From b6a95f9970305c8883a27f6bd4e3ed85f43ee519 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 14:08:06 -0400 Subject: [PATCH 01/15] PoC Smart Escrows (#5340) * wasmedge in unittest * add WashVM.h and cpp * accountID comparison (vector) working * json decode tx and ledger object with two buffers working * wasm return a buffer working * add a failure test case to P2P3 * host function return ledger sqn * instruction gas and host function gas * basics * add scaffold * add amendment check * working PoC * get test working * fix clang-format * prototype #2 * p2p3 * [WIP] P4 * P5 * add calculateBaseFee * add FinishFunction preflight checks (+ tests) * additional reserve for sfFinishFunction * higher fees for EscrowFinish * rename amendment to SmartEscrow * make fee voting changes, add basic tests * clean up * clean up * clean up * more cleanup * add subscribe tests * add more tests * undo formatting * undo formatting * remove bad comment * more debugging statements * fix clang-format * fix rebase issues * fix more rebase issues * more rebase fixes * add source code for wasm * respond to comments * add const --------- Co-authored-by: Peng Wang --- CMakeLists.txt | 1 + cfg/rippled-example.cfg | 24 + cmake/RippledCore.cmake | 1 + conanfile.py | 3 + include/xrpl/protocol/Feature.h | 2 +- include/xrpl/protocol/Fees.h | 3 + include/xrpl/protocol/Indexes.h | 6 + include/xrpl/protocol/TER.h | 1 + include/xrpl/protocol/detail/features.macro | 2 +- .../xrpl/protocol/detail/ledger_entries.macro | 7 + include/xrpl/protocol/detail/sfields.macro | 5 +- .../xrpl/protocol/detail/transactions.macro | 8 +- include/xrpl/protocol/jss.h | 2 + src/libxrpl/protocol/STValidation.cpp | 3 + src/libxrpl/protocol/TER.cpp | 1 + src/test/app/Escrow_test.cpp | 368 +- src/test/app/FeeVote_test.cpp | 41 +- src/test/app/PseudoTx_test.cpp | 8 +- src/test/app/Wasm_test.cpp | 4752 +++++++++++++++++ src/test/jtx/TestHelpers.h | 27 + src/test/jtx/impl/envconfig.cpp | 2 + src/test/rpc/Subscribe_test.cpp | 20 +- src/xrpld/app/ledger/Ledger.cpp | 42 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 78 +- src/xrpld/app/misc/NetworkOPs.cpp | 37 + src/xrpld/app/misc/WasmVM.cpp | 592 ++ src/xrpld/app/misc/WasmVM.h | 97 + src/xrpld/app/tx/detail/Change.cpp | 17 + src/xrpld/app/tx/detail/Escrow.cpp | 179 +- src/xrpld/app/tx/detail/Escrow.h | 3 + src/xrpld/app/tx/detail/Transactor.cpp | 37 +- src/xrpld/core/Config.h | 6 + src/xrpld/core/detail/Config.cpp | 4 + 33 files changed, 6339 insertions(+), 40 deletions(-) create mode 100644 src/test/app/Wasm_test.cpp create mode 100644 src/xrpld/app/misc/WasmVM.cpp create mode 100644 src/xrpld/app/misc/WasmVM.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 03dba51d0c..28cfd2322a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) +find_package(wasmedge REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index ee9fdbd274..d465994a6b 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1248,6 +1248,30 @@ # Example: # owner_reserve = 2000000 # 2 XRP # +# extension_compute_limit = +# +# The extension compute limit is the maximum amount of gas that can be +# consumed by a single transaction. The gas limit is used to prevent +# transactions from consuming too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 2000000 # 2 million gas +# +# extension_size_limit = +# +# The extension size limit is the maximum size of a WASM extension in +# bytes. The size limit is used to prevent extensions from consuming +# too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 2000000 # 2 million gas +# #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index fc0576872a..d4ff75434e 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,6 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> + wasmedge::wasmedge ) include(add_module) diff --git a/conanfile.py b/conanfile.py index d4513068fb..ec39608d3f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,6 +2,7 @@ from conan import ConanFile from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout import re + class Xrpl(ConanFile): name = 'xrpl' @@ -32,6 +33,7 @@ class Xrpl(ConanFile): 'soci/4.0.3', 'xxhash/0.8.2', 'zlib/1.3.1', + 'wasmedge/0.14.1', ] tool_requires = [ @@ -125,6 +127,7 @@ class Xrpl(ConanFile): self.folders.generators = 'build/generators' generators = 'CMakeDeps' + def generate(self): tc = CMakeToolchain(self) tc.variables['tests'] = self.options.tests diff --git a/include/xrpl/protocol/Feature.h b/include/xrpl/protocol/Feature.h index 1c476df617..b6477baa02 100644 --- a/include/xrpl/protocol/Feature.h +++ b/include/xrpl/protocol/Feature.h @@ -80,7 +80,7 @@ namespace detail { // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 88; +static constexpr std::size_t numFeatures = 89; /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index 4393f1a1d9..a89bd4e486 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -34,6 +34,9 @@ struct Fees XRPAmount base{0}; // Reference tx cost (drops) XRPAmount reserve{0}; // Reserve base (drops) XRPAmount increment{0}; // Reserve increment (drops) + std::uint32_t extensionComputeLimit{ + 0}; // Extension compute limit (instructions) + std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/Indexes.h b/include/xrpl/protocol/Indexes.h index bbed539592..a7c184e81c 100644 --- a/include/xrpl/protocol/Indexes.h +++ b/include/xrpl/protocol/Indexes.h @@ -230,6 +230,12 @@ page(Keylet const& root, std::uint64_t index = 0) noexcept Keylet escrow(AccountID const& src, std::uint32_t seq) noexcept; +inline Keylet +escrow(uint256 const& key) noexcept +{ + return {ltESCROW, key}; +} + /** A PaymentChannel */ Keylet payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept; diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 317e9c2c97..01bf4669aa 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -344,6 +344,7 @@ enum TECcodes : TERUnderlyingType { tecARRAY_TOO_LARGE = 191, tecLOCKED = 192, tecBAD_CREDENTIALS = 193, + tecWASM_REJECTED = 194, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 7b120c0b8d..103dc34243 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -29,7 +29,7 @@ // If you add an amendment here, then do not forget to increment `numFeatures` // in include/xrpl/protocol/Feature.h. -// Check flags in Credential transactions +XRPL_FEATURE(SmartEscrow, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (FrozenLPTokenTransfer, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(DeepFreeze, Supported::yes, VoteBehavior::DefaultNo) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 5a652baf4f..2d4a3453ea 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -315,6 +315,11 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + + // New fields + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, })) @@ -344,6 +349,8 @@ LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({ {sfCondition, soeOPTIONAL}, {sfCancelAfter, soeOPTIONAL}, {sfFinishAfter, soeOPTIONAL}, + {sfFinishFunction, soeOPTIONAL}, + {sfData, soeOPTIONAL}, {sfSourceTag, soeOPTIONAL}, {sfDestinationTag, soeOPTIONAL}, {sfOwnerNode, soeREQUIRED}, diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 3217bab913..42a706c4de 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -112,6 +112,8 @@ TYPED_SFIELD(sfEmitGeneration, UINT32, 46) TYPED_SFIELD(sfVoteWeight, UINT32, 48) TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) +TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 52) +TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 53) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) @@ -223,7 +225,7 @@ TYPED_SFIELD(sfBaseFeeDrops, AMOUNT, 22) TYPED_SFIELD(sfReserveBaseDrops, AMOUNT, 23) TYPED_SFIELD(sfReserveIncrementDrops, AMOUNT, 24) -// currency amount (AMM) +// currency amount (more) TYPED_SFIELD(sfLPTokenOut, AMOUNT, 25) TYPED_SFIELD(sfLPTokenIn, AMOUNT, 26) TYPED_SFIELD(sfEPrice, AMOUNT, 27) @@ -265,6 +267,7 @@ TYPED_SFIELD(sfAssetClass, VL, 28) TYPED_SFIELD(sfProvider, VL, 29) TYPED_SFIELD(sfMPTokenMetadata, VL, 30) TYPED_SFIELD(sfCredentialType, VL, 31) +TYPED_SFIELD(sfFinishFunction, VL, 32) // account (common) TYPED_SFIELD(sfAccount, ACCOUNT, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index dd3ac42325..19c31d439b 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -42,12 +42,14 @@ TRANSACTION(ttPAYMENT, 0, Payment, ({ /** This transaction type creates an escrow object. */ TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, ({ - {sfDestination, soeREQUIRED}, {sfAmount, soeREQUIRED}, + {sfDestination, soeREQUIRED}, + {sfDestinationTag, soeOPTIONAL}, {sfCondition, soeOPTIONAL}, {sfCancelAfter, soeOPTIONAL}, {sfFinishAfter, soeOPTIONAL}, - {sfDestinationTag, soeOPTIONAL}, + {sfFinishFunction, soeOPTIONAL}, + {sfData, soeOPTIONAL}, })) /** This transaction type completes an existing escrow. */ @@ -488,6 +490,8 @@ TRANSACTION(ttFEE, 101, SetFee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index 483b69a962..fa34cf800b 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -265,6 +265,8 @@ JSS(expected_date_UTC); // out: any (warnings) JSS(expected_ledger_size); // out: TxQ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info +JSS(extension_compute); // out: NetworkOps +JSS(extension_size); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 16f0c28879..f14fce4321 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -66,6 +66,9 @@ STValidation::validationFormat() {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + // featureSmartEscrow + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, }; // clang-format on diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 815b27c001..dc0bdb4a59 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -117,6 +117,7 @@ transResults() MAKE_ERROR(tecARRAY_TOO_LARGE, "Array is too large."), MAKE_ERROR(tecLOCKED, "Fund is locked."), MAKE_ERROR(tecBAD_CREDENTIALS, "Bad credentials."), + MAKE_ERROR(tecWASM_REJECTED, "The custom WASM code that was run rejected your transaction."), MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."), MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 714fc7734d..123b654835 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1519,7 +1519,7 @@ struct Escrow_test : public beast::unit_test::suite Account const alice{"alice"}; Account const bob{"bob"}; Account const carol{"carol"}; - Account const dillon{"dillon "}; + Account const dillon{"dillon"}; Account const zelda{"zelda"}; const char credType[] = "abcde"; @@ -1656,6 +1656,370 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testFinishFunctionPreflight() + { + testcase("Test preflight checks involving FinishFunction"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::get_ledger_sqn() >= 5} + // } + static auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + + { + // featureSmartEscrow disabled + Env env(*this, supported_amendments() - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + auto escrowCreate = escrow(alice, carol, XRP(1000)); + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temDISABLED)); + env.close(); + } + + Env env(*this); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow(alice, carol, XRP(1000)); + + // Success situations + { + // FinishFunction + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + Condition + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + condition(cb1), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + condition(cb1), + finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + + // Failure situations (i.e. all other combinations) + { + // only FinishFunction + env(escrowCreate, + finish_function(wasmHex), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + Condition + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction 0 length + env(escrowCreate, + finish_function(""), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + // { + // // FinishFunction > max length + // std::string longWasmHex = "00"; + // // TODO: fix to use the config setting + // // TODO: make this test more efficient + // // uncomment when that's done + // for (int i = 0; i < 4294967295; i++) + // { + // longWasmHex += "11"; + // } + // env(escrowCreate, + // finish_function(longWasmHex), + // cancel_time(env.now() + 100s), + // fee(txnFees), + // ter(temMALFORMED)); + // env.close(); + // } + } + + void + testFinishFunction() + { + testcase("PoC escrow function"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::get_ledger_sqn() >= 5} + // } + static auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + + { + // basic FinishFunction situation + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + Condition + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // no fulfillment provided, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function fails + env(finish(carol, alice, seq), + condition(cb1), + fulfillment(fb1), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + // no fulfillment provided, function succeeds + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // wrong fulfillment provided, function succeeds + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb2), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function succeeds, tx succeeds + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb1), + fee(txnFees), + ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + FinishAfter + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + auto const ts = env.now() + 97s; + env(escrowCreate, + finish_function(wasmHex), + finish_time(ts), + cancel_time(env.now() + 1000s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(finish(carol, alice, seq), + fee(txnFees + 1), + ter(tecNO_PERMISSION)); + env.close(); + // finish time hasn't passed, function succeeds + for (; env.now() < ts; env.close()) + env(finish(carol, alice, seq), + fee(txnFees + 2), + ter(tecNO_PERMISSION)); + + env(finish(carol, alice, seq), + fee(txnFees + 1), + ter(tesSUCCESS)); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + FinishAfter #2 + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 2s), + cancel_time(env.now() + 100s), + fee(txnFees)); + // Don't close the ledger here + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecNO_PERMISSION)); + env.close(); + + // finish time has passed, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + // finish time has passed, function succeeds, tx succeeds + env(finish(carol, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + } + void run() override { @@ -1671,6 +2035,8 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(); testEscrowWithTickets(); testCredentials(); + testFinishFunctionPreflight(); + testFinishFunction(); } }; diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 289ce2a713..a49dbb0bca 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -37,36 +37,56 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } { Section config; config.append( {"reference_fee = 50", "account_reserve = 1234567", - "owner_reserve = 1234"}); + "owner_reserve = 1234", + "extension_compute_limit = 100", + "extension_size_limit = 200"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); + BEAST_EXPECT(setup.extension_compute_limit == 100); + BEAST_EXPECT(setup.extension_size_limit == 200); } { Section config; config.append( {"reference_fee = blah", "account_reserve = yada", - "owner_reserve = foo"}); + "owner_reserve = foo", + "extension_compute_limit = bar", + "extension_size_limit = baz"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } { Section config; config.append( {"reference_fee = -50", "account_reserve = -1234567", - "owner_reserve = -1234"}); + "owner_reserve = -1234", + "extension_compute_limit = -100", + "extension_size_limit = -200"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -74,6 +94,11 @@ class FeeVote_test : public beast::unit_test::suite setup.account_reserve == static_cast(-1234567)); BEAST_EXPECT( setup.owner_reserve == static_cast(-1234)); + BEAST_EXPECT( + setup.extension_compute_limit == + static_cast(-100)); + BEAST_EXPECT( + setup.extension_size_limit == static_cast(-200)); } { const auto big64 = std::to_string( @@ -84,12 +109,20 @@ class FeeVote_test : public beast::unit_test::suite config.append( {"reference_fee = " + big64, "account_reserve = " + big64, - "owner_reserve = " + big64}); + "owner_reserve = " + big64, + "extension_compute_limit = " + big64, + "extension_size_limit = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index a04316cbd7..55622e4923 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -48,6 +48,11 @@ struct PseudoTx_test : public beast::unit_test::suite obj[sfReserveIncrement] = 0; obj[sfReferenceFeeUnits] = 0; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = 0; + obj[sfExtensionSizeLimit] = 0; + } })); res.emplace_back(STTx(ttAMENDMENT, [&](auto& obj) { @@ -114,9 +119,10 @@ struct PseudoTx_test : public beast::unit_test::suite { using namespace test::jtx; FeatureBitset const all{supported_amendments()}; - FeatureBitset const xrpFees{featureXRPFees}; + testPrevented(all - featureXRPFees - featureSmartEscrow); testPrevented(all - featureXRPFees); + testPrevented(all - featureSmartEscrow); testPrevented(all); testAllowed(); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp new file mode 100644 index 0000000000..31e8007c72 --- /dev/null +++ b/src/test/app/Wasm_test.cpp @@ -0,0 +1,4752 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +#include + +#include + +namespace ripple { +namespace test { + +/* Host function body definition. */ +WasmEdge_Result +Add(void* Data, + const WasmEdge_CallingFrameContext* CallFrameCxt, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + int32_t Val1 = WasmEdge_ValueGetI32(In[0]); + int32_t Val2 = WasmEdge_ValueGetI32(In[1]); + // printf("Host function \"Add\": %d + %d\n", Val1, Val2); + Out[0] = WasmEdge_ValueGenI32(Val1 + Val2); + return WasmEdge_Result_Success; +} + +void +invokeAdd() +{ + /* Create the VM context. */ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + // clang-format off + /* The WASM module buffer. */ + uint8_t WASM[] = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + + /* Create the module instance. */ + WasmEdge_String ExportName = WasmEdge_StringCreateByCString("extern"); + WasmEdge_ModuleInstanceContext* HostModCxt = + WasmEdge_ModuleInstanceCreate(ExportName); + WasmEdge_ValType ParamList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(ParamList, 2, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate(HostFType, Add, NULL, 0); + WasmEdge_FunctionTypeDelete(HostFType); + WasmEdge_String HostFuncName = WasmEdge_StringCreateByCString("func-add"); + WasmEdge_ModuleInstanceAddFunction(HostModCxt, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostModCxt); + + /* The parameters and returns arrays. */ + WasmEdge_Value Params[2] = { + WasmEdge_ValueGenI32(1234), WasmEdge_ValueGenI32(5678)}; + WasmEdge_Value Returns[1]; + /* Function name. */ + WasmEdge_String FuncName = WasmEdge_StringCreateByCString("addTwo"); + /* Run the WASM function from buffer. */ + WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( + VMCxt, WASM, sizeof(WASM), FuncName, Params, 2, Returns, 1); + + if (WasmEdge_ResultOK(Res)) + { + // printf("invokeAdd get the result: %d\n", + // WasmEdge_ValueGetI32(Returns[0])); + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); + } + + /* Resources deallocations. */ + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(FuncName); + WasmEdge_ModuleInstanceDelete(HostModCxt); +} + +struct Wasm_test : public beast::unit_test::suite +{ + void + testWasmtimeLib() + { + testcase("wasmtime lib test"); + invokeAdd(); + BEAST_EXPECT(true); + } + + void + testEscrowWasmP0() + { + testcase("escrow wasm P0 test"); + auto wasmHex = + "0061736d0100000001090260017f017f6000000305040001010004050170010101" + "05030100100609017f01418080c0000b071802066d656d6f727902000b6d6f636b" + "5f657363726f7700030a25040800200041056f450b02000b0e0010818080800010" + "81808080000b08002000100010020b0072046e616d650011106d6f636b5f657363" + "726f772e7761736d014404000b6d6f636b5f657363726f77010564756d6d790211" + "5f5f7761736d5f63616c6c5f64746f7273031a6d6f636b5f657363726f772e636f" + "6d6d616e645f6578706f7274071201000f5f5f737461636b5f706f696e74657200" + "c0010970726f64756365727302086c616e67756167650204527573740003433131" + "000c70726f6365737365642d62790205727573746325312e38332e302d6e696768" + "746c79202863326637346333663920323032342d30392d30392905636c616e675f" + "31382e312e322d776173692d73646b202868747470733a2f2f6769746875622e63" + "6f6d2f6c6c766d2f6c6c766d2d70726f6a65637420323661316436363031643732" + "376139366634333031643064383634376235613432373630616530632900560f74" + "61726765745f6665617475726573052b0b62756c6b2d6d656d6f72792b0a6d756c" + "746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e" + "63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + auto re = runEscrowWasm(wasm, funcName, 15); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + + re = runEscrowWasm(wasm, funcName, 11); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + + void + testBadWasm() + { + testcase("bad wasm test"); + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + auto re = runEscrowWasm(wasm, funcName, 15); + BEAST_EXPECT(re.error()); + } + + void + testEscrowWasmP1() + { + testcase("escrow wasm P1 test"); + auto wasmHex = + "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" + "00030c0b01010200000000000003000405017001030305030100110619037f0141" + "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" + "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" + "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" + "200010012200450d0120000f0b230041206b220024002000410036021820004101" + "36020c200041b480c00036020820004204370210200041086a41d080c000100500" + "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" + "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" + "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" + "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" + "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" + "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" + "0245044041002100410021010c040b4100210020054100411920074101766b2007" + "411f461b7421044100210103400240200228020441787122062005490d00200620" + "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" + "021422062000200620022004411d764104716a41106a2802002202471b20002006" + "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" + "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" + "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" + "000b20012000410372360204200020016a220020002802044101723602040c060b" + "024041022000742203410020036b72200120007471682206410374220041a483c0" + "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" + "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" + "360204200120056a2206200020056b2204410172360204200020016a2004360200" + "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" + "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" + "200220057236020020000c010b20002802080b2102200020033602082002200336" + "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" + "043602000c050b200068410274419482c0006a280200220128020441787120056b" + "2103200121020240034002400240200128021022000d00200128021422000d0020" + "022802182107024002402002200228020c22004604402002411441102002280214" + "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" + "013602080c010b200241146a200241106a20001b21040340200421062001220041" + "146a200041106a200028021422011b210420004114411020011b6a28020022010d" + "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" + "28020047044020074110411420072802102002461b6a20003602002000450d040c" + "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" + "77713602000c030b200028020441787120056b22012003200120034922011b2103" + "2000200220011b2102200021010c010b0b20002007360218200228021022010440" + "20002001360210200120003602180b20022802142201450d002000200136021420" + "0120003602180b02400240200341104f044020022005410372360204200220056a" + "22062003410172360204200320066a200336020041b485c0002802002204450d01" + "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" + "2205410120044103767422047145044041ac85c000200420057236020020000c01" + "0b20002802080b2104200020013602082004200136020c2001200036020c200120" + "043602080c010b2002200320056a2200410372360204200020026a220020002802" + "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" + "41086a0f0b20002001724504404100210141022007742200410020006b72200871" + "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" + "20012000280204417871220420056b220620034922071b21082000280210220245" + "0440200028021421020b20012008200420054922001b210120032006200320071b" + "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" + "200020056b4f710d0020012802182107024002402001200128020c220046044020" + "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" + "2202200036020c200020023602080c010b200141146a200141106a20001b210403" + "40200421062002220041146a200041106a200028021422021b2104200041144110" + "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" + "28021c410274419482c0006a220228020047044020074110411420072802102001" + "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" + "b085c000280200417e200128021c77713602000c010b2000200736021820012802" + "102202044020002002360210200220003602180b20012802142202450d00200020" + "02360214200220003602180b0240200341104f0440200120054103723602042001" + "20056a22022003410172360204200220036a200336020020034180024f04402002" + "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" + "410120034103767422037145044041ac85c000200320047236020020000c010b20" + "002802080b2103200020023602082003200236020c2002200036020c2002200336" + "02080c010b2001200320056a2200410372360204200020016a2200200028020441" + "01723602040b0c010b024002400240024002400240200541b485c0002802002201" + "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" + "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" + "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" + "02002201200020002001491b3602000240024041c085c000280200220304404194" + "83c0002100034020002802002201200028020422066a2002460d02200028020822" + "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" + "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" + "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" + "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" + "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" + "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" + "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" + "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" + "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" + "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" + "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" + "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" + "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" + "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" + "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" + "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" + "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" + "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" + "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" + "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" + "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" + "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" + "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" + "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" + "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" + "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" + "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" + "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" + "85c000200441286b220036020020022000410172360204200020026a4128360204" + "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" + "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" + "20046a2101419483c0002100024002400340200120002802002206470440200028" + "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" + "0028020022014f04402003200120002802046a2206490d010b200028020821000c" + "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" + "0172360204200020026a412836020441cc85c00041808080013602002003200641" + "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" + "002109200141106a419c83c00029020037020020012009370208419883c0002004" + "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" + "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" + "012003460d0720012001280204417e713602042003200120036b22004101723602" + "042001200036020020004180024f04402003200010070c080b200041f8017141a4" + "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" + "ac85c000200020027236020020010c010b20012802080b21002001200336020820" + "00200336020c2003200136020c200320003602080c070b20002002360200200020" + "0028020420046a360204200220054103723602042006410f6a41787141086b2201" + "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" + "460d04200128020422054103714101460440200120054178712200100820002001" + "6a22012802042105200020036a21030b20012005417e7136020420042003410172" + "360204200320046a200336020020034180024f04402004200310070c060b200341" + "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" + "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" + "043602082003200436020c2004200036020c200420033602080c050b41b885c000" + "200020056b220136020041c085c00041c085c000280200220020056a2202360200" + "2002200141017236020420002005410372360204200041086a21000c060b41bc85" + "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" + "85c000410036020020002001410372360204200020016a22012001280204410172" + "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" + "2002410172360204200020016a2002360200200020054103723602040b20004108" + "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" + "71220141086b220236020041b885c00041b885c00028020020046a220320002001" + "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" + "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" + "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" + "0041b485c00041b485c00028020020036a22003602002004200041017236020420" + "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" + "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" + "20056a22023602002002200141017236020420002005410372360204200041086a" + "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" + "402007410020076b41037122026a21062002044020072103418080c00021050340" + "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" + "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" + "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" + "6b411871210820052802002105034020062005200c762004280200220520087472" + "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" + "20022104034020062004280200360200200441046a2104200641046a2206200349" + "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" + "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" + "4122460440200021032007210241002105412221080240034020032d0000220920" + "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" + "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" + "0b000bd20601047f0240200041046b280200220241787122034104410820024103" + "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" + "0041046b280200220341787122006a21020240024020034101710d002003410271" + "450d012001280200220320006a2100200120036b220141bc85c000280200460440" + "20022802044103714103470d0141b485c000200036020020022002280204417e71" + "36020420012000410172360204200220003602000c020b2001200310080b024002" + "4002400240024020022802042203410271450440200241c085c000280200460d02" + "200241bc85c000280200460d0320022003417871220210082001200020026a2200" + "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" + "0020003602000c060b20022003417e713602042001200041017236020420002001" + "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" + "c00028020041016b220036020020000d04419c83c0002802002200044003402001" + "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" + "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" + "003602002001200041017236020441bc85c000280200200146044041b485c00041" + "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" + "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" + "00210103402002200128020022054f04402002200520012802046a490d040b2001" + "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" + "20006a220036020020012000410172360204200020016a20003602000c020b2000" + "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" + "007145044041ac85c000200020037236020020020c010b20022802080b21002002" + "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" + "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" + "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" + "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" + "7f230041206b220224002002410036021020024101360204200242043702082002" + "412e36021c200220003602182002200241186a360200200220011005000ba40201" + "037f230041206b22022400200241106a2203200041106a29020037030020024108" + "6a2204200041086a290200370300200241013b011c200220013602182002200029" + "0200370300230041206b2200240020022802182101200041106a20032902003703" + "00200041086a20042902003703002000200236021c200020013602182000200229" + "020037030041002102230041106b22012400200028020c21030240024002400240" + "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" + "2802042102200328020021030c010b20014180808080783602002001200036020c" + "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" + "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" + "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" + "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" + "2002410274419482c0006a21044101200274220341b085c0002802007145044020" + "042000360200200020043602182000200036020c2000200036020841b085c00041" + "b085c0002802002003723602000f0b024002402001200428020022032802044178" + "71460440200321020c010b20014100411920024101766b2002411f461b74210503" + "4020032005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c200220" + "00360208200041003602182000200236020c200020013602080f0b200420003602" + "00200020033602182000200036020c200020003602080bf10201047f200028020c" + "21020240024020014180024f044020002802182103024002402000200246044020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" + "2201200236020c200220013602080c010b200041146a200041106a20021b210403" + "40200421052001220241146a200241106a200228021422011b2104200241144110" + "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" + "0274419482c0006a220128020047044020034110411420032802102000461b6a20" + "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" + "280200417e200028021c77713602000c020b200028020822002002470440200020" + "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" + "77713602000f0b2002200336021820002802102201044020022001360210200120" + "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" + "017f230041106b22032400419082c000419082c000280200220441016a36020002" + "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" + "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" + "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" + "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" + "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" + "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" + "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" + "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" + "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" + "64006000100029000000a804000009000000617373657274696f6e206661696c65" + "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" + "6765010452757374000c70726f6365737365642d62790105727573746325312e38" + "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" + "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("check_accountID"); + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + std::vector data(str.begin(), str.end()); + auto re = runEscrowWasm(wasm, funcName, data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; + std::vector data(str.begin(), str.end()); + auto re = runEscrowWasm(wasm, funcName, data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + } + + void + testEscrowWasmP2P3() + { + testcase("escrow wasm P2 & P3 test"); + auto wasmHex = + "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" + "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" + "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" + "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" + "616004030305060001070808080809040702000000040403030304030500020306" + "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" + "0903020201020200000405000203030402020205100b0303000005030101010104" + "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" + "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" + "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" + "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" + "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" + "360228200320023602242003200136022020034180013a002c2003410036021c20" + "03428080808010370214200341c8006a200341146a108180808000024002400240" + "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" + "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" + "2903483703300240024020032802282202200328022422064f0d00200328022021" + "070340200720026a2d000041776a220141174b0d02410120017441938080047145" + "0d022006200241016a2202470d000b200320063602280b20002003290330370300" + "200041106a2004290300370300200041086a200529030037030020032802142202" + "450d04200328021820021082808080000c040b20032002360228200341086a2007" + "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" + "200328020c21012003280208210641141084808080002202450d01200220063602" + "0c2002411636020020002002360204200041063a00002002200136021020034130" + "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" + "032802142202450d00200328021820021082808080000b200341e0006a24808080" + "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" + "210302400240024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f0006a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" + "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" + "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241386a200320052005200441016a220420052004491b" + "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" + "84808080002207450d1f2007200836020c20074105360200200720043602100c08" + "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" + "c080001a200228024c21042002280248210841141084808080002207450d1e2007" + "200836020c20074107360200200720043602100c070b20022902dc02210e200228" + "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228024421042002280240210841141084808080002207450d1c2007200836020c" + "20074115360200200720043602100c050b200241b0016a20011081808080000240" + "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" + "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" + "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" + "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" + "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" + "000120042007360204200441106a2003290300370300200441036a20052d00003a" + "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" + "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" + "0000200420083602100c180b200628020021030b200241306a2003200520052004" + "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" + "042002280230210841141084808080002207450d172007200836020c2007410236" + "0200200720043602100b200241d8026a109180808000024020022802d802220445" + "0d002009200441186c1082808080000b200128020c210320012802142104200128" + "0210210541062106410121090b200120012d001841016a3a001802400240200420" + "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" + "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" + "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28021421082002280210210541141084808080002204450d1d200441163602000c" + "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" + "41776a220841174b0d024101200874419380800471450d022001200441016a2204" + "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" + "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" + "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" + "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" + "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" + "210541141084808080002204450d1a200441153602000c040b200241206a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228022421082002280220210541141084808080002204450d1920044116360200" + "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" + "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" + "001a200228021c21082002280218210541141084808080002204450d1620044102" + "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" + "01200220073602b401200220063a00b001024020090d00200241063a0078200220" + "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" + "200241c8016a1092808080000c110b200241086a20032005200520042005200449" + "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" + "1084808080002204450d142004200136020c200441183602002000200436020420" + "0041063a0000200420083602100c130b200141003602082001200441016a360214" + "200241b0016a2006200110938080800020022802b40121080240024020022802b0" + "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" + "948080800020022d00784106460d1320002002290378370300200041106a200241" + "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" + "150b41002101024020044100480d00024020040d0041012101410021050c030b41" + "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" + "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" + "086a220320012008200410df808080003602002002200536027c200241033a0078" + "2002200436028401200041106a200241f8006a41106a290300370300200041086a" + "2003290300370300200020022903783703000c120b2001200441016a3602142002" + "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" + "20024190016a109680808000024020022d00784106460d00200020022903783703" + "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" + "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" + "200020043602040c120b2000200228029801360204200041063a00000c110b0240" + "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" + "14200141bb80c0800041031086808080002204450d02200041063a000020002004" + "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" + "0a490d042002200320052005200441016a220420052004491b1083808080004100" + "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" + "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" + "200241003a007820002002290378370300200041086a200241f8006a41086a2903" + "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" + "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" + "00200020043602040c0e0b20024181023b01782000200229037837030020004108" + "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" + "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" + "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" + "02290378370300200041086a200241f8006a41086a290300370300200041106a20" + "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" + "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" + "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" + "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" + "21070c070b20022802d401220441003602082004200428021441016a3602142002" + "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" + "460d06200241d8026a200720022802b801109880808000024020022802d8022204" + "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" + "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" + "41003602dc01200220053602e002200220083602dc02200220043602d802200241" + "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" + "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" + "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" + "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" + "024020022d00b101450d0020022802d40122044100360208200420042802144101" + "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" + "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" + "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" + "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" + "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" + "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" + "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" + "290300220f370300200220022903b00122103703d802200541106a200e37020020" + "0541086a200f3702002005201037020020024180026a41086a200c290200370300" + "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" + "186a280200360200200220022902b00137038002200220033602a4022002200736" + "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" + "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" + "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" + "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" + "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" + "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" + "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" + "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" + "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" + "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" + "200820041082808080000b200241dc016a109b808080000b41062106410121090b" + "200120012d001841016a3a0018200128020c210302400240024020012802142204" + "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" + "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" + "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" + "21040c050b200241e8006a200320052005200441016a220420052004491b108380" + "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" + "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" + "200441016a220436021420052004470d000b200521040b200241e0006a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28026421082002280260210541141084808080002204450d072004200536020c20" + "044103360200200420083602100c010b200241d8006a200320052005200441016a" + "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" + "280258210541141084808080002204450d062004200536020c2004411636020020" + "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" + "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" + "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" + "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" + "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" + "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" + "80000c010b200241d0006a200320052005200420052004491b1083808080004100" + "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" + "0d042004200136020c2004411836020020002004360204200041063a0000200420" + "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" + "200041063a0000200020043602040c010b20002002290378370300200041106a20" + "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" + "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" + "002202417871220341044108200241037122021b20016a490d0002402002450d00" + "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" + "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" + "0301057f02400240024002400240024020022003490d0041012104410021052003" + "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" + "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" + "418a94a8d000736b20077241808182847871418081828478460d00034020062001" + "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" + "034109490d0103400240024020074108480d004180828408200120076a22064178" + "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" + "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" + "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" + "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" + "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" + "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" + "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" + "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" + "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" + "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" + "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" + "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" + "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" + "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" + "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" + "0041002100410021060c040b4100210020024100411920054101766b2005411f46" + "1b74210741002106034002402001220128020441787122082002490d0020082002" + "6b220820034f0d00200821032001210620080d004100210320012106200121000c" + "060b200128021422082000200820012007411d764104716a41106a280200220147" + "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" + "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" + "0022032802082206460d002006200236020c200220063602080c010b4100200141" + "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" + "0204410172360204200341086a0f0b024002402000200374410220037422004100" + "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" + "0022002802082207460d002007200636020c200620073602080c010b4100200141" + "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" + "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" + "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" + "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" + "d2c08000200621010c010b200628020821010b200620033602082001200336020c" + "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" + "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" + "787120026b2103200621010240024003400240200628021022000d002006280214" + "22000d0020012802182105024002400240200128020c22002001470d0020014114" + "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" + "0036020c200020063602080c010b200141146a200141106a20001b210703402007" + "21082006220041146a200041106a200028021422061b210720004114411020061b" + "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" + "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" + "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" + "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" + "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" + "360218024020012802102206450d0020002006360210200620003602180b200128" + "02142206450d0020002006360214200620003602180b0240024002402003411049" + "0d0020012002410372360204200120026a22022003410172360204200220036a20" + "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" + "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" + "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" + "0b200620003602082007200036020c2000200636020c200020073602080c010b20" + "01200320026a2200410372360204200120006a220020002802044101723602040c" + "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" + "4020002006720d004100210641022005742200410020006b722004712200450d03" + "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" + "280204417871220120026b220820034922051b2104200120024921072008200320" + "051b21080240200028021022010d00200028021421010b2006200420071b210620" + "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" + "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" + "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" + "410021000c020b20062802082201200036020c200020013602080c010b20064114" + "6a200641106a20001b21070340200721082001220041146a200041106a20002802" + "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" + "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" + "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" + "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" + "c080000c010b20002005360218024020062802102201450d002000200136021020" + "0120003602180b20062802142201450d0020002001360214200120003602180b02" + "40024020034110490d0020062002410372360204200620026a2200200341017236" + "0204200020036a200336020002402003418002490d002000200310d7808080000c" + "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" + "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" + "200228020821030b200220003602082003200036020c2000200236020c20002003" + "3602080c010b2006200320026a2200410372360204200620006a22002000280204" + "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" + "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" + "200241af80046a220641107640002203417f4622070d0720034110742201450d07" + "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" + "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" + "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" + "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" + "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" + "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" + "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" + "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" + "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" + "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" + "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" + "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" + "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" + "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" + "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" + "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" + "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" + "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" + "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" + "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" + "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" + "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" + "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" + "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" + "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" + "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" + "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" + "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" + "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" + "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" + "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" + "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" + "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" + "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" + "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" + "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" + "003602f0d2c0800020012000410172360204200120006a41283602044100418080" + "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" + "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" + "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" + "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" + "02402000280200220620034b0d002003200620002802046a2206490d020b200028" + "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" + "800020012000410172360204200120006a412836020441004180808001360284d3" + "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" + "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" + "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" + "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" + "200041046a22002006490d000b20072003460d0720072007280204417e71360204" + "2003200720036b22004101723602042007200036020002402000418002490d0020" + "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" + "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" + "c08000200621000c010b200628020821000b200620033602082000200336020c20" + "03200636020c200320003602080c070b200020013602002000200028020420086a" + "360204200120024103723602042007410f6a41787141786a2206200120026a2200" + "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" + "200628020422024103714101470d0020062002417871220210a880808000200220" + "036a2103200620026a220628020421020b20062002417e71360204200020034101" + "72360204200020036a200336020002402003418002490d002000200310d7808080" + "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" + "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" + "010b200228020821030b200220003602082003200036020c2000200236020c2000" + "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" + "8000220020026a22063602f8d2c080002006200341017236020420002002410372" + "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" + "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" + "410372360204200320006a220020002802044101723602040c010b410020063602" + "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" + "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" + "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" + "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" + "d2c0800020062001410172360204200020036a4128360204410041808080013602" + "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" + "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" + "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" + "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" + "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" + "0020026a22063602f8d2c080002006200341017236020420002002410372360204" + "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" + "02000b200041046a109b808080000c020b20002802042201450d01200028020820" + "011082808080000f0b200041046a10918080800020002802042201450d00200028" + "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" + "80808080002000280214220420002802102205200420054b1b2106200028020c21" + "0702400240024002400340024020020d00410021040c050b20062004460d012000" + "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" + "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" + "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" + "8080002204450d01200441093602000c020b200320072005200610838080800041" + "002d00c0cfc080001a200328020421012003280200210241141084808080002204" + "450d00200441053602000c010b000b2004200236020c200420013602100b200341" + "106a24808080800020040b970202027f027e23808080800041106b220424808080" + "8000024002400240024002400240024002402001280214220520012802104f0d00" + "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" + "020b2002450d02420121060c050b20042001200220034100108880808000200428" + "02000d020c030b200420012002200341001089808080002004280200450d022000" + "2004280204360208200042033703000c040b420021060240420020037d22074200" + "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" + "020b20002004280204360208200042033703000c020b2004290308210342002106" + "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" + "23808080800041106b220524808080800020012001280214220641016a22073602" + "140240024002402007200128021022084f0d00200720086b2109200128020c210a" + "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" + "410a490d00024020060d002005200a20082008200741016a220720082007491b10" + "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" + "808080002207450d072007200c36020c2007410d36020020002007360204200041" + "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" + "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" + "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" + "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" + "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" + "20002001200220032007108b808080000c010b200541086a200128020c20082008" + "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" + "0c21062005280208210c41141084808080002207450d012007200c36020c200741" + "053602002000200736020420004101360200200720063602100b200541106a2480" + "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" + "0620012001280214220741016a220836021402402008200128021022094f0d0041" + "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" + "2001200741026a22083602140b200128020c210a02400240024002400240024002" + "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" + "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" + "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" + "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" + "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" + "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" + "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" + "042007200836020c20074105360200200020073602042000410136020020072001" + "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" + "020421012005280200210841141084808080002207450d032007200836020c2007" + "410d3602002000200736020420004101360200200720013602100c040b20042008" + "6a2207411f7541808080807873200720084100482007200448731b21070b200020" + "01200220032007108b808080000c020b2000200120022003502006108c80808000" + "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" + "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" + "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" + "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" + "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" + "22052480808080002003ba2106024002400240024002400240024020042004411f" + "7522077320076b220741b502490d0003402006440000000000000000610d062004" + "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" + "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" + "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" + "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" + "84808080002204450d022004200136020c2004410e360200200020043602042004" + "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" + "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" + "28020c21072005280208210141141084808080002204450d012004200136020c20" + "04410e36020020002004360204200420073602100b410121040c020b000b200020" + "0620069a20021b390308410021040b20002004360200200541106a248080808000" + "0b840201027f23808080800041106b220524808080800002400240024002402004" + "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" + "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" + "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" + "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" + "1084808080002204450d002004200336020c2004410e3602002000200436020420" + "042001360210410121040c020b000b200044000000000000000044000000000000" + "008020021b390308410021040b20002004360200200541106a2480808080000b95" + "0502067f017e23808080800041306b2203248080808000200128020c2104024002" + "40024002400240024020012802142205200128021022064f0d002001200541016a" + "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" + "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" + "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" + "21072003280218210441141084808080002201450d022001200436020c20014105" + "3602002000200136020820004203370300200120073602100c040b200341086a20" + "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" + "1a200328020c21072003280208210441141084808080002201450d012001200436" + "020c2001410d3602002000200136020820004203370300200120073602100c030b" + "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" + "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" + "01450d012001200436020c2001410d360200200020013602082000420337030020" + "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" + "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" + "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" + "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" + "0b0b200341206a200120022009108e808080000240024020032802200d00200020" + "032b0328390308420021090c010b20002003280224360208420321090b20002009" + "3703000c020b000b20002001200220091087808080000b200341306a2480808080" + "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" + "0641016a2107200520066b2108200128020c20066a210541002104034002402005" + "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" + "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" + "200720046a3602142008200441016a2204470d000b200821040b20002001200220" + "032004108b808080000f0b200020012002200320041088808080000bc80101047f" + "23808080800041206b2202248080808000024002400240200028020c450d002000" + "21010c010b200241106a41086a2203200041086a28020036020020022000290200" + "370310200241086a200128020c2001280210200128021410838080800041002d00" + "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" + "200120022903103702002001200536020c20012004360210200141086a20032802" + "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "014108411810d480808000024020012802082200418180808078460d0020002001" + "28020c109580808000000b200141106a2480808080000b950101027f0240200028" + "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" + "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" + "0041046a28020020021082808080000c010b200010918080800020002802002202" + "450d00200041046a280200200241186c1082808080000b200041186a2100200141" + "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" + "01020b20002802082201450d01200028020420011082808080000c010b20002d00" + "044103470d00200028020822012802002102024020012802042203280200220445" + "0d002002200411808080800080808080000b024020032802042203450d00200220" + "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" + "097f017e23808080800041306b2203248080808000024002400240024002400240" + "0240024002400340024002402001280208220420012802042205460d0002400240" + "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" + "00460d0120074120490d012006200441016a22086a21094100200520086b417871" + "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" + "800020012802042105200128020821070c040b200741086a2107200b41086a2109" + "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" + "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" + "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" + "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" + "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" + "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" + "1084808080002207450d052007200936020c200741043602002000200736020420" + "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" + "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" + "024020094122470d002002280208450d0520072004490d072002200b20046a2007" + "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" + "0204200228020810ca8080800020032802282207450d032000200328022c360208" + "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" + "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" + "450d052007200936020c2007411036020020002007360204200041023602002007" + "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" + "80002001200741016a2209360208024020092005490d00200341206a200b200520" + "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" + "1084808080002207450d06200741043602000c090b2001200741026a2204360208" + "02400240024002400240024002400240024002400240200b20096a2d0000220741" + "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" + "00470d020240200228020822072002280200470d00200210cb808080000b200220" + "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" + "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" + "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" + "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" + "22072002280200470d00200210cb808080000b2002200741016a36020820022802" + "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" + "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" + "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" + "02200741016a360208200228020420076a41083a0000410021070c050b02402002" + "28020822072002280200470d00200210cb808080000b2002200741016a36020820" + "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" + "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" + "0000410021070c030b0240200228020822072002280200470d00200210cb808080" + "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" + "40200228020822072002280200470d00200210cb808080000b2002200741016a36" + "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" + "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" + "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" + "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" + "40024020032802282207450d002000200328022c3602084100210b0c010b410221" + "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" + "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" + "200936020c2007200b3602100b20004102360200200020073602040b200341306a" + "2480808080000b7901027f410021030240024020024100480d00024020020d0041" + "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" + "040d01410121030b20032002109580808000000b20042001200210df8080800021" + "012000200236020c2000200136020820002003360204200041033a00000b100002" + "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" + "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" + "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" + "370308200041023a0000200020012903083703100f0b200041023a000020002001" + "290308220337031020002003423f883703080bb40701077f23808080800041306b" + "22022480808080002001280200220328020c210402400240024002402003280214" + "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" + "174b0d024101200874419380800471450d022003200541016a2205360214200620" + "05470d000b200621050b41012108200241286a200420062006200541016a220520" + "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" + "210341141084808080002205450d022005200336020c2005410336020020002005" + "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" + "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" + "20053602140240200520064f0d00034002400240024002400240200420056a2d00" + "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" + "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" + "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" + "0c21062002280208210341141084808080002205450d092005200336020c200541" + "1136020020002005360204200520063602100c080b200041013a0001410021080c" + "070b41012108200241186a200420062006200541016a220520062005491b108380" + "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" + "80002205450d072005200336020c20054115360200200020053602042005200636" + "02100c060b2003200541016a220536021420062005470d000b200621050b410121" + "08200241106a200420062006200541016a220520062005491b1083808080004100" + "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" + "0d042005200336020c2005410536020020002005360204200520063602100c030b" + "41002108200141003a0004024020074122460d002002200420062006200541016a" + "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" + "280200210641141084808080002205450d042005200636020c2005411136020020" + "002005360204200520083602100c020b200041013a00010c020b200241206a2004" + "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" + "21082002280220210641141084808080002205450d022005200636020c20054108" + "36020020002005360204200520083602100b410121080b200020083a0000200241" + "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" + "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" + "8080800022040d01410121030b20032002109580808000000b20042001200210df" + "8080800021012000200236020820002001360204200020033602000bdc0201067f" + "23808080800041106b22022480808080002001280200220328020c210402400240" + "02400240024020032802142201200341106a28020022054f0d000340200420016a" + "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" + "41016a220136021420052001470d000b200521010b200241086a20042005200520" + "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" + "21072002280208210541141084808080002201450d03200141033602000c010b02" + "402006413a470d002003200141016a360214200020031081808080000c020b2002" + "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" + "001a200228020421072002280200210541141084808080002201450d0220014106" + "3602000b2001200536020c20002001360204200041063a0000200120073602100b" + "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" + "042480808080000240024002400240024002400240024002400240024002400240" + "20012802002205450d002002280208210620022802042107200128020421080240" + "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" + "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" + "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" + "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" + "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" + "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" + "2002290204220fa721092002280200220b418080808078470d03200921050c010b" + "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" + "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" + "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" + "028c02200142808080801037020420012009360200200920032903003703002009" + "41086a200341086a290300370300200941106a200341106a2903003703000c010b" + "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" + "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" + "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" + "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" + "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" + "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" + "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" + "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" + "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" + "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" + "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" + "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" + "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" + "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" + "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" + "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" + "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" + "200420042903880137026020042005360208200420063602782008280200220d41" + "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" + "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" + "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" + "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" + "370300200b2003290300370300200b41086a200341086a290300370300200d200e" + "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" + "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" + "246a200441dc006a41186a28020036020020042010370234200420073602302004" + "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" + "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" + "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" + "210d200b2f019203410b490d02200641016a210602400240024002400240024002" + "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" + "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" + "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" + "36027820044188016a200441f8006a10c18080800020042802b001410520044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" + "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" + "2105200d418080808078460d032004200d3602302008200441086a412410df8080" + "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" + "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" + "41003b019203200d410036028802200b41003b019003200b200d36028802200120" + "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" + "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" + "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" + "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" + "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" + "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" + "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" + "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" + "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" + "6a200941106a220d290300370300200041086a200941086a220b29030037030020" + "092003290300370300200b200341086a290300370300200d200341106a29030037" + "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" + "80808080004100210241002103024020002802002204450d002001200436021820" + "014100360214200120043602082001410036020420012000280204220336021c20" + "01200336020c20002802082103410121020b200120033602202001200236021020" + "01200236020002400240024003400240024002400240024020030d002001280200" + "450d0820012802082104200128020422030d0141002100200128020c2203450d06" + "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" + "024020024101712203450d0020012802040d0020012802082103200128020c2200" + "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" + "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" + "3702082001200336020441012102200141013602000b2001280208210002402001" + "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" + "20012802242203450d0120012802282100200128022c220520032f019203490d02" + "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" + "2001200436020c20014100360208200120033602040c010b200320044102746a41" + "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" + "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" + "2802002204450d00200028020420041082808080000b0240024002400240200320" + "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" + "20032802042200450d01200328020820001082808080000c010b200341046a1091" + "8080800020032802042200450d002003280208200041186c1082808080000b2001" + "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" + "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" + "03037f017e037f23808080800041f0006b22022480808080004100210302402000" + "2d0000220420012d0000470d00410121030240024002400240024020040e060500" + "01020304050b20002d000120012d00014621030c040b4100210320002903082205" + "2001290308520d030240024002402005a70e03000102000b200029031020012903" + "105121030c050b200029031020012903105121030c040b20002b031020012b0310" + "6121030c030b41002103200028020c2204200128020c470d022000280208200128" + "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" + "0d012001280208210420002802082100200641016a210103402001417f6a220145" + "21032001450d0220002004109c808080002106200441186a2104200041186a2100" + "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" + "6c2002420037026420024100360254200241003602442002410036023020024100" + "36022020022001280208220636025c200220012802042203360258200220063602" + "4c2002200336024820022000280208220636023820022000280204220136023420" + "0220063602282002200136022420022004410020031b3602602002200341004722" + "033602502002200336024020022004410020011b36023c20022001410047220336" + "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" + "80004101210320022802102201450d0120022802142104200241086a2007109d80" + "80800020022802082200450d0141002103200128020822062000280208470d0120" + "0228020c210820012802042000280204200610dc808080000d0120042008109c80" + "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" + "200128022022020d00410021020c010b20012002417f6a36022002400240024020" + "012802004101470d0020012802040d01200128020821030240200128020c220245" + "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" + "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" + "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" + "050c010b03402003280288022205450d03200241016a210220032f019003210420" + "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" + "21060c010b200520034102746a4198036a21030340200328020022064198036a21" + "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" + "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" + "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" + "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" + "001a200010848080800022010d01410121010b20012000109580808000000b2001" + "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" + "108080808000024002400240024020042d00384106460d00200441086a41106a20" + "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" + "29030037030020042004290338370308200441386a200220031080808080002004" + "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" + "0629030037030020042004290338370320200441086a10a0808080002205450d02" + "200441206a10a0808080002206450d0320052006109c808080002105200441206a" + "108580808000200441086a10858080800002402003450d00200220031082808080" + "000b02402001450d00200020011082808080000b200441d0006a24808080800020" + "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" + "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" + "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" + "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" + "004105470d0020002802042202450d002000280208210303402002418c026a2100" + "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" + "0c020b2000280208210120002802042107200641016a2106200541746a21052000" + "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" + "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" + "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" + "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" + "0041c0006b22052480808080002005200136020c20052000360208200520033602" + "14200520023602102005410236021c200541dc82c0800036021820054202370224" + "2005418180808000ad422086200541106aad843703382005418280808000ad4220" + "86200541086aad843703302005200541306a360220200541186a200410a4808080" + "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" + "41206b2200248080808000200041003602182000410136020c200041ac81c08000" + "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" + "23808080800041206b2202248080808000200241106a200041106a290200370300" + "200241086a200041086a290200370300200241013b011c20022001360218200220" + "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" + "6a280200220241787122006a21030240024020024101710d002002410271450d01" + "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" + "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" + "7136020420012000410172360204200320003602000f0b2001200210a880808000" + "0b024002400240024002400240200328020422024102710d00200341002802f8d2" + "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" + "80002001200220006a2200410172360204200120006a2000360200200141002802" + "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" + "2000410172360204200120006a20003602000b2000418002490d022001200010d7" + "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" + "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" + "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" + "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" + "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" + "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" + "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" + "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" + "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" + "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" + "00220241012000410376742200710d00410020022000723602e4d2c08000200321" + "000c010b200328020821000b200320013602082000200136020c2001200336020c" + "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" + "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" + "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" + "0041206b2203248080808000200341003602102003410136020420034204370208" + "2003200136021c200320003602182003200341186a3602002003200210a4808080" + "00000b840601057f0240024002402000417c6a2203280200220441787122054104" + "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" + "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" + "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" + "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" + "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" + "7871220420056a22052001490d042006200410a880808000200520016b22024110" + "490d0120032001200328020041017172410272360200200720016a220120024103" + "72360204200720056a220520052802044101723602042001200210a98080800020" + "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" + "20016a22052002410372360204200620062802044101723602042005200210a980" + "80800020000f0b20032005200328020041017172410272360200200720056a2202" + "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" + "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" + "200720056a2202200228020441017236020441002102410021010c010b20032001" + "200441017172410272360200200720016a22012002410172360204200720056a22" + "05200236020020052005280204417e713602040b410020013602f4d2c080004100" + "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" + "0240200210848080800022050d0041000f0b20052000417c417820032802002201" + "4103711b20014178716a2201200220012002491b10df808080002102200010a580" + "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" + "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" + "410272360200200720016a2202200520016b2205410172360204410020053602f0" + "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" + "4002402001418002490d002000280218210302400240024020022000470d002000" + "41144110200028021422021b6a28020022010d01410021020c020b200028020822" + "01200236020c200220013602080c010b200041146a200041106a20021b21040340" + "200421052001220241146a200241106a200228021422011b210420024114411020" + "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" + "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" + "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" + "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" + "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" + "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d0020022001360214" + "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" + "4101710d002003410271450d012000280200220320016a21010240200020036b22" + "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" + "d2c0800020022002280204417e7136020420002001410172360204200220013602" + "000c020b2000200310a8808080000b024002400240024020022802042203410271" + "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" + "03417871220310a8808080002000200320016a2201410172360204200020016a20" + "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" + "2003417e7136020420002001410172360204200020016a20013602000b02402001" + "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" + "0240024041002802e4d2c08000220341012001410376742201710d004100200320" + "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" + "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" + "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" + "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" + "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" + "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" + "7e23808080800041306b2203248080808000200320003602002003200136020420" + "03410236020c200341c485c08000360208200342023702142003418380808000ad" + "4220862204200341046aad84370328200320042003ad843703202003200341206a" + "360210200341086a200210a480808000000b110020003502004101200110ad8080" + "80000b7902017f017e23808080800041306b220324808080800020032001360204" + "200320003602002003410236020c200341c882c080003602082003420237021420" + "03418380808000ad42208622042003ad8437032820032004200341046aad843703" + "202003200341206a360210200341086a200210a480808000000bec0203027f017e" + "037f23808080800041306b2203248080808000412721040240024020004290ce00" + "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" + "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" + "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" + "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" + "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" + "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" + "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" + "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" + "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" + "23808080800041206b220124808080800020002802182102200141106a20004110" + "6a290200370300200141086a200041086a2902003703002001200036021c200120" + "0236021820012000290200370300200110d880808000000bcb0501077f02400240" + "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" + "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" + "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" + "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" + "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" + "28021422012000280218220920082002200310b080808000450d0041010f0b2001" + "20042005200928020c11818080800080808080000f0b0240024002400240200028" + "0204220120064b0d00200028021422012000280218220920082002200310b08080" + "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" + "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" + "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" + "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" + "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" + "00202000200736021041000f0b200120042005200928020c118180808000808080" + "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" + "020b20072101410021070c010b20074101762101200741016a41017621070b2001" + "41016a210120002802102106200028021821092000280214210a02400340200141" + "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" + "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" + "020c11818080800080808080000d00410021010340024020072001470d00200720" + "07490f0b200141016a2101200a200620092802101182808080008080808000450d" + "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" + "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" + "200020032004200128020c11818080800080808080000b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c200341e485c08000360208200342023702142003418380808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" + "200028020022040d002003410171450d010b02402003410171450d00200120026a" + "210502400240200028020c22060d0041002107200121080c010b41002107410021" + "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" + "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" + "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" + "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" + "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" + "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" + "2007200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a02402002" + "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" + "0641002103024020012007460d004100210302402009417c4b0d00410021034100" + "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" + "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" + "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" + "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" + "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" + "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" + "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" + "41002108024020054104490d002004200d41f007716a2109410021082004210303" + "40200328020c2207417f7341077620074106767241818284087120032802082207" + "417f7341077620074106767241818284087120032802042207417f734107762007" + "4106767241818284087120032802002207417f7341077620074106767241818284" + "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" + "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" + "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" + "4107762003410676724181828408712103200c4101460d0220082802042207417f" + "7341077620074106767241818284087120036a2103200c4102460d022008280208" + "2208417f7341077620084106767241818284087120036a21030c020b024020020d" + "00410021060c030b2002410371210802400240200241044f0d0041002106410021" + "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" + "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" + "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" + "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" + "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" + "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" + "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" + "024020002d00200e0402000102020b20052103410021050c010b20054101762103" + "200541016a41017621050b200341016a2103200028021021092000280218210820" + "00280214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c118180" + "80800080808080000f0b0240200720012002200828020c11818080800080808080" + "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" + "016a21032007200920082802101182808080008080808000450d000b2003417f6a" + "2005490b140020012000280200200028020410b2808080000b1c00200028020020" + "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" + "306b2203248080808000200341033a002c2003412036021c410021042003410036" + "02282003200136022420032000360220200341003602142003410036020c024002" + "40024002400240200228021022050d00200228020c2200450d0120022802082101" + "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" + "0240200041046a2802002207450d00200328022020002802002007200328022428" + "020c11818080800080808080000d040b20012802002003410c6a20012802041182" + "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" + "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" + "41016a210420022802082109200228020021004100210603400240200041046a28" + "02002201450d00200328022020002802002001200328022428020c118180808000" + "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" + "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" + "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" + "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" + "02102003200b36020c200141046a280200210702400240024020012802000e0301" + "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" + "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" + "2802002003410c6a200128020411828080800080808080000d02200041086a2100" + "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" + "0020044103746a22012802002001280204200328022428020c1181808080008080" + "808000450d010b410121010c010b410021010b200341306a24808080800020010b" + "d70201057f2380808080004180016b220224808080800002400240024002402001" + "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" + "030b41ff00210303402002200322046a22052000410f712203413072200341d700" + "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" + "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" + "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" + "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" + "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" + "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" + "20024180016a24808080800020000b7902017f017e23808080800041306b220324" + "808080800020032000360200200320013602042003410236020c2003419886c080" + "00360208200342023702142003418380808000ad4220862204200341046aad8437" + "0328200320042003ad843703202003200341206a360210200341086a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" + "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" + "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" + "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" + "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" + "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" + "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" + "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" + "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" + "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" + "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" + "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" + "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" + "0010a280808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641a888c0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541b089c080003602302005420537023c20054182" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418480808000ad422086200541286aad843703582005418580808000ad42" + "2086200541246aad843703502005418380808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541f089c080003602302005420337023c2005" + "418280808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418380808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541d088c080003602302005420437023c2005418280" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" + "000d00200128021441d881c080004102200128021828020c118180808000808080" + "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111828080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111828080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11818080800080808080000d010b2004412720011182808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410de808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" + "400240024041c8031084808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" + "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "df80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" + "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" + "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" + "00200028020021002002410036022c2002428080808010370224200241033a0050" + "200241203602402002410036024c200241c0a0c080003602482002410036023820" + "0241003602302002200241246a3602440240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002400240" + "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" + "1314151617180b024002400240024020002d00040e0400010203000b2002200028" + "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" + "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" + "2900e4ccc08000370000200241143602602002200336025c200241143602582002" + "410336026c200241ccccc08000360268200242023702742002418680808000ad42" + "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" + "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" + "8080002103024020022802582204450d00200228025c20041082808080000b2003" + "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" + "013702742002418280808000ad422086200241086aad8437035820022003410274" + "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" + "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" + "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" + "0c190b20002802082203280200200241306a200328020428021011828080800080" + "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" + "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" + "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" + "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" + "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" + "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" + "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" + "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" + "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" + "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" + "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" + "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" + "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" + "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" + "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" + "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" + "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" + "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" + "6a200241246a41086a280200360200200220022902243703582002418380808000" + "36027c2002418380808000360274200241888080800036026c2002410436020c20" + "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" + "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" + "280218200241086a10b5808080002100024020022802582201450d00200228025c" + "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" + "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" + "00280204200028020810b2808080000b4b01017f02402000280200200028020822" + "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" + "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" + "8080800041106b2202248080808000200028020821032000280204210441012105" + "024020012802142206412220012802182207280210220811828080800080808080" + "000d000240024020030d0041002103410021000c010b410021094100210a200421" + "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" + "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" + "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" + "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" + "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" + "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" + "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" + "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" + "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" + "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" + "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" + "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" + "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" + "0d010240024020022d0004418001470d0020062002280208200811828080800080" + "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" + "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" + "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" + "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" + "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" + "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" + "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" + "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" + "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" + "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" + "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" + "200728020c11818080800080808080000d00200641222008118280808000808080" + "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" + "05200128021828020c11818080800080808080000b1e01017f0240200028020022" + "01450d00200028020420011082808080000b0b5301047f02402000280208220120" + "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" + "200441dc00460d0120044120490d012000200141016a220136020820022001470d" + "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" + "0210cf80808000200028020821030b200028020420036a2001200210df80808000" + "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" + "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" + "20026b21074100210503400240024002400240200220056a2d00002208c0220941" + "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" + "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" + "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" + "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" + "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" + "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" + "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" + "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" + "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" + "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" + "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" + "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" + "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" + "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" + "0520042802082108024041141084808080002203450d002003200836020c200341" + "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" + "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" + "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" + "41106a2480808080000b5901017f23808080800041106b22012480808080002001" + "41086a2000200028020041014101410110d4808080000240200128020822004181" + "80808078460d002000200128020c109580808000000b200141106a248080808000" + "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" + "8080000240024020022f01140d0002400240024002400240024020022f01162203" + "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" + "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" + "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" + "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" + "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" + "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" + "2205418080046a210302402001280200200128020822006b41034b0d0020012000" + "410410cf80808000200128020821000b2001200041046a36020820012802042000" + "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" + "002005410676413f71418001723a000220002003410c76413f71418001723a0001" + "410021000c070b200220002802002000280204200028020810838080800041002d" + "00c0cfc080001a200228020421012002280200210341141084808080002200450d" + "042000200336020c20004114360200200020013602100c060b200241086a200028" + "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" + "21012002280208210341141084808080002200450d032000200336020c20004114" + "360200200020013602100c050b200241173602142000200241146a10d080808000" + "21000c040b200241173602142000200241146a10d08080800021000c030b024002" + "4002402003418001490d0002402001280200200128020822046b41034b0d002001" + "2004410410cf80808000200128020821040b200128020420046a21002003418010" + "4f0d0120034106764140722106410221050c020b02402001280208220020012802" + "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" + "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" + "60722106410321050b200020063a00002001200420056a360208200020056a417f" + "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" + "206a24808080800020000b910301057f23808080800041106b2202248080808000" + "02400240024002402001280204220320012802082204490d000240200320046b41" + "034b0d0020012003360208200241086a2001280200200320031083808080004100" + "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" + "0d022001200436020c2001410436020020002001360204200120033602100c030b" + "2001200441046a220536020802402001280200220620046a22012d000141017441" + "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" + "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" + "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" + "001a200228020421032002280200210441141084808080002201450d0220012004" + "36020c2001410c36020020002001360204200120033602100c030b200020013b01" + "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" + "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" + "022480808080000240024002402001280208220320012802042204490d00200241" + "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" + "032002280208210441141084808080002201450d022001200436020c2001410436" + "02002000200136020420012003360210410121010c010b2000200128020020036a" + "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" + "5601017f23808080800041106b2203248080808000200341086a20002001200241" + "01410110d480808000024020032802082202418180808078460d00200220032802" + "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" + "106b2202248080808000200241086a200028020020002802042000280208108380" + "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" + "8080800022000d00000b2000200436020c20002001290200370200200020033602" + "10200041086a200141086a280200360200200241106a24808080800020000b1f00" + "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" + "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" + "00200320016a3602080b200241106a24808080800041000b820101017f02400240" + "024002402003280204450d000240200328020822040d002002450d0341002d00c0" + "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" + "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" + "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" + "8080800041206b2206248080808000024002400240200220036a220320024f0d00" + "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" + "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" + "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" + "20080d00410021020c010b2006200820056c36021c200620012802043602142004" + "21020b20062002360218200641086a20042009200641146a10d380808000024020" + "062802080d00200628020c21022001200736020020012002360204418180808078" + "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" + "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" + "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" + "017120024101746b413e6a21020b200042003702102000200236021c2002410274" + "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" + "00360200200020033602182000200036020c20002000360208410041002802e8d2" + "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" + "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" + "03034020042003411d764104716a41106a22052802002202450d02200341017421" + "032002210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b20052000" + "360200200020043602182000200036020c200020003602080b0b00200010d98080" + "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" + "024002400240024020002802040e020001020b20020d0141012102410021030c02" + "0b20020d00200028020022022802042103200228020021020c010b200141808080" + "80783602002001200036020c2001418980808000200028021c22002d001c20002d" + "001d10da80808000000b20012003360204200120023602002001418a8080800020" + "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" + "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" + "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" + "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" + "086a200020011183808080008080808000000b410041003a0094d3c08000200245" + "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" + "02402002450d000240034020002d0000220420012d00002205470d01200041016a" + "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" + "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" + "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" + "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" + "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" + "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" + "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" + "280200210803402005417c6a220520082003742001280200220820027672360200" + "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" + "210103402005417c6a220520012802003602002001417c6a210120042005490d00" + "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" + "036a210502402003450d0020002104200121080340200420082d00003a00002008" + "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" + "6a210402400240200120036a2206410371450d0020074101480d01200641037422" + "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" + "21080340200520082002762001280200220820037472360200200141046a210120" + "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" + "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" + "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" + "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" + "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" + "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" + "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" + "00410020006b41037122046a210502402004450d00200021032001210603402003" + "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" + "01480d012009410374220641187121022009417c71220a41046a2101410020066b" + "4118712104200a2802002106034020052006200276200128020022062004747236" + "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" + "092101034020052001280200360200200141046a2101200541046a22052003490d" + "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" + "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" + "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" + "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" + "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" + "0a000000150000004b000000450010000a000000160000004b0000004163636f75" + "6e7400450010000a0000001700000033000000450010000a000000180000003300" + "00006361706163697479206f766572666c6f770000009800100011000000616c6c" + "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" + "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" + "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" + "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" + "686520696e6465782069732000150110002000000035011000120000003a200000" + "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" + "7273006c0110001300000066000000170000003078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230323132" + "323233323432353236323732383239333033313332333333343335333633373338" + "333934303431343234333434343534363437343834393530353135323533353435" + "353536353735383539363036313632363336343635363636373638363937303731" + "373237333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939636f72652f7372632f66" + "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" + "000000a40900001a00000072616e676520737461727420696e64657820206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" + "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" + "10000000a202100022000000736c69636520696e64657820737461727473206174" + "202062757420656e64732061742000f4021000160000000a0310000d0000000101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000020202020202" + "020202020202020202020202020202020202020202020202030303030303030303" + "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" + "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" + "000e0000003b041000040000003f041000100000004f0410000100000062797465" + "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" + "7420697320696e7369646520202862797465732029206f66206000700410000b00" + "00007b04100026000000a104100008000000a9041000060000004f041000010000" + "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" + "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" + "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" + "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" + "002c0510001d0000000a0000002b00000000060101030104020507070208080902" + "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" + "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" + "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" + "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" + "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" + "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" + "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" + "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" + "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" + "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" + "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" + "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" + "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" + "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" + "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" + "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" + "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" + "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" + "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" + "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" + "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" + "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" + "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" + "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" + "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" + "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" + "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" + "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" + "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" + "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" + "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" + "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" + "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" + "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" + "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" + "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" + "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" + "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" + "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" + "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" + "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" + "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" + "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" + "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" + "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" + "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" + "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" + "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" + "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" + "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" + "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" + "0239010405010204011402160601013a0101020104080107030a021e013b010101" + "0c01090128010301370101030503010407020b021d013a01020102010301050207" + "020b021c02390201010204080109010a021d014801040102030101080151010207" + "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" + "0202021902040310040d01020206010f01000300031d021e021e02400201070801" + "020b09012d030101750222017603040209010603db0202013a0101070101010102" + "08060a0201301f310430070101050128090c022004020201033801010203010103" + "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" + "04010a200250020001030104011902050197021a120d012608190b2e0330010204" + "020227014306020202020c0108012f01330101030202050201012a020801ee0102" + "01040100010010101000020001e201950500030102050428030401a50200040002" + "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" + "090a0402015f0302010102060102019d010308150239020101010116010e070305" + "c308020301011701510102060101020101020102eb010204060201021b02550802" + "0101026a0101010206010165030204010500090102f5010a020101040190040202" + "0401200a280602040801090602032e0d010200070106010152160207010201027a" + "06030101020107010148020301010100020b023405050101010001060f00053b07" + "00013f0451010002002e0217000101030405080802071e0494030037043208010e" + "011605010f000701110207010201056401a00700013d04000400076d07006080f0" + "002f72757374632f63326637346333663932386165623530336631356234653965" + "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" + "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" + "0e10006000000071010000360000002f72757374632f6332663734633366393238" + "61656235303366313562346539656635373738653737663330353862382f6c6962" + "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" + "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" + "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" + "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" + "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" + "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" + "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" + "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" + "00181d10005f00000058020000300000000d0000000c000000040000000e000000" + "0f00000010000000000000000000000001000000110000006120446973706c6179" + "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" + "20756e65787065637465646c792f72757374632f63326637346333663932386165" + "6235303366313562346539656635373738653737663330353862382f6c69627261" + "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" + "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" + "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" + "207768696c652070617273696e67206120737472696e67454f46207768696c6520" + "70617273696e6720612076616c7565657870656374656420603a60657870656374" + "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" + "78706563746564206964656e7465787065637465642076616c7565657870656374" + "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" + "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" + "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" + "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" + "206120737472696e676b6579206d757374206265206120737472696e67696e7661" + "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" + "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" + "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" + "6164696e6720737572726f6761746520696e206865782065736361706574726169" + "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" + "70656374656420656e64206f662068657820657363617065726563757273696f6e" + "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" + "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" + "4826100001000000000000000000f03f0000000000002440000000000000594000" + "00000000408f40000000000088c34000000000006af8400000000080842e410000" + "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" + "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" + "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" + "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" + "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" + "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" + "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" + "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" + "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" + "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" + "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" + "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" + "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" + "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" + "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" + "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" + "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" + "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" + "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" + "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" + "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" + "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" + "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" + "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" + "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" + "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" + "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" + "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" + "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" + "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" + "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" + "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" + "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" + "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" + "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" + "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" + "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" + "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" + "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" + "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" + "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" + "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" + "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" + "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" + "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" + "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" + "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" + "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" + "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" + "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" + "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" + "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" + "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" + "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" + "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" + "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" + "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" + "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" + "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" + "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" + "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" + "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" + "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" + "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" + "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" + "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" + "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" + "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" + "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" + "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" + "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" + "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" + "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" + "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" + "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" + "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" + "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" + "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" + "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" + "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" + "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" + "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" + "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" + "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" + "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" + "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" + "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" + "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" + "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" + "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" + "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" + "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" + "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" + "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" + "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" + "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" + "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" + "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" + "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" + "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" + "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" + "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" + "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" + "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" + "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" + "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" + "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" + "64656466696c6520746f6f206c617267657265736f757263652062757379657865" + "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" + "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" + "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" + "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" + "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" + "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" + "0048261000010000006f7065726174696f6e207375636365737366756c10000000" + "1100000012000000100000001000000013000000120000000d0000000e00000015" + "0000000c0000000b00000015000000150000000f0000000e000000130000002600" + "00003800000019000000170000000c000000090000000a00000010000000170000" + "00190000000e0000000d00000014000000080000001b0000000e00000010000000" + "16000000150000000b000000160000000d0000000b000000130000005023100060" + "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" + "1000f8231000042410000f24100024241000392410004824100056241000692410" + "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" + "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" + "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" + "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" + "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" + "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" + "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" + "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" + "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" + "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" + "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" + "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" + "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" + "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" + "243137683533326265333033376461316237656445064a5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" + "70617273655f6964656e743137683663353964643731393635353139313045074b" + "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" + "4c54245224475424313270617273655f6e756d6265723137683738336134316134" + "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" + "73657269616c697a6572244c54245224475424313370617273655f646563696d61" + "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" + "70617273655f6578706f6e656e7431376833366464376462643233653461346562" + "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" + "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" + "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" + "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" + "346636345f66726f6d5f7061727473313768633863316239626161613836666637" + "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" + "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" + "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" + "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" + "24313670617273655f616e795f6e756d6265723137683931643533303465356139" + "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" + "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" + "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" + "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" + "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" + "61775f7665633139526177566563244c54245424432441244754243867726f775f" + "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" + "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" + "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" + "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" + "62653863353535633862636433353545143c5f5a4e357365726465326465375669" + "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" + "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" + "68616e646c655f6572726f72313768393762376462643066373264643738384516" + "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" + "35766973697431376838366238393638313662613130613765451781015f5a4e37" + "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" + "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" + "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" + "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" + "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" + "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" + "244754243976697369745f73747231376835356436653830653061376366383938" + "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" + "6363657373244c5424522447542424753230246173247532302473657264652e2e" + "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" + "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" + "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" + "4c54244b24432456244324412447542436696e7365727431376834643164623464" + "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" + "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" + "244b244324562443244124475424247532302461732475323024636f72652e2e6f" + "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" + "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" + "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" + "702e2e5061727469616c4571244754243265713137683162323138393234373831" + "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" + "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" + "475424247532302461732475323024636f72652e2e697465722e2e747261697473" + "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" + "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" + "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" + "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" + "6e646578244754243130696e6465785f696e746f31376864333238633634636161" + "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" + "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" + "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" + "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" + "63617061636974795f6f766572666c6f7731376834393964343832613965643537" + "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" + "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" + "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" + "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" + "70616e69636b696e673570616e6963313768303465656239313764643933633232" + "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" + "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" + "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" + "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "244754243133646973706f73655f6368756e6b3137683665306363636434353836" + "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" + "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" + "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" + "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" + "2475323024666f7224753230247533322447542433666d74313768626633653032" + "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" + "70616e69635f626f756e64735f636865636b313768336436623861613463383034" + "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" + "363431376864353231666136656636613036373261452e11727573745f62656769" + "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" + "327061645f696e74656772616c3137686334656130376130626331333536633445" + "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" + "656772616c313277726974655f7072656669783137686139613433323830623630" + "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" + "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" + "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" + "706164313768343736396165333839333734636335314533495f5a4e34345f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" + "706c61792447542433666d74313768376666346430623836303963323437324534" + "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" + "2e666d742e2e44656275672447542433666d743137683361366261613162623437" + "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" + "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" + "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" + "3024666f7224753230247533322447542433666d74313768353533393862313635" + "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" + "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" + "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" + "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" + "6275675f657874313768656366613566303431373437393039384539345f5a4e34" + "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" + "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" + "6963655f6572726f725f6661696c31376862303364323439386438646362363433" + "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" + "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" + "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" + "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" + "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" + "656275672447542433666d7431376865613566643964626339343936626665453e" + "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" + "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" + "30246933322447542433666d743137686365643930633761363339633031646445" + "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" + "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" + "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" + "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" + "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" + "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" + "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" + "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" + "3130696e736572745f666974313768633861306366353339656666303131314541" + "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" + "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" + "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" + "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" + "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" + "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" + "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768343032353764366634326532" + "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" + "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" + "61792447542433666d74313768636534323236616131663732366331634544615f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" + "74655f73747231376835393964396535373839343664643938452e31393245575f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768623637326562313939633335643138364546555f5a4e35335f244c542463" + "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768663761653238353562323439" + "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" + "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" + "313768376236353738393966393837353963624548475f5a4e313073657264655f" + "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" + "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" + "616c6c6f63337665633136566563244c5424542443244124475424313765787465" + "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" + "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" + "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" + "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" + "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" + "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" + "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" + "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" + "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" + "6f64655f6865785f65736361706531376834376265353936383535663830346461" + "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" + "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" + "63377261775f7665633230526177566563496e6e6572244c542441244754243772" + "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" + "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" + "3472656164356572726f7231376865663535323764333333633963323666455130" + "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" + "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" + "666d742e2e577269746524475424313077726974655f6368617231376832313433" + "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" + "766563313166696e6973685f67726f773137683533383539626133383962373164" + "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" + "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" + "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" + "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" + "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" + "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" + "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" + "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" + "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" + "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" + "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" + "75376424247537642431376865313761333937376638396331313738455a3b5f5a" + "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" + "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" + "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" + "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" + "61735f73747231376865623366373232643232346534326638455c066d656d636d" + "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" + "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" + "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" + "2e726f6461746100550970726f64756365727302086c616e677561676501045275" + "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" + "6768746c79202863326637346333663920323032342d30392d30392900490f7461" + "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::string escrow_tx_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; + + std::vector escrow_tx_json_data( + escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasm( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasm( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + } + + void + testEscrowWasmP4() + { + testcase("escrow wasm P4 test"); + auto wasmHex = + "0061736d0100000001791160037f7f7f017f60027f7f017f60017f0060027f7f00" + "60037e7f7f017f60037f7f7f0060067f7f7f7f7f7f017f60017f017f60047f7f7f" + "7f017f60057f7f7f7f7f0060000060057f7f7f7f7f017f60077f7f7f7f7f7f7f01" + "7f60047f7f7f7f0060067f7f7f7f7f7f0060047f7f7f7e0060057f7f7f7e7f0003" + "7c7b01010301040506010202020202010102050001000103010007070303080500" + "090201020a03020500030305020b05050101010001010a0505050c090901010105" + "0903010101030d0d0502050d01030301010d0e020a0a02030101020a0d0d000101" + "0a030302020d03030205050003030f0f1010101009030000000004050170011e1e" + "05030100110619037f01418080c0000b7f004184e0c0000b7f004190e0c0000b07" + "5106066d656d6f7279020008616c6c6f6361746500180a6465616c6c6f63617465" + "001b11636f6d706172655f6163636f756e744944001c0a5f5f646174615f656e64" + "03010b5f5f686561705f6261736503020923010041010b1d210307122f30433134" + "3c3d443e59626708110e500d160942585a5e5f600a9188037b6601017f23808080" + "800041106b220224808080800002400240200028020c450d00200021010c010b20" + "0241086a200041086a280200360200200220002902003703002001200210818080" + "80002101200041141082808080000b200241106a24808080800020010b8c010103" + "7f23808080800041106b2202248080808000200241086a200028020c2000280210" + "200028021410c78080800041002d00e0dbc080001a200228020c21032002280208" + "21040240411410998080800022000d00000b2000200436020c2000200129020037" + "020020002003360210200041086a200141086a280200360200200241106a248080" + "80800020000b7001027f024002402000417c6a2802002202417871220341044108" + "200241037122021b20016a490d0002402002450d002003200141276a4b0d020b20" + "0010a5808080000f0b419db8c08000412e41ccb8c0800010a680808000000b41dc" + "b8c08000412e418cb9c0800010a680808000000be90201057f2380808080004180" + "016b22022480808080000240024002400240200128021c22034110710d00200341" + "20710d0120003100004101200110848080800021000c030b20002d0000210041ff" + "00210303402002200322046a22052000410f712203413072200341d7006a200341" + "0a491b3a00002004417f6a2103200041ff017122064104762100200641104f0d00" + "0c020b0b20002d0000210041ff00210303402002200322046a22052000410f7122" + "03413072200341376a2003410a491b3a00002004417f6a2103200041ff01712206" + "4104762100200641104f0d000b02402004418101490d002004418001419887c080" + "00108580808000000b2001410141a887c0800041022005418101200441016a6b10" + "868080800021000c010b02402004418101490d002004418001419887c080001085" + "80808000000b2001410141a887c0800041022005418101200441016a6b10868080" + "800021000b20024180016a24808080800020000bec0203027f017e037f23808080" + "800041306b2203248080808000412721040240024020004290ce005a0d00200021" + "050c010b412721040340200341096a20046a2206417c6a20004290ce0080220542" + "f0b1037e20007ca7220741ffff037141e4006e220841017441aa87c080006a2f00" + "003b00002006417e6a2008419c7f6c20076a41ffff037141017441aa87c080006a" + "2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22046a" + "2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441aa" + "87c080006a2f00003b00000b024002402006410a490d00200341096a2004417e6a" + "22046a200641017441aa87c080006a2f00003b00000c010b200341096a2004417f" + "6a22046a20064130723a00000b2002200141014100200341096a20046a41272004" + "6b1086808080002104200341306a24808080800020040b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c2003419c8ac08000360208200342023702142003418180808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bcb0501077f0240024020010d00200541016a2106" + "200028021c2107412d21080c010b412b418080c400200028021c22074101712201" + "1b2108200120056a21060b0240024020074104710d00410021020c010b02400240" + "20030d00410021090c010b02402003410371220a0d000c010b4100210920022101" + "0340200920012c000041bf7f4a6a2109200141016a2101200a417f6a220a0d000b" + "0b200920066a21060b024020002802000d00024020002802142201200028021822" + "0920082002200310ac80808000450d0041010f0b200120042005200928020c1180" + "8080800080808080000f0b02400240024002402000280204220120064b0d002000" + "28021422012000280218220920082002200310ac80808000450d0141010f0b2007" + "410871450d01200028021021072000413036021020002d0020210b4101210c2000" + "41013a0020200028021422092000280218220a20082002200310ac808080000d02" + "200120066b41016a2101024003402001417f6a2201450d0120094130200a280210" + "1181808080008080808000450d000b41010f0b0240200920042005200a28020c11" + "80808080008080808000450d0041010f0b2000200b3a0020200020073602104100" + "0f0b200120042005200928020c1180808080008080808000210c0c010b20012006" + "6b210702400240024020002d002022010e0402000100020b20072101410021070c" + "010b20074101762101200741016a41017621070b200141016a2101200028021021" + "06200028021821092000280214210a024003402001417f6a2201450d01200a2006" + "20092802101181808080008080808000450d000b41010f0b4101210c200a200920" + "082002200310ac808080000d00200a20042005200928020c118080808000808080" + "80000d00410021010340024020072001470d0020072007490f0b200141016a2101" + "200a200620092802101181808080008080808000450d000b2001417f6a2007490f" + "0b200c0be70201057f2380808080004180016b2202248080808000024002400240" + "0240200128021c22034110710d0020034120710d01200035020041012001108480" + "80800021000c030b2000280200210041ff00210303402002200322046a22052000" + "410f712203413072200341d7006a2003410a491b3a00002004417f6a2103200041" + "10492106200041047621002006450d000c020b0b2000280200210041ff00210303" + "402002200322046a22052000410f712203413072200341376a2003410a491b3a00" + "002004417f6a210320004110492106200041047621002006450d000b0240200441" + "8101490d002004418001419887c08000108580808000000b2001410141a887c080" + "0041022005418101200441016a6b10868080800021000c010b0240200441810149" + "0d002004418001419887c08000108580808000000b2001410141a887c080004102" + "2005418101200441016a6b10868080800021000b20024180016a24808080800020" + "000b1e01017f024020002802002201450d00200028020420011082808080000b0b" + "970101047f024002400240200028020022002802000e020001020b200028020822" + "01450d01200028020420011082808080000c010b20002d00044103470d00200028" + "0208220128020021020240200128020422032802002204450d0020022004118280" + "80800080808080000b024020032802042203450d00200220031082808080000b20" + "01410c1082808080000b200041141082808080000b6801017f0240024002400240" + "20002d00000e050303030102000b200041046a108b808080000c020b2000280204" + "2201450d01200028020820011082808080000f0b200041046a108c808080002000" + "2802042201450d002000280208200141186c1082808080000f0b0be30501067f23" + "808080800041306b22012480808080004100210241002103024020002802002204" + "450d00200120043602182001410036021420012004360208200141003602042001" + "2000280204220336021c2001200336020c20002802082103410121020b20012003" + "360220200120023602102001200236020002400240024003400240024002400240" + "024020030d002001280200450d0820012802082104200128020422030d01410021" + "00200128020c2203450d06034020042802980321042003417f6a22030d000c070b" + "0b20012003417f6a360220024020024101712203450d0020012802040d00200128" + "02082103200128020c2200450d03034020032802980321032000417f6a22000d00" + "0c040b0b2003450d01200128020421030c030b200421000c050b41a8acc0800010" + "a080808000000b200142003702082001200336020441012102200141013602000b" + "200128020821000240200128020c220520032f019203490d000240034020014124" + "6a2003200010bf8080800020012802242203450d0120012802282100200128022c" + "220520032f019203490d020c000b0b4188a5c0800010a080808000000b20054101" + "6a21040240024020000d002001200436020c20014100360208200120033602040c" + "010b200320044102746a4198036a21040340200428020022064198036a21042000" + "417f6a22000d000b20014200370208200120063602042003450d040b0240200320" + "05410c6c6a418c026a22002802002204450d00200028020420041082808080000b" + "02400240024002402003200541186c6a22032d00000e050303030102000b200341" + "046a108b808080000c020b20032802042200450d01200328020820001082808080" + "000c010b200341046a108c8080800020032802042200450d002003280208200041" + "186c1082808080000b200128022021030c000b0b200421030b0340200141246a20" + "03200010bf8080800020012802242203450d01200128022821000c000b0b200141" + "306a2480808080000b950101027f024020002802082201450d0020002802044104" + "6a2100034002400240024002402000417c6a2d00000e050303030102000b200010" + "8b808080000c020b20002802002202450d01200041046a28020020021082808080" + "000c010b2000108c8080800020002802002202450d00200041046a280200200241" + "186c1082808080000b200041186a21002001417f6a22010d000b0b0b2200200128" + "021441d4a6c080004105200128021828020c11808080800080808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "002000108f808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110908080" + "8000200028020821030b200028020420036a2002410c6a200110fa808080001a20" + "00200320016a3602080b200241106a24808080800041000b5901017f2380808080" + "0041106b2201248080808000200141086a2000200028020041014101410110d280" + "808000024020012802082200418180808078460d002000200128020c109a808080" + "00000b200141106a2480808080000b5601017f23808080800041106b2203248080" + "808000200341086a2000200120024101410110d280808000024020032802082202" + "418180808078460d002002200328020c109a80808000000b200341106a24808080" + "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" + "109080808000200028020821030b200028020420036a2001200210fa808080001a" + "2000200320026a36020841000b1400200120002802042000280208109380808000" + "0bc20b010b7f200028020821030240024002400240200028020022040d00200341" + "0171450d010b02402003410171450d00200120026a210502400240200028020c22" + "060d0041002107200121080c010b41002107410021092001210803402008220320" + "05460d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21080c" + "010b200341046a21080b200820036b20076a21072006200941016a2209470d000b" + "0b20082005460d00024020082c00002203417f4a0d0020034160491a0b02400240" + "2007450d000240200720024f0d00200120076a2c000041bf7f4a0d01410021030c" + "020b20072002460d00410021030c010b200121030b2007200220031b2102200320" + "0120031b21010b024020040d00200028021420012002200028021828020c118080" + "80800080808080000f0b2000280204210a024020024110490d0020022001200141" + "036a417c7122076b22096a220b4103712104410021064100210302402001200746" + "0d004100210302402009417c4b0d00410021034100210503402003200120056a22" + "082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841026a2c000041bf7f" + "4a6a200841036a2c000041bf7f4a6a2103200541046a22050d000b0b2001210803" + "40200320082c000041bf7f4a6a2103200841016a2108200941016a22090d000b0b" + "02402004450d002007200b417c716a22082c000041bf7f4a210620044101460d00" + "200620082c000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a" + "21060b200b4102762105200620036a21060340200721042005450d04200541c001" + "200541c001491b220b410371210c200b410274210d41002108024020054104490d" + "002004200d41f007716a210941002108200421030340200328020c2207417f7341" + "077620074106767241818284087120032802082207417f73410776200741067672" + "41818284087120032802042207417f734107762007410676724181828408712003" + "2802002207417f7341077620074106767241818284087120086a6a6a6a21082003" + "41106a22032009470d000b0b2005200b6b21052004200d6a2107200841087641ff" + "81fc0771200841ff81fc07716a418180046c41107620066a2106200c450d000b20" + "04200b41fc01714102746a22082802002203417f73410776200341067672418182" + "8408712103200c4101460d0220082802042207417f734107762007410676724181" + "8284087120036a2103200c4102460d0220082802082208417f7341077620084106" + "767241818284087120036a21030c020b024020020d00410021060c030b20024103" + "71210802400240200241044f0d0041002106410021090c010b4100210620012103" + "2002410c71220921070340200620032c000041bf7f4a6a200341016a2c000041bf" + "7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a21062003" + "41046a21032007417c6a22070d000b0b2008450d02200120096a21030340200620" + "032c000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11808080800080808080000f0b2003410876" + "41ff811c71200341ff81fc07716a418180046c41107620066a21060b0240024020" + "0a20064d0d00200a20066b21054100210302400240024020002d00200e04020001" + "02020b20052103410021050c010b20054101762103200541016a41017621050b20" + "0341016a210320002802102109200028021821082000280214210703402003417f" + "6a2203450d022007200920082802101181808080008080808000450d000b41010f" + "0b200028021420012002200028021828020c11808080800080808080000f0b0240" + "200720012002200828020c1180808080008080808000450d0041010f0b41002103" + "0340024020052003470d0020052005490f0b200341016a21032007200920082802" + "101181808080008080808000450d000b2003417f6a2005490b890503037f017e03" + "7f23808080800041f0006b220224808080800041002103024020002d0000220420" + "012d0000470d00410121030240024002400240024020040e06050001020304050b" + "20002d000120012d00014621030c040b4100210320002903082205200129030852" + "0d030240024002402005a70e03000102000b200029031020012903105121030c05" + "0b200029031020012903105121030c040b20002b031020012b03106121030c030b" + "41002103200028020c2204200128020c470d0220002802082001280208200410f7" + "808080004521030c020b41002103200028020c2206200128020c470d0120012802" + "08210420002802082100200641016a210103402001417f6a22014521032001450d" + "02200020041094808080002106200441186a2104200041186a210020060d000c02" + "0b0b41002103200028020c2204200128020c470d002002410036026c2002420037" + "026420024100360254200241003602442002410036023020024100360220200220" + "01280208220636025c2002200128020422033602582002200636024c2002200336" + "024820022000280208220636023820022000280204220136023420022006360228" + "2002200136022420022004410020031b3602602002200341004722033602502002" + "200336024020022004410020011b36023c20022001410047220336022c20022003" + "36021c200241c0006a21070340200241106a2002411c6a10958080800041012103" + "20022802102201450d0120022802142104200241086a2007109580808000200228" + "02082200450d0141002103200128020822062000280208470d01200228020c2108" + "20012802042000280204200610f7808080000d01200420081094808080000d000b" + "0b200241f0006a24808080800020030bed0201057f024002400240200128022022" + "020d00410021020c010b20012002417f6a36022002400240024020012802004101" + "470d0020012802040d01200128020821030240200128020c2202450d0003402003" + "2802980321032002417f6a22020d000b0b20014200370208200120033602042001" + "41013602000c020b41c8acc0800010a080808000000b200128020421030b200128" + "0208210202400240200128020c220420032f0192034f0d00200321050c010b0340" + "2003280288022205450d03200241016a210220032f019003210420052103200420" + "052f0192034f0d000b0b200441016a21030240024020020d00200521060c010b20" + "0520034102746a4198036a21030340200328020022064198036a21032002417f6a" + "22020d000b410021030b2001200336020c20014100360208200120063602042005" + "200441186c6a210320052004410c6c6a418c026a21020b20002003360204200020" + "023602000f0b41b8acc0800010a080808000000bae0301057f2380808080004110" + "6b220224808080800041012103024020012802142204419f81c08000410d200128" + "0218220528020c220611808080800080808080000d00024020012d001c4104710d" + "00200441f886c080004103200611808080800080808080000d01200441ac81c080" + "004104200611808080800080808080000d012004418bc2c0800041022006118080" + "80800080808080000d01200420002d0000410274220141dc83c080006a28020020" + "0141c883c080006a280200200611808080800080808080000d012004418187c080" + "0041022006118080808000808080800021030c010b200441fb86c0800041032006" + "11808080800080808080000d002002200536020420022004360200410121032002" + "41013a000f20022002410f6a360208200241ac81c0800041041097808080000d00" + "2002418bc2c0800041021097808080000d00200220002d0000410274220141dc83" + "c080006a280200200141c883c080006a2802001097808080000d00410121032002" + "41fe86c0800041021097808080000d002004418087c08000410120061180808080" + "00808080800021030b200241106a24808080800020030bdf04010c7f2001417f6a" + "210320002802042104200028020021052000280208210641002107410021084100" + "21094100210a02400340200a4101710d0102400240200920024b0d000340200120" + "096a210a0240024002400240200220096b220b41074b0d0020022009470d012002" + "21090c050b02400240200a41036a417c71220c200a6b220d450d00410021000340" + "200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b41786a" + "220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a94" + "a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b2000" + "727141808182847871418081828478470d02200c41086a210c200d41086a220d20" + "0e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b20004101" + "6a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a20" + "0d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a46" + "0d01200b200041016a2200470d000b200221090c030b2000200d6a21000b200020" + "096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d004100" + "210a2009210d200921000c030b200920024d0d000b0b20082002460d024101210a" + "2008210d200221000b0240024020062d0000450d00200541f486c0800041042004" + "28020c11808080800080808080000d010b200020086b210b4100210c0240200020" + "08460d00200320006a2d0000410a46210c0b200120086a21002006200c3a000020" + "0d210820052000200b200428020c1180808080008080808000450d010b0b410121" + "070b20070b4901017f410021010240024020004100480d00024020000d00410121" + "010c020b41002d00e0dbc080001a200010998080800022010d01410121010b2001" + "2000109a80808000000b20010bcb2502087f017e02400240024002400240024002" + "400240200041f501490d0041002101200041cdff7b4f0d052000410b6a22014178" + "71210241002802c4dfc080002203450d04411f21040240200041f4ffff074b0d00" + "2002410620014108766722006b7641017120004101746b413e6a21040b41002002" + "6b21010240200441027441a8dcc080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b742107410021060340" + "02402005220528020441787122082002490d00200820026b220820014f0d002008" + "21012005210620080d004100210120052106200521000c040b2005280214220820" + "00200820052007411d764104716a41106a2802002205471b200020081b21002007" + "41017421072005450d020c000b0b024041002802c0dfc08000220541102000410b" + "6a41f803712000410b491b22024103762201762200410371450d00024002402000" + "417f7341017120016a2207410374220041b8ddc080006a2201200041c0ddc08000" + "6a28020022022802082206460d002006200136020c200120063602080c010b4100" + "2005417e200777713602c0dfc080000b20022000410372360204200220006a2200" + "2000280204410172360204200241086a0f0b200241002802c8dfc080004d0d0302" + "400240024020000d0041002802c4dfc080002200450d0620006841027441a8dcc0" + "80006a280200220628020441787120026b21012006210503400240200628021022" + "000d00200628021422000d0020052802182104024002400240200528020c220020" + "05470d00200541144110200528021422001b6a28020022060d01410021000c020b" + "20052802082206200036020c200020063602080c010b200541146a200541106a20" + "001b21070340200721082006220041146a200041106a200028021422061b210720" + "004114411020061b6a28020022060d000b200841003602000b2004450d04024020" + "0528021c41027441a8dcc080006a22062802002005460d00200441104114200428" + "02102005461b6a20003602002000450d050c040b2006200036020020000d034100" + "41002802c4dfc08000417e200528021c77713602c4dfc080000c040b2000280204" + "41787120026b22062001200620014922061b21012000200520061b210520002106" + "0c000b0b02400240200020017441022001742200410020006b7271682208410374" + "220141b8ddc080006a2206200141c0ddc080006a28020022002802082207460d00" + "2007200636020c200620073602080c010b41002005417e200877713602c0dfc080" + "000b20002002410372360204200020026a2207200120026b220641017236020420" + "0020016a2006360200024041002802c8dfc080002205450d00200541787141b8dd" + "c080006a210141002802d0dfc0800021020240024041002802c0dfc08000220841" + "012005410376742205710d00410020082005723602c0dfc08000200121050c010b" + "200128020821050b200120023602082005200236020c2002200136020c20022005" + "3602080b410020073602d0dfc08000410020063602c8dfc08000200041086a0f0b" + "20002004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b02400240024020" + "014110490d0020052002410372360204200520026a220220014101723602042002" + "20016a200136020041002802c8dfc080002207450d01200741787141b8ddc08000" + "6a210641002802d0dfc0800021000240024041002802c0dfc08000220841012007" + "410376742207710d00410020082007723602c0dfc08000200621070c010b200628" + "020821070b200620003602082007200036020c2000200636020c20002007360208" + "0c010b2005200120026a2200410372360204200520006a22002000280204410172" + "3602040c010b410020023602d0dfc08000410020013602c8dfc080000b20054108" + "6a0f0b024020002006720d004100210641022004742200410020006b7220037122" + "00450d0320006841027441a8dcc080006a28020021000b2000450d010b03402000" + "20062000280204417871220520026b220820014922041b21032005200249210720" + "08200120041b21080240200028021022050d00200028021421050b200620032007" + "1b21062001200820071b21012005210020050d000b0b2006450d00024041002802" + "c8dfc0800022002002490d002001200020026b4f0d010b20062802182104024002" + "400240200628020c22002006470d00200641144110200628021422001b6a280200" + "22050d01410021000c020b20062802082205200036020c200020053602080c010b" + "200641146a200641106a20001b21070340200721082005220041146a200041106a" + "200028021422051b210720004114411020051b6a28020022050d000b2008410036" + "02000b2004450d030240200628021c41027441a8dcc080006a2205280200200646" + "0d0020044110411420042802102006461b6a20003602002000450d040c030b2005" + "200036020020000d02410041002802c4dfc08000417e200628021c77713602c4df" + "c080000c030b02400240024002400240024041002802c8dfc08000220020024f0d" + "00024041002802ccdfc08000220020024b0d0041002101200241af80046a220641" + "107640002200417f4622070d0720004110742205450d07410041002802d8dfc080" + "00410020064180807c7120071b22086a22003602d8dfc08000410041002802dcdf" + "c0800022012000200120004b1b3602dcdfc0800002400240024041002802d4dfc0" + "80002201450d0041a8ddc080002100034020002802002206200028020422076a20" + "05460d02200028020822000d000c030b0b0240024041002802e4dfc08000220045" + "0d00200020054d0d010b410020053602e4dfc080000b410041ff1f3602e8dfc080" + "00410020083602acddc08000410020053602a8ddc08000410041b8ddc080003602" + "c4ddc08000410041c0ddc080003602ccddc08000410041b8ddc080003602c0ddc0" + "8000410041c8ddc080003602d4ddc08000410041c0ddc080003602c8ddc0800041" + "0041d0ddc080003602dcddc08000410041c8ddc080003602d0ddc08000410041d8" + "ddc080003602e4ddc08000410041d0ddc080003602d8ddc08000410041e0ddc080" + "003602ecddc08000410041d8ddc080003602e0ddc08000410041e8ddc080003602" + "f4ddc08000410041e0ddc080003602e8ddc08000410041f0ddc080003602fcddc0" + "8000410041e8ddc080003602f0ddc08000410041003602b4ddc08000410041f8dd" + "c08000360284dec08000410041f0ddc080003602f8ddc08000410041f8ddc08000" + "360280dec0800041004180dec0800036028cdec0800041004180dec08000360288" + "dec0800041004188dec08000360294dec0800041004188dec08000360290dec080" + "0041004190dec0800036029cdec0800041004190dec08000360298dec080004100" + "4198dec080003602a4dec0800041004198dec080003602a0dec08000410041a0de" + "c080003602acdec08000410041a0dec080003602a8dec08000410041a8dec08000" + "3602b4dec08000410041a8dec080003602b0dec08000410041b0dec080003602bc" + "dec08000410041b0dec080003602b8dec08000410041b8dec080003602c4dec080" + "00410041c0dec080003602ccdec08000410041b8dec080003602c0dec080004100" + "41c8dec080003602d4dec08000410041c0dec080003602c8dec08000410041d0de" + "c080003602dcdec08000410041c8dec080003602d0dec08000410041d8dec08000" + "3602e4dec08000410041d0dec080003602d8dec08000410041e0dec080003602ec" + "dec08000410041d8dec080003602e0dec08000410041e8dec080003602f4dec080" + "00410041e0dec080003602e8dec08000410041f0dec080003602fcdec080004100" + "41e8dec080003602f0dec08000410041f8dec08000360284dfc08000410041f0de" + "c080003602f8dec0800041004180dfc0800036028cdfc08000410041f8dec08000" + "360280dfc0800041004188dfc08000360294dfc0800041004180dfc08000360288" + "dfc0800041004190dfc0800036029cdfc0800041004188dfc08000360290dfc080" + "0041004198dfc080003602a4dfc0800041004190dfc08000360298dfc080004100" + "41a0dfc080003602acdfc0800041004198dfc080003602a0dfc08000410041a8df" + "c080003602b4dfc08000410041a0dfc080003602a8dfc08000410041b0dfc08000" + "3602bcdfc08000410041a8dfc080003602b0dfc08000410020053602d4dfc08000" + "410041b0dfc080003602b8dfc080004100200841586a22003602ccdfc080002005" + "2000410172360204200520006a4128360204410041808080013602e0dfc080000c" + "080b200120054f0d00200620014b0d00200028020c450d030b410041002802e4df" + "c080002200200520002005491b3602e4dfc08000200520086a210641a8ddc08000" + "21000240024002400340200028020022072006460d01200028020822000d000c02" + "0b0b200028020c450d010b41a8ddc0800021000240034002402000280200220620" + "014b0d002001200620002802046a2206490d020b200028020821000c000b0b4100" + "20053602d4dfc080004100200841586a22003602ccdfc080002005200041017236" + "0204200520006a4128360204410041808080013602e0dfc080002001200641606a" + "41787141786a22002000200141106a491b2207411b36020441002902a8ddc08000" + "2109200741106a41002902b0ddc0800037020020072009370208410020083602ac" + "ddc08000410020053602a8ddc080004100200741086a3602b0ddc0800041004100" + "3602b4ddc080002007411c6a2100034020004107360200200041046a2200200649" + "0d000b20072001460d0720072007280204417e713602042001200720016b220041" + "01723602042007200036020002402000418002490d002001200010e3808080000c" + "080b200041f8017141b8ddc080006a21060240024041002802c0dfc08000220541" + "012000410376742200710d00410020052000723602c0dfc08000200621000c010b" + "200628020821000b200620013602082000200136020c2001200636020c20012000" + "3602080c070b200020053602002000200028020420086a36020420052002410372" + "3602042007410f6a41787141786a2201200520026a22006b2102200141002802d4" + "dfc08000460d03200141002802d0dfc08000460d04024020012802042206410371" + "4101470d0020012006417871220610a880808000200620026a2102200120066a22" + "0128020421060b20012006417e7136020420002002410172360204200020026a20" + "0236020002402002418002490d002000200210e3808080000c060b200241f80171" + "41b8ddc080006a21010240024041002802c0dfc080002206410120024103767422" + "02710d00410020062002723602c0dfc08000200121020c010b200128020821020b" + "200120003602082002200036020c2000200136020c200020023602080c050b4100" + "200020026b22013602ccdfc08000410041002802d4dfc08000220020026a220636" + "02d4dfc080002006200141017236020420002002410372360204200041086a2101" + "0c060b41002802d0dfc08000210102400240200020026b2206410f4b0d00410041" + "003602d0dfc08000410041003602c8dfc080002001200041037236020420012000" + "6a220020002802044101723602040c010b410020063602c8dfc080004100200120" + "026a22053602d0dfc0800020052006410172360204200120006a20063602002001" + "20024103723602040b200141086a0f0b2000200720086a360204410041002802d4" + "dfc080002200410f6a417871220141786a22063602d4dfc080004100200020016b" + "41002802ccdfc0800020086a22016a41086a22053602ccdfc08000200620054101" + "72360204200020016a4128360204410041808080013602e0dfc080000c030b4100" + "20003602d4dfc08000410041002802ccdfc0800020026a22023602ccdfc0800020" + "0020024101723602040c010b410020003602d0dfc08000410041002802c8dfc080" + "0020026a22023602c8dfc0800020002002410172360204200020026a2002360200" + "0b200541086a0f0b4100210141002802ccdfc08000220020024d0d004100200020" + "026b22013602ccdfc08000410041002802d4dfc08000220020026a22063602d4df" + "c080002006200141017236020420002002410372360204200041086a0f0b20010f" + "0b20002004360218024020062802102205450d0020002005360210200520003602" + "180b20062802142205450d0020002005360214200520003602180b024002402001" + "4110490d0020062002410372360204200620026a22002001410172360204200020" + "016a200136020002402001418002490d002000200110e3808080000c020b200141" + "f8017141b8ddc080006a21020240024041002802c0dfc080002205410120014103" + "76742201710d00410020052001723602c0dfc08000200221010c010b2002280208" + "21010b200220003602082001200036020c2000200236020c200020013602080c01" + "0b2006200120026a2200410372360204200620006a220020002802044101723602" + "040b200641086a0b1000024020000d0010a3808080000b000b140002402001450d" + "00200020011082808080000b0ba20b03087f017e017f2380808080004190016b22" + "04248080808000200441e8006a20002001109d8080800002400240024002400240" + "024002400240024002400240024020042d00684106460d00200441106a200441e8" + "006a41106a2205290300370300200441086a200441e8006a41086a220629030037" + "030020042004290368370300200441e8006a20022003109d8080800020042d0068" + "4106460d01200441186a41106a2005290300370300200441186a41086a20062903" + "003703002004200429036837031841dc81c0800041072004109e80808000220745" + "0d0241dc81c080004107200441186a109e808080002208450d03418482c0800041" + "04200441186a109e808080002206450d0420062d00004103462205450d05410021" + "092006280208410020051b210502400240200628020c220a0e020c00010b410121" + "0920052d000041556a0e030b080b080b20052d0000412b470d06200541016a2105" + "200a410a492106200a417f6a2209210a20060d070c080b2004200428026c36024c" + "41b880c08000412b200441cc006a41e480c0800041bc81c08000109f8080800000" + "0b2004200428026c36024c41b880c08000412b200441cc006a41e480c0800041cc" + "81c08000109f80808000000b41e481c0800010a080808000000b41f481c0800010" + "a080808000000b418882c0800010a080808000000b419882c0800010a080808000" + "000b200a2109200a41094f0d010b41002106034020052d000041506a220a41094b" + "0d02200541016a2105200a2006410a6c6a21062009417f6a22090d000c040b0b41" + "0021060340200a450d0320052d000041506a220b41094b0d01410221092006ad42" + "0a7e220c422088a74100470d02200541016a2105200a417f6a210a200b200ca722" + "0d6a2206200d4f0d000c020b0b410121090b200420093a006841b880c08000412b" + "200441e8006a41a880c0800041a882c08000109f80808000000b20042006360230" + "02400240200720081094808080000d00200441003a00370c010b20042006417f6a" + "220536023002402005450d00200441003a00370c010b200441013a00370b200441" + "0336026c200441d482c08000360268200442023702742004418180808000360258" + "20044182808080003602502004200441cc006a3602702004200441306a36025420" + "04200441376a36024c200441e8006a10a28080800041002d00e0dbc080001a0240" + "02400240024041091099808080002205450d00200520042d00373a000020044100" + "360254200442808080801037024c200441033a0088012004412036027820044100" + "360284012004418080c08000360280012004410036027020044100360268200420" + "0441cc006a36027c20043502304101200441e8006a1084808080000d0120044138" + "6a41086a200441cc006a41086a2802003602002004200429024c37033841002d00" + "e0dbc080001a200428023c210641041099808080002209450d0220092006360000" + "2005200636000120042004280240220a36024841002d00e0dbc080001a20044104" + "3602444104109980808000220b450d032005200a360005200b200a360000200441" + "05360250200441a083c0800036024c200442043702582004418180808000360284" + "01200441818080800036027c200441838080800036027420044184808080003602" + "6c200420063602642004200441e8006a3602542004200441c8006a360280012004" + "200441c4006a3602782004200441e4006a3602702004200441386a360268200441" + "cc006a10a280808000200b41041082808080002009410410828080800020044118" + "6a108a808080002004108a8080800002402003450d00200220031082808080000b" + "02402001450d00200020011082808080000b20044190016a24808080800020050f" + "0b41014109109a80808000000b41c0a5c080004137200441e4006a419880c08000" + "41c4a6c08000109f80808000000b41014104109a80808000000b41014104109a80" + "808000000bea0301057f23808080800041e0006b22032480808080002003410036" + "0228200320023602242003200136022020034180013a002c2003410036021c2003" + "428080808010370214200341c8006a200341146a10e88080800002400240024002" + "4020032d00484106460d00200341306a41106a2204200341c8006a41106a290300" + "370300200341306a41086a2205200341c8006a41086a2903003703002003200329" + "03483703300240024020032802282202200328022422064f0d0020032802202107" + "0340200720026a2d000041776a220141174b0d024101200174419380800471450d" + "022006200241016a2202470d000b200320063602280b2000200329033037030020" + "0041106a2004290300370300200041086a20052903003703002003280214220245" + "0d04200328021820021082808080000c040b20032002360228200341086a200720" + "062006200241016a220220062002491b10c78080800041002d00e0dbc080001a20" + "0328020c21012003280208210641141099808080002202450d012002200636020c" + "2002411636020020002002360204200041063a000020022001360210200341306a" + "108a808080000c020b2000200328024c360204200041063a00000c010b000b2003" + "2802142202450d00200328021820021082808080000b200341e0006a2480808080" + "000be60101077f41002103024020022d00004105470d0020022802042204450d00" + "2002280208210503402004418c026a210220042f0192032206410c6c2107417f21" + "08024002400340024020070d00200621080c020b20022802082103200228020421" + "09200841016a2108200741746a21072002410c6a2102417f200020092001200320" + "012003491b10f7808080002209200120036b20091b220341004720034100481b22" + "034101460d000b200341ff0171450d010b024020050d0041000f0b2005417f6a21" + "05200420084102746a4198036a28020021040c010b0b2004200841186c6a21030b" + "20030b8f0101017f23808080800041c0006b22052480808080002005200136020c" + "2005200036020820052003360214200520023602102005410236021c200541e486" + "c08000360218200542023702242005418580808000ad422086200541106aad8437" + "03382005418680808000ad422086200541086aad843703302005200541306a3602" + "20200541186a200410a480808000000b130041ec84c08000412b200010a6808080" + "00000b11002000350200410120011084808080000bbe0604017f017e037f017e23" + "808080800041c0006b22012480808080002001410636020c200141b0c2c0800036" + "0208024041002d0090dcc080004103460d0010db808080000b0240024002400240" + "024041002903f8dfc0800022024200520d0002404100280280e0c0800022030d00" + "10d5808080004100280280e0c0800021030b20032003280200220441016a360200" + "2004417f4c0d012003450d02200320032802002204417f6a360200200329030821" + "0220044101470d00200310d6808080000b024002400240200241002903e8dbc080" + "00510d0041002d00f4dbc08000210441012103410041013a00f4dbc08000200120" + "043a00182004450d012001420037023420014281808080c00037022c200141d8c3" + "c08000360228200141186a200141286a10d780808000000b024041002802f0dbc0" + "80002203417f460d00200341016a21030c020b41b8c4c08000412641fcc4c08000" + "10b780808000000b410020023703e8dbc080000b410020033602f0dbc080002001" + "41e8dbc0800036021041042103200141043a00182001200141106a360220200141" + "186a41dcb7c08000200010b280808000210020012d001821040240024020000d00" + "420021024117200441ff0171764101710d01200128021c22032802002100024020" + "0341046a28020022042802002205450d002000200511828080800080808080000b" + "024020042802042204450d00200020041082808080000b2003410c108280808000" + "410421030c010b200441ff01714104460d032001290318220642807e8321022006" + "a721030b200128021022002000280208417f6a2204360208024020040d00200041" + "003a000c200042003703000b200341ff01714104470d03200141c0006a24808080" + "80000f0b000b419cb9c0800041de004190bac0800010b780808000000b20014100" + "3602382001410136022c200141a0c3c0800036022820014204370230200141286a" + "41a8c3c0800010a480808000000b200120022003ad42ff01838437031020014102" + "36022c20014190c2c08000360228200142023702342001418780808000ad422086" + "200141106aad843703202001418680808000ad422086200141086aad8437031820" + "01200141186a360230200141286a41a0c2c0800010a480808000000b4701017f23" + "808080800041206b2200248080808000200041003602182000410136020c200041" + "8484c0800036020820004204370210200041086a41a084c0800010a48080800000" + "0b5601017f23808080800041206b2202248080808000200241106a200041106a29" + "0200370300200241086a200041086a290200370300200241013b011c2002200136" + "021820022000290200370300200210ab80808000000bbe0601057f200041786a22" + "012000417c6a280200220241787122006a21030240024020024101710d00200241" + "0271450d012001280200220220006a21000240200120026b220141002802d0dfc0" + "8000470d0020032802044103714103470d01410020003602c8dfc0800020032003" + "280204417e7136020420012000410172360204200320003602000f0b2001200210" + "a8808080000b024002400240024002400240200328020422024102710d00200341" + "002802d4dfc08000460d02200341002802d0dfc08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a200036020020" + "0141002802d0dfc08000470d01410020003602c8dfc080000f0b20032002417e71" + "36020420012000410172360204200120006a20003602000b2000418002490d0220" + "01200010e38080800041002101410041002802e8dfc08000417f6a22003602e8df" + "c0800020000d04024041002802b0ddc080002200450d0041002101034020014101" + "6a2101200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602e8dfc0" + "80000f0b410020013602d4dfc08000410041002802ccdfc0800020006a22003602" + "ccdfc08000200120004101723602040240200141002802d0dfc08000470d004100" + "41003602c8dfc08000410041003602d0dfc080000b200041002802e0dfc0800022" + "044d0d0341002802d4dfc080002200450d034100210241002802ccdfc080002205" + "4129490d0241a8ddc080002101034002402001280200220320004b0d0020002003" + "20012802046a490d040b200128020821010c000b0b410020013602d0dfc0800041" + "0041002802c8dfc0800020006a22003602c8dfc080002001200041017236020420" + "0120006a20003602000f0b200041f8017141b8ddc080006a210302400240410028" + "02c0dfc08000220241012000410376742200710d00410020022000723602c0dfc0" + "8000200321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802b0ddc080002201450d00410021" + "020340200241016a2102200128020822010d000b0b4100200241ff1f200241ff1f" + "4b1b3602e8dfc08000200520044d0d004100417f3602e0dfc080000b0b4d01017f" + "23808080800041206b220324808080800020034100360210200341013602042003" + "42043702082003200136021c200320003602182003200341186a36020020032002" + "10a480808000000b840601057f0240024002402000417c6a220328020022044178" + "71220541044108200441037122061b20016a490d0002402006450d002005200141" + "276a4b0d020b41102002410b6a4178712002410b491b210102400240024020060d" + "002001418002490d0120052001410472490d01200520016b418180084f0d010c02" + "0b200041786a220720056a21060240024002400240200520014f0d002006410028" + "02d4dfc08000460d03200641002802d0dfc08000460d0220062802042204410271" + "0d042004417871220420056a22052001490d042006200410a88080800020052001" + "6b22024110490d0120032001200328020041017172410272360200200720016a22" + "012002410372360204200720056a220520052802044101723602042001200210a9" + "8080800020000f0b200520016b2202410f4d0d0420032001200441017172410272" + "360200200720016a22052002410372360204200620062802044101723602042005" + "200210a98080800020000f0b200320052003280200410171724102723602002007" + "20056a2202200228020441017236020420000f0b41002802c8dfc0800020056a22" + "052001490d0102400240200520016b2202410f4b0d002003200441017120057241" + "0272360200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236020420" + "0720056a2205200236020020052005280204417e713602040b410020013602d0df" + "c08000410020023602c8dfc0800020000f0b41002802ccdfc0800020056a220520" + "014b0d040b0240200210998080800022050d0041000f0b20052000417c41782003" + "28020022014103711b20014178716a2201200220012002491b10fa808080002102" + "200010a580808000200221000b20000f0b419db8c08000412e41ccb8c0800010a6" + "80808000000b41dcb8c08000412e418cb9c0800010a680808000000b2003200120" + "0441017172410272360200200720016a2202200520016b22054101723602044100" + "20053602ccdfc08000410020023602d4dfc0800020000b820301047f200028020c" + "21020240024002402001418002490d002000280218210302400240024020022000" + "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" + "002802082201200236020c200220013602080c010b200041146a200041106a2002" + "1b21040340200421052001220241146a200241106a200228021422011b21042002" + "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" + "28021c41027441a8dcc080006a22012802002000460d0020034110411420032802" + "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" + "002802c4dfc08000417e200028021c77713602c4dfc080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b410041002802c0dfc0" + "8000417e200141037677713602c0dfc080000f0b20022003360218024020002802" + "102201450d0020022001360210200120023602180b20002802142201450d002002" + "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" + "28020422034101710d002003410271450d012000280200220320016a2101024020" + "0020036b220041002802d0dfc08000470d0020022802044103714103470d014100" + "20013602c8dfc0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a8808080000b02400240024002402002280204" + "22034102710d00200241002802d4dfc08000460d02200241002802d0dfc0800046" + "0d0320022003417871220310a8808080002000200320016a220141017236020420" + "0020016a2001360200200041002802d0dfc08000470d01410020013602c8dfc080" + "000f0b20022003417e7136020420002001410172360204200020016a2001360200" + "0b02402001418002490d002000200110e3808080000f0b200141f8017141b8ddc0" + "80006a21020240024041002802c0dfc08000220341012001410376742201710d00" + "410020032001723602c0dfc08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602d4" + "dfc08000410041002802ccdfc0800020016a22013602ccdfc08000200020014101" + "72360204200041002802d0dfc08000470d01410041003602c8dfc0800041004100" + "3602d0dfc080000f0b410020003602d0dfc08000410041002802c8dfc080002001" + "6a22013602c8dfc0800020002001410172360204200020016a20013602000f0b0b" + "7902017f017e23808080800041306b220324808080800020032001360204200320" + "003602002003410236020c200341cc85c080003602082003420237021420034181" + "80808000ad42208622042003ad8437032820032004200341046aad843703202003" + "200341206a360210200341086a200210a480808000000b5d01027f238080808000" + "41206b220124808080800020002802182102200141106a200041106a2902003703" + "00200141086a200041086a2902003703002001200036021c200120023602182001" + "2000290200370300200110e480808000000b490002402002418080c400460d0020" + "00200220012802101181808080008080808000450d0041010f0b024020030d0041" + "000f0b200020032004200128020c11808080800080808080000b7902017f017e23" + "808080800041306b22032480808080002003200036020020032001360204200341" + "0236020c200341bc8ac08000360208200342023702142003418180808000ad4220" + "862204200341046aad84370328200320042003ad843703202003200341206a3602" + "10200341086a200210a480808000000b820302017f017e23808080800041f0006b" + "2203248080808000200341ccb7c0800036020c20032000360208200341ccb7c080" + "00360214200320013602102003410236021c200341dc85c0800036021802402002" + "2802000d002003410336025c2003419086c0800036025820034203370264200341" + "8580808000ad4220862204200341106aad8437034820032004200341086aad8437" + "03402003418680808000ad422086200341186aad843703382003200341386a3602" + "60200341d8006a4184c4c0800010a480808000000b200341206a41106a20024110" + "6a290200370300200341206a41086a200241086a29020037030020032002290200" + "3703202003410436025c200341c486c08000360258200342043702642003418580" + "808000ad4220862204200341106aad8437035020032004200341086aad84370348" + "2003418880808000ad422086200341206aad843703402003418680808000ad4220" + "86200341186aad843703382003200341386a360260200341d8006a4184c4c08000" + "10a480808000000b1c0020002802002001200028020428020c1181808080008080" + "8080000b14002001200028020020002802041093808080000b1400200128021420" + "01280218200010b2808080000bbf05010a7f23808080800041306b220324808080" + "8000200341033a002c2003412036021c4100210420034100360228200320013602" + "2420032000360220200341003602142003410036020c0240024002400240024020" + "0228021022050d00200228020c2200450d01200228020821012000410374210620" + "00417f6a41ffffffff017141016a21042002280200210003400240200041046a28" + "02002207450d00200328022020002802002007200328022428020c118080808000" + "80808080000d040b20012802002003410c6a200128020411818080800080808080" + "000d03200141086a2101200041086a2100200641786a22060d000c020b0b200228" + "02142201450d00200141057421082001417f6a41ffffff3f7141016a2104200228" + "02082109200228020021004100210603400240200041046a2802002201450d0020" + "0328022020002802002001200328022428020c11808080800080808080000d030b" + "2003200520066a220141106a28020036021c20032001411c6a2d00003a002c2003" + "200141186a2802003602282001410c6a28020021074100210a4100210b02400240" + "0240200141086a2802000e03010002010b2007410374210c4100210b2009200c6a" + "220c2802040d01200c28020021070b4101210b0b200320073602102003200b3602" + "0c200141046a280200210702400240024020012802000e03010002010b20074103" + "74210b2009200b6a220b2802040d01200b28020021070b4101210a0b2003200736" + "02182003200a3602142009200141146a2802004103746a22012802002003410c6a" + "200128020411818080800080808080000d02200041086a21002008200641206a22" + "06470d000b0b200420022802044f0d012003280220200228020020044103746a22" + "012802002001280204200328022428020c1180808080008080808000450d010b41" + "0121010c010b410021010b200341306a24808080800020010bd70201057f238080" + "8080004180016b22022480808080000240024002400240200128021c2203411071" + "0d0020034120710d012000ad4101200110848080800021000c030b41ff00210303" + "402002200322046a22052000410f712203413072200341d7006a2003410a491b3a" + "00002004417f6a210320004110492106200041047621002006450d000c020b0b41" + "ff00210303402002200322046a22052000410f712203413072200341376a200341" + "0a491b3a00002004417f6a210320004110492106200041047621002006450d000b" + "02402004418101490d002004418001419887c08000108580808000000b20014101" + "41a887c0800041022005418101200441016a6b10868080800021000c010b024020" + "04418101490d002004418001419887c08000108580808000000b2001410141a887" + "c0800041022005418101200441016a6b10868080800021000b20024180016a2480" + "8080800020000b2200200128021441c284c08000410e200128021828020c118080" + "80800080808080000b6001017f23808080800041306b2200248080808000200041" + "0136020c200041e484c08000360208200042013702142000418980808000ad4220" + "862000412f6aad843703202000200041206a360210200041086a41e8c1c0800010" + "a480808000000b7902017f017e23808080800041306b2203248080808000200320" + "00360200200320013602042003410236020c200341f08ac0800036020820034202" + "3702142003418180808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b6a0101" + "7f23808080800041306b22032480808080002003200136020c2003200036020820" + "034101360214200341f0bac080003602102003420137021c2003418680808000ad" + "422086200341086aad843703282003200341286a360218200341106a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441809b" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41809bc080006a280200410b7420024b1b22042004410272220420044102744180" + "9bc080006a280200410b7420024b1b2204200441016a2204200441027441809bc0" + "80006a280200410b7420024b1b2204200441016a2204200441027441809bc08000" + "6a280200410b7420024b1b220441027441809bc080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441809bc080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441fc9ac080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241849cc080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641b284c080006a2d" + "00003a000b20032001410476410f7141b284c080006a2d00003a000f2003200141" + "0876410f7141b284c080006a2d00003a000e20032001410c76410f7141b284c080" + "006a2d00003a000d20032001411076410f7141b284c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141b284c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b2004412141e09ac0800010aa80808000000b200541d70541" + "f09ac0800010aa80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141c48fc08000412c419c90c0800041c40141" + "e091c0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141a295c08000412841f295c080" + "0041a002419298c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641b284c080006a2d00003a001720032001410476410f71" + "41b284c080006a2d00003a001b20032001410876410f7141b284c080006a2d0000" + "3a001a20032001410c76410f7141b284c080006a2d00003a001920032001411076" + "410f7141b284c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141b284c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41b48fc0800010b680808000000b200c200441b48fc0800010ad" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41a48fc080" + "0010a080808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641808dc0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541888ec080003602302005420537023c20054186" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418a80808000ad422086200541286aad843703582005418b80808000ad42" + "2086200541246aad843703502005418180808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541c88ec080003602302005420337023c2005" + "418680808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418180808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541a88dc080003602302005420437023c2005418680" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418180808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "200641f48ec0800010b680808000000b200410a080808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b3808080" + "000d00200128021441b084c080004102200128021828020c118080808000808080" + "80000d002000280204200110b38080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111818080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111818080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11808080800080808080000d010b2004412720011181808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f7620011084808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10f9808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10f9808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410f9808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00e0dbc080001a200128020022032f01920321040240024002" + "400240024041c8031099808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10fa8080" + "80001a20052003200b41186c6a200841186c10fa80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "fa80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810fa80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41a0a4c0800010ad80808000000b41e8a3c0800041284190a4c0800010a68080" + "8000000b2008410c41b0a4c0800010ad80808000000b41e8a3c0800041284190a4" + "c0800010a680808000000b900801017f23808080800041f0006b22022480808080" + "0020002802002100200241003602482002428080808010370240200241033a006c" + "2002412036025c2002410036026820024198a5c080003602642002410036025420" + "02410036024c2002200241c0006a36026002400240024002400240024002400240" + "024002400240024002400240024002400240024002400240024002400240024002" + "400240024020002802000e191718000102030405060708090a0b0c0d0e0f101112" + "13141516170b200241c0006a41d9a6c0800041181091808080000d190c180b2002" + "41c0006a41f1a6c08000411b1091808080000d180c170b200241c0006a418ca7c0" + "8000411a1091808080000d170c160b200241c0006a41a6a7c08000411910918080" + "80000d160c150b200241c0006a41bfa7c08000410c1091808080000d150c140b20" + "0241c0006a41cba7c0800041131091808080000d140c130b200241c0006a41dea7" + "c0800041131091808080000d130c120b200241c0006a41f1a7c08000410e109180" + "8080000d120c110b200241c0006a41ffa7c08000410e1091808080000d110c100b" + "200241c0006a418da8c08000410c1091808080000d100c0f0b200241c0006a4199" + "a8c08000410e1091808080000d0f0c0e0b200241c0006a41a7a8c08000410e1091" + "808080000d0e0c0d0b200241c0006a41b5a8c0800041131091808080000d0d0c0c" + "0b200241c0006a41c8a8c08000411a1091808080000d0c0c0b0b200241c0006a41" + "e2a8c08000413e1091808080000d0b0c0a0b200241c0006a41a0a9c08000411410" + "91808080000d0a0c090b200241c0006a41b4a9c0800041341091808080000d090c" + "080b200241c0006a41e8a9c08000412c1091808080000d080c070b200241c0006a" + "4194aac0800041241091808080000d070c060b200241c0006a41b8aac08000410e" + "1091808080000d060c050b200241c0006a41c6aac0800041131091808080000d05" + "0c040b200241c0006a41d9aac08000411c1091808080000d040c030b200241c000" + "6a41f5aac0800041181091808080000d030c020b200241c0006a20002802042000" + "280208109180808000450d010c020b200041046a200241cc006a10c3808080000d" + "010b200241306a41086a200241c0006a41086a2802003602002002200229024037" + "0330200241818080800036022c20024181808080003602242002418c8080800036" + "021c20024104360204200241a8abc080003602002002420337020c200220004110" + "6a36022820022000410c6a3602202002200241306a3602182002200241186a3602" + "0820012802142001280218200210b2808080002100024020022802302201450d00" + "200228023420011082808080000b200241f0006a24808080800020000f0b41c0a5" + "c080004137200241186a41b0a5c0800041c4a6c08000109f80808000000be50301" + "017f23808080800041c0006b220224808080800002400240024002400240024020" + "002d00000e0400010203000b2002200028020436020441002d00e0dbc080001a41" + "141099808080002200450d04200041106a410028009cc5c0800036000020004108" + "6a4100290094c5c080003700002000410029008cc5c08000370000200241143602" + "102002200036020c200241143602082002410336022c200241bcc1c08000360228" + "200242023702342002418d80808000ad422086200241046aad843703202002418e" + "80808000ad422086200241086aad843703182002200241186a3602302001280214" + "2001280218200241286a10b280808000210020022802082201450d03200228020c" + "20011082808080000c030b20002d000121002002410136022c200241f0bac08000" + "360228200242013702342002418680808000ad422086200241186aad8437030820" + "022000410274220041e0c5c080006a28020036021c200220004184c7c080006a28" + "02003602182002200241086a36023020012802142001280218200241286a10b280" + "80800021000c020b20012000280204220028020020002802041093808080002100" + "0c010b200028020422002802002001200028020428021011818080800080808080" + "0021000b200241c0006a24808080800020000f0b000bd507010d7f238080808000" + "41106b220224808080800020002802082103200028020421044101210502402001" + "2802142206412220012802182207280210220811818080800080808080000d0002" + "40024020030d0041002103410021000c010b410021094100210a2004210b200321" + "0c024002400340200b200c6a210d4100210002400340200b20006a220e2d000022" + "0141817f6a41ff017141a101490d0120014122460d01200141dc00460d01200c20" + "0041016a2200470d000b200a200c6a210a0c030b02400240200e2c00002201417f" + "4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71210b2001" + "411f71210c02402001415f4b0d00200c410674200b722101200e41026a210b0c01" + "0b200b410674200e2d0002413f7172210b0240200141704f0d00200b200c410c74" + "722101200e41036a210b0c010b200b410674200e2d0003413f7172200c41127441" + "8080f00071722101200e41046a210b0b2000200a6a2100200241046a2001418180" + "0410b8808080000240024020022d0004418001460d0020022d000f20022d000e6b" + "41ff01714101460d0020002009490d0302402009450d000240200920034f0d0020" + "0420096a2c000041bf7f4a0d010c050b20092003470d040b02402000450d000240" + "200020034f0d00200420006a2c000041bf7f4c0d050c010b20002003470d040b20" + "06200420096a200020096b200728020c220e11808080800080808080000d010240" + "024020022d0004418001470d002006200228020820081181808080008080808000" + "450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b200e1180" + "8080800080808080000d020b0240024020014180014f0d004101210e0c010b0240" + "20014180104f0d004102210e0c010b41034104200141808004491b210e0b200e20" + "006a21090b0240024020014180014f0d00410121010c010b024020014180104f0d" + "00410221010c010b41034104200141808004491b21010b200120006a210a200d20" + "0b6b220c0d010c030b0b410121050c030b2004200320092000419089c0800010ba" + "80808000000b02402009200a4b0d004100210002402009450d000240200920034f" + "0d0020092100200420096a2c000041bf7f4c0d020c010b2003210020092003470d" + "010b0240200a0d00410021030c020b0240200a20034f0d00200021092004200a6a" + "2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b2004200320" + "09200a41a089c0800010ba80808000000b2006200420006a200320006b20072802" + "0c11808080800080808080000d0020064122200811818080800080808080002105" + "0b200241106a24808080800020050b870102017c017e0240024002402001280200" + "0e03000102000b20004202370308200020012b0308220239031020002002bd42ff" + "ffffffffffffffff00834280808080808080f8ff00534101743a00000f0b200042" + "00370308200041023a0000200020012903083703100f0b200041023a0000200020" + "01290308220337031020002003423f883703080be411020b7f027e238080808000" + "41c0016b2204248080808000024002400240024002400240024002400240024002" + "400240024020012802002205450d00200228020821062002280204210720012802" + "042108024003402005418c026a210920052f019203220a410c6c210b417f210c02" + "40024003400240200b0d00200a210c0c020b2009280208210d2009280204210e20" + "0c41016a210c200b41746a210b2009410c6a2109417f2007200e2006200d200620" + "0d491b10f780808000220e2006200d6b200e1b220d410047200d4100481b220d41" + "01460d000b200d41ff0171450d010b2008450d022008417f6a21082005200c4102" + "746a4198036a28020021050c010b0b20022802002209450d0c2007200910828080" + "80000c0c0b2002290204220fa721092002280200220b418080808078470d032009" + "21050c010b2002290204220fa721052002280200220d418080808078470d010b20" + "01210c0c090b41002d00e0dbc080001a4198031099808080002209450d02200941" + "013b01920320094100360288022009200f422088a7ad4220862005ad8437039002" + "2009200d36028c0220014280808080103702042001200936020020092003290300" + "370300200941086a200341086a290300370300200941106a200341106a29030037" + "03000c010b200f422088a7ad4220862009ad84210f024002400240024002402005" + "2f0192032209410b490d00200441086a21084104210d200c4105490d03200c210d" + "200c417b6a0e020302010b2005418c026a220e200c410c6c6a210d02400240200c" + "41016a220620094d0d00200d200f370204200d200b3602000c010b200e2006410c" + "6c6a200d2009200c6b220e410c6c10f9808080001a200d200f370204200d200b36" + "02002005200641186c6a2005200c41186c6a200e41186c10f9808080001a0b2005" + "200c41186c6a220d41106a200341106a290300370300200d200329030037030020" + "0d41086a200341086a2903003703002005200941016a3b0192030c030b200c4179" + "6a210c200441f8006a21084106210d0c010b4100210c200441f8006a2108410521" + "0d0b41002d00e0dbc080001a4198031099808080002209450d02200941003b0192" + "0320094100360288022009200d417f7320052f01920322076a22063b0192032004" + "4188016a41086a2005200d41186c6a220e41086a29030037030020044188016a41" + "106a200e41106a2903003703002004200e290300370388012006410c4f0d032007" + "200d41016a220e6b2006470d042005418c026a2202200d410c6c6a220729020421" + "10200728020021072009418c026a2002200e410c6c6a2006410c6c10fa80808000" + "1a20092005200e41186c6a200641186c10fa8080800021062005200d3b01920320" + "0441dc006a410c6a20044190016a290300370200200441f0006a20044198016a29" + "030037020020042004290388013702602004200536020820042006360278200828" + "0200220d418c026a200c410c6c6a210602400240200d2f019203220e200c4b0d00" + "2006200f3702042006200b3602000c010b2006410c6a2006200e200c6b2208410c" + "6c10f9808080001a2006200f3702042006200b360200200d200c41186c6a220b41" + "186a200b200841186c10f9808080001a0b200d200c41186c6a220b41106a200341" + "106a290300370300200b2003290300370300200b41086a200341086a2903003703" + "00200d200e41016a3b0192032007418080808078460d00200441c4006a200441dc" + "006a41086a290200370200200441cc006a200441dc006a41106a29020037020020" + "0441306a41246a200441dc006a41186a2802003602002004201037023420042007" + "3602302004200429025c37023c024002400240200528028802220b0d004100210c" + "0c010b200441306a4104722108200441b8016a210220044188016a410472210720" + "0441b0016a2103200441c0006a210e4100210c4100210603402006200c470d0820" + "052f019003210d200b2f019203410b490d02200641016a21060240024002400240" + "024002400240200d4105490d00200d417b6a0e020203010b200441043602800120" + "04200636027c2004200b3602782003210b0c040b20044106360280012004200636" + "027c2004200b360278200d41796a210d0c020b2004410536028001200420063602" + "7c2004200b36027820044188016a200441f8006a10c18080800020042802b00141" + "05200441306a200e200910c080808000200428028801210d200441086a20074124" + "10fa808080001a0c030b20044105360280012004200636027c2004200b36027841" + "00210d0b2002210b0b20044188016a200441f8006a10c180808000200b28020020" + "0d200441306a200e200910c080808000200428028801210d200441086a20074124" + "10fa808080001a0b20042802bc01210c20042802b801210920042802b401210620" + "042802b0012105200d418080808078460d032004200d3602302008200441086a41" + "2410fa808080001a200528028802220b0d000b0b2001280200220b450d0741002d" + "00e0dbc080001a2001280204210641c803109980808000220d450d03200d200b36" + "029803200d41003b019203200d410036028802200b41003b019003200b200d3602" + "88022001200641016a3602042001200d3602002006200c470d08200d2004290330" + "37028c02200d41013b019203200d2004290340370300200d200936029c03200d41" + "94026a200441306a41086a280200360200200d41086a200441c8006a2903003703" + "00200d41106a200441d0006a2903003703002009200d36028802200941013b0190" + "030c010b200b200d200441306a200e200910c0808080000b200120012802084101" + "6a3602080b200041063a00000c070b000b2006410b41a0a4c0800010ad80808000" + "000b41e8a3c0800041284190a4c0800010a680808000000b41c0a4c08000413541" + "f8a4c0800010a680808000000b41bca2c0800010a080808000000b41a7a3c08000" + "413041d8a3c0800010a680808000000b20002005200c41186c6a22092903003703" + "00200041106a200941106a220d290300370300200041086a200941086a220b2903" + "0037030020092003290300370300200b200341086a290300370300200d20034110" + "6a2903003703000b200441c0016a2480808080000be60301057f02400240024002" + "400240024020022003490d00410121044100210520034101480d04200120036a21" + "060240200341034b0d000340200620014d0d062006417f6a22062d0000410a470d" + "000c050b0b024041808284082006417c6a2800002207418a94a8d000736b200772" + "41808182847871418081828478460d000340200620014d0d062006417f6a22062d" + "0000410a470d000c050b0b200320064103716b210720034109490d010340024002" + "4020074108480d004180828408200120076a220641786a2802002208418a94a8d0" + "00736b20087241808182847871418081828478460d010b200120076a21060c040b" + "200741786a210741808284082006417c6a2802002208418a94a8d000736b200872" + "41808182847871418081828478460d000c030b0b2003200241b8adc0800010ad80" + "808000000b200120076a21060340200620014d0d032006417f6a22062d0000410a" + "470d000c020b0b0340200620014d0d022006417f6a22062d0000410a470d000b0b" + "200620016b41016a220520024b0d010b0240200120056a20014d0d004100210620" + "0521070340200620012d0000410a466a2106200141016a21012007417f6a22070d" + "000b200641016a21040b200020043602002000200320056b3602040f0b20052002" + "41c8adc0800010ad80808000000b9b0d02097f017e23808080800041306b220324" + "808080800002400240024002400240024002400240024003400240024020012802" + "08220420012802042205460d00024002400240200420054f0d0020012802002206" + "20046a2d000022074122460d01200741dc00460d0120074120490d012006200441" + "016a22086a21094100200520086b417871220a6b210703402009210b024020070d" + "002001200a20086a360208200110c9808080002001280204210520012802082107" + "0c040b200741086a2107200b41086a2109200b290000220c42a2c48891a2c48891" + "228542fffdfbf7efdfbfff7e7c200c42e0bffffefdfbf7ef5f7c84200c42dcb8f1" + "e2c58b97aedc008542fffdfbf7efdfbfff7e7c84200c427f858342808182848890" + "a0c0807f83220c500d000b2001200b20066b200c7aa74103766a22073602080c02" + "0b2004200541d8adc0800010aa808080000c080b200421070b20072005470d0120" + "0521040b200341086a20012802002004200410c78080800041002d00e0dbc08000" + "1a200328020c210b2003280208210941141099808080002207450d052007200936" + "020c2007410436020020002007360204200041023602002007200b3602100c0a0b" + "024020072005490d002007200541e8adc0800010aa80808000000b024020012802" + "00220b20076a2d0000220941dc00460d00024020094122470d002002280208450d" + "0520072004490d072002200b20046a200720046b10ca808080004101210b200120" + "0741016a360208200341286a20012002280204200228020810cb80808000200328" + "02282207450d032000200328022c3602080c040b2001200741016a220736020820" + "0341106a200b2005200710c78080800041002d00e0dbc080001a2003280214210b" + "2003280210210941141099808080002207450d052007200936020c200741103602" + "0020002007360204200041023602002007200b3602100c0a0b024020072004490d" + "002002200b20046a200720046b10ca808080002001200741016a22093602080240" + "20092005490d00200341206a200b2005200910c78080800041002d00e0dbc08000" + "1a2003280224210b2003280220210941141099808080002207450d062007410436" + "02000c090b2001200741026a220436020802400240024002400240024002400240" + "024002400240200b20096a2d0000220741ed004a0d000240200741e1004a0d0020" + "074122460d032007412f460d04200741dc00470d02024020022802082207200228" + "0200470d002002108f808080000b2002200741016a360208200228020420076a41" + "dc003a0000410021070c0b0b2007419e7f6a0e050401010105010b200741927f6a" + "0e080500000006000708000b200341186a200b2005200410c78080800041002d00" + "e0dbc080001a200328021c210b2003280218210941141099808080002207450d0e" + "2007410c3602000c110b0240200228020822072002280200470d002002108f8080" + "80000b2002200741016a360208200228020420076a41223a0000410021070c070b" + "0240200228020822072002280200470d002002108f808080000b2002200741016a" + "360208200228020420076a412f3a0000410021070c060b02402002280208220720" + "02280200470d002002108f808080000b2002200741016a36020820022802042007" + "6a41083a0000410021070c050b0240200228020822072002280200470d00200210" + "8f808080000b2002200741016a360208200228020420076a410c3a000041002107" + "0c040b0240200228020822072002280200470d002002108f808080000b20022007" + "41016a360208200228020420076a410a3a0000410021070c030b02402002280208" + "22072002280200470d002002108f808080000b2002200741016a36020820022802" + "0420076a410d3a0000410021070c020b0240200228020822072002280200470d00" + "2002108f808080000b2002200741016a360208200228020420076a41093a000041" + "0021070c010b2001200210cc8080800021070b2007450d010c090b0b2004200741" + "98aec0800010b680808000000b4102210b200328022c21070b2000200b36020020" + "0020073602040c060b20072004490d022001200741016a360208200341286a2001" + "200b20046a200720046b10cb808080000240024020032802282207450d00200020" + "0328022c3602084100210b0c010b4102210b200328022c21070b2000200b360200" + "200020073602040c050b000b2004200741f8adc0800010b680808000000b200420" + "074188aec0800010b680808000000b2007200936020c2007200b3602100b200041" + "02360200200020073602040b200341306a2480808080000b5301047f0240200028" + "02082201200028020422024f0d00200028020021030340200320016a2d00002204" + "4122460d01200441dc00460d0120044120490d012000200141016a220136020820" + "022001470d000b0b0b4901017f02402000280200200028020822036b20024f0d00" + "200020032002109080808000200028020821030b200028020420036a2001200210" + "fa808080001a2000200320026a3602080bb10501077f23808080800041106b2204" + "24808080800002402003450d004100200341796a2205200520034b1b2106200241" + "036a417c7120026b21074100210503400240024002400240200220056a2d000022" + "08c022094100480d00200720056b4103710d01200520064f0d020340200220056a" + "2208280204200828020072418081828478710d03200541086a22052006490d000c" + "030b0b0240024002400240024002400240200841808bc080006a2d0000417e6a0e" + "03000102050b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c" + "050b200541016a220a20034f0d032002200a6a2c0000210a02400240200841e001" + "460d00200841ed01460d012009411f6a41ff0171410c490d032009417e71416e47" + "0d05200a4140480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d" + "030c020b200541016a220a20034f0d022002200a6a2c0000210a02400240024002" + "40200841907e6a0e050100000002000b2009410f6a41ff017141024b0d05200a41" + "40480d020c050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d03" + "0b200541026a220820034f0d02200220086a2c000041bf7f4a0d02200541036a22" + "0520034f0d02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b2005" + "41026a220520034f0d00200220056a2c000041bf7f4c0d010b200441086a200128" + "02002001280204200128020810c7808080004100210241002d00e0dbc080001a20" + "0428020c210520042802082108024041141099808080002203450d002003200836" + "020c2003410f360200200320053602100c060b000b200541016a21050c020b2005" + "41016a21050c010b200520034f0d000340200220056a2c00004100480d01200320" + "0541016a2205470d000c030b0b20052003490d000b0b2000200236020020002003" + "360204200441106a2480808080000be20601057f23808080800041206b22022480" + "80808000200241146a200010cd808080000240024020022f01140d000240024002" + "4002400240024020022f011622034180f803714180b803460d0020034180c8006a" + "41ffff03714180f803490d04200241146a200010ce8080800020022d00140d0620" + "022d0015210420002000280208220541016a360208200441dc00470d0320024114" + "6a200010ce8080800020022d00140d0620022d001521042000200541026a360208" + "200441f500470d02200241146a200010cd8080800020022f01140d0620022f0116" + "22044180c0006a41ffff03714180f803490d0120034180d0006a41ffff0371410a" + "7420044180c8006a41ffff0371722205418080046a210302402001280200200128" + "020822006b41034b0d00200120004104109080808000200128020821000b200120" + "0041046a360208200128020420006a2200200341127641f001723a000020004103" + "6a2004413f71418001723a000020002005410676413f71418001723a0002200020" + "03410c76413f71418001723a0001410021000c070b200220002802002000280204" + "200028020810c78080800041002d00e0dbc080001a200228020421012002280200" + "210341141099808080002200450d042000200336020c2000411436020020002001" + "3602100c060b200241086a20002802002000280204200028020810c78080800041" + "002d00e0dbc080001a200228020c21012002280208210341141099808080002200" + "450d032000200336020c20004114360200200020013602100c050b200241173602" + "142000200241146a10cf8080800021000c040b200241173602142000200241146a" + "10cf8080800021000c030b0240024002402003418001490d000240200128020020" + "0128020822046b41034b0d00200120044104109080808000200128020821040b20" + "0128020420046a210020034180104f0d0120034106764140722106410221050c02" + "0b0240200128020822002001280200470d002001108f808080000b200120004101" + "6a360208200128020420006a20033a0000410021000c040b20002003410676413f" + "71418001723a00012003410c764160722106410321050b200020063a0000200120" + "0420056a360208200020056a417f6a2003413f71418001723a0000410021000c02" + "0b000b200228021821000b200241206a24808080800020000b910301057f238080" + "80800041106b220224808080800002400240024002402001280204220320012802" + "082204490d000240200320046b41034b0d0020012003360208200241086a200128" + "02002003200310c78080800041002d00e0dbc080001a200228020c210320022802" + "08210441141099808080002201450d022001200436020c20014104360200200020" + "01360204200120033602100c030b2001200441046a220536020802402001280200" + "220620046a22012d000141017441b8aec080006a2f010020012d000041017441b8" + "b2c080006a2f010072c141087420012d000241017441b8b2c080006a2e01007220" + "012d000341017441b8aec080006a2e0100722201417f4a0d002002200620032005" + "10c78080800041002d00e0dbc080001a2002280204210320022802002104411410" + "99808080002201450d022001200436020c2001410c360200200020013602042001" + "20033602100c030b200020013b0102410021010c030b2004200341a8aec0800010" + "85808080000b000b410121010b200020013b0100200241106a2480808080000bb2" + "0101037f23808080800041106b2202248080808000024002400240200128020822" + "0320012802042204490d00200241086a20012802002004200310c7808080004100" + "2d00e0dbc080001a200228020c2103200228020821044114109980808000220145" + "0d022001200436020c200141043602002000200136020420012003360210410121" + "010c010b2000200128020020036a2d00003a0001410021010b200020013a000020" + "0241106a2480808080000f0b000b8c0101037f23808080800041106b2202248080" + "808000200241086a20002802002000280204200028020810c78080800041002d00" + "e0dbc080001a200228020c2103200228020821040240411410998080800022000d" + "00000b2000200436020c2000200129020037020020002003360210200041086a20" + "0141086a280200360200200241106a24808080800020000b1f0002402001280204" + "0e020000000b200041b8b6c08000200110b2808080000b820101017f0240024002" + "4002402003280204450d000240200328020822040d002002450d0341002d00e0db" + "c080001a0c020b20032802002004200210a78080800021030c030b2002450d0141" + "002d00e0dbc080001a0b200210998080800021030c010b200121030b2000200236" + "020820002003200120031b36020420002003453602000b9f0202047f017e238080" + "80800041206b2206248080808000024002400240200220036a220320024f0d0041" + "0021020c010b41002102200420056a417f6a410020046b71ad4108410420054101" + "461b22072001280200220841017422092003200920034b1b2203200720034b1b22" + "07ad7e220a422088a70d00200aa7220941808080807820046b4b0d010240024020" + "080d00410021020c010b2006200820056c36021c20062001280204360214200421" + "020b20062002360218200641086a20042009200641146a10d18080800002402006" + "2802080d00200628020c2102200120073602002001200236020441818080807821" + "020c010b20062802102103200628020c21020c010b0b2000200336020420002002" + "360200200641206a2480808080000b5901017f23808080800041106b2201248080" + "808000200141086a2000200028020041014108411810d280808000024020012802" + "082200418180808078460d002000200128020c109a80808000000b200141106a24" + "80808080000b4701017f23808080800041206b2200248080808000200041003602" + "182000410136020c200041d8bac0800036020820004204370210200041086a41e0" + "bac0800010a480808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d00e0dbc080001a02400240024041201099808080002201450d" + "0020014102360210200142818080801037030041002903a0dcc080002102034020" + "02427f510d024100200242017c220341002903a0dcc08000220420042002512205" + "1b3703a0dcc08000200421022005450d000b410020033703f8dfc0800020012003" + "3703084100280280e0c08000450d02200041003602182000410136020c200041e0" + "b6c0800036020820004204370210200041086a41b8b7c0800010a4808080000b00" + "0b10d480808000000b41002001360280e0c08000200041206a2480808080000b5b" + "01027f024020002802104101470d002000280214220141003a0000200028021822" + "02450d00200120021082808080000b02402000417f460d00200020002802042201" + "417f6a36020420014101470d00200041201082808080000b0b3a01017f23808080" + "800041106b2202248080808000200241c8b7c0800036020c200220003602082002" + "41086a2002410c6a200110ae80808000000b3000024020002802002d00000d0020" + "01418589c0800041051093808080000f0b2001418a89c080004104109380808000" + "0b14002001200028020420002802081093808080000b7001037f20002802042101" + "0240024020002d0000220041044b0d0020004103470d010b200128020021000240" + "200141046a28020022022802002203450d00200020031182808080008080808000" + "0b024020022802042202450d00200020021082808080000b2001410c1082808080" + "000b0bf10101027f23808080800041206b22002480808080000240024002400240" + "41002d0090dcc080000e0400000301000b410041023a0090dcc0800041002d00e0" + "dbc080001a4180081099808080002201450d01410041033a0090dcc08000410020" + "01360280dcc08000410042808080808080013703f8dbc08000410042003703e8db" + "c08000410041003a0088dcc0800041004100360284dcc08000410041003a00f4db" + "c08000410041003602f0dbc080000b200041206a2480808080000f0b000b200041" + "003602182000410136020c200041d8c5c080003602082000420437021020004108" + "6a41a8c4c0800010a480808000000bb708010a7f23808080800041206b22042480" + "808080000240024002400240024020012802100d002001417f3602102003410020" + "03200241036a417c7120026b22056b41077120032005491b22066b210720032006" + "490d0102402006450d0002400240200220036a2208417f6a22092d0000410a470d" + "002006417f6a21060c010b200220076a220a2009460d0102402008417e6a22092d" + "0000410a470d002006417e6a21060c010b200a2009460d0102402008417d6a2209" + "2d0000410a470d002006417d6a21060c010b200a2009460d0102402008417c6a22" + "092d0000410a470d002006417c6a21060c010b200a2009460d0102402008417b6a" + "22092d0000410a470d002006417b6a21060c010b200a2009460d0102402008417a" + "6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240200841" + "796a22092d0000410a470d00200641796a21060c010b200a2009460d0120064178" + "7221060b200620076a41016a21060c040b20052003200320054b1b210b41002006" + "6b21082002417c6a210c2006417f7320026a210a02400340200a21052008210620" + "072209200b4d0d01200641786a2108200541786a210a4180828408200220094178" + "6a22076a280200220d418a94a8d000736b200d724180828408200c20096a280200" + "220d418a94a8d000736b200d727141808182847871418081828478460d000b0b20" + "0920034b0d0202400340200320066a450d012006417f6a2106200520036a210920" + "05417f6a210520092d0000410a470d000b200320066a41016a21060c040b024002" + "402001411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b0240" + "200128021420066b20034b0d002000200141146a2002200310dd808080000c050b" + "200128021820066a2002200310fa808080001a200041043a00002001411c6a2006" + "20036a3602000c040b10b580808000000b2007200341c889c08000108580808000" + "000b2009200341d889c0800010ad80808000000b0240200320064f0d0020044100" + "3602182004410136020c200441a8bbc0800036020820044204370210200441086a" + "41b0bbc0800010a480808000000b02402001411c6a2802002205450d0002400240" + "200128021420056b20064d0d00200141186a28020020056a2002200610fa808080" + "001a2001411c6a200520066a22053602000c010b200441086a200141146a200220" + "0610dd80808000024020042d00084104460d00200020042903083702000c030b20" + "01411c6a28020021050b2005450d00200141003a00202001411c6a41003602000b" + "200220066a210502402001280214200320066b22064b0d002000200141146a2005" + "200610dd808080000c010b200141186a2802002005200610fa808080001a200041" + "043a00002001411c6a20063602000b2001200128021041016a360210200441206a" + "2480808080000b7101027f20012802002104024020012802082205450d00200420" + "056b20034f0d004100210520014100360208200141003a000c0b0240200420034d" + "0d00200128020420056a2002200310fa808080001a200041043a00002001200520" + "036a3602080f0b20004204370200200141003a000c0bc90103027f017e027f2380" + "8080800041106b2203248080808000200341086a20002802082802002001200210" + "dc80808000024020032d000822024104460d002000280204210420032903082105" + "0240024020002d0000220141044b0d0020014103470d010b200428020021010240" + "200441046a28020022062802002207450d00200120071182808080008080808000" + "0b024020062802042206450d00200120061082808080000b2004410c1082808080" + "000b200020053702000b200341106a24808080800020024104470b9c0303027f01" + "7e037f23808080800041106b220224808080800020024100360204024002400240" + "02402001418001490d002001418010490d012001418080044f0d0220022001413f" + "71418001723a000620022001410c7641e001723a000420022001410676413f7141" + "8001723a0005410321010c030b200220013a0004410121010c020b20022001413f" + "71418001723a00052002200141067641c001723a0004410221010c010b20022001" + "413f71418001723a00072002200141127641f001723a000420022001410676413f" + "71418001723a000620022001410c76413f71418001723a0005410421010b200241" + "086a2000280208280200200241046a200110dc80808000024020022d0008220141" + "04460d0020002802042103200229030821040240024020002d0000220541044b0d" + "0020054103470d010b200328020021050240200341046a28020022062802002207" + "450d002005200711828080800080808080000b024020062802042206450d002005" + "20061082808080000b2003410c1082808080000b200020043702000b200241106a" + "24808080800020014104470b1200200041dcb7c08000200110b2808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b0d00" + "2001410620014108766722026b7641017120024101746b413e6a21020b20004200" + "3702102000200236021c200241027441a8dcc080006a2103024041002802c4dfc0" + "800041012002742204710d0020032000360200200020033602182000200036020c" + "20002000360208410041002802c4dfc080002004723602c4dfc080000f0b024002" + "400240200328020022042802044178712001470d00200421020c010b2001410041" + "1920024101766b2002411f461b742103034020042003411d764104716a41106a22" + "052802002202450d02200341017421032002210420022802044178712001470d00" + "0b0b20022802082203200036020c20022000360208200041003602182000200236" + "020c200020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080b0b00200010e580808000000bb50101037f23808080800041106b" + "2201248080808000200028020c2102024002400240024020002802040e02000102" + "0b20020d0141012102410021030c020b20020d0020002802002202280204210320" + "0228020021020c010b20014180808080783602002001200036020c2001418f8080" + "8000200028021c22002d001c20002d001d10e680808000000b2001200336020420" + "0120023602002001419080808000200028021c22002d001c20002d001d10e68080" + "8000000b990101027f23808080800041106b22042480808080004100410028029c" + "dcc08000220541016a36029cdcc08000024020054100480d000240024041002d00" + "f0dfc080000d00410041002802ecdfc0800041016a3602ecdfc080004100280298" + "dcc08000417f4a0d010c020b200441086a20002001118380808000808080800000" + "0b410041003a00f0dfc080002002450d0010e180808000000b000b0c0020002001" + "2902003703000bf726020c7f017e2380808080004190036b220224808080800020" + "0128020c2103024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f8006a200320052005200441016a220420" + "052004491b10c78080800041002d00e0dbc080001a200228027c21082002280278" + "2101411410998080800022040d010c190b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602b002200242808080" + "8080013702a80241082109200420054f0d02200241b8016a41086a210a200241b8" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241c0006a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802442104200228024021084114" + "1099808080002206450d1d2006200836020c20064105360200200620043602100c" + "080b200241d0006a200320052005200420052004491b10c78080800041002d00e0" + "dbc080001a200228025421042002280250210841141099808080002206450d1c20" + "06200836020c20064107360200200620043602100c070b20022902ac02210e2002" + "2802a802210641042107410021090c070b200741dd00470d00200241c8006a2003" + "20052005200441016a220420052004491b10c78080800041002d00e0dbc080001a" + "200228024c21042002280248210841141099808080002206450d1a200620083602" + "0c20064115360200200620043602100c050b200241b8016a200110e88080800002" + "4020022d00b80122084106470d0020022802bc0121060c050b200241ec016a4102" + "6a2205200b41026a2d00003a0000200241d8016a41086a2203200a41086a290300" + "3703002002200b2f00003b01ec012002200a2903003703d80120022802bc012107" + "0240200c20022802a802470d00200241a8026a10d3808080000b20022802ac0222" + "09200c41186c6a220420022903d801370308200420083a0000200420022f01ec01" + "3b000120042007360204200441106a2003290300370300200441036a20052d0000" + "3a00002002200c41016a220c3602b0024100210d20012802142204200128021022" + "054f0d020c000b0b2004200136020c200441053602002000200436020420004106" + "3a0000200420083602100c160b200628020021030b200241386a20032005200520" + "0441016a220420052004491b10c78080800041002d00e0dbc080001a200228023c" + "21042002280238210841141099808080002206450d152006200836020c20064102" + "360200200620043602100b200241a8026a108c80808000024020022802a8022204" + "450d002009200441186c1082808080000b200128020c2103200128021421042001" + "280210210541062107410121090b200120012d001841016a3a0018024002402004" + "20054f0d0003400240024002400240024002400240200320046a2d00002208410c" + "4a0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c" + "060b20084120460d052008412c460d01200841dd00460d020b200241186a200320" + "052005200441016a220420052004491b10c78080800041002d00e0dbc080001a20" + "0228021c21082002280218210541141099808080002204450d1b20044116360200" + "0c070b2001200441016a2204360214200420054f0d020340200320046a2d000022" + "0c41776a220841174b0d024101200874419380800471450d022001200441016a22" + "0436021420052004470d000b200521040c020b2001200441016a3602142002200e" + "3703c001200220063602bc01200220073a00b80102402009450d00410621072002" + "41063a00800120022006360284010c160b20024180016a41106a200241b8016a41" + "106a29030037030020024180016a41086a200241b8016a41086a29030037030020" + "0220022903b801220e37038001200ea721070c150b200c41dd00470d0020024130" + "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" + "80001a200228023421082002280230210541141099808080002204450d18200441" + "153602000c040b200241286a200320052005200441016a220420052004491b10c7" + "8080800041002d00e0dbc080001a200228022c2108200228022821054114109980" + "8080002204450d17200441163602000c030b2001200441016a2204360214200520" + "04470d000b200521040b200241206a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802242108200228022021054114" + "1099808080002204450d14200441023602000b2004200536020c20042008360210" + "200220043602d0012002200e3703c001200220063602bc01200220073a00b80102" + "4020090d0041062107200241063a0080012002200436028401200241b8016a108a" + "808080000c100b41062107200241063a0080012002200636028401200410e98080" + "80000c0f0b200241106a200320052005200420052004491b10c78080800041002d" + "00e0dbc080001a200228021421082002280210210141141099808080002204450d" + "122004200136020c2004411836020020002004360204200041063a000020042008" + "3602100c110b200141003602082001200441016a360214200241b8016a20062001" + "10c88080800020022802bc0121080240024020022802b80122054102460d002002" + "2802c0012104024020050d0020024180016a2008200410ea8080800020022d0080" + "014106460d112000200229038001370300200041106a20024180016a41106a2903" + "00370300200041086a20024180016a41086a2903003703000c130b410021010240" + "20044100480d00024020040d0041012101410021050c030b41002d00e0dbc08000" + "1a20042105200410998080800022010d02410121010b20012004109a8080800000" + "0b200041063a0000200020083602040c110b20024180016a41086a220320012008" + "200410fa808080003602002002200536028401200241033a008001200220043602" + "8c01200041106a20024180016a41106a290300370300200041086a200329030037" + "030020002002290380013703000c100b2001200441016a36021420024198016a20" + "01410010eb8080800002402002290398014203510d0020024180016a2002419801" + "6a10c580808000024020022d0080014106460d0020002002290380013703002000" + "41106a20024180016a41106a290300370300200041086a20024180016a41086a29" + "03003703000c110b20022802840120011080808080002104200041063a00002000" + "20043602040c100b200020022802a001360204200041063a00000c0f0b02402007" + "41f3004a0d00200741e600460d04200741ee00470d012001200441016a36021420" + "0141d0dbc08000410310ec808080002204450d02200041063a0000200020043602" + "040c0f0b200741f400460d02200741fb00460d040b200741506a41ff0171410a49" + "0d04200241086a200320052005200441016a220420052004491b10c78080800041" + "002d00e0dbc080001a200228020c21082002280208210541141099808080002204" + "450d0e2004200536020c2004410a3602002004200836021020022004360284010c" + "0b0b200241003a0080012000200229038001370300200041086a20024180016a41" + "086a290300370300200041106a20024180016a41106a2903003703000c0c0b2001" + "200441016a3602140240200141d3dbc08000410310ec808080002204450d002000" + "41063a0000200020043602040c0c0b20024181023b018001200020022903800137" + "0300200041086a20024180016a41086a290300370300200041106a20024180016a" + "41106a2903003703000c0b0b2001200441016a3602140240200141d6dbc0800041" + "0410ec808080002204450d00200041063a0000200020043602040c0b0b20024101" + "3b0180012000200229038001370300200041086a20024180016a41086a29030037" + "0300200041106a20024180016a41106a2903003703000c0a0b200120012d001841" + "7f6a22083a0018200441016a2104200841ff0171450d0520012004360214200220" + "013602f001200241013a00f401200241f8016a200241f0016a10ed808080004100" + "210d410021064100210c024002400240024020022802f80122044180808080786a" + "0e020200010b20022802fc0121060c060b20022902fc01210e2002410036028c02" + "20024100360284022002200e3702ac02200220043602a80220024190026a200241" + "f0016a10ee8080800020022d0090024106460d03200241b8016a20024184026a20" + "0241a8026a20024190026a10c680808000024020022d00b8014106460d00200241" + "b8016a108a808080000b200241a8026a41046a2104200241b8016a41046a210802" + "400340200241ec026a200241f0016a10ed80808000024020022802ec0222054180" + "808080786a0e020204000b20022902f002210e20022802f0022103200241f8026a" + "200241f0016a10ee80808000024020022d00f8024106470d0020022802fc022106" + "2005450d07200320051082808080000c070b200820022903f80237020020084110" + "6a200241f8026a41106a290300370200200841086a200241f8026a41086a290300" + "370200200241a8026a41086a200241b8016a41086a290200370300200241a8026a" + "41106a200241b8016a41106a290200370300200241a8026a41186a200241b8016a" + "41186a280200360200200220022902b8013703a802200220053602c4022002200e" + "3e02c8022002200e4220883e02cc02200241d0026a41106a200441106a29020037" + "0300200241d0026a41086a200441086a290200370300200220042902003703d002" + "200241b8016a20024184026a200241c4026a200241d0026a10c68080800020022d" + "00b8014106460d00200241b8016a108a808080000c000b0b200228028402210620" + "02280288022109200228028c02210c0b410521070c050b20022802f00221060c02" + "0b200241a8016a2001410110eb80808000024020022903a8014203510d00200241" + "80016a200241a8016a10c580808000024020022d0080014106460d002000200229" + "038001370300200041106a20024180016a41106a290300370300200041086a2002" + "4180016a41086a2903003703000c0a0b2002280284012001108080808000210420" + "0041063a0000200020043602040c090b200020022802b001360204200041063a00" + "000c080b20022802940221062004450d00200ea720041082808080000b20024184" + "026a108b808080000b410621074101210d0b200120012d001841016a3a00182001" + "28020c21030240024020012802142204200128021022054f0d0003400240024002" + "4002400240200320046a2d00002208410c4a0d00200841776a4102490d040c010b" + "02402008411f4a0d002008410d470d010c040b20084120460d032008412c460d01" + "200841fd00460d020b200241e0006a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802642108200228026021054114" + "1099808080002204450d0b200441163602000c050b200241f0006a200320052005" + "200441016a220420052004491b10c78080800041002d00e0dbc080001a20022802" + "7421082002280270210541141099808080002204450d0a200441153602000c040b" + "2001200441016a3602140240200d450d0041062107200241063a00800120022006" + "360284010c060b200220073a008001200220022f00a8023b0081012002200c3602" + "8c01200220093602880120022006360284012002200241aa026a2d00003a008301" + "0c050b2001200441016a220436021420052004470d000b200521040b200241e800" + "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" + "80001a200228026c21082002280268210541141099808080002204450d06200441" + "033602000b2004200536020c20042008360210200220073a00b801200220022f00" + "a8023b00b901200220043602d0012002200c3602c401200220093602c001200220" + "063602bc012002200241aa026a2d00003a00bb010240200d0d0041062107200241" + "063a0080012002200436028401200241b8016a108a808080000c020b4106210720" + "0241063a0080012002200636028401200410e9808080000c010b200241d8006a20" + "0320052005200420052004491b10c78080800041002d00e0dbc080001a20022802" + "5c21082002280258210141141099808080002204450d042004200136020c200441" + "1836020020002004360204200041063a0000200420083602100c030b200741ff01" + "714106470d010b20022802840120011080808080002104200041063a0000200020" + "043602040c010b2000200229038001370300200041106a20024180016a41106a29" + "0300370300200041086a20024180016a41086a2903003703000b20024190036a24" + "80808080000f0b000b920101047f02400240024020002802000e020001020b2000" + "2802082201450d01200028020420011082808080000c010b20002d00044103470d" + "002000280208220128020021020240200128020422032802002204450d00200220" + "0411828080800080808080000b024020032802042203450d002002200310828080" + "80000b2001410c1082808080000b200041141082808080000b7901027f41002103" + "0240024020024100480d00024020020d0041002103410121040c020b41002d00e0" + "dbc080001a20022103200210998080800022040d01410121030b20032002109a80" + "808000000b20042001200210fa8080800021012000200236020c20002001360208" + "20002003360204200041033a00000b950502067f017e23808080800041306b2203" + "248080808000200128020c21040240024002400240024002402001280214220520" + "0128021022064f0d002001200541016a2207360214200420056a2d000022084130" + "470d020240200720064f0d00200420076a2d000041506a41ff0171410a490d020b" + "200020012002420010ef808080000c050b200341186a20042006200510c7808080" + "0041002d00e0dbc080001a200328021c2107200328021821044114109980808000" + "2201450d022001200436020c200141053602002000200136020820004203370300" + "200120073602100c040b200341086a200420062006200541026a22012006200149" + "1b10c78080800041002d00e0dbc080001a200328020c2107200328020821044114" + "1099808080002201450d012001200436020c2001410d3602002000200136020820" + "004203370300200120073602100c030b02402008414f6a41ff01714109490d0020" + "0341106a20042006200710c78080800041002d00e0dbc080001a20032802142107" + "2003280210210441141099808080002201450d012001200436020c2001410d3602" + "002000200136020820004203370300200120073602100c030b200841506aad42ff" + "01832109200720064f0d010340200420076a2d000041506a220541ff0171220841" + "0a4f0d020240024020094299b3e6cc99b3e6cc19540d0020094299b3e6cc99b3e6" + "cc19520d01200841054b0d010b2001200741016a22073602142009420a7e2005ad" + "42ff01837c210920062007470d010c030b0b200341206a20012002200910f08080" + "80000240024020032802200d00200020032b0328390308420021090c010b200020" + "03280224360208420321090b200020093703000c020b000b200020012002200910" + "ef808080000b200341306a2480808080000ba20201087f23808080800041106b22" + "032480808080002000280214220420002802102205200420054b1b210620002802" + "0c210702400240024002400340024020020d00410021040c050b20062004460d01" + "2000200441016a22083602142002417f6a2102200720046a210920012d0000210a" + "20082104200141016a2101200a20092d0000460d000b200341086a200720052008" + "10c78080800041002d00e0dbc080001a200328020c210120032802082102411410" + "99808080002204450d01200441093602000c020b200320072005200610c7808080" + "0041002d00e0dbc080001a20032802042101200328020021024114109980808000" + "2204450d00200441053602000c010b000b2004200236020c200420013602100b20" + "0341106a24808080800020040bae0201047f23808080800041106b220224808080" + "8000200241046a200110f680808000024002400240024020022d00040d00024020" + "022d00050d0020004180808080783602000c040b41002103200128020022014100" + "3602082001200128021441016a360214200241046a2001410c6a200110c8808080" + "002002280208210420022802044102460d010240200228020c22014100480d0002" + "4020010d0041012103410021050c040b41002d00e0dbc080001a20012105200110" + "998080800022030d03410121030b20032001109a80808000000b20002002280208" + "36020420004181808080783602000c020b20004181808080783602002000200436" + "02040c010b20032004200110fa8080800021042000200136020820002004360204" + "200020053602000b200241106a2480808080000bdc0201067f2380808080004110" + "6b22022480808080002001280200220328020c2104024002400240024002402003" + "2802142201200341106a28020022054f0d000340200420016a2d0000220641776a" + "220741174b0d024101200774419380800471450d022003200141016a2201360214" + "20052001470d000b200521010b200241086a200420052005200141016a22012005" + "2001491b10c78080800041002d00e0dbc080001a200228020c2107200228020821" + "0541141099808080002201450d03200141033602000c010b02402006413a470d00" + "2003200141016a3602142000200310e8808080000c020b20022004200520052001" + "41016a220120052001491b10c78080800041002d00e0dbc080001a200228020421" + "072002280200210541141099808080002201450d02200141063602000b20012005" + "36020c20002001360204200041063a0000200120073602100b200241106a248080" + "8080000f0b000b970202027f027e23808080800041106b22042480808080000240" + "02400240024002400240024002402001280214220520012802104f0d0020012802" + "0c20056a2d00002205412e460d01200541c500460d02200541e500460d020b2002" + "450d02420121060c050b2004200120022003410010f18080800020042802000d02" + "0c030b2004200120022003410010f2808080002004280200450d02200020042802" + "04360208200042033703000c040b420021060240420020037d22074200590d0042" + "022106200721030c030b2003babd428080808080808080807f8421030c020b2000" + "2004280204360208200042033703000c020b20042903082103420021060b200020" + "03370308200020063703000b200441106a2480808080000bbd0101057f41002104" + "0240024020012802102205200128021422064d0d00200641016a2107200520066b" + "2108200128020c20066a21054100210403400240200520046a2d0000220641506a" + "41ff0171410a490d002006412e460d030240200641c500460d00200641e500470d" + "030b2000200120022003200410f2808080000f0b2001200720046a360214200820" + "0441016a2204470d000b200821040b2000200120022003200410f3808080000f0b" + "2000200120022003200410f1808080000bfa0301097f23808080800041106b2205" + "24808080800020012001280214220641016a220736021402400240024020072001" + "28021022084f0d00200720086b2109200128020c210a4100210602400240034002" + "40200a20076a2d0000220b41506a220c41ff0171220d410a490d00024020060d00" + "2005200a20082008200741016a220720082007491b10c78080800041002d00e0db" + "c080001a200528020421062005280200210c41141099808080002207450d072007" + "200c36020c2007410d360200200020073602042000410136020020072006360210" + "0c060b200620046a2107200b41207241e500470d032000200120022003200710f2" + "808080000c050b024020034298b3e6cc99b3e6cc19580d0020034299b3e6cc99b3" + "e6cc19520d02200d41054b0d020b2001200741016a22073602142006417f6a2106" + "2003420a7e200cad42ff01837c210320072008470d000b200920046a21070c010b" + "2000200120022003200620046a10f4808080000c020b2000200120022003200710" + "f3808080000c010b200541086a200128020c20082008200641026a220720082007" + "491b10c78080800041002d00e0dbc080001a200528020c21062005280208210c41" + "141099808080002207450d012007200c36020c2007410536020020002007360204" + "20004101360200200720063602100b200541106a2480808080000f0b000bb80401" + "077f23808080800041106b22052480808080004101210620012001280214220741" + "016a220836021402402008200128021022094f0d00410121060240024020012802" + "0c20086a2d000041556a0e03010200020b410021060b2001200741026a22083602" + "140b200128020c210a0240024002400240024002400240200820094f0d00200120" + "0841016a2207360214200a20086a2d000041506a41ff01712208410a4f0d010240" + "200720094f0d000340200a20076a2d000041506a41ff0171220b410a4f0d012001" + "200741016a22073602140240200841cb99b3e6004c0d00200841cc99b3e600470d" + "07200b41074b0d070b2008410a6c200b6a210820092007470d000b0b20060d0220" + "0420086b2207411f75418080808078732007200841004a2007200448731b21070c" + "030b200541086a200a2009200810c78080800041002d00e0dbc080001a20052802" + "0c21012005280208210841141099808080002207450d042007200836020c200741" + "053602002000200736020420004101360200200720013602100c050b2005200a20" + "09200710c78080800041002d00e0dbc080001a2005280204210120052802002108" + "41141099808080002207450d032007200836020c2007410d360200200020073602" + "0420004101360200200720013602100c040b200420086a2207411f754180808080" + "7873200720084100482007200448731b21070b2000200120022003200710f38080" + "80000c020b200020012002200350200610f5808080000c010b000b200541106a24" + "80808080000b9f0304017f017c017f017c23808080800041106b22052480808080" + "002003ba2106024002400240024002400240024020042004411f7522077320076b" + "220741b502490d0003402006440000000000000000610d062004417f4a0d022006" + "44a0c8eb85f3cce17fa32106200441b4026a22042004411f7522077320076b2207" + "41b4024b0d000b0b200741037441a8c8c080006a2b030021082004417f4a0d0120" + "062008a321060c040b2005200128020c2001280210200128021410c78080800041" + "002d00e0dbc080001a200528020421072005280200210141141099808080002204" + "450d022004200136020c2004410e36020020002004360204200420073602100c01" + "0b20062008a222069944000000000000f07f620d02200541086a200128020c2001" + "280210200128021410c78080800041002d00e0dbc080001a200528020c21072005" + "280208210141141099808080002204450d012004200136020c2004410e36020020" + "002004360204200420073602100b410121040c020b000b2000200620069a20021b" + "390308410021040b20002004360200200541106a2480808080000b7f01047f0240" + "024020012802142205200128021022064f0d00200128020c210702400340200720" + "056a2d0000220841506a41ff017141094b0d012001200541016a22053602142006" + "2005470d000c020b0b200841207241e500460d010b2000200120022003200410f3" + "808080000f0b2000200120022003200410f2808080000b840201027f2380808080" + "0041106b220524808080800002400240024002402004450d002003450d010b2001" + "2802142204200128021022034f0d01200128020c21060340200620046a2d000041" + "506a41ff0171410a4f0d022001200441016a220436021420032004470d000c020b" + "0b200541086a200128020c2001280210200128021410c78080800041002d00e0db" + "c080001a200528020c210120052802082103024041141099808080002204450d00" + "2004200336020c2004410e3602002000200436020420042001360210410121040c" + "020b000b200044000000000000000044000000000000008020021b390308410021" + "040b20002004360200200541106a2480808080000bb40701077f23808080800041" + "306b22022480808080002001280200220328020c21040240024002400240200328" + "02142205200341106a28020022064f0d000340200420056a2d0000220741776a22" + "0841174b0d024101200874419380800471450d022003200541016a220536021420" + "062005470d000b200621050b41012108200241286a200420062006200541016a22" + "0520062005491b10c78080800041002d00e0dbc080001a200228022c2106200228" + "0228210341141099808080002205450d022005200336020c200541033602002000" + "2005360204200520063602100c010b0240200741fd00470d004100210820004100" + "3a00010c010b02400240024020012d00040d00200541016a21052007412c470d01" + "200320053602140240200520064f0d00034002400240024002400240200420056a" + "2d00002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e0304" + "0102000b2008410d460d03200841fd00460d020b41012108200241086a20042006" + "2006200541016a220520062005491b10c78080800041002d00e0dbc080001a2002" + "28020c21062002280208210341141099808080002205450d092005200336020c20" + "05411136020020002005360204200520063602100c080b200041013a0001410021" + "080c070b41012108200241186a200420062006200541016a220520062005491b10" + "c78080800041002d00e0dbc080001a200228021c21062002280218210341141099" + "808080002205450d072005200336020c2005411536020020002005360204200520" + "063602100c060b2003200541016a220536021420062005470d000b200621050b41" + "012108200241106a200420062006200541016a220520062005491b10c780808000" + "41002d00e0dbc080001a2002280214210620022802102103411410998080800022" + "05450d042005200336020c2005410536020020002005360204200520063602100c" + "030b41002108200141003a0004024020074122460d002002200420062006200541" + "016a220520062005491b10c78080800041002d00e0dbc080001a20022802042108" + "2002280200210641141099808080002205450d042005200636020c200541113602" + "0020002005360204200520083602100c020b200041013a00010c020b200241206a" + "200420062006200520062005491b10c78080800041002d00e0dbc080001a200228" + "022421082002280220210641141099808080002205450d022005200636020c2005" + "410836020020002005360204200520083602100b410121080b200020083a000020" + "0241306a2480808080000f0b000b4a01037f4100210302402002450d0002400340" + "20002d0000220420012d00002205470d01200041016a2100200141016a21012002" + "417f6a2202450d020c000b0b200420056b21030b20030bac0501087f0240024002" + "400240200020016b20024f0d00200120026a2103200020026a2104024020024110" + "4f0d00200021050c030b2004417c7121054100200441037122066b210702402006" + "450d00200120026a417f6a210803402004417f6a220420082d00003a0000200841" + "7f6a210820052004490d000b0b2005200220066b2209417c7122066b2104024020" + "0320076a2207410371450d0020064101480d022007410374220841187121022007" + "417c71220a417c6a2101410020086b4118712103200a280200210803402005417c" + "6a2205200820037420012802002208200276723602002001417c6a210120042005" + "490d000c030b0b20064101480d01200920016a417c6a210103402005417c6a2205" + "20012802003602002001417c6a210120042005490d000c020b0b02400240200241" + "104f0d00200021040c010b2000410020006b41037122036a210502402003450d00" + "20002104200121080340200420082d00003a0000200841016a2108200441016a22" + "042005490d000b0b2005200220036b2209417c7122076a21040240024020012003" + "6a2206410371450d0020074101480d012006410374220841187121022006417c71" + "220a41046a2101410020086b4118712103200a2802002108034020052008200276" + "2001280200220820037472360200200141046a2101200541046a22052004490d00" + "0c020b0b20074101480d0020062101034020052001280200360200200141046a21" + "01200541046a22052004490d000b0b20094103712102200620076a21010b200245" + "0d02200420026a21050340200420012d00003a0000200141016a2101200441016a" + "22042005490d000c030b0b20094103712201450d012007410020066b6a21032004" + "20016b21050b2003417f6a210103402004417f6a220420012d00003a0000200141" + "7f6a210120052004490d000b0b20000b0e0020002001200210f8808080000bc102" + "01087f02400240200241104f0d00200021030c010b2000410020006b4103712204" + "6a210502402004450d0020002103200121060340200320062d00003a0000200641" + "016a2106200341016a22032005490d000b0b2005200220046b2207417c7122086a" + "210302400240200120046a2209410371450d0020084101480d0120094103742206" + "41187121022009417c71220a41046a2101410020066b4118712104200a28020021" + "060340200520062002762001280200220620047472360200200141046a21012005" + "41046a22052003490d000c020b0b20084101480d00200921010340200520012802" + "00360200200141046a2101200541046a22052003490d000b0b2007410371210220" + "0920086a21010b02402002450d00200320026a21050340200320012d00003a0000" + "200141016a2101200341016a22032005490d000b0b20000b0be45b0100418080c0" + "000bda5b110000000c000000040000001200000013000000140000000000000000" + "00000001000000150000000000000001000000010000001600000063616c6c6564" + "2060526573756c743a3a756e77726170282960206f6e20616e2060457272602076" + "616c75650017000000040000000400000018000000456d707479496e76616c6964" + "4469676974506f734f766572666c6f774e65674f766572666c6f775a65726f5061" + "727365496e744572726f726b696e647372632f6c69622e72730000b00010000a00" + "0000200000004b000000b00010000a000000210000004b0000004163636f756e74" + "00b00010000a0000002200000033000000b00010000a0000002300000033000000" + "44617461b00010000a0000002500000030000000b00010000a0000002600000024" + "000000b00010000a00000027000000350000007465737420676f6f64203d202c20" + "636f756e746572203d200a000000380110000c000000440110000c000000500110" + "0001000000746573742064617461202c20706f696e746572203d202c20706f696e" + "7465725f7533325f6c656e203d202c206c656e203d2000006c0110000a00000076" + "0110000c0000008201100014000000960110000800000050011000010000000500" + "00000c0000000b0000000b00000004000000740010007900100085001000900010" + "009b0010006361706163697479206f766572666c6f77000000f001100011000000" + "616c6c6f632f7372632f7261775f7665632e72730c021000140000001800000005" + "0000002e2e30313233343536373839616263646566426f72726f774d7574457272" + "6f72616c726561647920626f72726f7765643a200000500210001200000063616c" + "6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65" + "602076616c7565696e646578206f7574206f6620626f756e64733a20746865206c" + "656e20697320206275742074686520696e64657820697320000000970210002000" + "0000b7021000120000003d3d617373657274696f6e20606c656674202072696768" + "7460206661696c65640a20206c6566743a200a2072696768743a200000de021000" + "10000000ee02100017000000050310000900000020726967687460206661696c65" + "643a200a20206c6566743a20000000de0210001000000028031000100000003803" + "100009000000050310000900000001000000000000000b21100002000000202020" + "20207b20207b0a2c0a7d207d636f72652f7372632f666d742f6e756d2e72730000" + "830310001300000066000000170000003078303030313032303330343035303630" + "373038303931303131313231333134313531363137313831393230323132323233" + "323432353236323732383239333033313332333333343335333633373338333934" + "303431343234333434343534363437343834393530353135323533353435353536" + "353735383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738383839" + "3930393139323933393439353936393739383939636f72652f7372632f666d742f" + "6d6f642e727366616c736574727565000072041000130000009b09000026000000" + "7204100013000000a40900001a000000636f72652f7372632f736c6963652f6d65" + "6d6368722e7273b004100018000000830000001e000000b0041000180000009f00" + "00000900000072616e676520737461727420696e64657820206f7574206f662072" + "616e676520666f7220736c696365206f66206c656e67746820e804100012000000" + "fa0410002200000072616e676520656e6420696e646578202c05100010000000fa" + "04100022000000736c69636520696e646578207374617274732061742020627574" + "20656e647320617420004c05100016000000620510000d00000001010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000202020202020202020202" + "020202020202020202020202020202020202020303030303030303030303030303" + "0303040404040400000000000000000000005b2e2e2e5d626567696e203c3d2065" + "6e642028203c3d2029207768656e20736c6963696e67206060850610000e000000" + "93061000040000009706100010000000a7061000010000006279746520696e6465" + "7820206973206e6f742061206368617220626f756e646172793b20697420697320" + "696e7369646520202862797465732029206f66206000c80610000b000000d30610" + "0026000000f9061000080000000107100006000000a70610000100000020697320" + "6f7574206f6620626f756e6473206f6620600000c80610000b0000003007100016" + "000000a706100001000000636f72652f7372632f7374722f6d6f642e7273006007" + "100013000000f00000002c000000636f72652f7372632f756e69636f64652f7072" + "696e7461626c652e7273000000840710001d0000001a0000003600000084071000" + "1d0000000a0000002b000000000601010301040205070702080809020a050b020e" + "041001110212051311140115021702190d1c051d081f0124016a046b02af03b102" + "bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb" + "010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418" + "363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f6465" + "5cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f" + "5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c15" + "1d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a48" + "4a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e" + "227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06" + "240424042808340b4e43813709160a08183b45390363080930160521031b050140" + "38044b052f040a070907402027040c0936033a051a07040c07504937330d33072e" + "080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b42" + "3e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a06" + "0a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937" + "030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d8430" + "10168faa8247a1b98239072a045c06260a460a28051382b05b654b043907114005" + "0b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092" + "604709743c80f60a73087015467a140c140c570919808781470385420f1584501f" + "060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a" + "04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c04" + "0907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81" + "540c1d03090736080e040907090780cb250a840600010305050606020706080709" + "110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c02" + "1f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05fd02fe03ff" + "09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192" + "a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4ba" + "bbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d" + "11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084" + "b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e" + "5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f" + "7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74" + "7596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a5b07080f10" + "272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df0482" + "44081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a" + "500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b" + "0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582" + "b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c04" + "0103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582" + "ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be" + "22740c80d61a81100580df0bf29e033709815c1480b80880cb050a183b030a0638" + "0846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a104" + "81da26070c050580a61081f50701202a064c04808d0480be031b030f0d636f7265" + "2f7372632f756e69636f64652f756e69636f64655f646174612e7273003f0d1000" + "2000000050000000280000003f0d1000200000005c000000160000000003000083" + "042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8" + "602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a1" + "39301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a153" + "00da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a0070000700" + "2d0101010201020101480b30151001650702060202010423011e1b5b0b3a090901" + "18040109010301052b033c082a180120370101010408040103070a021d013a0101" + "010204080109010a021a010202390104020402020303011e0203010b0239010405" + "010204011402160601013a0101020104080107030a021e013b0101010c01090128" + "010301370101030503010407020b021d013a01020102010301050207020b021c02" + "390201010204080109010a021d0148010401020301010801510102070c08620102" + "090b0749021b0101010101370e01050102050b0124090166040106010202021902" + "040310040d01020206010f01000300031d021e021e02400201070801020b09012d" + "030101750222017603040209010603db0202013a010107010101010208060a0201" + "301f310430070101050128090c0220040202010338010102030101033a08020298" + "03010d0107040106010302c6400001c32100038d016020000669020004010a2002" + "50020001030104011902050197021a120d012608190b2e03300102040202270143" + "06020202020c0108012f01330101030202050201012a020801ee01020104010001" + "0010101000020001e201950500030102050428030401a502000400025003460b31" + "047b01360f290102020a033104020207013d03240501083e010c0234090a040201" + "5f0302010102060102019d010308150239020101010116010e070305c308020301" + "011701510102060101020101020102eb010204060201021b025508020101026a01" + "01010206010165030204010500090102f5010a0201010401900402020401200a28" + "0602040801090602032e0d010200070106010152160207010201027a0603010102" + "0107010148020301010100020b023405050101010001060f00053b0700013f0451" + "010002002e0217000101030405080802071e0494030037043208010e011605010f" + "000701110207010201056401a00700013d04000400076d07006080f0002f727573" + "74632f633266373463336639323861656235303366313562346539656635373738" + "653737663330353862382f6c6962726172792f616c6c6f632f7372632f636f6c6c" + "656374696f6e732f62747265652f6d61702f656e7472792e727300db1010006000" + "000071010000360000002f72757374632f63326637346333663932386165623530" + "3366313562346539656635373738653737663330353862382f6c6962726172792f" + "616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e" + "7273617373657274696f6e206661696c65643a20656467652e686569676874203d" + "3d2073656c662e686569676874202d2031004c1110005b000000af020000090000" + "00617373657274696f6e206661696c65643a207372632e6c656e2829203d3d2064" + "73742e6c656e28294c1110005b0000002f070000050000004c1110005b000000af" + "040000230000004c1110005b000000ef04000024000000617373657274696f6e20" + "6661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e" + "686569676874202d20310000004c1110005b000000f003000009000000c8151000" + "5f0000005802000030000000110000000c00000004000000120000001300000014" + "000000000000000000000001000000150000006120446973706c617920696d706c" + "656d656e746174696f6e2072657475726e656420616e206572726f7220756e6578" + "7065637465646c792f72757374632f633266373463336639323861656235303366" + "313562346539656635373738653737663330353862382f6c6962726172792f616c" + "6c6f632f7372632f737472696e672e72730000f71210004b000000060a00000e00" + "00004572726f72454f46207768696c652070617273696e672061206c697374454f" + "46207768696c652070617273696e6720616e206f626a656374454f46207768696c" + "652070617273696e67206120737472696e67454f46207768696c65207061727369" + "6e6720612076616c7565657870656374656420603a60657870656374656420602c" + "60206f7220605d60657870656374656420602c60206f7220607d60657870656374" + "6564206964656e7465787065637465642076616c75656578706563746564206022" + "60696e76616c696420657363617065696e76616c6964206e756d6265726e756d62" + "6572206f7574206f662072616e6765696e76616c696420756e69636f646520636f" + "646520706f696e74636f6e74726f6c2063686172616374657220285c7530303030" + "2d5c75303031462920666f756e64207768696c652070617273696e672061207374" + "72696e676b6579206d757374206265206120737472696e67696e76616c69642076" + "616c75653a206578706563746564206b657920746f2062652061206e756d626572" + "20696e2071756f746573666c6f6174206b6579206d7573742062652066696e6974" + "652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c656164696e67" + "20737572726f6761746520696e2068657820657363617065747261696c696e6720" + "636f6d6d61747261696c696e672063686172616374657273756e65787065637465" + "6420656e64206f662068657820657363617065726563757273696f6e206c696d69" + "742065786365656465644572726f72282c206c696e653a202c20636f6c756d6e3a" + "200000008d1510000600000093151000080000009b1510000a000000b820100001" + "0000002f72757374632f6332663734633366393238616562353033663135623465" + "39656635373738653737663330353862382f6c6962726172792f616c6c6f632f73" + "72632f636f6c6c656374696f6e732f62747265652f6e617669676174652e727300" + "c81510005f000000c600000027000000c81510005f000000160200002f000000c8" + "1510005f000000a1000000240000002f686f6d652f7077616e672f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631" + "376432326262613135303031662f73657264655f6a736f6e2d312e302e3133352f" + "7372632f726561642e727300581610005f000000a001000045000000581610005f" + "000000a50100003d000000581610005f000000ad0100001a000000581610005f00" + "0000fa01000013000000581610005f000000030200003e000000581610005f0000" + "00ff01000033000000581610005f000000090200003a000000581610005f000000" + "6802000019000000ffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffff0000010002000300040005000600070008000900ffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffff0000100020003000400050" + "006000700080009000ffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000f000" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffff110000000c00000004000000120000001300000014000000" + "7265656e7472616e7420696e69740000501b10000e0000002f72757374632f6332" + "663734633366393238616562353033663135623465396566353737386537376633" + "30353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63652e" + "7273000000681b10004d0000002301000042000000000000000000000004000000" + "04000000190000001a0000000c000000040000001b0000001c0000001d0000002f" + "727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c6d61" + "6c6c6f632e7273617373657274696f6e206661696c65643a207073697a65203e3d" + "2073697a65202b206d696e5f6f7665726865616400f41b100029000000a8040000" + "09000000617373657274696f6e206661696c65643a207073697a65203c3d207369" + "7a65202b206d61785f6f766572686561640000f41b100029000000ae0400000d00" + "0000757365206f66207374643a3a7468726561643a3a63757272656e7428292069" + "73206e6f7420706f737369626c6520616674657220746865207468726561642773" + "206c6f63616c206461746120686173206265656e2064657374726f796564737464" + "2f7372632f7468726561642f6d6f642e727300fa1c100015000000f10200001300" + "00006661696c656420746f2067656e657261746520756e69717565207468726561" + "642049443a2062697473706163652065786861757374656400201d100037000000" + "fa1c100015000000c40400000d00000001000000000000007374642f7372632f69" + "6f2f62756666657265642f6c696e657772697465727368696d2e72736d6964203e" + "206c656e00009d1d100009000000781d1000250000000f01000029000000656e74" + "697479206e6f7420666f756e647065726d697373696f6e2064656e696564636f6e" + "6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574686f" + "737420756e726561636861626c656e6574776f726b20756e726561636861626c65" + "636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e65637465646164" + "647265737320696e2075736561646472657373206e6f7420617661696c61626c65" + "6e6574776f726b20646f776e62726f6b656e2070697065656e7469747920616c72" + "65616479206578697374736f7065726174696f6e20776f756c6420626c6f636b6e" + "6f742061206469726563746f727969732061206469726563746f72796469726563" + "746f7279206e6f7420656d707479726561642d6f6e6c792066696c657379737465" + "6d206f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e2073796d6c" + "696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e646c" + "65696e76616c696420696e70757420706172616d65746572696e76616c69642064" + "61746174696d6564206f75747772697465207a65726f6e6f2073746f7261676520" + "73706163657365656b206f6e20756e7365656b61626c652066696c6566696c6573" + "797374656d2071756f746120657863656564656466696c6520746f6f206c617267" + "657265736f75726365206275737965786563757461626c652066696c6520627573" + "79646561646c6f636b63726f73732d646576696365206c696e6b206f722072656e" + "616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e616d65" + "617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e2069" + "6e746572727570746564756e737570706f72746564756e65787065637465642065" + "6e64206f662066696c656f7574206f66206d656d6f72796f74686572206572726f" + "72756e63617465676f72697a6564206572726f7220286f73206572726f72202900" + "00000100000000000000ad2010000b000000b8201000010000007374642f737263" + "2f696f2f737464696f2e727300d4201000130000002c030000140000006661696c" + "6564207072696e74696e6720746f203a20000000f8201000130000000b21100002" + "000000d4201000130000005d040000090000007374646f75747374642f7372632f" + "696f2f6d6f642e72736120666f726d617474696e6720747261697420696d706c65" + "6d656e746174696f6e2072657475726e656420616e206572726f72207768656e20" + "74686520756e6465726c79696e672073747265616d20646964206e6f7400000047" + "211000560000003621100011000000280700001500000063616e6e6f7420726563" + "7572736976656c792061637175697265206d75746578b821100020000000737464" + "2f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e7273" + "e02110002400000014000000090000007374642f7372632f73796e632f6f6e6365" + "2e72731422100014000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465787374642f7372632f73" + "796e632f7265656e7472616e745f6c6f636b2e72735e2210001e00000022010000" + "2d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d6520" + "696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f726d" + "6564207265637572736976656c79a0221000380000001000000011000000120000" + "00100000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e00000013000000260000003800000019" + "000000170000000c000000090000000a0000001000000017000000190000000e00" + "00000d00000014000000080000001b0000000e0000001000000016000000150000" + "000b000000160000000d0000000b00000013000000c01d1000d01d1000e11d1000" + "f31d1000031e1000131e1000261e1000381e1000451e1000531e1000681e100074" + "1e10007f1e1000941e1000a91e1000b81e1000c61e1000d91e1000ff1e1000371f" + "1000501f1000671f1000731f10007c1f1000861f1000961f1000ad1f1000c61f10" + "00d41f1000e11f1000f51f1000fd1f10001820100026201000362010004c201000" + "612010006c201000822010008f2010009a201000000000000000f03f0000000000" + "00244000000000000059400000000000408f40000000000088c34000000000006a" + "f8400000000080842e4100000000d01263410000000084d797410000000065cdcd" + "41000000205fa00242000000e876483742000000a2941a6d42000040e59c30a242" + "0000901ec4bcd64200003426f56b0c430080e03779c3414300a0d8855734764300" + "c84e676dc1ab43003d9160e458e143408cb5781daf154450efe2d6e41a4b4492d5" + "4d06cff08044f64ae1c7022db544b49dd9794378ea449102282c2a8b2045350332" + "b7f4ad54450284fee471d9894581121f2fe727c04521d7e6fae031f445ea8ca039" + "593e294624b00888ef8d5f46176e05b5b5b893469cc94622e3a6c846037cd8ea9b" + "d0fe46824dc77261423347e32079cff91268471b695743b8179e47b1a1162ad3ce" + "d2471d4a9cf487820748a55cc3f129633d48e7191a37fa5d724861a0e0c478f5a6" + "4879c818f6d6b2dc484c7dcf59c6ef11499e5c43f0b76b4649c63354eca5067c49" + "5ca0b4b32784b14973c8a1a031e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0" + "fddd76d261854a307d951447baba4a3e6edd6c6cb4f04acec9148887e1244b41fc" + "196ae9195a4ba93d50e23150904b134de45a3e64c44b57609df14d7df94b6db804" + "6ea1dc2f4c44f3c2e4e4e9634c15b0f31d5ee4984c1b9c70a5751dcf4c91616687" + "6972034df5f93fe9034f384d72f88fe3c4626e4d47fb390ebbfda24d197ac8d129" + "bdd74d9f983a4674ac0d4e649fe4abc88b424e3dc7ddd6ba2e774e0c39958c69fa" + "ac4ea743ddf7811ce24e9194d475a2a3164fb5b949138b4c4c4f11140eecd6af81" + "4f169911a7cc1bb64f5bffd5d0bfa2eb4f99bf85e2b74521507f2f27db25975550" + "5ffbf051effc8a501b9d369315dec050624404f89a15f5507b5505b6015b2a516d" + "55c311e1786051c82a3456199794517a35c1abdfbcc9516cc158cb0b160052c7f1" + "2ebe8e1b345239aeba6d72226952c75929090f6b9f521dd8b965e9a2d352244e28" + "bfa38b0853ad61f2ae8cae3e530c7d57ed172d73534f5cade85df8a75363b3d862" + "75f6dd531e70c75d09ba1254254c39b58b6847542e9f87a2ae427d547dc39425ad" + "49b2545cf4f96e18dce6547371b88a1e931c55e846b316f3db5155a21860dcef52" + "8655ca1e78d3abe7bb553f132b64cb70f1550ed8353dfecc2556124e83cc3d405b" + "56cb10d29f26089156fe94c647304ac5563d3ab859bc9cfa56662413b8f5a13057" + "80ed172673ca6457e0e89def0ffd99578cb1c2f5293ed057ef5d3373b44d04586b" + "35009021613958c54200f469b96f58bb298038e2d3a3582a34a0c6dac8d8583541" + "487811fb0e59c1282debea5c4359f172f8a525347859ad8f760f2f41ae59cc19aa" + "69bde8e2593fa014c4eca2175a4fc819f5a78b4d5a321d30f94877825a7e247c37" + "1b15b75a9e2d5b0562daec5a82fc58437d08225ba33b2f949c8a565b8c0a3bb943" + "2d8c5b97e6c4534a9cc15b3d20b6e85c03f65b4da8e32234842b5c3049ce95a032" + "615c7cdb41bb487f955c5b5212ea1adfca5c79734bd270cb005d5750de064dfe34" + "5d6de49548e03d6a5dc4ae5d2dac66a05d751ab5385780d45d1261e2066da0095e" + "ab7c4d244404405ed6db602d5505745ecc12b978aa06a95e7f57e7165548df5eaf" + "96502e358d135f5bbce4798270485f72eb5d18a38c7e5f27b33aefe517b35ff15f" + "096bdfdde75fedb7cb4557d51d60f4529f8b56a55260b127872eac4e87609df128" + "3a5722bd60029759847635f260c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd" + "35c89161d65c8f2c433ac6610c34b3f7d3c8fb618700d07a845d3162a9008499e5" + "b46562d400e5ff1e229b628420ef5f53f5d062a5e8ea37a8320563cfa2e545527f" + "3a63c185af6b938f706332679b4678b3a463fe40425856e0d9639f6829f7352c10" + "64c6c2f3744337446478b330521445796456e0bc665996af64360c36e0f7bde364" + "438f43d875ad18651473544ed3d84e65ecc7f41084478365e8f931156519b86561" + "787e5abe1fee653d0b8ff8d6d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0" + "bbeedf62c266389d6aea97fbf666864405e57dba2c67d44a23af8ef46167891dec" + "5ab2719667eb24a7f11e0ecc6713770857d3880168d794ca2c08eb35680d3afd37" + "ca656b684844fe629e1fa1685ad5bdfb8567d568b14aad7a67c10a69af4eacace0" + "b840695a62d7d718e77469f13acd0ddf20aa69d644a0688b54e0690c56c842ae69" + "146a8f6b7ad31984496a7306594820e57f6a08a4372d34efb36a0a8d853801ebe8" + "6a4cf0a686c1251f6b305628f49877536bbb6b32317f55886baa067ffdde6abe6b" + "2a646f5ecb02f36b353d0b367ec3276c820c8ec35db45d6cd1c7389aba90926cc6" + "f9c640e934c76c37b8f8902302fd6c23739b3a5621326deb4f42c9aba9666de6e3" + "92bb16549c6d70ce3b358eb4d16d0cc28ac2b121066e8f722d331eaa3b6e9967fc" + "df524a716e7f81fb97e79ca56edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a" + "3a1b456f948306b508627a6f3d122471457db06fcc166dcd969ce46f7f5cc880bc" + "c31970cf397dd0551a507043889c44eb20847054aac3152629b970e994349b6f73" + "ef7011dd00c125a82371561441312f9258716b5991fdbab68e71e3d77ade3432c3" + "71dc8d1916c2fef77153f19f9b72fe2d72d4f643a107bf627289f49489c96e9772" + "ab31faeb7b4acd720b5f7c738d4e0273cd765bd030e2367381547204bd9a6c73d0" + "74c722b6e0a173045279abe358d67386a657961cef0b7414c8f6dd71754174187a" + "7455ced275749e98d1ea8147ab7463ffc232b10ce1743cbf737fdd4f15750baf50" + "dfd4a34a75676d920b65a68075c008774efecfb475f1ca14e2fd03ea75d6fe4cad" + "7e4220768c3ea0581e5354762f4ec8eee5678976bb617a6adfc1bf76157d8ca22b" + "d9f3765a9c2f8b76cf28777083fb2d54035f772632bd9c14629377b07eecc3993a" + "c8775c9ee7344049fe77f9c21021c8ed3278b8f354293aa96778a530aab388939d" + "78675e4a70357cd27801f65ccc421b07798233747f13e23c7931a0a82f4c0d7279" + "3dc8923b9f90a6794d7a770ac734dc7970ac8a66fca0117a8c572d803b09467a6f" + "ad38608a8b7b7a656c237c3637b17a7f472c1b0485e57a5e59f72145e61a7bdb97" + "3a35ebcf507bd23d8902e603857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a" + "9ece85247cf687184642a7597cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8" + "560df97cf8f19066ac502f7d3b971ac06b92637d0a3d21b00677987d4c8c295cc8" + "94ce7db0f79939fd1c037e9c7500883ce4377e039300aa4bdd6d7ee25b404a4faa" + "a27eda72d01ce354d77e908f04e41b2a0d7fbad9826e513a427f299023cae5c876" + "7f3374ac3c1f7bac7fa0c8eb85f3cce17f756c6c727565616c736500c04a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01884a7b003d5f5a4e313073657264" + "655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e31" + "3768386631666565323432343761346639634501435f5a4e313073657264655f6a" + "736f6e3264653231446573657269616c697a6572244c5424522447542435657272" + "6f723137683438663764306565626231623836343145020e5f5f727573745f6465" + "616c6c6f63035b5f5a4e34636f726533666d74336e756d34395f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e44656275672475323024666f72247532" + "302475382447542433666d74313768346234323333323664643863616231354504" + "305f5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "3532316661366566366130363732614505445f5a4e34636f726535736c69636535" + "696e6465783236736c6963655f73746172745f696e6465785f6c656e5f6661696c" + "313768663931613361666538376231643434334506385f5a4e34636f726533666d" + "7439466f726d617474657231327061645f696e74656772616c3137686334656130" + "376130626331333536633445075c5f5a4e34636f726533666d74336e756d35305f" + "244c5424696d706c2475323024636f72652e2e666d742e2e446562756724753230" + "24666f7224753230247533322447542433666d7431376835353339386231363535" + "30643532376545084c5f5a4e34636f726533707472343264726f705f696e5f706c" + "616365244c5424616c6c6f632e2e737472696e672e2e537472696e672447542431" + "37683738323934613239653363373833306445094f5f5a4e34636f726533707472" + "343564726f705f696e5f706c616365244c542473657264655f6a736f6e2e2e6572" + "726f722e2e4572726f722447542431376866383763386436646339616234626335" + "450a4f5f5a4e34636f726533707472343564726f705f696e5f706c616365244c54" + "2473657264655f6a736f6e2e2e76616c75652e2e56616c75652447542431376835" + "333262653330333764613162376564450b81015f5a4e39395f244c5424616c6c6f" + "632e2e636f6c6c656374696f6e732e2e62747265652e2e6d61702e2e4254726565" + "4d6170244c54244b24432456244324412447542424753230246173247532302463" + "6f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031376835" + "346633306630323133646334313362450c645f5a4e37305f244c5424616c6c6f63" + "2e2e7665632e2e566563244c542454244324412447542424753230246173247532" + "3024636f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031" + "376864313538343863353832316334666665450d525f5a4e35335f244c5424636f" + "72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866376165323835356232343964" + "626335450e5f5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" + "475424313077726974655f63686172313768323134333931636238656231353263" + "36450f435f5a4e35616c6c6f63377261775f7665633139526177566563244c5424" + "5424432441244754243867726f775f6f6e65313768363666383634616630346265" + "6432623245105a5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c5424412447542437726573657276653231646f5f72657365727665" + "5f616e645f68616e646c653137683766656665376563326164336435616245115d" + "5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475" + "32302461732475323024636f72652e2e666d742e2e577269746524475424397772" + "6974655f737472313768353939643965353738393436646439384512595f5a4e36" + "305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532302461" + "732475323024636f72652e2e666d742e2e446973706c61792447542433666d7431" + "37686365343232366161316637323663316345132e5f5a4e34636f726533666d74" + "39466f726d61747465723370616431376834373639616533383933373463633531" + "45145d5f5a4e36355f244c542473657264655f6a736f6e2e2e76616c75652e2e56" + "616c7565247532302461732475323024636f72652e2e636d702e2e506172746961" + "6c4571244754243265713137683162323138393234373831393663383045158b01" + "5f5a4e3130385f244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e6274" + "7265652e2e6d61702e2e49746572244c54244b2443245624475424247532302461" + "732475323024636f72652e2e697465722e2e7472616974732e2e6974657261746f" + "722e2e4974657261746f7224475424346e65787431376835363664323036316535" + "6139376461644516615f5a4e36385f244c5424636f72652e2e6e756d2e2e657272" + "6f722e2e5061727365496e744572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863383736363338616561" + "6230633031664517675f5a4e36385f244c5424636f72652e2e666d742e2e627569" + "6c646572732e2e50616441646170746572247532302461732475323024636f7265" + "2e2e666d742e2e5772697465244754243977726974655f73747231376838313862" + "343965376536396132366664451808616c6c6f6361746519435f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542436" + "6d616c6c6f6331376865363539333961346338393763633135451a335f5a4e3561" + "6c6c6f63377261775f766563313268616e646c655f6572726f7231376839376237" + "646264306637326464373838451b0a6465616c6c6f636174651c11636f6d706172" + "655f6163636f756e7449441d325f5a4e313073657264655f6a736f6e3264653130" + "66726f6d5f736c69636531376831316365303837373634633961376230451e5c5f" + "5a4e35355f244c542473747224753230246173247532302473657264655f6a736f" + "6e2e2e76616c75652e2e696e6465782e2e496e646578244754243130696e646578" + "5f696e746f31376864333238633634636161396431376163451f325f5a4e34636f" + "726536726573756c743133756e777261705f6661696c6564313768663839396364" + "303037373637303035314520325f5a4e34636f7265366f7074696f6e3133756e77" + "7261705f6661696c6564313768333535313964653938613737363134664521625f" + "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" + "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" + "7533322447542433666d743137686266336530323238343833653337356145222b" + "5f5a4e3373746432696f35737464696f365f7072696e7431376838316334373231" + "3636303436663066634523385f5a4e35616c6c6f63377261775f76656331376361" + "7061636974795f6f766572666c6f77313768343939643438326139656435373135" + "614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d7431" + "3768363534306363623264356664633361624525415f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243466726565" + "3137683339383334616161616533653839343645262c5f5a4e34636f7265397061" + "6e69636b696e673570616e69633137683034656562393137646439336332323945" + "270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c696e6b" + "5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447" + "54243133646973706f73655f6368756e6b31376836653063636364343538363537" + "343633452a3a5f5a4e34636f72653970616e69636b696e67313870616e69635f62" + "6f756e64735f636865636b31376833643662386161346338303439363632452b11" + "727573745f626567696e5f756e77696e642c465f5a4e34636f726533666d743946" + "6f726d617474657231327061645f696e74656772616c313277726974655f707265" + "66697831376861396134333238306236303036643132452d425f5a4e34636f7265" + "35736c69636535696e6465783234736c6963655f656e645f696e6465785f6c656e" + "5f6661696c31376830383862353665323939626561616166452e3b5f5a4e34636f" + "72653970616e69636b696e6731396173736572745f6661696c65645f696e6e6572" + "31376836663765333235376438346135303432452f475f5a4e34325f244c542424" + "52462454247532302461732475323024636f72652e2e666d742e2e446562756724" + "47542433666d74313768336136626161316262343761643230344530495f5a4e34" + "345f244c54242452462454247532302461732475323024636f72652e2e666d742e" + "2e446973706c61792447542433666d743137683766663464306238363039633234" + "37324531585f5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e" + "7473247532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363861336538653530396361666336344532265f5a4e34" + "636f726533666d7435777269746531376839333535346534626537316632633761" + "45335f5f5a4e34636f726533666d74336e756d35305f244c5424696d706c247532" + "3024636f72652e2e666d742e2e44656275672475323024666f7224753230247533" + "322447542433666d7431376835353339386231363535306435323765452e323534" + "5c5f5a4e36335f244c5424636f72652e2e63656c6c2e2e426f72726f774d757445" + "72726f72247532302461732475323024636f72652e2e666d742e2e446562756724" + "47542433666d74313768313564336433343334626464636363384535395f5a4e34" + "636f72653463656c6c323270616e69635f616c72656164795f626f72726f776564" + "313768333134623532613162633436626665344536405f5a4e34636f726535736c" + "69636535696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "313768353862336536383666653333373030654537325f5a4e34636f7265366f70" + "74696f6e31336578706563745f6661696c65643137686630386139396532643733" + "33366336614538535f5a4e34636f72653463686172376d6574686f647332325f24" + "4c5424696d706c2475323024636861722447542431366573636170655f64656275" + "675f657874313768656366613566303431373437393039384539345f5a4e34636f" + "726537756e69636f6465397072696e7461626c6535636865636b31376836646136" + "346638306663313630633761453a325f5a4e34636f7265337374723136736c6963" + "655f6572726f725f6661696c31376862303364323439386438646362363433453b" + "355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c5f72" + "7431376832616462643139306563313832373933453c645f5a4e37315f244c5424" + "636f72652e2e6f70732e2e72616e67652e2e52616e6765244c5424496478244754" + "24247532302461732475323024636f72652e2e666d742e2e446562756724475424" + "33666d7431376836636632383632303536616535653233453d465f5a4e34315f24" + "4c542463686172247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376865613566643964626339343936626665453e625f" + "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" + "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" + "6933322447542433666d7431376863656439306337613633396330316464453fce" + "015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f64" + "653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e672443244b24" + "432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e" + "6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c2447542432" + "316465616c6c6f636174655f616e645f617363656e643137683538396137326639" + "343233626663656245409a025f5a4e35616c6c6f633131636f6c6c656374696f6e" + "73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e2e63" + "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f646552656624" + "4c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" + "652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e2e63" + "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e" + "496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e45646765244754243130" + "696e736572745f6669743137686338613063663533396566663031313145419202" + "5f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f6465" + "32313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e" + "62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e636f" + "6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4d" + "75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e" + "62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c24475424" + "244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" + "652e2e6d61726b65722e2e4b56244754243573706c697431376864303961343862" + "37613831363331616145425a5f5a4e36315f244c542473657264655f6a736f6e2e" + "2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e666d" + "742e2e44656275672447542433666d743137683430323537643666343265323962" + "37344543595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e4572" + "726f72247532302461732475323024636f72652e2e666d742e2e446973706c6179" + "2447542433666d74313768393032373163376232613663653833394544575f5a4e" + "35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475323024" + "61732475323024636f72652e2e666d742e2e44656275672447542433666d743137" + "686236373265623139396333356431383645453a5f5a4e313073657264655f6a73" + "6f6e32646531325061727365724e756d6265723576697369743137683836623839" + "36383136626131306137654546565f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565336d6170323542547265654d6170244c54244b2443245624" + "4324412447542436696e7365727431376834643164623464613838343264346665" + "4547455f5a4e313073657264655f6a736f6e347265616439536c69636552656164" + "3137706f736974696f6e5f6f665f696e6465783137683236623431383938353234" + "38333239364548695f5a4e37305f244c542473657264655f6a736f6e2e2e726561" + "642e2e536c6963655265616424753230246173247532302473657264655f6a736f" + "6e2e2e726561642e2e52656164244754243970617273655f737472313768616265" + "386335353563386263643335354549475f5a4e313073657264655f6a736f6e3472" + "65616439536c696365526561643139736b69705f746f5f6573636170655f736c6f" + "7731376834373836633665323234666132336632454a465f5a4e35616c6c6f6333" + "7665633136566563244c54245424432441244754243137657874656e645f66726f" + "6d5f736c69636531376864626131346637346638653232366463454b2f5f5a4e31" + "3073657264655f6a736f6e34726561643661735f73747231376866636436626234" + "313731373865366635454c3e5f5a4e313073657264655f6a736f6e347265616432" + "3070617273655f756e69636f64655f657363617065313768393634306663636162" + "64303034613064454d725f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e526561642447542431376465636f64655f6865785f65" + "736361706531376834376265353936383535663830346461454e355f5a4e313073" + "657264655f6a736f6e347265616431317065656b5f6f725f656f66313768373363" + "62313436306531616339386135454f2e5f5a4e313073657264655f6a736f6e3472" + "656164356572726f72313768656635353237643333336339633236664550305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376861333165" + "6164363637646336373865304551325f5a4e35616c6c6f63377261775f76656331" + "3166696e6973685f67726f77313768353338353962613338396237316433354552" + "4b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e6572244c" + "54244124475424313467726f775f616d6f7274697a656431376839386333363466" + "6334356633643132344553435f5a4e35616c6c6f63377261775f76656331395261" + "77566563244c54245424432441244754243867726f775f6f6e6531376866373333" + "3137633566643665626336364554395f5a4e337374643674687265616438546872" + "6561644964336e6577396578686175737465643137683333366266376131343838" + "30343463384555425f5a4e34636f72653463656c6c346f6e636531374f6e636543" + "656c6c244c54245424475424387472795f696e6974313768636536336266323238" + "3531393165373145563e5f5a4e35616c6c6f633473796e633136417263244c5424" + "5424432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394557355f5a4e34636f72653970616e69636b696e6731336173736572" + "745f6661696c6564313768323332363266326333633738623661624558475f5a4e" + "34325f244c54242452462454247532302461732475323024636f72652e2e666d74" + "2e2e44656275672447542433666d74313768653138373433383865303762666532" + "3545595d5f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53747269" + "6e67247532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d7431376863653432323661613166373236633163452e3238335a7a" + "5f5a4e34636f726533707472383864726f705f696e5f706c616365244c54247374" + "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447542424" + "47542431376831363664633631616230333334633165455b495f5a4e3373746434" + "73796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424" + "3130696e697469616c697a6531376837663563353038646139653162303962455c" + "605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e5374646f7574" + "4c6f636b2475323024617324753230247374642e2e696f2e2e5772697465244754" + "243977726974655f616c6c31376832346238323631303436316432353666455d55" + "5f5a4e3373746432696f3862756666657265643962756677726974657231384275" + "66577269746572244c54245724475424313477726974655f616c6c5f636f6c6431" + "376835383462646262616562306662316262455e735f5a4e38305f244c54247374" + "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" + "4c54245424475424247532302461732475323024636f72652e2e666d742e2e5772" + "697465244754243977726974655f73747231376837666163663562633065666364" + "383038455f325f5a4e34636f726533666d74355772697465313077726974655f63" + "686172313768663062336265316563313964653565374560305f5a4e34636f7265" + "33666d743557726974653977726974655f666d7431376866383830386630646630" + "65343531336445610a727573745f70616e696362375f5a4e34636f72653570616e" + "6963313250616e69635061796c6f61643661735f73747231376836313439663134" + "3264396132653032654563505f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c542441244754243138696e736572745f6c61726765" + "5f6368756e6b313768656665383531613237353832646137624564455f5a4e3373" + "746433737973396261636b747261636532365f5f727573745f656e645f73686f72" + "745f6261636b747261636531376834646333646534376432323032316239456558" + "5f5a4e337374643970616e69636b696e673139626567696e5f70616e69635f6861" + "6e646c657232385f24753762242475376224636c6f737572652475376424247537" + "64243137686531376133393737663839633131373845663b5f5a4e337374643970" + "616e69636b696e673230727573745f70616e69635f776974685f686f6f6b313768" + "37373665373963396636353931626535456783015f5a4e39395f244c5424737464" + "2e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e646c65722e" + "2e5374617469635374725061796c6f6164247532302461732475323024636f7265" + "2e2e70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638456888015f5a4e313073657264655f" + "6a736f6e3576616c756532646537375f244c5424696d706c247532302473657264" + "652e2e64652e2e446573657269616c697a652475323024666f7224753230247365" + "7264655f6a736f6e2e2e76616c75652e2e56616c75652447542431316465736572" + "69616c697a65313768333165353137383163383336383735394569535f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "39616234626335452e3331316a3c5f5a4e3573657264653264653756697369746f" + "72313876697369745f626f72726f7765645f737472313768343564373131633837" + "31363863326636456b4f5f5a4e313073657264655f6a736f6e3264653231446573" + "657269616c697a6572244c54245224475424313670617273655f616e795f6e756d" + "62657231376839316435333034653561396363663531456c4a5f5a4e3130736572" + "64655f6a736f6e3264653231446573657269616c697a6572244c54245224475424" + "313170617273655f6964656e743137683663353964643731393635353139313045" + "6d735f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d61704163" + "63657373244c5424522447542424753230246173247532302473657264652e2e64" + "652e2e4d61704163636573732447542431336e6578745f6b65795f736565643137" + "6865363235636133323138363233653036456e755f5a4e37355f244c5424736572" + "64655f6a736f6e2e2e64652e2e4d6170416363657373244c542452244754242475" + "3230246173247532302473657264652e2e64652e2e4d6170416363657373244754" + "2431356e6578745f76616c75655f73656564313768656338353637376538303165" + "39393133456f4b5f5a4e313073657264655f6a736f6e3264653231446573657269" + "616c697a6572244c54245224475424313270617273655f6e756d62657231376837" + "3833613431613462393130646432304570515f5a4e313073657264655f6a736f6e" + "3264653231446573657269616c697a6572244c5424522447542431387061727365" + "5f6c6f6e675f696e74656765723137686438313037386634613331633262653245" + "714c5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a65" + "72244c54245224475424313370617273655f646563696d616c3137683661306333" + "363832326663336530306145724d5f5a4e313073657264655f6a736f6e32646532" + "31446573657269616c697a6572244c54245224475424313470617273655f657870" + "6f6e656e743137683336646437646264323365346134656245734d5f5a4e313073" + "657264655f6a736f6e3264653231446573657269616c697a6572244c5424522447" + "542431346636345f66726f6d5f7061727473313768633863316239626161613836" + "666637334574555f5a4e313073657264655f6a736f6e3264653231446573657269" + "616c697a6572244c54245224475424323270617273655f646563696d616c5f6f76" + "6572666c6f77313768336130306563656466383630313864334575565f5a4e3130" + "73657264655f6a736f6e3264653231446573657269616c697a6572244c54245224" + "475424323370617273655f6578706f6e656e745f6f766572666c6f773137683034" + "3762396637333562616463666138457681015f5a4e37355f244c54247365726465" + "5f6a736f6e2e2e64652e2e4d6170416363657373244c5424522447542424753230" + "246173247532302473657264652e2e64652e2e4d61704163636573732447542431" + "336e6578745f6b65795f7365656431326861735f6e6578745f6b65793137683564" + "61326634303536653538313464394577066d656d636d7078365f5a4e3137636f6d" + "70696c65725f6275696c74696e73336d656d376d656d6d6f766531376863383366" + "3931363866353238616565364579076d656d6d6f76657a066d656d637079071201" + "000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100550970" + "726f64756365727302086c616e6775616765010452757374000c70726f63657373" + "65642d62790105727573746325312e38332e302d6e696768746c79202863326637" + "346333663920323032342d30392d30392900490f7461726765745f666561747572" + "6573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b" + "0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::string escrow_tx_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; + + std::vector escrow_tx_json_data( + escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", + "Data" : "02" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasmP4( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + { + auto reValue = re.value(); + // std::cout << reValue.first << " " << + // reValue.second + // << std::endl; + BEAST_EXPECT(!reValue.first); + BEAST_EXPECT(reValue.second == "1"); + } + } + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", + "Data" : "1" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasmP4( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + { + auto reValue = re.value(); + // std::cout << reValue.first << " " << + // reValue.second + // << std::endl; + BEAST_EXPECT(reValue.first); + BEAST_EXPECT(reValue.second == "0"); + } + } + } + + void + testEscrowWasmP5() + { + testcase("escrow wasm P5 test"); + auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + struct TestLedgerDataProvider : public LedgerDataProvider + { + Env* env; + + public: + TestLedgerDataProvider(Env* env) : env(env) + { + } + + int32_t + get_ledger_sqn() override + { + return (int32_t)env->current()->seq(); + } + }; + Env env{*this}; + TestLedgerDataProvider ledgerDataProvider(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + + env.close(); + env.close(); + env.close(); + env.close(); + + re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + + void + testEscrowWasmP6() + { + testcase("escrow wasm P6 test"); + auto wasmHex = + "0061736d010000000109026000017f60017f0002150108686f73745f6c69620863" + "6f6e7374496e74000003030201010405017001010105030100100619037f014180" + "80c0000b7f00418080c0000b7f00418080c0000b073e05066d656d6f7279020007" + "6c6f6f70696e6700010c6c6f6f70696e675f686f737400020a5f5f646174615f65" + "6e6403010b5f5f686561705f6261736503020a1a0202000b150003401080808080" + "001a2000417f6a22000d000b0b0077046e616d65000e0d7761736d5f6c69622e77" + "61736d014c0300325f5a4e387761736d5f6c696238686f73745f6c696238636f6e" + "7374496e74313768643939653133366665323437376662344501076c6f6f70696e" + "67020c6c6f6f70696e675f686f7374071201000f5f5f737461636b5f706f696e74" + "657200550970726f64756365727302086c616e6775616765010452757374000c70" + "726f6365737365642d62790105727573746325312e38332e302d6e696768746c79" + "202863326637346333663920323032342d30392d30392900490f7461726765745f" + "6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + { + std::string funcName("looping"); + auto re = runEscrowWasm(wasm, funcName, 1000, 500); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re.value().result); + std::cout << re.value().cost << std::endl; + } + } + { + std::string funcName("looping_host"); + auto re = runEscrowWasm(wasm, funcName, 1000, 50); + BEAST_EXPECT(!re.has_value()); + } + } + + void + run() override + { + using namespace test::jtx; + + testWasmtimeLib(); + testEscrowWasmP0(); + testBadWasm(); + testEscrowWasmP1(); + testEscrowWasmP2P3(); + testEscrowWasmP4(); + testEscrowWasmP5(); + testEscrowWasmP6(); + } +}; + +BEAST_DEFINE_TESTSUITE(Wasm, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index d81551aa84..262c6ebeb8 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -343,6 +343,33 @@ public: } }; +struct finish_function +{ +private: + std::string value_; + +public: + explicit finish_function(std::string func) : value_(func) + { + } + + explicit finish_function(Slice const& func) : value_(strHex(func)) + { + } + + template + explicit finish_function(std::array const& f) + : finish_function(makeSlice(f)) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfFinishFunction.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index 1309a52393..fd4949d5a4 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -36,6 +36,8 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); + cfg.FEES.extension_compute_limit = 4294967295; + cfg.FEES.extension_size_limit = 4294967295; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 3f804adda6..662442676f 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -515,6 +515,22 @@ public: if (jv.isMember(jss::reserve_inc) != isFlagLedger) return false; + if (env.closed()->rules().enabled(featureSmartEscrow)) + { + if (jv.isMember(jss::extension_compute) != isFlagLedger) + return false; + + if (jv.isMember(jss::extension_size) != isFlagLedger) + return false; + } + else + { + if (jv.isMember(jss::extension_compute)) + return false; + + if (jv.isMember(jss::extension_size)) + return false; + } return true; }; @@ -1298,14 +1314,14 @@ public: { using namespace test::jtx; FeatureBitset const all{supported_amendments()}; - FeatureBitset const xrpFees{featureXRPFees}; testServer(); testLedger(); testTransactions_APIv1(); testTransactions_APIv2(); testManifests(); - testValidations(all - xrpFees); + testValidations(all - featureXRPFees - featureSmartEscrow); + testValidations(all - featureSmartEscrow); testValidations(all); testSubErrors(true); testSubErrors(false); diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 90e77c1e3d..852f73cde1 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -230,6 +230,14 @@ Ledger::Ledger( sle->at(sfReserveIncrement) = *f; sle->at(sfReferenceFeeUnits) = Config::FEE_UNITS_DEPRECATED; } + if (std::find( + amendments.begin(), amendments.end(), featureSmartEscrow) != + amendments.end()) + { + sle->at(sfExtensionComputeLimit) = + config.FEES.extension_compute_limit; + sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + } rawInsert(sle); } @@ -621,6 +629,7 @@ Ledger::setup() { bool oldFees = false; bool newFees = false; + bool extensionFees = false; { auto const baseFee = sle->at(~sfBaseFee); auto const reserveBase = sle->at(~sfReserveBase); @@ -638,6 +647,7 @@ Ledger::setup() auto const reserveBaseXRP = sle->at(~sfReserveBaseDrops); auto const reserveIncrementXRP = sle->at(~sfReserveIncrementDrops); + auto assign = [&ret]( XRPAmount& dest, std::optional const& src) { @@ -654,12 +664,32 @@ Ledger::setup() assign(fees_.increment, reserveIncrementXRP); newFees = baseFeeXRP || reserveBaseXRP || reserveIncrementXRP; } + { + auto const extensionComputeLimit = + sle->at(~sfExtensionComputeLimit); + auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + + auto assign = [](std::uint32_t& dest, + std::optional const& src) { + if (src) + { + dest = src.value(); + } + }; + assign(fees_.extensionComputeLimit, extensionComputeLimit); + assign(fees_.extensionSizeLimit, extensionSizeLimit); + extensionFees = extensionComputeLimit || extensionSizeLimit; + } if (oldFees && newFees) // Should be all of one or the other, but not both ret = false; if (!rules_.enabled(featureXRPFees) && newFees) // Can't populate the new fees before the amendment is enabled ret = false; + if (!rules_.enabled(featureSmartEscrow) && extensionFees) + // Can't populate the extension fees before the amendment is + // enabled + ret = false; } } catch (SHAMapMissingNode const&) @@ -678,15 +708,17 @@ Ledger::setup() void Ledger::defaultFees(Config const& config) { - XRPL_ASSERT( - fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0, - "ripple::Ledger::defaultFees : zero fees"); + assert( + fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) fees_.reserve = config.FEES.account_reserve; - if (fees_.increment == 0) - fees_.increment = config.FEES.owner_reserve; + if (fees_.extensionComputeLimit == 0) + fees_.extensionComputeLimit = config.FEES.extension_compute_limit; + if (fees_.extensionSizeLimit == 0) + fees_.extensionSizeLimit = config.FEES.extension_size_limit; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 95160f398a..5583b68862 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -29,10 +29,10 @@ namespace ripple { namespace detail { +template class VotableValue { private: - using value_type = XRPAmount; value_type const current_; // The current setting value_type const target_; // The setting we want std::map voteMap_; @@ -67,8 +67,9 @@ public: getVotes() const; }; -auto -VotableValue::getVotes() const -> std::pair +template +std::pair +VotableValue::getVotes() const { value_type ourVote = current_; int weight = 0; @@ -191,6 +192,32 @@ FeeVoteImpl::doValidation( "reserve increment", sfReserveIncrement); } + if (rules.enabled(featureSmartEscrow)) + { + auto vote = [&v, this]( + auto const current, + std::uint32_t target, + const char* name, + auto const& sfield) { + if (current != target) + { + JLOG(journal_.info()) + << "Voting for " << name << " of " << target; + + v[sfield] = target; + } + }; + vote( + lastFees.extensionComputeLimit, + target_.extension_compute_limit, + "extension compute limit", + sfExtensionComputeLimit); + vote( + lastFees.extensionSizeLimit, + target_.extension_size_limit, + "extension size limit", + sfExtensionSizeLimit); + } } void @@ -213,11 +240,19 @@ FeeVoteImpl::doVoting( detail::VotableValue incReserveVote( lastClosedLedger->fees().increment, target_.owner_reserve); + detail::VotableValue extensionComputeVote( + lastClosedLedger->fees().extensionComputeLimit, + target_.extension_compute_limit); + + detail::VotableValue extensionSizeVote( + lastClosedLedger->fees().extensionSizeLimit, + target_.extension_size_limit); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, SF_AMOUNT const& xrpField) { if (auto const field = ~val->at(~xrpField); field && field->native()) @@ -246,7 +281,7 @@ FeeVoteImpl::doVoting( else { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, auto const& valueField) { if (auto const field = val->at(~valueField)) { @@ -277,6 +312,29 @@ FeeVoteImpl::doVoting( doVote(val, incReserveVote, sfReserveIncrement); } } + if (rules.enabled(featureSmartEscrow)) + { + auto doVote = [](std::shared_ptr const& val, + detail::VotableValue& value, + SF_UINT32 const& extensionField) { + if (auto const field = ~val->at(~extensionField); field) + { + value.addVote(field.value()); + } + else + { + value.noVote(); + } + }; + + for (auto const& val : set) + { + if (!val->isTrusted()) + continue; + doVote(val, extensionComputeVote, sfExtensionComputeLimit); + doVote(val, extensionSizeVote, sfExtensionSizeLimit); + } + } // choose our positions // TODO: Use structured binding once LLVM 16 is the minimum supported @@ -285,11 +343,14 @@ FeeVoteImpl::doVoting( auto const baseFee = baseFeeVote.getVotes(); auto const baseReserve = baseReserveVote.getVotes(); auto const incReserve = incReserveVote.getVotes(); + auto const extensionCompute = extensionComputeVote.getVotes(); + auto const extensionSize = extensionSizeVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position - if (baseFee.second || baseReserve.second || incReserve.second) + if (baseFee.second || baseReserve.second || incReserve.second || + extensionCompute.second || extensionSize.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -317,6 +378,11 @@ FeeVoteImpl::doVoting( incReserveVote.current()); obj[sfReferenceFeeUnits] = Config::FEE_UNITS_DEPRECATED; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = extensionCompute.first; + obj[sfExtensionSizeLimit] = extensionSize.first; + } }); uint256 txID = feeTx.getTransactionID(); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index d46bfa74db..2b3c38eea4 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2262,6 +2262,15 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) reserveIncXRP && reserveIncXRP->native()) jvObj[jss::reserve_inc] = reserveIncXRP->xrp().jsonClipped(); + if (auto const extensionComputeLimit = + ~val->at(~sfExtensionComputeLimit); + extensionComputeLimit) + jvObj[jss::extension_compute] = *extensionComputeLimit; + + if (auto const extensionSizeLimit = ~val->at(~sfExtensionSizeLimit); + extensionSizeLimit) + jvObj[jss::extension_size] = *extensionSizeLimit; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2711,12 +2720,21 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::seq] = Json::UInt(lpClosed->info().seq); l[jss::hash] = to_string(lpClosed->info().hash); + bool const smartEscrowEnabled = + m_ledgerMaster.getValidatedLedger()->rules().enabled( + featureSmartEscrow); if (!human) { l[jss::base_fee] = baseFee.jsonClipped(); l[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); l[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); } @@ -2726,6 +2744,12 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::reserve_base_xrp] = lpClosed->fees().accountReserve(0).decimalXRP(); l[jss::reserve_inc_xrp] = lpClosed->fees().increment.decimalXRP(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } if (auto const closeOffset = app_.timeKeeper().closeOffset(); std::abs(closeOffset.count()) >= 60) @@ -2911,6 +2935,13 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().accountReserve(0).jsonClipped(); jvObj[jss::reserve_inc] = lpAccepted->fees().increment.jsonClipped(); + if (lpAccepted->rules().enabled(featureSmartEscrow)) + { + jvObj[jss::extension_compute] = + lpAccepted->fees().extensionComputeLimit; + jvObj[jss::extension_size] = + lpAccepted->fees().extensionSizeLimit; + } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -3947,6 +3978,12 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (lpClosed->rules().enabled(featureSmartEscrow)) + { + jvResult[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } } if ((mMode >= OperatingMode::SYNCING) && !isNeedNetworkLedger()) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp new file mode 100644 index 0000000000..d94135646b --- /dev/null +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -0,0 +1,592 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +// WasmVM::WasmVM(beast::Journal j) +// : j_(j) +//{ +// } + +namespace ripple { +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t input) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; + WasmEdge_Value Returns[1]; + WasmEdge_String FuncName = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( + VMCxt, + wasmCode.data(), + wasmCode.size(), + FuncName, + Params, + 1, + Returns, + 1); + + bool ok = WasmEdge_ResultOK(Res); + bool re = false; + if (ok) + { + auto result = WasmEdge_ValueGetI32(Returns[0]); + // printf("Get the result: %d\n", result); + if (result != 0) + re = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(FuncName); + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& accountID) +{ + auto dataLen = (int32_t)accountID.size(); + // printf("accountID size: %d\n", dataLen); + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + WasmEdge_Result allocRes = WasmEdge_VMRunWasmFromBuffer( + VMCxt, + wasmCode.data(), + wasmCode.size(), + allocFunc, + allocParams, + 1, + allocReturns, + 1); + + bool ok = WasmEdge_ResultOK(allocRes); + bool re = false; + if (ok) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("Alloc pointer: %d\n", pointer); + + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, accountID.data(), pointer, dataLen); + + ok = WasmEdge_ResultOK(setRes); + if (ok) + { + // printf("Set data ok\n"); + + WasmEdge_Value params[2] = { + WasmEdge_ValueGenI32(pointer), WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = + WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 2, returns, 1); + + ok = WasmEdge_ResultOK(funcRes); + if (ok) + { + // printf("func ok\n"); + re = (WasmEdge_ValueGetI32(returns[0]) == 1); + } + else + { + printf( + "Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + } + else + { + printf( + "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); + } + } + else + { + printf( + "Alloc error message: %s\n", WasmEdge_ResultGetMessage(allocRes)); + } + + WasmEdge_VMDelete(VMCxt); + // TODO free everything + // WasmEdge_StringDelete(FuncName); + if (ok) + { + // printf("runEscrowWasm ok, result %d\n", re); + return re; + } + else + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { + auto dataLen = (int32_t)data.size(); + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + + WasmEdge_Result allocRes = WasmEdge_VMExecute( + VMCxt, allocFunc, allocParams, 1, allocReturns, 1); + + if (WasmEdge_ResultOK(allocRes)) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("alloc ptr %d, len %d\n", pointer, dataLen); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, data.data(), pointer, dataLen); + if (WasmEdge_ResultOK(setRes)) + { + return pointer; + } + } + + return 0; + }; + + auto tx_ptr = wasmAlloc(escrow_tx_json_data); + auto lo_ptr = wasmAlloc(escrow_lo_json_data); + if (tx_ptr == 0 || lo_ptr == 0) + { + printf("data error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto txLen = (int32_t)escrow_tx_json_data.size(); + auto loLen = (int32_t)escrow_lo_json_data.size(); + + WasmEdge_Value params[4] = { + WasmEdge_ValueGenI32(tx_ptr), + WasmEdge_ValueGenI32(txLen), + WasmEdge_ValueGenI32(lo_ptr), + WasmEdge_ValueGenI32(loLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); + + if (WasmEdge_ResultOK(funcRes)) + { + // printf("func ok\n"); + return WasmEdge_ValueGetI32(returns[0]) == 1; + } + else + { + printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + return Unexpected(tecFAILED_PROCESSING); + } +} + +Expected, TER> +runEscrowWasmP4( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { + auto dataLen = (int32_t)data.size(); + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + + WasmEdge_Result allocRes = WasmEdge_VMExecute( + VMCxt, allocFunc, allocParams, 1, allocReturns, 1); + + if (WasmEdge_ResultOK(allocRes)) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("alloc ptr %d, len %d\n", pointer, dataLen); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, data.data(), pointer, dataLen); + if (WasmEdge_ResultOK(setRes)) + { + return pointer; + } + } + + return 0; + }; + + auto tx_ptr = wasmAlloc(escrow_tx_json_data); + auto lo_ptr = wasmAlloc(escrow_lo_json_data); + if (tx_ptr == 0 || lo_ptr == 0) + { + printf("data error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto txLen = (int32_t)escrow_tx_json_data.size(); + auto loLen = (int32_t)escrow_lo_json_data.size(); + + WasmEdge_Value params[4] = { + WasmEdge_ValueGenI32(tx_ptr), + WasmEdge_ValueGenI32(txLen), + WasmEdge_ValueGenI32(lo_ptr), + WasmEdge_ValueGenI32(loLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); + + if (WasmEdge_ResultOK(funcRes)) + { + auto pointer = WasmEdge_ValueGetI32(returns[0]); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + uint8_t buff[9]; + WasmEdge_Result getRes = + WasmEdge_MemoryInstanceGetData(mi, buff, pointer, 9); + if (!WasmEdge_ResultOK(getRes)) + { + printf( + "re mem get message: %s\n", WasmEdge_ResultGetMessage(getRes)); + return Unexpected(tecFAILED_PROCESSING); + } + auto flag = buff[0]; + + auto leToInt32 = [](const uint8_t* d) -> uint32_t { + uint32_t r = 0; + for (int i = 0; i < 4; ++i) + { + r |= static_cast(d[i]) << (i * 8); + // printf("leToInt32 %d\n", r); + } + return r; + }; + auto ret_pointer = + leToInt32(reinterpret_cast(&buff[1])); + auto ret_len = leToInt32(reinterpret_cast(&buff[5])); + // printf("re flag %d, ptr %d, len %d\n", flag, ret_pointer, + // ret_len); + + std::vector buff2(ret_len); + getRes = WasmEdge_MemoryInstanceGetData( + mi, buff2.data(), ret_pointer, ret_len); + if (!WasmEdge_ResultOK(getRes)) + { + printf( + "re 2 mem get message: %s\n", + WasmEdge_ResultGetMessage(getRes)); + return Unexpected(tecFAILED_PROCESSING); + } + + std::string newData(buff2.begin(), buff2.end()); + + // free + WasmEdge_String freeFunc = WasmEdge_StringCreateByCString("deallocate"); + WasmEdge_Value freeParams[2] = { + WasmEdge_ValueGenI32(ret_pointer), WasmEdge_ValueGenI32(ret_len)}; + WasmEdge_Value freeReturns[0]; + WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + // free pointer too, with len = 9 too + freeParams[0] = WasmEdge_ValueGenI32(pointer); + freeParams[1] = WasmEdge_ValueGenI32(9); + WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + + return std::pair(flag == 1, newData); + } + else + { + printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + return Unexpected(tecFAILED_PROCESSING); + } +} + +WasmEdge_Result +get_ledger_sqn( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + Out[0] = + WasmEdge_ValueGenI32(((LedgerDataProvider*)data)->get_ledger_sqn()); + return WasmEdge_Result_Success; +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + LedgerDataProvider* ledgerDataProvider) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + { // register host function + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate( + HostFType, get_ledger_sqn, ledgerDataProvider, 0); + WasmEdge_FunctionTypeDelete(HostFType); + + WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* HostMod = + WasmEdge_ModuleInstanceCreate(HostName); + WasmEdge_StringDelete(HostName); + + WasmEdge_String HostFuncName = + WasmEdge_StringCreateByCString("get_ledger_sqn"); + WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_Result regRe = + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + if (!WasmEdge_ResultOK(regRe)) + { + printf("host func reg error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + } + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Value funcReturns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); + + bool ok = WasmEdge_ResultOK(funcRes); + bool re = false; + if (ok) + { + auto result = WasmEdge_ValueGetI32(funcReturns[0]); + if (result != 0) + re = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(func); + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +WasmEdge_Result +constInt( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + Out[0] = WasmEdge_ValueGenI32(5); + return WasmEdge_Result_Success; +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t gasLimit, + int32_t input) +{ + WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); + WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); + WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); + + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); + WasmEdge_StatisticsContext* StatCxt = + WasmEdge_VMGetStatisticsContext(VMCxt); + WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); + + { // register host function + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate(HostFType, constInt, nullptr, 100); + WasmEdge_FunctionTypeDelete(HostFType); + + WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* HostMod = + WasmEdge_ModuleInstanceCreate(HostName); + WasmEdge_StringDelete(HostName); + + WasmEdge_String HostFuncName = + WasmEdge_StringCreateByCString("constInt"); + WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_Result regRe = + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + if (!WasmEdge_ResultOK(regRe)) + { + printf("host func reg error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + } + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, Params, 1, NULL, 0); + + bool ok = WasmEdge_ResultOK(funcRes); + EscrowResultP6 re; + if (ok) + { + auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); + re.cost = WasmEdge_StatisticsGetTotalCost(sc); + // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount + re.result = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(func); + // delete other obj allocated + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h new file mode 100644 index 0000000000..37988a97e3 --- /dev/null +++ b/src/xrpld/app/misc/WasmVM.h @@ -0,0 +1,97 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#ifndef RIPPLE_APP_MISC_WASMVM_H_INLCUDED +#define RIPPLE_APP_MISC_WASMVM_H_INLCUDED + +#include +// #include +#include + +#include + +namespace ripple { + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t input); + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& accountID); + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data); + +Expected, TER> +runEscrowWasmP4( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data); + +struct LedgerDataProvider +{ + virtual int32_t + get_ledger_sqn() + { + return 1; + } + + virtual ~LedgerDataProvider() = default; +}; + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + LedgerDataProvider* ledgerDataProvider); + +struct EscrowResultP6 +{ + bool result; + int32_t cost; +}; + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t gasLimit, + int32_t input); + +} // namespace ripple +#endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED + +// class WasmVM final +//{ +// public: +// explicit WasmVM(beast::Journal j); +// ~WasmVM() = default; +// +// private: +// beast::Journal j_; +// }; \ No newline at end of file diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index 45834742c8..2f5d1c6e31 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -128,6 +128,18 @@ Change::preclaim(PreclaimContext const& ctx) ctx.tx.isFieldPresent(sfReserveIncrementDrops)) return temDISABLED; } + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + !ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + return temMALFORMED; + } + else + { + if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + return temDISABLED; + } return tesSUCCESS; case ttAMENDMENT: case ttUNL_MODIFY: @@ -375,6 +387,11 @@ Change::applyFee() set(feeObject, ctx_.tx, sfReserveBase); set(feeObject, ctx_.tx, sfReserveIncrement); } + if (view().rules().enabled(featureSmartEscrow)) + { + set(feeObject, ctx_.tx, sfExtensionComputeLimit); + set(feeObject, ctx_.tx, sfExtensionSizeLimit); + } view().update(feeObject); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 48b9867d3a..41b51b295f 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -97,9 +98,28 @@ EscrowCreate::makeTxConsequences(PreflightContext const& ctx) return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()}; } +XRPAmount +EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount txnFees{Transactor::calculateBaseFee(view, tx)}; + if (tx.isFieldPresent(sfFinishFunction)) + { + // TODO: make this fee increase based on the extra compute run + txnFees += 1000; + } + return txnFees; +} + NotTEC EscrowCreate::preflight(PreflightContext const& ctx) { + if (ctx.tx.isFieldPresent(sfFinishFunction) && + !ctx.rules.enabled(featureSmartEscrow)) + { + JLOG(ctx.j.debug()) << "SmartEscrow not enabled"; + return temDISABLED; + } + if (ctx.rules.enabled(fix1543) && ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; @@ -122,14 +142,23 @@ EscrowCreate::preflight(PreflightContext const& ctx) ctx.tx[sfCancelAfter] <= ctx.tx[sfFinishAfter]) return temBAD_EXPIRATION; + if (ctx.tx.isFieldPresent(sfFinishFunction) && + !ctx.tx.isFieldPresent(sfCancelAfter)) + return temBAD_EXPIRATION; + if (ctx.rules.enabled(fix1571)) { // In the absence of a FinishAfter, the escrow can be finished // immediately, which can be confusing. When creating an escrow, // we want to ensure that either a FinishAfter time is explicitly // specified or a completion condition is attached. - if (!ctx.tx[~sfFinishAfter] && !ctx.tx[~sfCondition]) + if (!ctx.tx[~sfFinishAfter] && !ctx.tx[~sfCondition] && + !ctx.tx[~sfFinishFunction]) + { + JLOG(ctx.j.debug()) << "Must have at least one of FinishAfter, " + "Condition, or FinishFunction."; return temMALFORMED; + } } if (auto const cb = ctx.tx[~sfCondition]) @@ -154,6 +183,19 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temDISABLED; } + if (ctx.tx.isFieldPresent(sfFinishFunction)) + { + auto const code = ctx.tx.getFieldVL(sfFinishFunction); + if (code.size() == 0 || + code.size() > ctx.app.config().FEES.extension_size_limit) + { + JLOG(ctx.j.debug()) + << "EscrowCreate.FinishFunction bad size " << code.size(); + return temMALFORMED; + } + // TODO: add check to ensure this is valid WASM code + } + return preflight2(ctx); } @@ -254,6 +296,8 @@ EscrowCreate::doApply() (*slep)[~sfCancelAfter] = ctx_.tx[~sfCancelAfter]; (*slep)[~sfFinishAfter] = ctx_.tx[~sfFinishAfter]; (*slep)[~sfDestinationTag] = ctx_.tx[~sfDestinationTag]; + (*slep)[~sfFinishFunction] = ctx_.tx[~sfFinishFunction]; + (*slep)[~sfData] = ctx_.tx[~sfData]; ctx_.view().insert(slep); @@ -277,8 +321,13 @@ EscrowCreate::doApply() } // Deduct owner's balance, increment owner count + // TODO: determine actual reserve based on FinishFunction size (*sle)[sfBalance] = (*sle)[sfBalance] - ctx_.tx[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, 1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + ctx_.tx.isFieldPresent(sfFinishFunction) ? 2 : 1, + ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; @@ -323,7 +372,10 @@ EscrowFinish::preflight(PreflightContext const& ctx) // If you specify a condition, then you must also specify // a fulfillment. if (static_cast(cb) != static_cast(fb)) + { + JLOG(ctx.j.debug()) << "Condition != Fulfillment"; return temMALFORMED; + } // Verify the transaction signature. If it doesn't work // then don't do any more work. @@ -367,6 +419,7 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } + // TODO: make this fee increase based on the extra compute run return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -384,6 +437,22 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } +struct EscrowLedgerDataProvider : public LedgerDataProvider +{ + ApplyView& view_; + +public: + EscrowLedgerDataProvider(ApplyView& view) : view_(view) + { + } + + int32_t + get_ledger_sqn() override + { + return (int32_t)view_.seq(); + } +}; + TER EscrowFinish::doApply() { @@ -392,6 +461,13 @@ EscrowFinish::doApply() if (!slep) return tecNO_TARGET; + // Order of processing the release conditions (in order of performance): + // FinishAfter/CancelAfter + // Destination validity (after SmartEscrow is enabled) + // Condition/Fulfillment + // Destination validity (before SmartEscrow is enabled) + // FinishFunction + // If a cancel time is present, a finish operation should only succeed prior // to that time. fix1571 corrects a logic error in the check that would make // a finish only succeed strictly after the cancel time. @@ -401,11 +477,17 @@ EscrowFinish::doApply() // Too soon: can't execute before the finish time if ((*slep)[~sfFinishAfter] && !after(now, (*slep)[sfFinishAfter])) + { + JLOG(j_.debug()) << "Too soon"; return tecNO_PERMISSION; + } // Too late: can't execute after the cancel time if ((*slep)[~sfCancelAfter] && after(now, (*slep)[sfCancelAfter])) + { + JLOG(j_.debug()) << "Too late"; return tecNO_PERMISSION; + } } else { @@ -413,13 +495,35 @@ EscrowFinish::doApply() if ((*slep)[~sfFinishAfter] && ctx_.view().info().parentCloseTime.time_since_epoch().count() <= (*slep)[sfFinishAfter]) + { + JLOG(j_.debug()) << "Too soon?"; return tecNO_PERMISSION; + } // Too late? if ((*slep)[~sfCancelAfter] && ctx_.view().info().parentCloseTime.time_since_epoch().count() <= (*slep)[sfCancelAfter]) + { + JLOG(j_.debug()) << "Too late?"; return tecNO_PERMISSION; + } + } + + AccountID const destID = (*slep)[sfDestination]; + auto const sled = ctx_.view().peek(keylet::account(destID)); + if (ctx_.view().rules().enabled(featureSmartEscrow)) + { + // NOTE: Escrow payments cannot be used to fund accounts. + if (!sled) + return tecNO_DST; + + if (ctx_.view().rules().enabled(featureDepositAuth)) + { + if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + !isTesSuccess(err)) + return err; + } } // Check cryptocondition fulfillment @@ -469,17 +573,56 @@ EscrowFinish::doApply() return tecCRYPTOCONDITION_ERROR; } - // NOTE: Escrow payments cannot be used to fund accounts. - AccountID const destID = (*slep)[sfDestination]; - auto const sled = ctx_.view().peek(keylet::account(destID)); - if (!sled) - return tecNO_DST; - - if (ctx_.view().rules().enabled(featureDepositAuth)) + if (!ctx_.view().rules().enabled(featureSmartEscrow)) { - if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); - !isTesSuccess(err)) - return err; + // NOTE: Escrow payments cannot be used to fund accounts. + if (!sled) + return tecNO_DST; + + if (ctx_.view().rules().enabled(featureDepositAuth)) + { + if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + !isTesSuccess(err)) + return err; + } + } + + // Execute custom release function + if ((*slep)[~sfFinishFunction]) + { + JLOG(j_.trace()) + << "The escrow has a finish function, running WASM code..."; + // WASM execution + auto const wasmStr = slep->getFieldVL(sfFinishFunction); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("ready"); + + auto const escrowTx = + ctx_.tx.getJson(JsonOptions::none).toStyledString(); + auto const escrowObj = + slep->getJson(JsonOptions::none).toStyledString(); + std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); + std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); + + EscrowLedgerDataProvider ledgerDataProvider(ctx_.view()); + + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + JLOG(j_.trace()) << "Escrow WASM ran"; + if (re.has_value()) + { + auto reValue = re.value(); + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue); + if (!reValue) + { + // ctx_.view().update(slep); + return tecWASM_REJECTED; + } + } + else + { + JLOG(j_.debug()) << "WASM Failure: " + transHuman(re.error()); + return re.error(); + } } AccountID const account = (*slep)[sfAccount]; @@ -512,7 +655,11 @@ EscrowFinish::doApply() // Adjust source owner count auto const sle = ctx_.view().peek(keylet::account(account)); - adjustOwnerCount(ctx_.view(), sle, -1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + slep->isFieldPresent(sfFinishFunction) ? -2 : -1, + ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger @@ -594,7 +741,11 @@ EscrowCancel::doApply() // Transfer amount back to owner, decrement owner count auto const sle = ctx_.view().peek(keylet::account(account)); (*sle)[sfBalance] = (*sle)[sfBalance] + (*slep)[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, -1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + slep->isFieldPresent(sfFinishFunction) ? -2 : -1, + ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger diff --git a/src/xrpld/app/tx/detail/Escrow.h b/src/xrpld/app/tx/detail/Escrow.h index 78acdbee00..0a74f31b3a 100644 --- a/src/xrpld/app/tx/detail/Escrow.h +++ b/src/xrpld/app/tx/detail/Escrow.h @@ -36,6 +36,9 @@ public: static TxConsequences makeTxConsequences(PreflightContext const& ctx); + static XRPAmount + calculateBaseFee(ReadView const& view, STTx const& tx); + static NotTEC preflight(PreflightContext const& ctx); diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index 9d3e9e3946..f192126387 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -831,6 +831,22 @@ removeExpiredCredentials( } } +static void +modifyWasmDataFields( + ApplyView& view, + std::vector> const& wasmObjects, + beast::Journal viewJ) +{ + for (auto const& [index, data] : wasmObjects) + { + if (auto const sle = view.peek(keylet::escrow(index))) + { + sle->setFieldVL(sfData, data); + view.update(sle); + } + } +} + static void removeDeletedTrustLines( ApplyView& view, @@ -973,6 +989,7 @@ Transactor::operator()() else if ( (result == tecOVERSIZE) || (result == tecKILLED) || (result == tecINCOMPLETE) || (result == tecEXPIRED) || + (result == tecWASM_REJECTED) || (isTecClaimHardFail(result, view().flags()))) { JLOG(j_.trace()) << "reapplying because of " << transToken(result); @@ -985,13 +1002,16 @@ Transactor::operator()() std::vector removedTrustLines; std::vector expiredNFTokenOffers; std::vector expiredCredentials; + std::vector> modifiedWasmObjects; bool const doOffers = ((result == tecOVERSIZE) || (result == tecKILLED)); bool const doLines = (result == tecINCOMPLETE); bool const doNFTokenOffers = (result == tecEXPIRED); bool const doCredentials = (result == tecEXPIRED); - if (doOffers || doLines || doNFTokenOffers || doCredentials) + bool const doWasmData = (result == tecWASM_REJECTED); + if (doOffers || doLines || doNFTokenOffers || doCredentials || + doWasmData) { ctx_.visit([doOffers, &removedOffers, @@ -1000,7 +1020,9 @@ Transactor::operator()() doNFTokenOffers, &expiredNFTokenOffers, doCredentials, - &expiredCredentials]( + &expiredCredentials, + doWasmData, + &modifiedWasmObjects]( uint256 const& index, bool isDelete, std::shared_ptr const& before, @@ -1035,6 +1057,13 @@ Transactor::operator()() (before->getType() == ltCREDENTIAL)) expiredCredentials.push_back(index); } + + if (doWasmData && before && after && + (before->getType() == ltESCROW)) + { + modifiedWasmObjects.push_back( + std::make_pair(index, after->getFieldVL(sfData))); + } }); } @@ -1064,6 +1093,10 @@ Transactor::operator()() removeExpiredCredentials( view(), expiredCredentials, ctx_.app.journal("View")); + if (result == tecWASM_REJECTED) + modifyWasmDataFields( + view(), modifiedWasmObjects, ctx_.app.journal("View")); + applied = isTecClaim(result); } diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 4329632b2e..c0cedcc1a4 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -80,6 +80,12 @@ struct FeeSetup /** The per-owned item reserve requirement in drops. */ XRPAmount owner_reserve{2 * DROPS_PER_XRP}; + /** The compute limit for Feature Extensions. */ + std::uint32_t extension_compute_limit{4294967295}; + + /** The WASM size limit for Feature Extensions. */ + std::uint32_t extension_size_limit{4294967295}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index b6375f1a9b..6a34b1db91 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1102,6 +1102,10 @@ setup_FeeVote(Section const& section) setup.account_reserve = temp; if (set(temp, "owner_reserve", section)) setup.owner_reserve = temp; + if (set(temp, "extension_compute_limit", section)) + setup.extension_compute_limit = temp; + if (set(temp, "extension_size_limit", section)) + setup.extension_size_limit = temp; } return setup; } From 911c0466c0d6500830652046ded798a7d1ffcb60 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 16:47:14 -0400 Subject: [PATCH 02/15] Merge develop into ripple/smart-escrow (#5357) * Set version to 2.4.0 * refactor: Remove unused and add missing includes (#5293) The codebase is filled with includes that are unused, and which thus can be removed. At the same time, the files often do not include all headers that contain the definitions used in those files. This change uses clang-format and clang-tidy to clean up the includes, with minor manual intervention to ensure the code compiles on all platforms. * refactor: Calculate numFeatures automatically (#5324) Requiring manual updates of numFeatures is an annoying manual process that is easily forgotten, and leads to frequent merge conflicts. This change takes advantage of the `XRPL_FEATURE` and `XRPL_FIX` macros, and adds a new `XRPL_RETIRE` macro to automatically set `numFeatures`. * refactor: Improve ordering of headers with clang-format (#5343) Removes all manual header groupings from source and header files by leveraging clang-format options. * Rename "deadlock" to "stall" in `LoadManager` (#5341) What the LoadManager class does is stall detection, which is not the same as deadlock detection. In the condition of severe CPU starvation, LoadManager will currently intentionally crash rippled reporting `LogicError: Deadlock detected`. This error message is misleading as the condition being detected is not a deadlock. This change fixes and refactors the code in response. * Adds hub.xrpl-commons.org as a new Bootstrap Cluster (#5263) * fix: Error message for ledger_entry rpc (#5344) Changes the error to `malformedAddress` for `permissioned_domain` in the `ledger_entry` rpc, when the account is not a string. This change makes it more clear to a user what is wrong with their request. * fix: Handle invalid marker parameter in grpc call (#5317) The `end_marker` is used to limit the range of ledger entries to fetch. If `end_marker` is less than `marker`, a crash can occur. This change adds an additional check. * fix: trust line RPC no ripple flag (#5345) The Trustline RPC `no_ripple` flag gets set depending on `lsfDefaultRipple` flag, which is not a flag of a trustline but of the account root. The `lsfDefaultRipple` flag does not provide any insight if this particular trust line has `lsfLowNoRipple` or `lsfHighNoRipple` flag set, so it should not be used here at all. This change simplifies the logic. * refactor: Updates Conan dependencies: RocksDB (#5335) Updates RocksDB to version 9.7.3, the latest version supported in Conan 1.x. A patch for 9.7.4 that fixes a memory leak is included. * fix: Remove null pointer deref, just do abort (#5338) This change removes the existing undefined behavior from `LogicError`, so we can be certain that there will be always a stacktrace. De-referencing a null pointer is an old trick to generate `SIGSEGV`, which would typically also create a stacktrace. However it is also an undefined behaviour and compilers can do something else. A more robust way to create a stacktrace while crashing the program is to use `std::abort`, which we have also used in this location for a long time. If we combine the two, we might not get the expected behaviour - namely, the nullpointer deref followed by `std::abort`, as handled in certain compiler versions may not immediately cause a crash. We have observed stacktrace being wiped instead, and thread put in indeterminate state, then stacktrace created without any useful information. * chore: Add PR number to payload (#5310) This PR adds one more payload field to the libXRPL compatibility check workflow - the PR number itself. * chore: Update link to ripple-binary-codec (#5355) The link to ripple-binary-codec's definitions.json appears to be outdated. The updated link is also documented here: https://xrpl.org/docs/references/protocol/binary-format#definitions-file * Prevent consensus from getting stuck in the establish phase (#5277) - Detects if the consensus process is "stalled". If it is, then we can declare a consensus and end successfully even if we do not have 80% agreement on our proposal. - "Stalled" is defined as: - We have a close time consensus - Each disputed transaction is individually stalled: - It has been in the final "stuck" 95% requirement for at least 2 (avMIN_ROUNDS) "inner rounds" of phaseEstablish, - and either all of the other trusted proposers or this validator, if proposing, have had the same vote(s) for at least 4 (avSTALLED_ROUNDS) "inner rounds", and at least 80% of the validators (including this one, if appropriate) agree about the vote (whether yes or no). - If we have been in the establish phase for more than 10x the previous consensus establish phase's time, then consensus is considered "expired", and we will leave the round, which sends a partial validation (indicating that the node is moving on without validating). Two restrictions avoid prematurely exiting, or having an extended exit in extreme situations. - The 10x time is clamped to be within a range of 15s (ledgerMAX_CONSENSUS) to 120s (ledgerABANDON_CONSENSUS). - If consensus has not had an opportunity to walk through all avalanche states (defined as not going through 8 "inner rounds" of phaseEstablish), then ConsensusState::Expired is treated as ConsensusState::No. - When enough nodes leave the round, any remaining nodes will see they've fallen behind, and move on, too, generally before hitting the timeout. Any validations or partial validations sent during this time will help the consensus process bring the nodes back together. --------- Co-authored-by: Michael Legleux Co-authored-by: Bart Co-authored-by: Ed Hennis Co-authored-by: Bronek Kozicki Co-authored-by: Darius Tumas Co-authored-by: Sergey Kuznetsov Co-authored-by: cyan317 <120398799+cindyyan317@users.noreply.github.com> Co-authored-by: Vlad <129996061+vvysokikh1@users.noreply.github.com> Co-authored-by: Alex Kremer --- .clang-format | 7 +- .github/actions/dependencies/action.yml | 6 +- .github/workflows/libxrpl.yml | 3 +- .github/workflows/macos.yml | 1 - BUILD.md | 4 +- Builds/levelization/results/loops.txt | 4 +- Builds/levelization/results/ordering.txt | 5 +- RELEASENOTES.md | 102 +++++ cfg/rippled-example.cfg | 1 + conanfile.py | 2 +- docs/consensus.md | 2 +- examples/example/src/example.cpp | 4 +- external/rocksdb/conandata.yml | 29 +- external/rocksdb/conanfile.py | 24 +- ...-0001-add-include-cstdint-for-gcc-13.patch | 30 -- .../6.29.5-0002-exclude-thirdparty.patch | 16 - .../patches/9.7.3-0001-memory-leak.patch | 319 ++++++++++++++ .../9.x.x-0001-exclude-thirdparty.patch | 30 ++ include/xrpl/basics/BasicConfig.h | 1 - include/xrpl/basics/Buffer.h | 3 +- include/xrpl/basics/CompressionAlgorithms.h | 4 +- include/xrpl/basics/CountedObject.h | 1 + include/xrpl/basics/Expected.h | 2 - include/xrpl/basics/LocalValue.h | 1 + include/xrpl/basics/Log.h | 2 + include/xrpl/basics/Resolver.h | 4 +- include/xrpl/basics/ResolverAsio.h | 1 + include/xrpl/basics/Slice.h | 1 + include/xrpl/basics/TaggedCache.h | 1 + include/xrpl/basics/UnorderedContainers.h | 1 + include/xrpl/basics/base_uint.h | 3 +- include/xrpl/basics/chrono.h | 5 +- include/xrpl/basics/contract.h | 2 +- include/xrpl/basics/make_SSLContext.h | 1 + .../xrpl/basics/partitioned_unordered_map.h | 1 + include/xrpl/basics/random.h | 2 +- include/xrpl/basics/spinlock.h | 1 + include/xrpl/basics/tagged_integer.h | 2 + include/xrpl/beast/asio/io_latency_probe.h | 1 + .../container/detail/aged_ordered_container.h | 2 + .../detail/aged_unordered_container.h | 2 + .../detail/empty_base_optimization.h | 1 + include/xrpl/beast/core/LexicalCast.h | 1 + include/xrpl/beast/core/List.h | 1 - include/xrpl/beast/hash/hash_append.h | 1 + include/xrpl/beast/hash/xxhasher.h | 1 + include/xrpl/beast/insight/Meter.h | 4 +- include/xrpl/beast/insight/StatsDCollector.h | 1 - include/xrpl/beast/net/IPAddress.h | 2 + include/xrpl/beast/net/IPAddressConversion.h | 2 - include/xrpl/beast/net/IPAddressV4.h | 2 + include/xrpl/beast/net/IPAddressV6.h | 2 + include/xrpl/beast/rfc2616.h | 5 +- include/xrpl/beast/test/yield_to.h | 1 + include/xrpl/beast/unit_test/match.h | 1 + include/xrpl/beast/unit_test/reporter.h | 2 + include/xrpl/beast/unit_test/runner.h | 2 + include/xrpl/beast/unit_test/suite.h | 2 + include/xrpl/beast/unit_test/suite_list.h | 2 + include/xrpl/beast/unit_test/thread.h | 1 + include/xrpl/beast/utility/Journal.h | 1 + include/xrpl/beast/utility/PropertyStream.h | 2 - include/xrpl/beast/utility/rngfill.h | 1 + include/xrpl/beast/utility/temp_dir.h | 1 + include/xrpl/crypto/csprng.h | 2 - include/xrpl/json/Object.h | 1 + include/xrpl/json/Output.h | 1 + include/xrpl/json/Writer.h | 1 + include/xrpl/json/detail/json_assert.h | 1 + include/xrpl/json/json_reader.h | 2 + include/xrpl/json/json_value.h | 1 + include/xrpl/json/json_writer.h | 1 + include/xrpl/protocol/Book.h | 1 + include/xrpl/protocol/Feature.h | 84 ++-- include/xrpl/protocol/FeeUnits.h | 1 + include/xrpl/protocol/HashPrefix.h | 1 + include/xrpl/protocol/IOUAmount.h | 2 + include/xrpl/protocol/KnownFormats.h | 2 + include/xrpl/protocol/MultiApiJson.h | 2 +- include/xrpl/protocol/Protocol.h | 1 + include/xrpl/protocol/Rate.h | 2 + include/xrpl/protocol/SOTemplate.h | 1 + include/xrpl/protocol/STBase.h | 2 + include/xrpl/protocol/STExchange.h | 1 + include/xrpl/protocol/STLedgerEntry.h | 2 +- include/xrpl/protocol/STObject.h | 2 + include/xrpl/protocol/STParsedJSON.h | 1 + include/xrpl/protocol/STPathSet.h | 1 + include/xrpl/protocol/STTx.h | 1 + include/xrpl/protocol/STValidation.h | 4 +- include/xrpl/protocol/SecretKey.h | 1 + include/xrpl/protocol/Seed.h | 1 + include/xrpl/protocol/Serializer.h | 1 + include/xrpl/protocol/Sign.h | 1 + include/xrpl/protocol/SystemParameters.h | 1 + include/xrpl/protocol/TER.h | 8 +- include/xrpl/protocol/TxFlags.h | 4 +- include/xrpl/protocol/TxMeta.h | 2 + include/xrpl/protocol/detail/STVar.h | 5 +- include/xrpl/protocol/detail/features.macro | 22 + include/xrpl/protocol/digest.h | 2 + include/xrpl/protocol/nftPageMask.h | 1 + include/xrpl/resource/ResourceManager.h | 1 + include/xrpl/resource/detail/Logic.h | 1 + include/xrpl/server/Handoff.h | 2 + include/xrpl/server/Port.h | 3 +- include/xrpl/server/Server.h | 1 + include/xrpl/server/Session.h | 2 + include/xrpl/server/SimpleWriter.h | 2 + include/xrpl/server/Writer.h | 1 + include/xrpl/server/detail/BaseHTTPPeer.h | 2 + include/xrpl/server/detail/BasePeer.h | 2 + include/xrpl/server/detail/Door.h | 2 + include/xrpl/server/detail/JSONRPCUtil.h | 1 + include/xrpl/server/detail/PlainHTTPPeer.h | 2 + include/xrpl/server/detail/PlainWSPeer.h | 2 + include/xrpl/server/detail/SSLHTTPPeer.h | 2 + include/xrpl/server/detail/SSLWSPeer.h | 2 + include/xrpl/server/detail/io_list.h | 1 + src/libxrpl/basics/Archive.cpp | 5 + src/libxrpl/basics/BasicConfig.cpp | 13 +- src/libxrpl/basics/CountedObject.cpp | 2 +- src/libxrpl/basics/FileUtilities.cpp | 14 + src/libxrpl/basics/Log.cpp | 12 +- src/libxrpl/basics/Number.cpp | 7 +- src/libxrpl/basics/ResolverAsio.cpp | 16 +- src/libxrpl/basics/StringUtilities.cpp | 21 +- src/libxrpl/basics/UptimeClock.cpp | 4 + src/libxrpl/basics/base64.cpp | 5 +- src/libxrpl/basics/contract.cpp | 17 +- src/libxrpl/basics/make_SSLContext.cpp | 23 +- src/libxrpl/basics/mulDiv.cpp | 5 + src/libxrpl/beast/core/CurrentThreadName.cpp | 4 + src/libxrpl/beast/core/SemanticVersion.cpp | 4 + src/libxrpl/beast/insight/Groups.cpp | 10 + src/libxrpl/beast/insight/Hook.cpp | 1 + src/libxrpl/beast/insight/NullCollector.cpp | 14 + src/libxrpl/beast/insight/StatsDCollector.cpp | 23 +- src/libxrpl/beast/net/IPAddressConversion.cpp | 4 + src/libxrpl/beast/net/IPAddressV4.cpp | 3 - src/libxrpl/beast/net/IPEndpoint.cpp | 12 +- .../beast/utility/{src => }/beast_Journal.cpp | 5 +- .../{src => }/beast_PropertyStream.cpp | 5 +- src/libxrpl/crypto/RFC1751.cpp | 11 +- src/libxrpl/crypto/csprng.cpp | 8 +- src/libxrpl/crypto/secure_erase.cpp | 3 + src/libxrpl/json/JsonPropertyStream.cpp | 2 + src/libxrpl/json/Object.cpp | 6 + src/libxrpl/json/Output.cpp | 3 + src/libxrpl/json/Writer.cpp | 8 + src/libxrpl/json/json_reader.cpp | 5 + src/libxrpl/json/json_value.cpp | 10 +- src/libxrpl/json/json_valueiterator.cpp | 1 + src/libxrpl/json/json_writer.cpp | 7 + src/libxrpl/json/to_string.cpp | 2 + src/libxrpl/protocol/AMMCore.cpp | 13 + src/libxrpl/protocol/AccountID.cpp | 10 +- src/libxrpl/protocol/Asset.cpp | 10 +- src/libxrpl/protocol/Book.cpp | 4 + src/libxrpl/protocol/BuildInfo.cpp | 7 +- src/libxrpl/protocol/ErrorCodes.cpp | 4 + src/libxrpl/protocol/Feature.cpp | 55 +-- src/libxrpl/protocol/IOUAmount.cpp | 10 +- src/libxrpl/protocol/Indexes.cpp | 15 + src/libxrpl/protocol/Issue.cpp | 9 +- src/libxrpl/protocol/Keylet.cpp | 2 + src/libxrpl/protocol/LedgerFormats.cpp | 5 +- src/libxrpl/protocol/LedgerHeader.cpp | 3 + src/libxrpl/protocol/MPTIssue.cpp | 9 + .../protocol/NFTSyntheticSerializer.cpp | 5 + src/libxrpl/protocol/NFTokenID.cpp | 16 + src/libxrpl/protocol/NFTokenOfferID.cpp | 12 + src/libxrpl/protocol/PublicKey.cpp | 18 +- src/libxrpl/protocol/Quality.cpp | 5 + src/libxrpl/protocol/QualityFunction.cpp | 7 +- src/libxrpl/protocol/RPCErr.cpp | 2 + src/libxrpl/protocol/Rate2.cpp | 6 + src/libxrpl/protocol/Rules.cpp | 8 + src/libxrpl/protocol/SField.cpp | 5 +- src/libxrpl/protocol/SOTemplate.cpp | 6 + src/libxrpl/protocol/STAccount.cpp | 12 + src/libxrpl/protocol/STAmount.cpp | 38 +- src/libxrpl/protocol/STArray.cpp | 9 + src/libxrpl/protocol/STBase.cpp | 9 +- src/libxrpl/protocol/STBlob.cpp | 10 +- src/libxrpl/protocol/STCurrency.cpp | 15 +- src/libxrpl/protocol/STInteger.cpp | 12 +- src/libxrpl/protocol/STIssue.cpp | 28 +- src/libxrpl/protocol/STLedgerEntry.cpp | 21 +- src/libxrpl/protocol/STNumber.cpp | 11 +- src/libxrpl/protocol/STObject.cpp | 30 ++ src/libxrpl/protocol/STParsedJSON.cpp | 19 +- src/libxrpl/protocol/STPathSet.cpp | 14 +- src/libxrpl/protocol/STTx.cpp | 37 +- src/libxrpl/protocol/STValidation.cpp | 18 +- src/libxrpl/protocol/STVar.cpp | 12 +- src/libxrpl/protocol/STVector256.cpp | 15 +- src/libxrpl/protocol/STXChainBridge.cpp | 19 +- src/libxrpl/protocol/SecretKey.cpp | 20 +- src/libxrpl/protocol/Seed.cpp | 9 +- src/libxrpl/protocol/Serializer.cpp | 15 +- src/libxrpl/protocol/Sign.cpp | 9 + src/libxrpl/protocol/TER.cpp | 8 +- src/libxrpl/protocol/TxFormats.cpp | 5 +- src/libxrpl/protocol/TxMeta.cpp | 17 +- src/libxrpl/protocol/UintTypes.cpp | 6 +- src/libxrpl/protocol/XChainAttestations.cpp | 17 +- src/libxrpl/protocol/digest.cpp | 4 +- src/libxrpl/protocol/tokens.cpp | 14 +- src/libxrpl/resource/Charge.cpp | 4 + src/libxrpl/resource/Consumer.cpp | 7 + src/libxrpl/resource/Fees.cpp | 1 + src/libxrpl/resource/ResourceManager.cpp | 19 +- src/libxrpl/server/JSONRPCUtil.cpp | 8 +- src/libxrpl/server/Port.cpp | 14 + src/test/app/AMMCalc_test.cpp | 2 + src/test/app/AMMClawback_test.cpp | 8 +- src/test/app/AMMExtended_test.cpp | 9 +- src/test/app/AMM_test.cpp | 16 +- src/test/app/AccountDelete_test.cpp | 1 + src/test/app/AccountTxPaging_test.cpp | 13 +- src/test/app/AmendmentTable_test.cpp | 2 + src/test/app/Check_test.cpp | 1 + src/test/app/Clawback_test.cpp | 6 +- src/test/app/Credentials_test.cpp | 3 +- src/test/app/CrossingLimits_test.cpp | 1 + src/test/app/DID_test.cpp | 5 +- src/test/app/DNS_test.cpp | 2 + src/test/app/DeliverMin_test.cpp | 1 + src/test/app/DepositAuth_test.cpp | 1 + src/test/app/Discrepancy_test.cpp | 1 + src/test/app/Escrow_test.cpp | 2 + src/test/app/FeeVote_test.cpp | 2 +- src/test/app/FixNFTokenPageLinks_test.cpp | 2 + src/test/app/Flow_test.cpp | 4 +- src/test/app/Freeze_test.cpp | 2 + src/test/app/HashRouter_test.cpp | 1 + src/test/app/LedgerHistory_test.cpp | 4 +- src/test/app/LedgerLoad_test.cpp | 2 + src/test/app/LedgerMaster_test.cpp | 2 +- src/test/app/LedgerReplay_test.cpp | 2 + src/test/app/LoadFeeTrack_test.cpp | 1 + src/test/app/MPToken_test.cpp | 1 + src/test/app/Manifest_test.cpp | 4 +- src/test/app/MultiSign_test.cpp | 2 + src/test/app/NFTokenBurn_test.cpp | 2 + src/test/app/NFTokenDir_test.cpp | 2 + src/test/app/NFToken_test.cpp | 2 + src/test/app/NetworkID_test.cpp | 3 +- src/test/app/OfferStream_test.cpp | 1 + src/test/app/Offer_test.cpp | 1 + src/test/app/Oracle_test.cpp | 1 + src/test/app/OversizeMeta_test.cpp | 2 +- src/test/app/Path_test.cpp | 8 +- src/test/app/PayChan_test.cpp | 3 +- src/test/app/PayStrand_test.cpp | 6 +- src/test/app/PermissionedDomains_test.cpp | 6 +- src/test/app/PseudoTx_test.cpp | 4 +- src/test/app/RCLCensorshipDetector_test.cpp | 2 + src/test/app/RCLValidations_test.cpp | 5 +- src/test/app/ReducedOffer_test.cpp | 1 + src/test/app/Regression_test.cpp | 3 +- src/test/app/SHAMapStore_test.cpp | 2 + src/test/app/SetAuth_test.cpp | 1 + src/test/app/SetRegularKey_test.cpp | 2 +- src/test/app/SetTrust_test.cpp | 2 + src/test/app/Taker_test.cpp | 3 +- src/test/app/TheoreticalQuality_test.cpp | 5 +- src/test/app/Ticket_test.cpp | 2 + src/test/app/Transaction_ordering_test.cpp | 2 +- src/test/app/TrustAndBalance_test.cpp | 1 + src/test/app/TxQ_test.cpp | 3 +- src/test/app/ValidatorKeys_test.cpp | 2 + src/test/app/ValidatorList_test.cpp | 2 + src/test/app/ValidatorSite_test.cpp | 13 +- src/test/app/XChain_test.cpp | 15 +- src/test/app/tx/apply_test.cpp | 2 + src/test/basics/Buffer_test.cpp | 1 + src/test/basics/Expected_test.cpp | 1 + src/test/basics/FeeUnits_test.cpp | 1 - src/test/basics/FileUtilities_test.cpp | 1 + src/test/basics/KeyCache_test.cpp | 2 +- src/test/basics/Number_test.cpp | 1 + src/test/basics/PerfLog_test.cpp | 3 +- src/test/basics/Slice_test.cpp | 1 + src/test/basics/TaggedCache_test.cpp | 1 + src/test/basics/base_uint_test.cpp | 5 +- src/test/basics/contract_test.cpp | 1 + src/test/basics/hardened_hash_test.cpp | 3 +- src/test/basics/tagged_integer_test.cpp | 1 + src/test/beast/IPEndpoint_test.cpp | 3 +- src/test/beast/SemanticVersion_test.cpp | 4 +- .../beast/aged_associative_container_test.cpp | 3 +- .../beast/beast_CurrentThreadName_test.cpp | 2 +- src/test/beast/beast_PropertyStream_test.cpp | 4 +- src/test/beast/beast_Zero_test.cpp | 3 +- src/test/beast/beast_abstract_clock_test.cpp | 1 + .../beast/beast_basic_seconds_clock_test.cpp | 3 +- .../beast/beast_io_latency_probe_test.cpp | 6 +- src/test/beast/define_print.cpp | 1 + src/test/conditions/PreimageSha256_test.cpp | 2 + .../consensus/ByzantineFailureSim_test.cpp | 4 +- src/test/consensus/Consensus_test.cpp | 389 +++++++++++++++++- .../DistributedValidatorsSim_test.cpp | 6 +- src/test/consensus/LedgerTiming_test.cpp | 2 + src/test/consensus/LedgerTrie_test.cpp | 5 +- src/test/consensus/NegativeUNL_test.cpp | 3 +- src/test/consensus/ScaleFreeSim_test.cpp | 4 +- src/test/consensus/Validations_test.cpp | 6 +- src/test/core/ClosureCounter_test.cpp | 2 + src/test/core/Config_test.cpp | 4 +- src/test/core/Coroutine_test.cpp | 3 +- src/test/core/CryptoPRNG_test.cpp | 4 +- src/test/core/JobQueue_test.cpp | 2 + src/test/core/SociDB_test.cpp | 4 +- src/test/core/Workers_test.cpp | 4 +- src/test/csf/BasicNetwork_test.cpp | 2 + src/test/csf/CollectorRef.h | 1 + src/test/csf/Digraph_test.cpp | 2 + src/test/csf/Histogram.h | 1 + src/test/csf/Histogram_test.cpp | 1 + src/test/csf/Peer.h | 5 + src/test/csf/PeerGroup.h | 2 + src/test/csf/Proposal.h | 4 +- src/test/csf/Scheduler_test.cpp | 2 +- src/test/csf/SimTime.h | 1 + src/test/csf/TrustGraph.h | 1 + src/test/csf/Tx.h | 6 +- src/test/csf/Validation.h | 2 + src/test/csf/collectors.h | 2 + src/test/csf/events.h | 2 + src/test/csf/impl/Sim.cpp | 1 + src/test/csf/impl/ledgers.cpp | 6 +- src/test/csf/ledgers.h | 5 + src/test/csf/submitters.h | 3 + src/test/csf/timers.h | 2 + src/test/json/Object_test.cpp | 1 + src/test/json/Output_test.cpp | 1 + src/test/json/TestOutputSuite.h | 1 + src/test/json/Writer_test.cpp | 2 +- src/test/json/json_value_test.cpp | 1 - src/test/jtx.h | 1 + src/test/jtx/AMM.h | 2 + src/test/jtx/AMMTest.h | 2 + src/test/jtx/Account.h | 1 + src/test/jtx/CaptureLogs.h | 5 + src/test/jtx/CheckMessageLogs.h | 5 + src/test/jtx/Env.h | 3 + src/test/jtx/Env_test.cpp | 4 +- src/test/jtx/JSONRPCClient.h | 2 + src/test/jtx/JTx.h | 1 + src/test/jtx/ManualTimeKeeper.h | 1 + src/test/jtx/Oracle.h | 1 + src/test/jtx/PathSet.h | 1 + src/test/jtx/TestHelpers.h | 2 + src/test/jtx/TestSuite.h | 1 + src/test/jtx/TrustedPublisherServer.h | 3 + src/test/jtx/WSClient.h | 1 + src/test/jtx/WSClient_test.cpp | 1 + src/test/jtx/amount.h | 2 + src/test/jtx/credentials.h | 7 +- src/test/jtx/delivermin.h | 1 + src/test/jtx/fee.h | 1 + src/test/jtx/flags.h | 1 + src/test/jtx/impl/AMM.cpp | 3 +- src/test/jtx/impl/AMMTest.cpp | 5 +- src/test/jtx/impl/Account.cpp | 1 + src/test/jtx/impl/Env.cpp | 10 +- src/test/jtx/impl/JSONRPCClient.cpp | 4 + src/test/jtx/impl/Oracle.cpp | 4 +- src/test/jtx/impl/TestHelpers.cpp | 2 +- src/test/jtx/impl/WSClient.cpp | 8 +- src/test/jtx/impl/acctdelete.cpp | 1 + src/test/jtx/impl/amount.cpp | 3 +- src/test/jtx/impl/attester.cpp | 1 - src/test/jtx/impl/check.cpp | 1 + src/test/jtx/impl/credentials.cpp | 1 + src/test/jtx/impl/delivermin.cpp | 1 + src/test/jtx/impl/deposit.cpp | 1 + src/test/jtx/impl/did.cpp | 1 + src/test/jtx/impl/envconfig.cpp | 2 +- src/test/jtx/impl/fee.cpp | 1 + src/test/jtx/impl/flags.cpp | 1 + src/test/jtx/impl/jtx_json.cpp | 1 + src/test/jtx/impl/last_ledger_sequence.cpp | 1 - src/test/jtx/impl/ledgerStateFix.cpp | 1 + src/test/jtx/impl/memo.cpp | 2 - src/test/jtx/impl/multisign.cpp | 5 +- src/test/jtx/impl/offer.cpp | 1 + src/test/jtx/impl/paths.cpp | 2 + src/test/jtx/impl/pay.cpp | 1 + src/test/jtx/impl/permissioned_domains.cpp | 1 - src/test/jtx/impl/quality2.cpp | 1 + src/test/jtx/impl/rate.cpp | 2 + src/test/jtx/impl/regkey.cpp | 1 + src/test/jtx/impl/sendmax.cpp | 1 + src/test/jtx/impl/seq.cpp | 1 + src/test/jtx/impl/tag.cpp | 1 - src/test/jtx/impl/ticket.cpp | 1 + src/test/jtx/impl/token.cpp | 1 + src/test/jtx/impl/trust.cpp | 2 + src/test/jtx/impl/txflags.cpp | 1 + src/test/jtx/impl/utility.cpp | 3 +- src/test/jtx/impl/xchain_bridge.cpp | 4 +- src/test/jtx/jtx_json.h | 1 + src/test/jtx/multisign.h | 1 + src/test/jtx/offer.h | 1 + src/test/jtx/owners.h | 3 + src/test/jtx/paths.h | 2 + src/test/jtx/pay.h | 1 + src/test/jtx/permissioned_domains.h | 5 +- src/test/jtx/prop.h | 1 + src/test/jtx/rate.h | 1 + src/test/jtx/regkey.h | 1 + src/test/jtx/require.h | 1 + src/test/jtx/rpc.h | 1 + src/test/jtx/sendmax.h | 1 + src/test/jtx/ter.h | 1 + src/test/jtx/trust.h | 1 + src/test/jtx/utility.h | 3 + src/test/jtx/xchain_bridge.h | 1 + src/test/ledger/BookDirs_test.cpp | 2 + src/test/ledger/Directory_test.cpp | 3 + src/test/ledger/Invariants_test.cpp | 3 +- src/test/ledger/PaymentSandbox_test.cpp | 2 + src/test/ledger/PendingSaves_test.cpp | 1 + src/test/ledger/SkipList_test.cpp | 5 +- src/test/ledger/View_test.cpp | 4 +- src/test/nodestore/Backend_test.cpp | 4 + src/test/nodestore/Basics_test.cpp | 3 +- src/test/nodestore/Database_test.cpp | 2 + src/test/nodestore/TestBase.h | 3 + src/test/nodestore/Timing_test.cpp | 7 +- src/test/nodestore/import_test.cpp | 13 +- src/test/nodestore/varint_test.cpp | 2 + src/test/overlay/ProtocolVersion_test.cpp | 1 + src/test/overlay/cluster_test.cpp | 3 +- src/test/overlay/compression_test.cpp | 5 +- src/test/overlay/handshake_test.cpp | 3 +- src/test/overlay/reduce_relay_test.cpp | 4 + src/test/overlay/short_read_test.cpp | 3 +- src/test/overlay/tx_reduce_relay_test.cpp | 5 +- src/test/peerfinder/Livecache_test.cpp | 4 +- src/test/peerfinder/PeerFinder_test.cpp | 4 +- src/test/protocol/ApiVersion_test.cpp | 1 - src/test/protocol/Hooks_test.cpp | 3 +- src/test/protocol/InnerObjectFormats_test.cpp | 6 +- src/test/protocol/Issue_test.cpp | 1 + src/test/protocol/Memo_test.cpp | 2 +- src/test/protocol/PublicKey_test.cpp | 1 + src/test/protocol/Quality_test.cpp | 1 + src/test/protocol/STAmount_test.cpp | 1 - src/test/protocol/STIssue_test.cpp | 3 +- src/test/protocol/STObject_test.cpp | 1 + src/test/protocol/STTx_test.cpp | 3 +- src/test/protocol/STValidation_test.cpp | 6 +- src/test/protocol/SecretKey_test.cpp | 1 + src/test/protocol/Seed_test.cpp | 2 +- src/test/protocol/SeqProxy_test.cpp | 1 + src/test/resource/Logic_test.cpp | 2 + src/test/rpc/AMMInfo_test.cpp | 2 +- src/test/rpc/AccountCurrencies_test.cpp | 1 + src/test/rpc/AccountInfo_test.cpp | 9 +- src/test/rpc/AccountLines_test.cpp | 6 +- src/test/rpc/AccountObjects_test.cpp | 2 + src/test/rpc/AccountOffers_test.cpp | 1 + src/test/rpc/AccountSet_test.cpp | 2 +- src/test/rpc/AccountTx_test.cpp | 1 + src/test/rpc/AmendmentBlocked_test.cpp | 3 +- src/test/rpc/Book_test.cpp | 2 + src/test/rpc/Connect_test.cpp | 1 + src/test/rpc/DeliveredAmount_test.cpp | 2 +- src/test/rpc/DepositAuthorized_test.cpp | 1 + src/test/rpc/Feature_test.cpp | 2 + src/test/rpc/GRPCTestClientBase.h | 2 + src/test/rpc/GatewayBalances_test.cpp | 2 + src/test/rpc/GetAggregatePrice_test.cpp | 2 + src/test/rpc/GetCounts_test.cpp | 1 + src/test/rpc/Handler_test.cpp | 3 +- src/test/rpc/JSONRPC_test.cpp | 3 +- src/test/rpc/KeyGeneration_test.cpp | 3 + src/test/rpc/LedgerClosed_test.cpp | 1 + src/test/rpc/LedgerData_test.cpp | 1 + src/test/rpc/LedgerHeader_test.cpp | 1 + src/test/rpc/LedgerRPC_test.cpp | 18 +- src/test/rpc/LedgerRequestRPC_test.cpp | 2 + src/test/rpc/ManifestRPC_test.cpp | 2 + src/test/rpc/NoRippleCheck_test.cpp | 4 +- src/test/rpc/NoRipple_test.cpp | 2 + src/test/rpc/OwnerInfo_test.cpp | 1 + src/test/rpc/Peers_test.cpp | 3 + src/test/rpc/RPCCall_test.cpp | 2 + src/test/rpc/RPCHelpers_test.cpp | 1 + src/test/rpc/RPCOverload_test.cpp | 2 + src/test/rpc/RobustTransaction_test.cpp | 2 + src/test/rpc/Roles_test.cpp | 5 +- src/test/rpc/ServerInfo_test.cpp | 2 + src/test/rpc/Simulate_test.cpp | 2 + src/test/rpc/Status_test.cpp | 2 +- src/test/rpc/Subscribe_test.cpp | 3 + src/test/rpc/TransactionEntry_test.cpp | 2 + src/test/rpc/TransactionHistory_test.cpp | 3 + src/test/rpc/Transaction_test.cpp | 2 + src/test/rpc/ValidatorInfo_test.cpp | 2 + src/test/rpc/ValidatorRPC_test.cpp | 4 +- src/test/rpc/Version_test.cpp | 2 + src/test/server/ServerStatus_test.cpp | 4 + src/test/server/Server_test.cpp | 11 +- src/test/shamap/FetchPack_test.cpp | 4 +- src/test/shamap/SHAMapSync_test.cpp | 3 +- src/test/shamap/SHAMap_test.cpp | 2 + src/test/shamap/common.h | 1 + src/test/unit_test/FileDirGuard.h | 2 + src/test/unit_test/multi_runner.h | 2 +- .../app/consensus/RCLCensorshipDetector.h | 2 + src/xrpld/app/consensus/RCLConsensus.cpp | 1 + src/xrpld/app/consensus/RCLConsensus.h | 6 +- src/xrpld/app/consensus/RCLCxLedger.h | 2 +- src/xrpld/app/consensus/RCLCxPeerPos.cpp | 4 +- src/xrpld/app/consensus/RCLCxPeerPos.h | 6 +- src/xrpld/app/consensus/RCLCxTx.h | 3 - src/xrpld/app/consensus/RCLValidations.cpp | 7 +- src/xrpld/app/consensus/RCLValidations.h | 3 +- .../app/ledger/AbstractFetchPackContainer.h | 1 + src/xrpld/app/ledger/AcceptedLedger.cpp | 2 +- src/xrpld/app/ledger/AcceptedLedger.h | 1 - src/xrpld/app/ledger/AcceptedLedgerTx.cpp | 1 + src/xrpld/app/ledger/AcceptedLedgerTx.h | 2 + src/xrpld/app/ledger/BookListeners.cpp | 2 - src/xrpld/app/ledger/BookListeners.h | 1 + src/xrpld/app/ledger/BuildLedger.h | 3 +- src/xrpld/app/ledger/ConsensusTransSetSF.cpp | 2 +- src/xrpld/app/ledger/ConsensusTransSetSF.h | 1 + src/xrpld/app/ledger/InboundLedger.h | 2 + src/xrpld/app/ledger/InboundLedgers.h | 3 +- src/xrpld/app/ledger/InboundTransactions.h | 2 + src/xrpld/app/ledger/Ledger.cpp | 15 +- src/xrpld/app/ledger/Ledger.h | 4 +- src/xrpld/app/ledger/LedgerCleaner.h | 2 +- src/xrpld/app/ledger/LedgerHistory.cpp | 1 + src/xrpld/app/ledger/LedgerHistory.h | 2 +- src/xrpld/app/ledger/LedgerHolder.h | 1 + src/xrpld/app/ledger/LedgerMaster.h | 5 +- src/xrpld/app/ledger/LedgerReplay.h | 2 +- src/xrpld/app/ledger/LedgerReplayTask.h | 1 - src/xrpld/app/ledger/LedgerReplayer.h | 2 +- src/xrpld/app/ledger/LedgerToJson.h | 4 +- src/xrpld/app/ledger/LocalTxs.h | 1 + src/xrpld/app/ledger/OpenLedger.h | 2 + src/xrpld/app/ledger/OrderBookDB.cpp | 1 + src/xrpld/app/ledger/OrderBookDB.h | 1 + src/xrpld/app/ledger/PendingSaves.h | 1 + src/xrpld/app/ledger/TransactionMaster.h | 2 + src/xrpld/app/ledger/detail/BuildLedger.cpp | 2 +- src/xrpld/app/ledger/detail/InboundLedger.cpp | 2 +- .../app/ledger/detail/InboundLedgers.cpp | 2 +- .../app/ledger/detail/InboundTransactions.cpp | 2 + src/xrpld/app/ledger/detail/LedgerCleaner.cpp | 1 + .../app/ledger/detail/LedgerDeltaAcquire.h | 2 +- src/xrpld/app/ledger/detail/LedgerMaster.cpp | 1 + .../ledger/detail/LedgerReplayMsgHandler.cpp | 1 + .../app/ledger/detail/LedgerReplayTask.cpp | 1 - .../app/ledger/detail/LedgerReplayer.cpp | 1 - src/xrpld/app/ledger/detail/LedgerToJson.cpp | 4 +- src/xrpld/app/ledger/detail/LocalTxs.cpp | 2 +- src/xrpld/app/ledger/detail/OpenLedger.cpp | 3 +- .../app/ledger/detail/SkipListAcquire.cpp | 1 - src/xrpld/app/ledger/detail/SkipListAcquire.h | 1 - .../app/ledger/detail/TimeoutCounter.cpp | 2 - src/xrpld/app/ledger/detail/TimeoutCounter.h | 4 +- .../app/ledger/detail/TransactionAcquire.cpp | 2 - .../app/ledger/detail/TransactionAcquire.h | 1 - .../app/ledger/detail/TransactionMaster.cpp | 1 + src/xrpld/app/main/Application.cpp | 8 +- src/xrpld/app/main/Application.h | 5 +- src/xrpld/app/main/BasicApp.cpp | 1 + src/xrpld/app/main/BasicApp.h | 1 + src/xrpld/app/main/CollectorManager.cpp | 1 + src/xrpld/app/main/GRPCServer.cpp | 10 +- src/xrpld/app/main/GRPCServer.h | 5 +- src/xrpld/app/main/LoadManager.cpp | 64 +-- src/xrpld/app/main/LoadManager.h | 26 +- src/xrpld/app/main/Main.cpp | 16 +- src/xrpld/app/main/NodeIdentity.cpp | 1 - src/xrpld/app/main/NodeIdentity.h | 3 +- src/xrpld/app/main/NodeStoreScheduler.cpp | 1 - src/xrpld/app/main/NodeStoreScheduler.h | 1 - src/xrpld/app/misc/AMMHelpers.h | 3 - src/xrpld/app/misc/AMMUtils.h | 2 + src/xrpld/app/misc/AmendmentTable.h | 1 + src/xrpld/app/misc/CredentialHelpers.cpp | 1 + src/xrpld/app/misc/CredentialHelpers.h | 5 +- src/xrpld/app/misc/DeliverMax.h | 3 - src/xrpld/app/misc/FeeVote.h | 3 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 3 +- src/xrpld/app/misc/LoadFeeTrack.h | 3 +- src/xrpld/app/misc/NegativeUNLVote.h | 1 + src/xrpld/app/misc/NetworkOPs.cpp | 34 +- src/xrpld/app/misc/NetworkOPs.h | 5 +- src/xrpld/app/misc/SHAMapStore.h | 2 +- src/xrpld/app/misc/SHAMapStoreImp.cpp | 4 +- src/xrpld/app/misc/SHAMapStoreImp.h | 4 +- src/xrpld/app/misc/TxQ.h | 3 + src/xrpld/app/misc/ValidatorKeys.h | 1 + src/xrpld/app/misc/ValidatorList.h | 6 +- src/xrpld/app/misc/ValidatorSite.h | 3 +- src/xrpld/app/misc/detail/AMMUtils.cpp | 7 +- src/xrpld/app/misc/detail/AccountTxPaging.cpp | 5 +- src/xrpld/app/misc/detail/AccountTxPaging.h | 3 +- src/xrpld/app/misc/detail/AmendmentTable.cpp | 2 + src/xrpld/app/misc/detail/LoadFeeTrack.cpp | 6 +- src/xrpld/app/misc/detail/Manifest.cpp | 1 + src/xrpld/app/misc/detail/Transaction.cpp | 5 +- src/xrpld/app/misc/detail/TxQ.cpp | 3 +- src/xrpld/app/misc/detail/ValidatorKeys.cpp | 4 +- src/xrpld/app/misc/detail/ValidatorList.cpp | 2 + src/xrpld/app/misc/detail/ValidatorSite.cpp | 4 +- src/xrpld/app/misc/detail/Work.h | 4 - src/xrpld/app/misc/detail/WorkBase.h | 3 +- src/xrpld/app/misc/detail/WorkFile.h | 2 +- .../app/misc/detail/{detail => }/WorkSSL.cpp | 0 src/xrpld/app/misc/detail/WorkSSL.h | 2 + src/xrpld/app/paths/AMMLiquidity.h | 2 +- src/xrpld/app/paths/AMMOffer.h | 1 + src/xrpld/app/paths/AccountCurrencies.h | 1 + src/xrpld/app/paths/Credit.cpp | 1 + src/xrpld/app/paths/Credit.h | 1 + src/xrpld/app/paths/Flow.cpp | 6 +- src/xrpld/app/paths/Flow.h | 1 + src/xrpld/app/paths/PathRequest.cpp | 4 +- src/xrpld/app/paths/PathRequest.h | 3 +- src/xrpld/app/paths/PathRequests.cpp | 3 +- src/xrpld/app/paths/PathRequests.h | 2 +- src/xrpld/app/paths/Pathfinder.cpp | 2 +- src/xrpld/app/paths/Pathfinder.h | 1 + src/xrpld/app/paths/RippleCalc.cpp | 1 + src/xrpld/app/paths/RippleCalc.h | 1 + src/xrpld/app/paths/RippleLineCache.cpp | 1 - src/xrpld/app/paths/RippleLineCache.h | 2 +- src/xrpld/app/paths/TrustLine.cpp | 4 +- src/xrpld/app/paths/TrustLine.h | 7 +- src/xrpld/app/paths/detail/AMMLiquidity.cpp | 2 +- src/xrpld/app/paths/detail/AMMOffer.cpp | 5 +- src/xrpld/app/paths/detail/BookStep.cpp | 1 + src/xrpld/app/paths/detail/DirectStep.cpp | 4 +- src/xrpld/app/paths/detail/FlowDebugInfo.h | 1 + src/xrpld/app/paths/detail/PaySteps.cpp | 5 +- src/xrpld/app/paths/detail/StepChecks.h | 1 + src/xrpld/app/paths/detail/Steps.h | 2 + src/xrpld/app/paths/detail/StrandFlow.h | 3 +- .../app/paths/detail/XRPEndpointStep.cpp | 2 +- src/xrpld/app/rdb/RelationalDatabase.h | 4 +- src/xrpld/app/rdb/State.h | 1 + src/xrpld/app/rdb/Wallet.h | 2 - src/xrpld/app/rdb/backend/detail/Node.cpp | 5 +- src/xrpld/app/rdb/backend/detail/Node.h | 4 - .../app/rdb/backend/detail/SQLiteDatabase.cpp | 7 +- src/xrpld/app/rdb/detail/Vacuum.cpp | 1 + src/xrpld/app/rdb/detail/Wallet.cpp | 1 + src/xrpld/app/tx/apply.h | 4 +- src/xrpld/app/tx/applySteps.h | 1 + src/xrpld/app/tx/detail/AMMBid.cpp | 5 +- src/xrpld/app/tx/detail/AMMClawback.cpp | 4 +- src/xrpld/app/tx/detail/AMMCreate.cpp | 5 +- src/xrpld/app/tx/detail/AMMDelete.cpp | 6 +- src/xrpld/app/tx/detail/AMMDeposit.cpp | 7 +- src/xrpld/app/tx/detail/AMMVote.cpp | 6 +- src/xrpld/app/tx/detail/AMMWithdraw.cpp | 7 +- src/xrpld/app/tx/detail/ApplyContext.cpp | 4 +- src/xrpld/app/tx/detail/ApplyContext.h | 3 +- src/xrpld/app/tx/detail/BookTip.cpp | 1 - src/xrpld/app/tx/detail/BookTip.h | 3 +- src/xrpld/app/tx/detail/CancelCheck.cpp | 5 +- src/xrpld/app/tx/detail/CancelOffer.cpp | 1 + src/xrpld/app/tx/detail/CancelOffer.h | 3 +- src/xrpld/app/tx/detail/CashCheck.cpp | 2 +- src/xrpld/app/tx/detail/Change.cpp | 2 + src/xrpld/app/tx/detail/Change.h | 5 - src/xrpld/app/tx/detail/Clawback.cpp | 2 +- src/xrpld/app/tx/detail/CreateCheck.cpp | 4 +- src/xrpld/app/tx/detail/CreateOffer.cpp | 2 +- src/xrpld/app/tx/detail/CreateOffer.h | 1 - src/xrpld/app/tx/detail/CreateTicket.cpp | 3 +- src/xrpld/app/tx/detail/CreateTicket.h | 2 - src/xrpld/app/tx/detail/Credentials.cpp | 4 +- src/xrpld/app/tx/detail/Credentials.h | 5 +- src/xrpld/app/tx/detail/DID.cpp | 3 +- src/xrpld/app/tx/detail/DeleteAccount.cpp | 2 +- src/xrpld/app/tx/detail/DeleteAccount.h | 2 - src/xrpld/app/tx/detail/DeleteOracle.cpp | 2 +- src/xrpld/app/tx/detail/DepositPreauth.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 7 +- src/xrpld/app/tx/detail/InvariantCheck.cpp | 4 +- src/xrpld/app/tx/detail/LedgerStateFix.cpp | 3 +- src/xrpld/app/tx/detail/LedgerStateFix.h | 2 - src/xrpld/app/tx/detail/MPTokenAuthorize.cpp | 1 + .../app/tx/detail/MPTokenIssuanceCreate.cpp | 2 +- .../app/tx/detail/MPTokenIssuanceDestroy.cpp | 3 +- .../app/tx/detail/MPTokenIssuanceSet.cpp | 3 +- .../app/tx/detail/NFTokenAcceptOffer.cpp | 2 +- src/xrpld/app/tx/detail/NFTokenBurn.cpp | 5 +- .../app/tx/detail/NFTokenCancelOffer.cpp | 3 +- .../app/tx/detail/NFTokenCreateOffer.cpp | 3 +- src/xrpld/app/tx/detail/NFTokenMint.cpp | 5 +- src/xrpld/app/tx/detail/NFTokenMint.h | 1 + src/xrpld/app/tx/detail/NFTokenModify.cpp | 4 +- src/xrpld/app/tx/detail/NFTokenUtils.cpp | 3 +- src/xrpld/app/tx/detail/NFTokenUtils.h | 2 +- src/xrpld/app/tx/detail/Offer.h | 3 +- src/xrpld/app/tx/detail/OfferStream.cpp | 1 + src/xrpld/app/tx/detail/OfferStream.h | 2 +- src/xrpld/app/tx/detail/PayChan.cpp | 2 +- src/xrpld/app/tx/detail/Payment.cpp | 2 +- src/xrpld/app/tx/detail/Payment.h | 3 - .../tx/detail/PermissionedDomainDelete.cpp | 1 + .../app/tx/detail/PermissionedDomainDelete.h | 5 +- .../app/tx/detail/PermissionedDomainSet.cpp | 1 + .../app/tx/detail/PermissionedDomainSet.h | 6 +- src/xrpld/app/tx/detail/SetAccount.cpp | 1 + src/xrpld/app/tx/detail/SetAccount.h | 5 +- src/xrpld/app/tx/detail/SetOracle.cpp | 2 +- src/xrpld/app/tx/detail/SetRegularKey.cpp | 1 + src/xrpld/app/tx/detail/SetRegularKey.h | 3 - src/xrpld/app/tx/detail/SetSignerList.cpp | 4 +- src/xrpld/app/tx/detail/SetSignerList.h | 8 +- src/xrpld/app/tx/detail/SetTrust.cpp | 2 +- src/xrpld/app/tx/detail/SetTrust.h | 4 +- src/xrpld/app/tx/detail/SignerEntries.cpp | 2 + src/xrpld/app/tx/detail/SignerEntries.h | 11 +- src/xrpld/app/tx/detail/Taker.cpp | 1 + src/xrpld/app/tx/detail/Taker.h | 3 +- src/xrpld/app/tx/detail/Transactor.cpp | 2 +- src/xrpld/app/tx/detail/Transactor.h | 1 + src/xrpld/app/tx/detail/XChainBridge.cpp | 4 +- src/xrpld/app/tx/detail/XChainBridge.h | 2 +- src/xrpld/app/tx/detail/apply.cpp | 1 + src/xrpld/app/tx/detail/applySteps.cpp | 1 + src/xrpld/conditions/Condition.h | 6 +- src/xrpld/conditions/Fulfillment.h | 2 +- src/xrpld/conditions/detail/Condition.cpp | 4 - src/xrpld/conditions/detail/Fulfillment.cpp | 3 +- src/xrpld/conditions/detail/PreimageSha256.h | 2 + src/xrpld/conditions/detail/error.cpp | 4 +- src/xrpld/conditions/detail/error.h | 1 - src/xrpld/conditions/detail/utils.h | 10 +- src/xrpld/consensus/Consensus.cpp | 37 +- src/xrpld/consensus/Consensus.h | 94 ++++- src/xrpld/consensus/ConsensusParms.h | 129 ++++-- src/xrpld/consensus/ConsensusProposal.h | 3 + src/xrpld/consensus/ConsensusTypes.h | 5 +- src/xrpld/consensus/DisputedTx.h | 103 ++++- src/xrpld/consensus/LedgerTiming.h | 2 +- src/xrpld/consensus/Validations.h | 1 + src/xrpld/core/ClosureCounter.h | 2 +- src/xrpld/core/Config.h | 7 - src/xrpld/core/DatabaseCon.h | 2 + src/xrpld/core/Job.h | 2 +- src/xrpld/core/JobQueue.h | 4 +- src/xrpld/core/JobTypeData.h | 1 + src/xrpld/core/JobTypes.h | 3 +- src/xrpld/core/LoadEvent.h | 1 - src/xrpld/core/LoadMonitor.h | 2 + src/xrpld/core/SociDB.h | 5 +- src/xrpld/core/detail/Config.cpp | 4 +- src/xrpld/core/detail/DatabaseCon.cpp | 1 + src/xrpld/core/detail/Job.cpp | 2 +- src/xrpld/core/detail/JobQueue.cpp | 2 + src/xrpld/core/detail/LoadEvent.cpp | 2 +- src/xrpld/core/detail/LoadMonitor.cpp | 1 + src/xrpld/core/detail/SociDB.cpp | 7 +- src/xrpld/core/detail/Workers.cpp | 1 + src/xrpld/core/detail/Workers.h | 2 + src/xrpld/ledger/ApplyView.h | 1 + src/xrpld/ledger/ApplyViewImpl.h | 1 + src/xrpld/ledger/BookDirs.h | 2 + src/xrpld/ledger/CachedView.h | 4 +- src/xrpld/ledger/Dir.h | 1 + src/xrpld/ledger/OpenView.h | 1 + src/xrpld/ledger/PaymentSandbox.h | 2 + src/xrpld/ledger/RawView.h | 4 +- src/xrpld/ledger/ReadView.h | 7 +- src/xrpld/ledger/View.h | 8 +- src/xrpld/ledger/detail/ApplyStateTable.cpp | 1 + src/xrpld/ledger/detail/ApplyStateTable.h | 2 + src/xrpld/ledger/detail/ApplyView.cpp | 1 + src/xrpld/ledger/detail/ApplyViewBase.cpp | 1 - src/xrpld/ledger/detail/ApplyViewBase.h | 2 +- src/xrpld/ledger/detail/ApplyViewImpl.cpp | 2 - src/xrpld/ledger/detail/BookDirs.cpp | 1 + src/xrpld/ledger/detail/CachedView.cpp | 2 - src/xrpld/ledger/detail/OpenView.cpp | 1 + src/xrpld/ledger/detail/PaymentSandbox.cpp | 3 +- src/xrpld/ledger/detail/RawStateTable.cpp | 1 + src/xrpld/ledger/detail/ReadViewFwdRange.h | 1 - src/xrpld/ledger/detail/View.cpp | 6 +- src/xrpld/net/AutoSocket.h | 1 + src/xrpld/net/HTTPClient.h | 2 + src/xrpld/net/HTTPClientSSLContext.h | 2 + src/xrpld/net/InfoSub.h | 2 +- src/xrpld/net/RPCCall.h | 4 +- src/xrpld/net/RPCSub.h | 1 + src/xrpld/net/RegisterSSLCerts.h | 1 + src/xrpld/net/detail/HTTPClient.cpp | 5 +- src/xrpld/net/detail/InfoSub.cpp | 1 - src/xrpld/net/detail/RPCCall.cpp | 4 +- src/xrpld/net/detail/RPCSub.cpp | 2 + src/xrpld/net/detail/RegisterSSLCerts.cpp | 7 +- src/xrpld/nodestore/Backend.h | 2 +- src/xrpld/nodestore/Database.h | 5 +- src/xrpld/nodestore/Factory.h | 3 + src/xrpld/nodestore/NodeObject.h | 2 +- src/xrpld/nodestore/Scheduler.h | 1 + src/xrpld/nodestore/Types.h | 2 +- src/xrpld/nodestore/backend/MemoryFactory.cpp | 3 + src/xrpld/nodestore/backend/NuDBFactory.cpp | 6 +- src/xrpld/nodestore/backend/NullFactory.cpp | 2 +- .../nodestore/backend/RocksDBFactory.cpp | 8 +- src/xrpld/nodestore/detail/BatchWriter.h | 1 + src/xrpld/nodestore/detail/Database.cpp | 2 + .../nodestore/detail/DatabaseNodeImp.cpp | 1 - src/xrpld/nodestore/detail/DatabaseNodeImp.h | 1 + .../nodestore/detail/DatabaseRotatingImp.cpp | 1 - src/xrpld/nodestore/detail/DecodedBlob.cpp | 2 + src/xrpld/nodestore/detail/EncodedBlob.h | 4 +- src/xrpld/nodestore/detail/NodeObject.cpp | 1 + src/xrpld/nodestore/detail/codec.h | 9 +- src/xrpld/nodestore/detail/varint.h | 3 +- src/xrpld/overlay/Cluster.h | 6 +- src/xrpld/overlay/ClusterNode.h | 1 + src/xrpld/overlay/Compression.h | 1 - src/xrpld/overlay/Message.h | 8 +- src/xrpld/overlay/Overlay.h | 9 +- src/xrpld/overlay/Peer.h | 1 + src/xrpld/overlay/PeerReservationTable.h | 1 - src/xrpld/overlay/PeerSet.h | 5 - src/xrpld/overlay/ReduceRelayCommon.h | 2 +- src/xrpld/overlay/Slot.h | 3 +- src/xrpld/overlay/Squelch.h | 2 +- src/xrpld/overlay/detail/Cluster.cpp | 3 +- src/xrpld/overlay/detail/ConnectAttempt.cpp | 1 + src/xrpld/overlay/detail/ConnectAttempt.h | 1 - src/xrpld/overlay/detail/Handshake.cpp | 3 + src/xrpld/overlay/detail/Handshake.h | 9 +- src/xrpld/overlay/detail/Message.cpp | 1 + src/xrpld/overlay/detail/OverlayImpl.cpp | 6 +- src/xrpld/overlay/detail/OverlayImpl.h | 3 + src/xrpld/overlay/detail/PeerImp.cpp | 1 + src/xrpld/overlay/detail/PeerImp.h | 4 +- .../overlay/detail/PeerReservationTable.cpp | 7 +- src/xrpld/overlay/detail/ProtocolMessage.h | 6 +- src/xrpld/overlay/detail/ProtocolVersion.cpp | 3 + src/xrpld/overlay/detail/ProtocolVersion.h | 1 + src/xrpld/overlay/detail/TrafficCount.h | 1 - src/xrpld/overlay/detail/TxMetrics.cpp | 1 + src/xrpld/overlay/detail/TxMetrics.h | 2 +- src/xrpld/overlay/detail/ZeroCopyStream.h | 2 +- src/xrpld/overlay/make_Overlay.h | 4 +- src/xrpld/peerfinder/PeerfinderManager.h | 2 + src/xrpld/peerfinder/Slot.h | 2 +- src/xrpld/peerfinder/detail/Bootcache.cpp | 1 + src/xrpld/peerfinder/detail/Bootcache.h | 2 + src/xrpld/peerfinder/detail/Checker.h | 5 +- src/xrpld/peerfinder/detail/Counts.h | 3 +- src/xrpld/peerfinder/detail/Handouts.h | 3 +- src/xrpld/peerfinder/detail/Livecache.h | 2 + src/xrpld/peerfinder/detail/Logic.h | 2 +- .../peerfinder/detail/PeerfinderManager.cpp | 4 +- src/xrpld/peerfinder/detail/SlotImp.h | 3 +- src/xrpld/peerfinder/detail/Source.h | 1 + src/xrpld/peerfinder/detail/SourceStrings.h | 1 + src/xrpld/peerfinder/detail/Store.h | 1 + src/xrpld/peerfinder/detail/StoreSqdb.h | 2 - src/xrpld/peerfinder/make_Manager.h | 2 + src/xrpld/perflog/PerfLog.h | 3 + src/xrpld/perflog/detail/PerfLogImp.cpp | 5 +- src/xrpld/perflog/detail/PerfLogImp.h | 8 +- src/xrpld/rpc/CTID.h | 2 +- src/xrpld/rpc/Context.h | 1 - src/xrpld/rpc/GRPCHandlers.h | 2 + src/xrpld/rpc/RPCHandler.h | 2 - src/xrpld/rpc/Role.h | 3 +- src/xrpld/rpc/ServerHandler.h | 3 +- src/xrpld/rpc/detail/DeliveredAmount.cpp | 8 +- src/xrpld/rpc/detail/Handler.cpp | 1 + src/xrpld/rpc/detail/Handler.h | 2 - src/xrpld/rpc/detail/MPTokenIssuanceID.cpp | 5 - src/xrpld/rpc/detail/RPCHandler.cpp | 6 +- src/xrpld/rpc/detail/RPCHelpers.cpp | 2 +- src/xrpld/rpc/detail/RPCHelpers.h | 9 +- src/xrpld/rpc/detail/Role.cpp | 3 +- src/xrpld/rpc/detail/ServerHandler.cpp | 5 +- src/xrpld/rpc/detail/Status.cpp | 1 + src/xrpld/rpc/detail/TransactionSign.cpp | 5 +- src/xrpld/rpc/detail/TransactionSign.h | 1 - src/xrpld/rpc/detail/WSInfoSub.h | 3 +- src/xrpld/rpc/handlers/AMMInfo.cpp | 4 +- src/xrpld/rpc/handlers/AccountChannels.cpp | 4 +- .../rpc/handlers/AccountCurrenciesHandler.cpp | 2 +- src/xrpld/rpc/handlers/AccountInfo.cpp | 3 +- src/xrpld/rpc/handlers/AccountLines.cpp | 10 +- src/xrpld/rpc/handlers/AccountObjects.cpp | 3 +- src/xrpld/rpc/handlers/AccountOffers.cpp | 2 +- src/xrpld/rpc/handlers/AccountTx.cpp | 5 +- src/xrpld/rpc/handlers/BlackList.cpp | 1 + src/xrpld/rpc/handlers/BookOffers.cpp | 1 + src/xrpld/rpc/handlers/CanDelete.cpp | 4 +- src/xrpld/rpc/handlers/Connect.cpp | 1 + src/xrpld/rpc/handlers/ConsensusInfo.cpp | 3 +- src/xrpld/rpc/handlers/DepositAuthorized.cpp | 1 + src/xrpld/rpc/handlers/Feature1.cpp | 2 +- src/xrpld/rpc/handlers/Fee1.cpp | 2 +- src/xrpld/rpc/handlers/FetchInfo.cpp | 3 +- src/xrpld/rpc/handlers/GatewayBalances.cpp | 2 +- src/xrpld/rpc/handlers/GetAggregatePrice.cpp | 1 + src/xrpld/rpc/handlers/GetCounts.cpp | 3 +- src/xrpld/rpc/handlers/GetCounts.h | 3 +- src/xrpld/rpc/handlers/LedgerAccept.cpp | 3 +- .../rpc/handlers/LedgerCleanerHandler.cpp | 1 + src/xrpld/rpc/handlers/LedgerClosed.cpp | 1 + src/xrpld/rpc/handlers/LedgerCurrent.cpp | 2 +- src/xrpld/rpc/handlers/LedgerData.cpp | 22 +- src/xrpld/rpc/handlers/LedgerEntry.cpp | 11 +- src/xrpld/rpc/handlers/LedgerHandler.cpp | 2 +- src/xrpld/rpc/handlers/LedgerHandler.h | 1 + src/xrpld/rpc/handlers/LedgerHeader.cpp | 1 + src/xrpld/rpc/handlers/LedgerRequest.cpp | 8 +- src/xrpld/rpc/handlers/LogLevel.cpp | 2 + src/xrpld/rpc/handlers/LogRotate.cpp | 1 + src/xrpld/rpc/handlers/Manifest.cpp | 2 +- src/xrpld/rpc/handlers/NFTOffers.cpp | 2 +- src/xrpld/rpc/handlers/NoRippleCheck.cpp | 1 + src/xrpld/rpc/handlers/OwnerInfo.cpp | 2 +- src/xrpld/rpc/handlers/PathFind.cpp | 2 +- src/xrpld/rpc/handlers/PayChanClaim.cpp | 5 +- src/xrpld/rpc/handlers/Peers.cpp | 3 +- src/xrpld/rpc/handlers/Ping.cpp | 1 + src/xrpld/rpc/handlers/Print.cpp | 1 + src/xrpld/rpc/handlers/Reservations.cpp | 1 + src/xrpld/rpc/handlers/RipplePathFind.cpp | 1 + src/xrpld/rpc/handlers/ServerInfo.cpp | 3 +- src/xrpld/rpc/handlers/ServerState.cpp | 3 +- src/xrpld/rpc/handlers/SignFor.cpp | 2 +- src/xrpld/rpc/handlers/SignHandler.cpp | 1 + src/xrpld/rpc/handlers/Simulate.cpp | 3 +- src/xrpld/rpc/handlers/Stop.cpp | 3 +- src/xrpld/rpc/handlers/Submit.cpp | 4 +- src/xrpld/rpc/handlers/SubmitMultiSigned.cpp | 2 +- src/xrpld/rpc/handlers/Subscribe.cpp | 1 + src/xrpld/rpc/handlers/TransactionEntry.cpp | 2 +- src/xrpld/rpc/handlers/Tx.cpp | 2 +- src/xrpld/rpc/handlers/TxHistory.cpp | 5 +- src/xrpld/rpc/handlers/TxReduceRelay.cpp | 1 + src/xrpld/rpc/handlers/UnlList.cpp | 2 +- src/xrpld/rpc/handlers/Unsubscribe.cpp | 1 + src/xrpld/rpc/handlers/ValidationCreate.cpp | 2 +- src/xrpld/rpc/handlers/ValidatorInfo.cpp | 1 + src/xrpld/rpc/handlers/ValidatorListSites.cpp | 2 +- src/xrpld/rpc/handlers/Validators.cpp | 2 +- src/xrpld/rpc/handlers/WalletPropose.cpp | 3 +- src/xrpld/shamap/Family.h | 3 +- src/xrpld/shamap/FullBelowCache.h | 1 + src/xrpld/shamap/SHAMap.h | 5 +- src/xrpld/shamap/SHAMapAccountStateLeafNode.h | 2 +- src/xrpld/shamap/SHAMapInnerNode.h | 8 - src/xrpld/shamap/SHAMapItem.h | 1 + src/xrpld/shamap/SHAMapLeafNode.h | 1 - src/xrpld/shamap/SHAMapMissingNode.h | 2 + src/xrpld/shamap/SHAMapNodeID.h | 2 +- src/xrpld/shamap/SHAMapSyncFilter.h | 2 +- src/xrpld/shamap/SHAMapTreeNode.h | 6 +- src/xrpld/shamap/SHAMapTxLeafNode.h | 2 +- src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h | 2 +- src/xrpld/shamap/TreeNodeCache.h | 2 + src/xrpld/shamap/detail/NodeFamily.cpp | 1 + src/xrpld/shamap/detail/SHAMap.cpp | 1 + src/xrpld/shamap/detail/SHAMapDelta.cpp | 1 + src/xrpld/shamap/detail/SHAMapInnerNode.cpp | 5 +- src/xrpld/shamap/detail/SHAMapLeafNode.cpp | 2 - src/xrpld/shamap/detail/SHAMapNodeID.cpp | 2 +- src/xrpld/shamap/detail/SHAMapSync.cpp | 1 + src/xrpld/shamap/detail/SHAMapTreeNode.cpp | 4 +- src/xrpld/shamap/detail/TaggedPointer.h | 1 - src/xrpld/shamap/detail/TaggedPointer.ipp | 6 +- 983 files changed, 3542 insertions(+), 1397 deletions(-) delete mode 100644 external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch delete mode 100644 external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch create mode 100644 external/rocksdb/patches/9.7.3-0001-memory-leak.patch create mode 100644 external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch rename src/libxrpl/beast/utility/{src => }/beast_Journal.cpp (98%) rename src/libxrpl/beast/utility/{src => }/beast_PropertyStream.cpp (99%) rename src/xrpld/app/misc/detail/{detail => }/WorkSSL.cpp (100%) diff --git a/.clang-format b/.clang-format index 1d0f396dd8..9100396885 100644 --- a/.clang-format +++ b/.clang-format @@ -44,6 +44,7 @@ DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ] +IncludeBlocks: Regroup IncludeCategories: - Regex: '^<(test)/' Priority: 0 @@ -53,8 +54,12 @@ IncludeCategories: Priority: 2 - Regex: '^<(boost)/' Priority: 3 - - Regex: '.*' + - Regex: '^.*/' Priority: 4 + - Regex: '^.*\.h' + Priority: 5 + - Regex: '.*' + Priority: 6 IncludeIsMainRegex: '$' IndentCaseLabels: true IndentFunctionDeclarationAfterType: false diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index d3c67e8668..afce1557d3 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -14,7 +14,7 @@ runs: run: | conan config set general.revisions_enabled=1 conan export external/snappy snappy/1.1.10@ - conan export external/rocksdb rocksdb/6.29.5@ + conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ - name: add Ripple Conan remote @@ -55,7 +55,3 @@ runs: --options xrpld=True \ --settings build_type=${{ inputs.configuration }} \ .. - - name: upload dependencies to remote - if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success') - shell: bash - run: conan upload --remote ripple '*' --all --parallel --confirm diff --git a/.github/workflows/libxrpl.yml b/.github/workflows/libxrpl.yml index fe4a2c3e22..2834595e3a 100644 --- a/.github/workflows/libxrpl.yml +++ b/.github/workflows/libxrpl.yml @@ -85,4 +85,5 @@ jobs: run: | gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \ /repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \ - -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" + -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" \ + -F "client_payload[pr]=${{ github.event.pull_request.number }}" diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 36d9f0225a..566e3550e0 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -73,7 +73,6 @@ jobs: run : | conan profile new default --detect || true conan profile update settings.compiler.cppstd=20 default - conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default - name: build dependencies uses: ./.github/actions/dependencies env: diff --git a/BUILD.md b/BUILD.md index 310c538584..fd985dce81 100644 --- a/BUILD.md +++ b/BUILD.md @@ -178,9 +178,9 @@ It does not override paths to dependencies when building with Visual Studio. ``` # Conan 1.x - conan export external/rocksdb rocksdb/6.29.5@ + conan export external/rocksdb rocksdb/9.7.3@ # Conan 2.x - conan export --version 6.29.5 external/rocksdb + conan export --version 9.7.3 external/rocksdb ``` Export our [Conan recipe for SOCI](./external/soci). diff --git a/Builds/levelization/results/loops.txt b/Builds/levelization/results/loops.txt index 7c132f5429..df1d273f93 100644 --- a/Builds/levelization/results/loops.txt +++ b/Builds/levelization/results/loops.txt @@ -14,10 +14,10 @@ Loop: xrpld.app xrpld.net xrpld.app > xrpld.net Loop: xrpld.app xrpld.overlay - xrpld.overlay == xrpld.app + xrpld.overlay > xrpld.app Loop: xrpld.app xrpld.peerfinder - xrpld.app > xrpld.peerfinder + xrpld.peerfinder ~= xrpld.app Loop: xrpld.app xrpld.rpc xrpld.rpc > xrpld.app diff --git a/Builds/levelization/results/ordering.txt b/Builds/levelization/results/ordering.txt index 681f76dd5d..eca7fc6dc2 100644 --- a/Builds/levelization/results/ordering.txt +++ b/Builds/levelization/results/ordering.txt @@ -6,6 +6,7 @@ libxrpl.protocol > xrpl.basics libxrpl.protocol > xrpl.json libxrpl.protocol > xrpl.protocol libxrpl.resource > xrpl.basics +libxrpl.resource > xrpl.json libxrpl.resource > xrpl.resource libxrpl.server > xrpl.basics libxrpl.server > xrpl.json @@ -42,6 +43,7 @@ test.consensus > xrpl.basics test.consensus > xrpld.app test.consensus > xrpld.consensus test.consensus > xrpld.ledger +test.consensus > xrpl.json test.core > test.jtx test.core > test.toplevel test.core > test.unit_test @@ -58,7 +60,6 @@ test.json > test.jtx test.json > xrpl.json test.jtx > xrpl.basics test.jtx > xrpld.app -test.jtx > xrpld.consensus test.jtx > xrpld.core test.jtx > xrpld.ledger test.jtx > xrpld.net @@ -158,7 +159,6 @@ xrpld.core > xrpl.basics xrpld.core > xrpl.json xrpld.core > xrpl.protocol xrpld.ledger > xrpl.basics -xrpld.ledger > xrpld.core xrpld.ledger > xrpl.json xrpld.ledger > xrpl.protocol xrpld.net > xrpl.basics @@ -183,7 +183,6 @@ xrpld.peerfinder > xrpld.core xrpld.peerfinder > xrpl.protocol xrpld.perflog > xrpl.basics xrpld.perflog > xrpl.json -xrpld.perflog > xrpl.protocol xrpld.rpc > xrpl.basics xrpld.rpc > xrpld.core xrpld.rpc > xrpld.ledger diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5d4d14d503..6bc7beccc7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,108 @@ This document contains the release notes for `rippled`, the reference server implementation of the XRP Ledger protocol. To learn more about how to build, run or update a `rippled` server, visit https://xrpl.org/install-rippled.html Have new ideas? Need help with setting up your node? [Please open an issue here](https://github.com/xrplf/rippled/issues/new/choose). +## Full Changelog + +### Amendments + +The following amendments are open for voting with this release: + +- **DynamicNFT (XLS-46)** - Adds the ability to mint mutable `NFToken` objects whose URI can be changed. ([#5048](https://github.com/XRPLF/rippled/pull/5048)) +- **PermissionedDomains (XLS-80)** - Adds Permissioned Domains, which act as part of broader systems on the XRP Ledger to restrict access to satisfy compliance rules. ([#5161](https://github.com/XRPLF/rippled/pull/5161)) +- **DeepFreeze (XLS-77)** - Adds the ability to deep freeze trust lines, enabling token issuers to block the transfer of assets for holders who have been deep frozen. ([#5187](https://github.com/XRPLF/rippled/pull/5187)) +- **fixFrozenLPTokenTransfer** - Prohibits the transfer of LP tokens when the associated liquidity pool contains at least one frozen asset. ([#5227](https://github.com/XRPLF/rippled/pull/5227)) +- **fixInvalidTxFlags** - Adds transaction flag checking for `CredentialCreate`, `CredentialAccept`, and `CredentialDelete` transactions. ([#5250](https://github.com/XRPLF/rippled/pull/5250)) + + +### New Features + +- Added a new `simulate` API method to execute dry runs of transactions and see the simulated metadata. ([#5069](https://github.com/XRPLF/rippled/pull/5069), [#5265](https://github.com/XRPLF/rippled/pull/5265)) +- Added the ability to specify MPTs when defining assets in transactions. ([#5200](https://github.com/XRPLF/rippled/pull/5200)) +- Added a `state` alias for `ripple_state` in the `ledger_entry` API method. Also refactored `LedgerEntry.cpp` to make it easier to read. ([#5199](https://github.com/XRPLF/rippled/pull/5199)) +- Improved UNL security by enabling validators to set a minimum number of UNL publishers to agree on validators. ([#5112](https://github.com/XRPLF/rippled/pull/5112)) +- Updated the XRPL Foundation UNL keys. ([#5289](https://github.com/XRPLF/rippled/pull/5289)) +- Added a new XRPL Foundation subdomain to enable a staged migration without modifying the key for the current UNL list. ([#5326](https://github.com/XRPLF/rippled/pull/5326)) +- Added support to filter ledger entry types by their canonical names in the `ledger`, `ledger_data`, and `account_objects` API methods. ([#5271](https://github.com/XRPLF/rippled/pull/5271)) +- Added detailed logging for each validation and proposal received from the network. ([#5291](https://github.com/XRPLF/rippled/pull/5291)) +- Improved git commit hash lookups when checking the version of a `rippled` debug build. Also added git commit hash info when using the `server_info` API method on an admin connection. ([#5225](https://github.com/XRPLF/rippled/pull/5225)) + + +### Bug fixes + +- Fixed an issue with overlapping data types in the `Expected` class. ([#5218](https://github.com/XRPLF/rippled/pull/5218)) +- Fixed an issue that prevented `rippled` from building on Windows with VS2022. ([#5197](https://github.com/XRPLF/rippled/pull/5197)) +- Fixed `server_definitions` prefixes. ([#5231](https://github.com/XRPLF/rippled/pull/5231)) +- Added missing dependency installations for generic MasOS runners. ([#5233](https://github.com/XRPLF/rippled/pull/5233)) +- Updated deprecated Github actions. ([#5241](https://github.com/XRPLF/rippled/pull/5241)) +- Fixed a failing assert scenario when submitting the `connect` admin RPC. ([#5235](https://github.com/XRPLF/rippled/pull/5235)) +- Fixed the levelization script to ignore single-line comments during dependency analysis. ([#5194](https://github.com/XRPLF/rippled/pull/5194)) +- Fixed the assert name used in `PermissionedDomainDelete`. ([#5245](https://github.com/XRPLF/rippled/pull/5245)) +- Fixed macOS unit tests. ([#5196](https://github.com/XRPLF/rippled/pull/5196)) +- Fixed an issue with validators not accurately reflecting amendment votes. Also added debug logging of amendment votes. ([#5173](https://github.com/XRPLF/rippled/pull/5173), [#5312](https://github.com/XRPLF/rippled/pull/5312)) +- Fixed a potential issue with double-charging fees. ([#5269](https://github.com/XRPLF/rippled/pull/5269)) +- Removed the `new parent hash` assert and replaced it with a log message. ([#5313](https://github.com/XRPLF/rippled/pull/5313)) +- Fixed an issue that prevented previously-failed inbound ledgers to not be acquired if a new trusted proposal arrived. ([#5318](https://github.com/XRPLF/rippled/pull/5318)) + + +### Other Improvements + +- Added unit tests for `AccountID` handling. ([#5174](https://github.com/XRPLF/rippled/pull/5174)) +- Added enforced levelization in `libxrpl` with CMake. ([#5199](https://github.com/XRPLF/rippled/pull/5111)) +- Updated `libxrpl` and all submodules to use the same compiler options. ([#5228](https://github.com/XRPLF/rippled/pull/5228)) +- Added Antithesis instrumentation. ([#5042](https://github.com/XRPLF/rippled/pull/5042), [#5213](https://github.com/XRPLF/rippled/pull/5213)) +- Added `rpcName` to the `LEDGER_ENTRY` macro to help prevent future bugs. ([#5202](https://github.com/XRPLF/rippled/pull/5202)) +- Updated the contribution guidelines to introduce a new workflow that avoids code freezes. Also added scripts that can be used by maintainers in branch management, and a CI job to check that code is consistent across the three main branches: `master`, `release`, and `develop`. ([#5215](https://github.com/XRPLF/rippled/pull/5215)) +- Added unit tests to check for caching issues fixed in `rippled 2.3.0`. ([#5242](https://github.com/XRPLF/rippled/pull/5242)) +- Cleaned up the API changelog. ([#5207](https://github.com/XRPLF/rippled/pull/5207)) +- Improved logs readability. ([#5251](https://github.com/XRPLF/rippled/pull/5251)) +- Updated Visual Studio CI to VS 2022, and added VS Debug builds. ([#5240](https://github.com/XRPLF/rippled/pull/5240)) +- Updated the `secp256k1` library to version 0.6.0. ([#5254](https://github.com/XRPLF/rippled/pull/5254)) +- Changed the `[port_peer]` parameter in `rippled` example config back to `51235`; also added the recommendation to use the default port of `2459` for new deployments. ([#5290](https://github.com/XRPLF/rippled/pull/5290), [#5299](https://github.com/XRPLF/rippled/pull/5299)) +- Improved CI management. ([#5268](https://github.com/XRPLF/rippled/pull/5268)) +- Updated the git commit message rules for contributors. ([#5283](https://github.com/XRPLF/rippled/pull/5283)) +- Fixed unnecessary `setCurrentThreadName` calls. ([#5280](https://github.com/XRPLF/rippled/pull/5280)) +- Added a check to prevent permissioned domains from being created in the event the Permissioned Domains amendement is enabled before the Credentials amendement. ([#5275](https://github.com/XRPLF/rippled/pull/5275)) +- Updated Conan dependencies. ([#5256](https://github.com/XRPLF/rippled/pull/5256)) +- Fixed minor typos in code comments. ([#5279](https://github.com/XRPLF/rippled/pull/5279)) +- Fixed incorrect build instructions. ([#5274](https://github.com/XRPLF/rippled/pull/5274)) +- Refactored `rotateWithLock()` to not hold a lock during callbacks. ([#5276](https://github.com/XRPLF/rippled/pull/5276)) +- Cleaned up debug logging by combining multiple data points into a single message. ([#5302](https://github.com/XRPLF/rippled/pull/5302)) +- Updated build flags to fix performance regressions. ([#5325](https://github.com/XRPLF/rippled/pull/5325)) + + +## Credits + +The following people contributed directly to this release: + +- Aanchal Malhotra +- Bart Thomee <11445373+bthomee@users.noreply.github.com> +- Bronek Kozicki +- code0xff +- Darius Tumas +- David Fuelling +- Donovan Hide +- Ed Hennis +- Elliot Lee +- Javier Romero +- Kenny Lei +- Mark Travis <7728157+mtrippled@users.noreply.github.com> +- Mayukha Vadari +- Michael Legleux +- Oleksandr <115580134+oleks-rip@users.noreply.github.com> +- Qi Zhao +- Ramkumar Srirengaram Gunasegharan +- Shae Wang +- Shawn Xie +- Sophia Xie +- Vijay Khanna Raviraj +- Vladislav Vysokikh +- Xun Zhao + +## Bug Bounties and Responsible Disclosures + +We welcome reviews of the `rippled` code and urge researchers to responsibly disclose any issues they may find. + +To report a bug, please send a detailed report to: # Version 2.3.1 diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index d465994a6b..7affa212ab 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -420,6 +420,7 @@ # - r.ripple.com 51235 # - sahyadri.isrdc.in 51235 # - hubs.xrpkuwait.com 51235 +# - hub.xrpl-commons.org 51235 # # Examples: # diff --git a/conanfile.py b/conanfile.py index ec39608d3f..d49f45903e 100644 --- a/conanfile.py +++ b/conanfile.py @@ -108,7 +108,7 @@ class Xrpl(ConanFile): if self.options.jemalloc: self.requires('jemalloc/5.3.0') if self.options.rocksdb: - self.requires('rocksdb/6.29.5') + self.requires('rocksdb/9.7.3') exports_sources = ( 'CMakeLists.txt', diff --git a/docs/consensus.md b/docs/consensus.md index 1b0063663a..4ee5aa70dc 100644 --- a/docs/consensus.md +++ b/docs/consensus.md @@ -558,7 +558,7 @@ struct ConsensusResult ConsensusTimer roundTime; // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn + // will be either Yes or MovedOn or Expired ConsensusState state = ConsensusState::No; }; diff --git a/examples/example/src/example.cpp b/examples/example/src/example.cpp index 7ff07f6ea4..8c3acdee07 100644 --- a/examples/example/src/example.cpp +++ b/examples/example/src/example.cpp @@ -1,7 +1,7 @@ -#include - #include +#include + int main(int argc, char const** argv) { std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str()); return 0; diff --git a/external/rocksdb/conandata.yml b/external/rocksdb/conandata.yml index 86b42f79f0..7d7a575d98 100644 --- a/external/rocksdb/conandata.yml +++ b/external/rocksdb/conandata.yml @@ -1,27 +1,12 @@ sources: - "6.29.5": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.29.5.tar.gz" - sha256: "ddbf84791f0980c0bbce3902feb93a2c7006f6f53bfd798926143e31d4d756f0" - "6.27.3": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.27.3.tar.gz" - sha256: "ee29901749b9132692b26f0a6c1d693f47d1a9ed8e3771e60556afe80282bf58" - "6.20.3": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.20.3.tar.gz" - sha256: "c6502c7aae641b7e20fafa6c2b92273d935d2b7b2707135ebd9a67b092169dca" - "8.8.1": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v8.8.1.tar.gz" - sha256: "056c7e21ad8ae36b026ac3b94b9d6e0fcc60e1d937fc80330921e4181be5c36e" + "9.7.3": + url: "https://github.com/facebook/rocksdb/archive/refs/tags/v9.7.3.tar.gz" + sha256: "acfabb989cbfb5b5c4d23214819b059638193ec33dad2d88373c46448d16d38b" patches: - "6.29.5": - - patch_file: "patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch" - patch_description: "Fix build with gcc 13 by including cstdint" - patch_type: "portability" - patch_source: "https://github.com/facebook/rocksdb/pull/11118" - - patch_file: "patches/6.29.5-0002-exclude-thirdparty.patch" + "9.7.3": + - patch_file: "patches/9.x.x-0001-exclude-thirdparty.patch" patch_description: "Do not include thirdparty.inc" patch_type: "portability" - "6.27.3": - - patch_file: "patches/6.27.3-0001-add-include-cstdint-for-gcc-13.patch" - patch_description: "Fix build with gcc 13 by including cstdint" + - patch_file: "patches/9.7.3-0001-memory-leak.patch" + patch_description: "Fix a leak of obsolete blob files left open until DB::Close()" patch_type: "portability" - patch_source: "https://github.com/facebook/rocksdb/pull/11118" diff --git a/external/rocksdb/conanfile.py b/external/rocksdb/conanfile.py index 1c7853d814..8b85ce1540 100644 --- a/external/rocksdb/conanfile.py +++ b/external/rocksdb/conanfile.py @@ -15,10 +15,10 @@ required_conan_version = ">=1.53.0" class RocksDBConan(ConanFile): name = "rocksdb" - homepage = "https://github.com/facebook/rocksdb" + description = "A library that provides an embeddable, persistent key-value store for fast storage" license = ("GPL-2.0-only", "Apache-2.0") url = "https://github.com/conan-io/conan-center-index" - description = "A library that provides an embeddable, persistent key-value store for fast storage" + homepage = "https://github.com/facebook/rocksdb" topics = ("database", "leveldb", "facebook", "key-value") package_type = "library" settings = "os", "arch", "compiler", "build_type" @@ -58,12 +58,12 @@ class RocksDBConan(ConanFile): @property def _compilers_minimum_version(self): return {} if self._min_cppstd == "11" else { - "apple-clang": "10", - "clang": "7", - "gcc": "7", - "msvc": "191", - "Visual Studio": "15", - } + "apple-clang": "10", + "clang": "7", + "gcc": "7", + "msvc": "191", + "Visual Studio": "15", + } def export_sources(self): export_conandata_patches(self) @@ -115,9 +115,9 @@ class RocksDBConan(ConanFile): check_min_vs(self, "191") if self.version == "6.20.3" and \ - self.settings.os == "Linux" and \ - self.settings.compiler == "gcc" and \ - Version(self.settings.compiler.version) < "5": + self.settings.os == "Linux" and \ + self.settings.compiler == "gcc" and \ + Version(self.settings.compiler.version) < "5": raise ConanInvalidConfiguration("Rocksdb 6.20.3 is not compilable with gcc <5.") # See https://github.com/facebook/rocksdb/issues/3522 def source(self): @@ -163,6 +163,8 @@ class RocksDBConan(ConanFile): if self.options.with_jemalloc: deps.set_property("jemalloc", "cmake_file_name", "JeMalloc") deps.set_property("jemalloc", "cmake_target_name", "JeMalloc::JeMalloc") + if self.options.with_zstd: + deps.set_property("zstd", "cmake_target_name", "zstd::zstd") deps.generate() def build(self): diff --git a/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch b/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch deleted file mode 100644 index 05725bf2c9..0000000000 --- a/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/include/rocksdb/utilities/checkpoint.h -+++ b/include/rocksdb/utilities/checkpoint.h -@@ -8,6 +8,7 @@ - #pragma once - #ifndef ROCKSDB_LITE - -+#include - #include - #include - #include "rocksdb/status.h" ---- a/table/block_based/data_block_hash_index.h -+++ b/table/block_based/data_block_hash_index.h -@@ -5,6 +5,7 @@ - - #pragma once - -+#include - #include - #include - ---- a/util/string_util.h -+++ b/util/string_util.h -@@ -6,6 +6,7 @@ - - #pragma once - -+#include - #include - #include - #include diff --git a/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch b/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch deleted file mode 100644 index fb0dd0c46b..0000000000 --- a/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index ec59d4491..35577c998 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -101 +100,0 @@ if(MSVC) -- option(WITH_GFLAGS "build with GFlags" OFF) -@@ -103,2 +102,2 @@ if(MSVC) -- include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc) --else() -+endif() -+ -@@ -117 +116 @@ else() -- if(MINGW) -+ if(MINGW OR MSVC) -@@ -183 +181,0 @@ else() --endif() diff --git a/external/rocksdb/patches/9.7.3-0001-memory-leak.patch b/external/rocksdb/patches/9.7.3-0001-memory-leak.patch new file mode 100644 index 0000000000..bb086e6cb2 --- /dev/null +++ b/external/rocksdb/patches/9.7.3-0001-memory-leak.patch @@ -0,0 +1,319 @@ +diff --git a/HISTORY.md b/HISTORY.md +index 36d472229..05ad1a202 100644 +--- a/HISTORY.md ++++ b/HISTORY.md +@@ -1,6 +1,10 @@ + # Rocksdb Change Log + > NOTE: Entries for next release do not go here. Follow instructions in `unreleased_history/README.txt` + ++## 9.7.4 (10/31/2024) ++### Bug Fixes ++* Fix a leak of obsolete blob files left open until DB::Close(). This bug was introduced in version 9.4.0. ++ + ## 9.7.3 (10/16/2024) + ### Behavior Changes + * OPTIONS file to be loaded by remote worker is now preserved so that it does not get purged by the primary host. A similar technique as how we are preserving new SST files from getting purged is used for this. min_options_file_numbers_ is tracked like pending_outputs_ is tracked. +diff --git a/db/blob/blob_file_cache.cc b/db/blob/blob_file_cache.cc +index 5f340aadf..1b9faa238 100644 +--- a/db/blob/blob_file_cache.cc ++++ b/db/blob/blob_file_cache.cc +@@ -42,6 +42,7 @@ Status BlobFileCache::GetBlobFileReader( + assert(blob_file_reader); + assert(blob_file_reader->IsEmpty()); + ++ // NOTE: sharing same Cache with table_cache + const Slice key = GetSliceForKey(&blob_file_number); + + assert(cache_); +@@ -98,4 +99,13 @@ Status BlobFileCache::GetBlobFileReader( + return Status::OK(); + } + ++void BlobFileCache::Evict(uint64_t blob_file_number) { ++ // NOTE: sharing same Cache with table_cache ++ const Slice key = GetSliceForKey(&blob_file_number); ++ ++ assert(cache_); ++ ++ cache_.get()->Erase(key); ++} ++ + } // namespace ROCKSDB_NAMESPACE +diff --git a/db/blob/blob_file_cache.h b/db/blob/blob_file_cache.h +index 740e67ada..6858d012b 100644 +--- a/db/blob/blob_file_cache.h ++++ b/db/blob/blob_file_cache.h +@@ -36,6 +36,15 @@ class BlobFileCache { + uint64_t blob_file_number, + CacheHandleGuard* blob_file_reader); + ++ // Called when a blob file is obsolete to ensure it is removed from the cache ++ // to avoid effectively leaking the open file and assicated memory ++ void Evict(uint64_t blob_file_number); ++ ++ // Used to identify cache entries for blob files (not normally useful) ++ static const Cache::CacheItemHelper* GetHelper() { ++ return CacheInterface::GetBasicHelper(); ++ } ++ + private: + using CacheInterface = + BasicTypedCacheInterface; +diff --git a/db/column_family.h b/db/column_family.h +index e4b7adde8..86637736a 100644 +--- a/db/column_family.h ++++ b/db/column_family.h +@@ -401,6 +401,7 @@ class ColumnFamilyData { + SequenceNumber earliest_seq); + + TableCache* table_cache() const { return table_cache_.get(); } ++ BlobFileCache* blob_file_cache() const { return blob_file_cache_.get(); } + BlobSource* blob_source() const { return blob_source_.get(); } + + // See documentation in compaction_picker.h +diff --git a/db/db_impl/db_impl.cc b/db/db_impl/db_impl.cc +index 261593423..06573ac2e 100644 +--- a/db/db_impl/db_impl.cc ++++ b/db/db_impl/db_impl.cc +@@ -659,8 +659,9 @@ Status DBImpl::CloseHelper() { + // We need to release them before the block cache is destroyed. The block + // cache may be destroyed inside versions_.reset(), when column family data + // list is destroyed, so leaving handles in table cache after +- // versions_.reset() may cause issues. +- // Here we clean all unreferenced handles in table cache. ++ // versions_.reset() may cause issues. Here we clean all unreferenced handles ++ // in table cache, and (for certain builds/conditions) assert that no obsolete ++ // files are hanging around unreferenced (leak) in the table/blob file cache. + // Now we assume all user queries have finished, so only version set itself + // can possibly hold the blocks from block cache. After releasing unreferenced + // handles here, only handles held by version set left and inside +@@ -668,6 +669,9 @@ Status DBImpl::CloseHelper() { + // time a handle is released, we erase it from the cache too. By doing that, + // we can guarantee that after versions_.reset(), table cache is empty + // so the cache can be safely destroyed. ++#ifndef NDEBUG ++ TEST_VerifyNoObsoleteFilesCached(/*db_mutex_already_held=*/true); ++#endif // !NDEBUG + table_cache_->EraseUnRefEntries(); + + for (auto& txn_entry : recovered_transactions_) { +@@ -3227,6 +3231,8 @@ Status DBImpl::MultiGetImpl( + s = Status::Aborted(); + break; + } ++ // This could be a long-running operation ++ ROCKSDB_THREAD_YIELD_HOOK(); + } + + // Post processing (decrement reference counts and record statistics) +diff --git a/db/db_impl/db_impl.h b/db/db_impl/db_impl.h +index 5e4fa310b..ccc0abfa7 100644 +--- a/db/db_impl/db_impl.h ++++ b/db/db_impl/db_impl.h +@@ -1241,9 +1241,14 @@ class DBImpl : public DB { + static Status TEST_ValidateOptions(const DBOptions& db_options) { + return ValidateOptions(db_options); + } +- + #endif // NDEBUG + ++ // In certain configurations, verify that the table/blob file cache only ++ // contains entries for live files, to check for effective leaks of open ++ // files. This can only be called when purging of obsolete files has ++ // "settled," such as during parts of DB Close(). ++ void TEST_VerifyNoObsoleteFilesCached(bool db_mutex_already_held) const; ++ + // persist stats to column family "_persistent_stats" + void PersistStats(); + +diff --git a/db/db_impl/db_impl_debug.cc b/db/db_impl/db_impl_debug.cc +index 790a50d7a..67f5b4aaf 100644 +--- a/db/db_impl/db_impl_debug.cc ++++ b/db/db_impl/db_impl_debug.cc +@@ -9,6 +9,7 @@ + + #ifndef NDEBUG + ++#include "db/blob/blob_file_cache.h" + #include "db/column_family.h" + #include "db/db_impl/db_impl.h" + #include "db/error_handler.h" +@@ -328,5 +329,49 @@ size_t DBImpl::TEST_EstimateInMemoryStatsHistorySize() const { + InstrumentedMutexLock l(&const_cast(this)->stats_history_mutex_); + return EstimateInMemoryStatsHistorySize(); + } ++ ++void DBImpl::TEST_VerifyNoObsoleteFilesCached( ++ bool db_mutex_already_held) const { ++ // This check is somewhat expensive and obscure to make a part of every ++ // unit test in every build variety. Thus, we only enable it for ASAN builds. ++ if (!kMustFreeHeapAllocations) { ++ return; ++ } ++ ++ std::optional l; ++ if (db_mutex_already_held) { ++ mutex_.AssertHeld(); ++ } else { ++ l.emplace(&mutex_); ++ } ++ ++ std::vector live_files; ++ for (auto cfd : *versions_->GetColumnFamilySet()) { ++ if (cfd->IsDropped()) { ++ continue; ++ } ++ // Sneakily add both SST and blob files to the same list ++ cfd->current()->AddLiveFiles(&live_files, &live_files); ++ } ++ std::sort(live_files.begin(), live_files.end()); ++ ++ auto fn = [&live_files](const Slice& key, Cache::ObjectPtr, size_t, ++ const Cache::CacheItemHelper* helper) { ++ if (helper != BlobFileCache::GetHelper()) { ++ // Skip non-blob files for now ++ // FIXME: diagnose and fix the leaks of obsolete SST files revealed in ++ // unit tests. ++ return; ++ } ++ // See TableCache and BlobFileCache ++ assert(key.size() == sizeof(uint64_t)); ++ uint64_t file_number; ++ GetUnaligned(reinterpret_cast(key.data()), &file_number); ++ // Assert file is in sorted live_files ++ assert( ++ std::binary_search(live_files.begin(), live_files.end(), file_number)); ++ }; ++ table_cache_->ApplyToAllEntries(fn, {}); ++} + } // namespace ROCKSDB_NAMESPACE + #endif // NDEBUG +diff --git a/db/db_iter.cc b/db/db_iter.cc +index e02586377..bf4749eb9 100644 +--- a/db/db_iter.cc ++++ b/db/db_iter.cc +@@ -540,6 +540,8 @@ bool DBIter::FindNextUserEntryInternal(bool skipping_saved_key, + } else { + iter_.Next(); + } ++ // This could be a long-running operation due to tombstones, etc. ++ ROCKSDB_THREAD_YIELD_HOOK(); + } while (iter_.Valid()); + + valid_ = false; +diff --git a/db/table_cache.cc b/db/table_cache.cc +index 71fc29c32..8a5be75e8 100644 +--- a/db/table_cache.cc ++++ b/db/table_cache.cc +@@ -164,6 +164,7 @@ Status TableCache::GetTableReader( + } + + Cache::Handle* TableCache::Lookup(Cache* cache, uint64_t file_number) { ++ // NOTE: sharing same Cache with BlobFileCache + Slice key = GetSliceForFileNumber(&file_number); + return cache->Lookup(key); + } +@@ -179,6 +180,7 @@ Status TableCache::FindTable( + size_t max_file_size_for_l0_meta_pin, Temperature file_temperature) { + PERF_TIMER_GUARD_WITH_CLOCK(find_table_nanos, ioptions_.clock); + uint64_t number = file_meta.fd.GetNumber(); ++ // NOTE: sharing same Cache with BlobFileCache + Slice key = GetSliceForFileNumber(&number); + *handle = cache_.Lookup(key); + TEST_SYNC_POINT_CALLBACK("TableCache::FindTable:0", +diff --git a/db/version_builder.cc b/db/version_builder.cc +index ed8ab8214..c98f53f42 100644 +--- a/db/version_builder.cc ++++ b/db/version_builder.cc +@@ -24,6 +24,7 @@ + #include + + #include "cache/cache_reservation_manager.h" ++#include "db/blob/blob_file_cache.h" + #include "db/blob/blob_file_meta.h" + #include "db/dbformat.h" + #include "db/internal_stats.h" +@@ -744,12 +745,9 @@ class VersionBuilder::Rep { + return Status::Corruption("VersionBuilder", oss.str()); + } + +- // Note: we use C++11 for now but in C++14, this could be done in a more +- // elegant way using generalized lambda capture. +- VersionSet* const vs = version_set_; +- const ImmutableCFOptions* const ioptions = ioptions_; +- +- auto deleter = [vs, ioptions](SharedBlobFileMetaData* shared_meta) { ++ auto deleter = [vs = version_set_, ioptions = ioptions_, ++ bc = cfd_ ? cfd_->blob_file_cache() ++ : nullptr](SharedBlobFileMetaData* shared_meta) { + if (vs) { + assert(ioptions); + assert(!ioptions->cf_paths.empty()); +@@ -758,6 +756,9 @@ class VersionBuilder::Rep { + vs->AddObsoleteBlobFile(shared_meta->GetBlobFileNumber(), + ioptions->cf_paths.front().path); + } ++ if (bc) { ++ bc->Evict(shared_meta->GetBlobFileNumber()); ++ } + + delete shared_meta; + }; +@@ -766,7 +767,7 @@ class VersionBuilder::Rep { + blob_file_number, blob_file_addition.GetTotalBlobCount(), + blob_file_addition.GetTotalBlobBytes(), + blob_file_addition.GetChecksumMethod(), +- blob_file_addition.GetChecksumValue(), deleter); ++ blob_file_addition.GetChecksumValue(), std::move(deleter)); + + mutable_blob_file_metas_.emplace( + blob_file_number, MutableBlobFileMetaData(std::move(shared_meta))); +diff --git a/db/version_set.h b/db/version_set.h +index 9336782b1..024f869e7 100644 +--- a/db/version_set.h ++++ b/db/version_set.h +@@ -1514,7 +1514,6 @@ class VersionSet { + void GetLiveFilesMetaData(std::vector* metadata); + + void AddObsoleteBlobFile(uint64_t blob_file_number, std::string path) { +- // TODO: Erase file from BlobFileCache? + obsolete_blob_files_.emplace_back(blob_file_number, std::move(path)); + } + +diff --git a/include/rocksdb/version.h b/include/rocksdb/version.h +index 2a19796b8..0afa2cab1 100644 +--- a/include/rocksdb/version.h ++++ b/include/rocksdb/version.h +@@ -13,7 +13,7 @@ + // minor or major version number planned for release. + #define ROCKSDB_MAJOR 9 + #define ROCKSDB_MINOR 7 +-#define ROCKSDB_PATCH 3 ++#define ROCKSDB_PATCH 4 + + // Do not use these. We made the mistake of declaring macros starting with + // double underscore. Now we have to live with our choice. We'll deprecate these +diff --git a/port/port.h b/port/port.h +index 13aa56d47..141716e5b 100644 +--- a/port/port.h ++++ b/port/port.h +@@ -19,3 +19,19 @@ + #elif defined(OS_WIN) + #include "port/win/port_win.h" + #endif ++ ++#ifdef OS_LINUX ++// A temporary hook into long-running RocksDB threads to support modifying their ++// priority etc. This should become a public API hook once the requirements ++// are better understood. ++extern "C" void RocksDbThreadYield() __attribute__((__weak__)); ++#define ROCKSDB_THREAD_YIELD_HOOK() \ ++ { \ ++ if (RocksDbThreadYield) { \ ++ RocksDbThreadYield(); \ ++ } \ ++ } ++#else ++#define ROCKSDB_THREAD_YIELD_HOOK() \ ++ {} ++#endif diff --git a/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch b/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch new file mode 100644 index 0000000000..7b5858bc1e --- /dev/null +++ b/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch @@ -0,0 +1,30 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 93b884d..b715cb6 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -106,14 +106,9 @@ endif() + include(CMakeDependentOption) + + if(MSVC) +- option(WITH_GFLAGS "build with GFlags" OFF) + option(WITH_XPRESS "build with windows built in compression" OFF) +- option(ROCKSDB_SKIP_THIRDPARTY "skip thirdparty.inc" OFF) +- +- if(NOT ROCKSDB_SKIP_THIRDPARTY) +- include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc) +- endif() +-else() ++endif() ++if(TRUE) + if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") + # FreeBSD has jemalloc as default malloc + # but it does not have all the jemalloc files in include/... +@@ -126,7 +121,7 @@ else() + endif() + endif() + +- if(MINGW) ++ if(MSVC OR MINGW) + option(WITH_GFLAGS "build with GFlags" OFF) + else() + option(WITH_GFLAGS "build with GFlags" ON) diff --git a/include/xrpl/basics/BasicConfig.h b/include/xrpl/basics/BasicConfig.h index f7e90c7c9a..2e3478644e 100644 --- a/include/xrpl/basics/BasicConfig.h +++ b/include/xrpl/basics/BasicConfig.h @@ -27,7 +27,6 @@ #include #include -#include #include #include #include diff --git a/include/xrpl/basics/Buffer.h b/include/xrpl/basics/Buffer.h index eb7a457198..b2f1163452 100644 --- a/include/xrpl/basics/Buffer.h +++ b/include/xrpl/basics/Buffer.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { diff --git a/include/xrpl/basics/CompressionAlgorithms.h b/include/xrpl/basics/CompressionAlgorithms.h index 4defd5a490..19db3568d6 100644 --- a/include/xrpl/basics/CompressionAlgorithms.h +++ b/include/xrpl/basics/CompressionAlgorithms.h @@ -21,9 +21,11 @@ #define RIPPLED_COMPRESSIONALGORITHMS_H_INCLUDED #include + +#include + #include #include -#include #include #include diff --git a/include/xrpl/basics/CountedObject.h b/include/xrpl/basics/CountedObject.h index 9ea76aa3bd..ef4b6544d2 100644 --- a/include/xrpl/basics/CountedObject.h +++ b/include/xrpl/basics/CountedObject.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_COUNTEDOBJECT_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/basics/Expected.h b/include/xrpl/basics/Expected.h index ced41b13ca..9abc7c8432 100644 --- a/include/xrpl/basics/Expected.h +++ b/include/xrpl/basics/Expected.h @@ -24,9 +24,7 @@ #include -#include #include -#include namespace ripple { diff --git a/include/xrpl/basics/LocalValue.h b/include/xrpl/basics/LocalValue.h index 41556f34f2..1f53fab246 100644 --- a/include/xrpl/basics/LocalValue.h +++ b/include/xrpl/basics/LocalValue.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_LOCALVALUE_H_INCLUDED #include + #include #include diff --git a/include/xrpl/basics/Log.h b/include/xrpl/basics/Log.h index 442270546e..2506b8ea8d 100644 --- a/include/xrpl/basics/Log.h +++ b/include/xrpl/basics/Log.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include #include #include diff --git a/include/xrpl/basics/Resolver.h b/include/xrpl/basics/Resolver.h index 6cba352e0a..2ed32f39bd 100644 --- a/include/xrpl/basics/Resolver.h +++ b/include/xrpl/basics/Resolver.h @@ -20,11 +20,11 @@ #ifndef RIPPLE_BASICS_RESOLVER_H_INCLUDED #define RIPPLE_BASICS_RESOLVER_H_INCLUDED +#include + #include #include -#include - namespace ripple { class Resolver diff --git a/include/xrpl/basics/ResolverAsio.h b/include/xrpl/basics/ResolverAsio.h index 51fcbdfb0d..49700d2b24 100644 --- a/include/xrpl/basics/ResolverAsio.h +++ b/include/xrpl/basics/ResolverAsio.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/include/xrpl/basics/Slice.h b/include/xrpl/basics/Slice.h index 9e9991f0dd..65d7acfd94 100644 --- a/include/xrpl/basics/Slice.h +++ b/include/xrpl/basics/Slice.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/basics/TaggedCache.h b/include/xrpl/basics/TaggedCache.h index 1fcdc3707b..dcc7c0def9 100644 --- a/include/xrpl/basics/TaggedCache.h +++ b/include/xrpl/basics/TaggedCache.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/basics/UnorderedContainers.h b/include/xrpl/basics/UnorderedContainers.h index b689a1b6ac..4f6e1093b1 100644 --- a/include/xrpl/basics/UnorderedContainers.h +++ b/include/xrpl/basics/UnorderedContainers.h @@ -25,6 +25,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/basics/base_uint.h b/include/xrpl/basics/base_uint.h index 05d83b3bb0..4b93330ef2 100644 --- a/include/xrpl/basics/base_uint.h +++ b/include/xrpl/basics/base_uint.h @@ -33,12 +33,13 @@ #include #include #include + #include #include + #include #include #include -#include #include namespace ripple { diff --git a/include/xrpl/basics/chrono.h b/include/xrpl/basics/chrono.h index d739b6bf44..2ed1a96047 100644 --- a/include/xrpl/basics/chrono.h +++ b/include/xrpl/basics/chrono.h @@ -20,17 +20,16 @@ #ifndef RIPPLE_BASICS_CHRONO_H_INCLUDED #define RIPPLE_BASICS_CHRONO_H_INCLUDED -#include - #include #include #include +#include + #include #include #include #include -#include namespace ripple { diff --git a/include/xrpl/basics/contract.h b/include/xrpl/basics/contract.h index bdfc8aac36..bf98964b9e 100644 --- a/include/xrpl/basics/contract.h +++ b/include/xrpl/basics/contract.h @@ -21,9 +21,9 @@ #define RIPPLE_BASICS_CONTRACT_H_INCLUDED #include + #include #include -#include #include namespace ripple { diff --git a/include/xrpl/basics/make_SSLContext.h b/include/xrpl/basics/make_SSLContext.h index c752a07585..aba797ce31 100644 --- a/include/xrpl/basics/make_SSLContext.h +++ b/include/xrpl/basics/make_SSLContext.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_MAKE_SSLCONTEXT_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/basics/partitioned_unordered_map.h b/include/xrpl/basics/partitioned_unordered_map.h index 4619ca1f4c..a378011520 100644 --- a/include/xrpl/basics/partitioned_unordered_map.h +++ b/include/xrpl/basics/partitioned_unordered_map.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/basics/random.h b/include/xrpl/basics/random.h index ca65b581d2..4b8bc81759 100644 --- a/include/xrpl/basics/random.h +++ b/include/xrpl/basics/random.h @@ -22,9 +22,9 @@ #include #include + #include #include -#include #include #include #include diff --git a/include/xrpl/basics/spinlock.h b/include/xrpl/basics/spinlock.h index 14a063e27a..5d5097bd2d 100644 --- a/include/xrpl/basics/spinlock.h +++ b/include/xrpl/basics/spinlock.h @@ -19,6 +19,7 @@ #define RIPPLE_BASICS_SPINLOCK_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/basics/tagged_integer.h b/include/xrpl/basics/tagged_integer.h index 4629e83091..b826b87db1 100644 --- a/include/xrpl/basics/tagged_integer.h +++ b/include/xrpl/basics/tagged_integer.h @@ -21,7 +21,9 @@ #define BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/asio/io_latency_probe.h b/include/xrpl/beast/asio/io_latency_probe.h index ca3efcdb3f..966b4686ae 100644 --- a/include/xrpl/beast/asio/io_latency_probe.h +++ b/include/xrpl/beast/asio/io_latency_probe.h @@ -21,6 +21,7 @@ #define BEAST_ASIO_IO_LATENCY_PROBE_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/container/detail/aged_ordered_container.h b/include/xrpl/beast/container/detail/aged_ordered_container.h index ad807e92cf..8c978d0517 100644 --- a/include/xrpl/beast/container/detail/aged_ordered_container.h +++ b/include/xrpl/beast/container/detail/aged_ordered_container.h @@ -25,9 +25,11 @@ #include #include #include + #include #include #include + #include #include #include diff --git a/include/xrpl/beast/container/detail/aged_unordered_container.h b/include/xrpl/beast/container/detail/aged_unordered_container.h index abafc6b2c4..3b9c83a014 100644 --- a/include/xrpl/beast/container/detail/aged_unordered_container.h +++ b/include/xrpl/beast/container/detail/aged_unordered_container.h @@ -25,8 +25,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/container/detail/empty_base_optimization.h b/include/xrpl/beast/container/detail/empty_base_optimization.h index 4cdc3a0e16..350046d594 100644 --- a/include/xrpl/beast/container/detail/empty_base_optimization.h +++ b/include/xrpl/beast/container/detail/empty_base_optimization.h @@ -11,6 +11,7 @@ #define BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/core/LexicalCast.h b/include/xrpl/beast/core/LexicalCast.h index b01fd8ae14..aa67bcad50 100644 --- a/include/xrpl/beast/core/LexicalCast.h +++ b/include/xrpl/beast/core/LexicalCast.h @@ -23,6 +23,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/beast/core/List.h b/include/xrpl/beast/core/List.h index 9b3c889d6a..d95f92d1c8 100644 --- a/include/xrpl/beast/core/List.h +++ b/include/xrpl/beast/core/List.h @@ -21,7 +21,6 @@ #define BEAST_INTRUSIVE_LIST_H_INCLUDED #include -#include namespace beast { diff --git a/include/xrpl/beast/hash/hash_append.h b/include/xrpl/beast/hash/hash_append.h index 2cbcd9ae3d..6b11fe1eb3 100644 --- a/include/xrpl/beast/hash/hash_append.h +++ b/include/xrpl/beast/hash/hash_append.h @@ -23,6 +23,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/beast/hash/xxhasher.h b/include/xrpl/beast/hash/xxhasher.h index 30af05ef0a..381980902a 100644 --- a/include/xrpl/beast/hash/xxhasher.h +++ b/include/xrpl/beast/hash/xxhasher.h @@ -21,6 +21,7 @@ #define BEAST_HASH_XXHASHER_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/insight/Meter.h b/include/xrpl/beast/insight/Meter.h index febd5cb3dc..7ef71988a1 100644 --- a/include/xrpl/beast/insight/Meter.h +++ b/include/xrpl/beast/insight/Meter.h @@ -20,10 +20,10 @@ #ifndef BEAST_INSIGHT_METER_H_INCLUDED #define BEAST_INSIGHT_METER_H_INCLUDED -#include - #include +#include + namespace beast { namespace insight { diff --git a/include/xrpl/beast/insight/StatsDCollector.h b/include/xrpl/beast/insight/StatsDCollector.h index 78195048d7..fb47eeb7fc 100644 --- a/include/xrpl/beast/insight/StatsDCollector.h +++ b/include/xrpl/beast/insight/StatsDCollector.h @@ -21,7 +21,6 @@ #define BEAST_INSIGHT_STATSDCOLLECTOR_H_INCLUDED #include - #include #include diff --git a/include/xrpl/beast/net/IPAddress.h b/include/xrpl/beast/net/IPAddress.h index cdac4abbd9..62469cfda1 100644 --- a/include/xrpl/beast/net/IPAddress.h +++ b/include/xrpl/beast/net/IPAddress.h @@ -25,8 +25,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/net/IPAddressConversion.h b/include/xrpl/beast/net/IPAddressConversion.h index 982a8e50f2..0dfbe3197d 100644 --- a/include/xrpl/beast/net/IPAddressConversion.h +++ b/include/xrpl/beast/net/IPAddressConversion.h @@ -22,8 +22,6 @@ #include -#include - #include namespace beast { diff --git a/include/xrpl/beast/net/IPAddressV4.h b/include/xrpl/beast/net/IPAddressV4.h index 7711a970de..98a92dba20 100644 --- a/include/xrpl/beast/net/IPAddressV4.h +++ b/include/xrpl/beast/net/IPAddressV4.h @@ -21,7 +21,9 @@ #define BEAST_NET_IPADDRESSV4_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/net/IPAddressV6.h b/include/xrpl/beast/net/IPAddressV6.h index 83e4d6f8a3..4a4ef73b86 100644 --- a/include/xrpl/beast/net/IPAddressV6.h +++ b/include/xrpl/beast/net/IPAddressV6.h @@ -21,7 +21,9 @@ #define BEAST_NET_IPADDRESSV6_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/rfc2616.h b/include/xrpl/beast/rfc2616.h index 7f96e924eb..648fbc22e2 100644 --- a/include/xrpl/beast/rfc2616.h +++ b/include/xrpl/beast/rfc2616.h @@ -20,10 +20,6 @@ #ifndef BEAST_RFC2616_HPP #define BEAST_RFC2616_HPP -// TODO: This include is a workaround for beast compilation bug. -// Remove when fix https://github.com/boostorg/beast/pull/2682/ is available. -#include - #include #include #include @@ -32,6 +28,7 @@ #include #include +#include #include #include #include diff --git a/include/xrpl/beast/test/yield_to.h b/include/xrpl/beast/test/yield_to.h index 9d0f50eebf..9e9f83b897 100644 --- a/include/xrpl/beast/test/yield_to.h +++ b/include/xrpl/beast/test/yield_to.h @@ -11,6 +11,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/match.h b/include/xrpl/beast/unit_test/match.h index e8e12bd556..641787e814 100644 --- a/include/xrpl/beast/unit_test/match.h +++ b/include/xrpl/beast/unit_test/match.h @@ -9,6 +9,7 @@ #define BEAST_UNIT_TEST_MATCH_HPP #include + #include namespace beast { diff --git a/include/xrpl/beast/unit_test/reporter.h b/include/xrpl/beast/unit_test/reporter.h index 956def1c30..e7a7d4b3ad 100644 --- a/include/xrpl/beast/unit_test/reporter.h +++ b/include/xrpl/beast/unit_test/reporter.h @@ -10,8 +10,10 @@ #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/runner.h b/include/xrpl/beast/unit_test/runner.h index 6330f2c8c8..283f7c8723 100644 --- a/include/xrpl/beast/unit_test/runner.h +++ b/include/xrpl/beast/unit_test/runner.h @@ -9,7 +9,9 @@ #define BEAST_UNIT_TEST_RUNNER_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/suite.h b/include/xrpl/beast/unit_test/suite.h index d49730d4d5..51cd3e17ea 100644 --- a/include/xrpl/beast/unit_test/suite.h +++ b/include/xrpl/beast/unit_test/suite.h @@ -9,9 +9,11 @@ #define BEAST_UNIT_TEST_SUITE_HPP #include + #include #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/suite_list.h b/include/xrpl/beast/unit_test/suite_list.h index 5856b4c7db..0095290eac 100644 --- a/include/xrpl/beast/unit_test/suite_list.h +++ b/include/xrpl/beast/unit_test/suite_list.h @@ -10,7 +10,9 @@ #include #include + #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/thread.h b/include/xrpl/beast/unit_test/thread.h index e94108f787..99572a549d 100644 --- a/include/xrpl/beast/unit_test/thread.h +++ b/include/xrpl/beast/unit_test/thread.h @@ -9,6 +9,7 @@ #define BEAST_UNIT_TEST_THREAD_HPP #include + #include #include #include diff --git a/include/xrpl/beast/utility/Journal.h b/include/xrpl/beast/utility/Journal.h index 41cea2a3a0..91ddf33d27 100644 --- a/include/xrpl/beast/utility/Journal.h +++ b/include/xrpl/beast/utility/Journal.h @@ -21,6 +21,7 @@ #define BEAST_UTILITY_JOURNAL_H_INCLUDED #include + #include namespace beast { diff --git a/include/xrpl/beast/utility/PropertyStream.h b/include/xrpl/beast/utility/PropertyStream.h index 5eaf70453e..18895e2410 100644 --- a/include/xrpl/beast/utility/PropertyStream.h +++ b/include/xrpl/beast/utility/PropertyStream.h @@ -22,11 +22,9 @@ #include -#include #include #include #include -#include namespace beast { diff --git a/include/xrpl/beast/utility/rngfill.h b/include/xrpl/beast/utility/rngfill.h index 93f11559cf..0188e5c529 100644 --- a/include/xrpl/beast/utility/rngfill.h +++ b/include/xrpl/beast/utility/rngfill.h @@ -21,6 +21,7 @@ #define BEAST_RANDOM_RNGFILL_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/beast/utility/temp_dir.h b/include/xrpl/beast/utility/temp_dir.h index 689b2d1efb..bbb7afc7b4 100644 --- a/include/xrpl/beast/utility/temp_dir.h +++ b/include/xrpl/beast/utility/temp_dir.h @@ -21,6 +21,7 @@ #define BEAST_UTILITY_TEMP_DIR_H_INCLUDED #include + #include namespace beast { diff --git a/include/xrpl/crypto/csprng.h b/include/xrpl/crypto/csprng.h index 3ad5d70004..9a4e933a2e 100644 --- a/include/xrpl/crypto/csprng.h +++ b/include/xrpl/crypto/csprng.h @@ -21,8 +21,6 @@ #define RIPPLE_CRYPTO_RANDOM_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/include/xrpl/json/Object.h b/include/xrpl/json/Object.h index ec60e56202..87ef8ea4f2 100644 --- a/include/xrpl/json/Object.h +++ b/include/xrpl/json/Object.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_OBJECT_H_INCLUDED #include + #include namespace Json { diff --git a/include/xrpl/json/Output.h b/include/xrpl/json/Output.h index 96905c20ba..ef5f68e518 100644 --- a/include/xrpl/json/Output.h +++ b/include/xrpl/json/Output.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_OUTPUT_H_INCLUDED #include + #include #include diff --git a/include/xrpl/json/Writer.h b/include/xrpl/json/Writer.h index 882e944093..f4c37c3316 100644 --- a/include/xrpl/json/Writer.h +++ b/include/xrpl/json/Writer.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace Json { diff --git a/include/xrpl/json/detail/json_assert.h b/include/xrpl/json/detail/json_assert.h index 264bcd90f3..5d680e6e34 100644 --- a/include/xrpl/json/detail/json_assert.h +++ b/include/xrpl/json/detail/json_assert.h @@ -20,6 +20,7 @@ #ifndef RIPPLE_JSON_JSON_ASSERT_H_INCLUDED #define RIPPLE_JSON_JSON_ASSERT_H_INCLUDED +#include #include #define JSON_ASSERT_MESSAGE(condition, message) \ diff --git a/include/xrpl/json/json_reader.h b/include/xrpl/json/json_reader.h index 6fb07c318d..27d608f850 100644 --- a/include/xrpl/json/json_reader.h +++ b/include/xrpl/json/json_reader.h @@ -24,7 +24,9 @@ #include #include + #include + #include namespace Json { diff --git a/include/xrpl/json/json_value.h b/include/xrpl/json/json_value.h index e419940171..91d29c28d6 100644 --- a/include/xrpl/json/json_value.h +++ b/include/xrpl/json/json_value.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_JSON_VALUE_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/json/json_writer.h b/include/xrpl/json/json_writer.h index 86a5ecd984..1b4ff15508 100644 --- a/include/xrpl/json/json_writer.h +++ b/include/xrpl/json/json_writer.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/include/xrpl/protocol/Book.h b/include/xrpl/protocol/Book.h index 164a5ccfa9..0a04deb277 100644 --- a/include/xrpl/protocol/Book.h +++ b/include/xrpl/protocol/Book.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/Feature.h b/include/xrpl/protocol/Feature.h index b6477baa02..a2eb7d8e50 100644 --- a/include/xrpl/protocol/Feature.h +++ b/include/xrpl/protocol/Feature.h @@ -21,7 +21,9 @@ #define RIPPLE_PROTOCOL_FEATURE_H_INCLUDED #include + #include + #include #include #include @@ -33,35 +35,39 @@ * * Steps required to add new features to the code: * - * 1) In this file, increment `numFeatures` and add a uint256 declaration - * for the feature at the bottom - * 2) Add a uint256 definition for the feature to the corresponding source - * file (Feature.cpp). Use `registerFeature` to create the feature with - * the feature's name, `Supported::no`, and `VoteBehavior::DefaultNo`. This - * should be the only place the feature's name appears in code as a string. - * 3) Use the uint256 as the parameter to `view.rules.enabled()` to - * control flow into new code that this feature limits. - * 4) If the feature development is COMPLETE, and the feature is ready to be - * SUPPORTED, change the `registerFeature` parameter to Supported::yes. - * 5) When the feature is ready to be ENABLED, change the `registerFeature` - * parameter to `VoteBehavior::DefaultYes`. - * In general, any newly supported amendments (`Supported::yes`) should have - * a `VoteBehavior::DefaultNo` for at least one full release cycle. High - * priority bug fixes can be an exception to this rule of thumb. + * 1) Add the appropriate XRPL_FEATURE or XRPL_FIX macro definition for the + * feature to features.macro with the feature's name, `Supported::no`, and + * `VoteBehavior::DefaultNo`. + * + * 2) Use the generated variable name as the parameter to `view.rules.enabled()` + * to control flow into new code that this feature limits. (featureName or + * fixName) + * + * 3) If the feature development is COMPLETE, and the feature is ready to be + * SUPPORTED, change the macro parameter in features.macro to Supported::yes. + * + * 4) In general, any newly supported amendments (`Supported::yes`) should have + * a `VoteBehavior::DefaultNo` indefinitely so that external governance can + * make the decision on when to activate it. High priority bug fixes can be + * an exception to this rule. In such cases, ensure the fix has been + * clearly communicated to the community using appropriate channels, + * then change the macro parameter in features.macro to + * `VoteBehavior::DefaultYes`. The communication process is beyond + * the scope of these instructions. + * * * When a feature has been enabled for several years, the conditional code * may be removed, and the feature "retired". To retire a feature: - * 1) Remove the uint256 declaration from this file. - * 2) MOVE the uint256 definition in Feature.cpp to the "retired features" - * section at the end of the file. - * 3) CHANGE the name of the variable to start with "retired". - * 4) CHANGE the parameters of the `registerFeature` call to `Supported::yes` - * and `VoteBehavior::DefaultNo`. + * + * 1) MOVE the macro definition in features.macro to the "retired features" + * section at the end of the file, and change the macro to XRPL_RETIRE. + * * The feature must remain registered and supported indefinitely because it - * still exists in the ledger, but there is no need to vote for it because - * there's nothing to vote for. If it is removed completely from the code, any - * instances running that code will get amendment blocked. Removing the - * feature from the ledger is beyond the scope of these instructions. + * may exist in the Amendments object on ledger. There is no need to vote + * for it because there's nothing to vote for. If the feature definition is + * removed completely from the code, any instances running that code will get + * amendment blocked. Removing the feature from the ledger is beyond the scope + * of these instructions. * */ @@ -76,11 +82,32 @@ allAmendments(); namespace detail { +#pragma push_macro("XRPL_FEATURE") +#undef XRPL_FEATURE +#pragma push_macro("XRPL_FIX") +#undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE + +#define XRPL_FEATURE(name, supported, vote) +1 +#define XRPL_FIX(name, supported, vote) +1 +#define XRPL_RETIRE(name) +1 + // This value SHOULD be equal to the number of amendments registered in // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 89; +static constexpr std::size_t numFeatures = + (0 + +#include + ); + +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") +#undef XRPL_FIX +#pragma pop_macro("XRPL_FIX") +#undef XRPL_FEATURE +#pragma pop_macro("XRPL_FEATURE") /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated @@ -320,12 +347,17 @@ foreachFeature(FeatureBitset bs, F&& f) #undef XRPL_FEATURE #pragma push_macro("XRPL_FIX") #undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE #define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name; #define XRPL_FIX(name, supported, vote) extern uint256 const fix##name; +#define XRPL_RETIRE(name) #include +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") #undef XRPL_FIX #pragma pop_macro("XRPL_FIX") #undef XRPL_FEATURE diff --git a/include/xrpl/protocol/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h index 640635c3fc..0cbf1b608a 100644 --- a/include/xrpl/protocol/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/HashPrefix.h b/include/xrpl/protocol/HashPrefix.h index 0b6ddda492..ab825658e8 100644 --- a/include/xrpl/protocol/HashPrefix.h +++ b/include/xrpl/protocol/HashPrefix.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_HASHPREFIX_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index e89feb123d..6895ed08ae 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/protocol/KnownFormats.h b/include/xrpl/protocol/KnownFormats.h index 5f5a04be1b..db2042eade 100644 --- a/include/xrpl/protocol/KnownFormats.h +++ b/include/xrpl/protocol/KnownFormats.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/include/xrpl/protocol/MultiApiJson.h b/include/xrpl/protocol/MultiApiJson.h index 03bab9b32e..15743e856b 100644 --- a/include/xrpl/protocol/MultiApiJson.h +++ b/include/xrpl/protocol/MultiApiJson.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED #define RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED +#include #include #include -#include #include #include #include diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 81a45c383f..1e8c76dbd8 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/Rate.h b/include/xrpl/protocol/Rate.h index 2872a5809d..548a7af6f9 100644 --- a/include/xrpl/protocol/Rate.h +++ b/include/xrpl/protocol/Rate.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include diff --git a/include/xrpl/protocol/SOTemplate.h b/include/xrpl/protocol/SOTemplate.h index b86fb63b85..9fd4cbf19d 100644 --- a/include/xrpl/protocol/SOTemplate.h +++ b/include/xrpl/protocol/SOTemplate.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/protocol/STBase.h b/include/xrpl/protocol/STBase.h index 097341384f..e0f28e03de 100644 --- a/include/xrpl/protocol/STBase.h +++ b/include/xrpl/protocol/STBase.h @@ -23,12 +23,14 @@ #include #include #include + #include #include #include #include #include #include + namespace ripple { /// Note, should be treated as flags that can be | and & diff --git a/include/xrpl/protocol/STExchange.h b/include/xrpl/protocol/STExchange.h index e1a1215dbd..dd7c4834a6 100644 --- a/include/xrpl/protocol/STExchange.h +++ b/include/xrpl/protocol/STExchange.h @@ -28,6 +28,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/STLedgerEntry.h b/include/xrpl/protocol/STLedgerEntry.h index 6a57b32451..96b37af0b9 100644 --- a/include/xrpl/protocol/STLedgerEntry.h +++ b/include/xrpl/protocol/STLedgerEntry.h @@ -124,4 +124,4 @@ STLedgerEntry::getType() const } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 4c8db2e01e..b89a415ebe 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -35,7 +35,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/protocol/STParsedJSON.h b/include/xrpl/protocol/STParsedJSON.h index d2052bf1f4..d655969030 100644 --- a/include/xrpl/protocol/STParsedJSON.h +++ b/include/xrpl/protocol/STParsedJSON.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_STPARSEDJSON_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/protocol/STPathSet.h b/include/xrpl/protocol/STPathSet.h index 953a209c15..7605a2283c 100644 --- a/include/xrpl/protocol/STPathSet.h +++ b/include/xrpl/protocol/STPathSet.h @@ -26,6 +26,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/STTx.h b/include/xrpl/protocol/STTx.h index 08b9a1bad1..8de2c8cc31 100644 --- a/include/xrpl/protocol/STTx.h +++ b/include/xrpl/protocol/STTx.h @@ -28,6 +28,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/STValidation.h b/include/xrpl/protocol/STValidation.h index 4f3e18de32..11ec733c01 100644 --- a/include/xrpl/protocol/STValidation.h +++ b/include/xrpl/protocol/STValidation.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #include @@ -146,8 +147,7 @@ public: render() const { std::stringstream ss; - ss << "validation: " - << " ledger_hash: " << getLedgerHash() + ss << "validation: " << " ledger_hash: " << getLedgerHash() << " consensus_hash: " << getConsensusHash() << " sign_time: " << to_string(getSignTime()) << " seen_time: " << to_string(getSeenTime()) diff --git a/include/xrpl/protocol/SecretKey.h b/include/xrpl/protocol/SecretKey.h index 67dc9c4ca5..1a13cd17c9 100644 --- a/include/xrpl/protocol/SecretKey.h +++ b/include/xrpl/protocol/SecretKey.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/Seed.h b/include/xrpl/protocol/Seed.h index 1d0a736db8..8a43d597a5 100644 --- a/include/xrpl/protocol/Seed.h +++ b/include/xrpl/protocol/Seed.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/Serializer.h b/include/xrpl/protocol/Serializer.h index 80829c8000..5724a19f57 100644 --- a/include/xrpl/protocol/Serializer.h +++ b/include/xrpl/protocol/Serializer.h @@ -30,6 +30,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/Sign.h b/include/xrpl/protocol/Sign.h index dcbe5dfd0d..7e1156ceda 100644 --- a/include/xrpl/protocol/Sign.h +++ b/include/xrpl/protocol/Sign.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/SystemParameters.h b/include/xrpl/protocol/SystemParameters.h index af49234054..121435dd92 100644 --- a/include/xrpl/protocol/SystemParameters.h +++ b/include/xrpl/protocol/SystemParameters.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 01bf4669aa..4f544963f0 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -42,7 +42,7 @@ using TERUnderlyingType = int; enum TELcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -399 .. -300: L Local error (transaction fee inadequate, exceeds local @@ -73,7 +73,7 @@ enum TELcodes : TERUnderlyingType { enum TEMcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -299 .. -200: M Malformed (bad signature) @@ -148,7 +148,7 @@ enum TEMcodes : TERUnderlyingType { enum TEFcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -199 .. -100: F @@ -192,7 +192,7 @@ enum TEFcodes : TERUnderlyingType { enum TERcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -99 .. -1: R Retry diff --git a/include/xrpl/protocol/TxFlags.h b/include/xrpl/protocol/TxFlags.h index f0f6c7f223..e94e79aee5 100644 --- a/include/xrpl/protocol/TxFlags.h +++ b/include/xrpl/protocol/TxFlags.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_PROTOCOL_TXFLAGS_H_INCLUDED #define RIPPLE_PROTOCOL_TXFLAGS_H_INCLUDED -#include - #include +#include + namespace ripple { /** Transaction flags. diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 44ec8ae93f..9422d697ca 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include namespace ripple { diff --git a/include/xrpl/protocol/detail/STVar.h b/include/xrpl/protocol/detail/STVar.h index 4a830cf8d7..6ff7e5ebc1 100644 --- a/include/xrpl/protocol/detail/STVar.h +++ b/include/xrpl/protocol/detail/STVar.h @@ -23,12 +23,9 @@ #include #include #include -#include + #include -#include #include -#include -#include namespace ripple { namespace detail { diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 103dc34243..0bcc268ca7 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -23,6 +23,9 @@ #if !defined(XRPL_FIX) #error "undefined macro: XRPL_FIX" #endif +#if !defined(XRPL_RETIRE) +#error "undefined macro: XRPL_RETIRE" +#endif // Add new amendments to the top of this list. // Keep it sorted in reverse chronological order. @@ -121,3 +124,22 @@ XRPL_FIX (NFTokenDirV1, Supported::yes, VoteBehavior::Obsolete) XRPL_FEATURE(NonFungibleTokensV1, Supported::yes, VoteBehavior::Obsolete) XRPL_FEATURE(CryptoConditionsSuite, Supported::yes, VoteBehavior::Obsolete) +// The following amendments have been active for at least two years. Their +// pre-amendment code has been removed and the identifiers are deprecated. +// All known amendments and amendments that may appear in a validated +// ledger must be registered either here or above with the "active" amendments +XRPL_RETIRE(MultiSign) +XRPL_RETIRE(TrustSetAuth) +XRPL_RETIRE(FeeEscalation) +XRPL_RETIRE(PayChan) +XRPL_RETIRE(CryptoConditions) +XRPL_RETIRE(TickSize) +XRPL_RETIRE(fix1368) +XRPL_RETIRE(Escrow) +XRPL_RETIRE(fix1373) +XRPL_RETIRE(EnforceInvariants) +XRPL_RETIRE(SortedDirectories) +XRPL_RETIRE(fix1201) +XRPL_RETIRE(fix1512) +XRPL_RETIRE(fix1523) +XRPL_RETIRE(fix1528) diff --git a/include/xrpl/protocol/digest.h b/include/xrpl/protocol/digest.h index b3c7a01410..efec616a0c 100644 --- a/include/xrpl/protocol/digest.h +++ b/include/xrpl/protocol/digest.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include diff --git a/include/xrpl/protocol/nftPageMask.h b/include/xrpl/protocol/nftPageMask.h index 1f8c39aa13..90fff10d95 100644 --- a/include/xrpl/protocol/nftPageMask.h +++ b/include/xrpl/protocol/nftPageMask.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_NFT_PAGE_MASK_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/resource/ResourceManager.h b/include/xrpl/resource/ResourceManager.h index b33b141ee0..22697d12eb 100644 --- a/include/xrpl/resource/ResourceManager.h +++ b/include/xrpl/resource/ResourceManager.h @@ -27,6 +27,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/resource/detail/Logic.h b/include/xrpl/resource/detail/Logic.h index 226dea3aef..b07ee00e73 100644 --- a/include/xrpl/resource/detail/Logic.h +++ b/include/xrpl/resource/detail/Logic.h @@ -32,6 +32,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Handoff.h b/include/xrpl/server/Handoff.h index f57c9ef57e..d33e8a7edd 100644 --- a/include/xrpl/server/Handoff.h +++ b/include/xrpl/server/Handoff.h @@ -21,8 +21,10 @@ #define RIPPLE_SERVER_HANDOFF_H_INCLUDED #include + #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Port.h b/include/xrpl/server/Port.h index 4ab56efb45..88f824d19f 100644 --- a/include/xrpl/server/Port.h +++ b/include/xrpl/server/Port.h @@ -22,17 +22,18 @@ #include #include + #include #include #include #include #include + #include #include #include #include #include -#include namespace boost { namespace asio { diff --git a/include/xrpl/server/Server.h b/include/xrpl/server/Server.h index e8157c03c6..232d1c381b 100644 --- a/include/xrpl/server/Server.h +++ b/include/xrpl/server/Server.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Session.h b/include/xrpl/server/Session.h index 25cf1ad747..196f8c78c2 100644 --- a/include/xrpl/server/Session.h +++ b/include/xrpl/server/Session.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/server/SimpleWriter.h b/include/xrpl/server/SimpleWriter.h index 0e3f63b0d9..371d6cbf97 100644 --- a/include/xrpl/server/SimpleWriter.h +++ b/include/xrpl/server/SimpleWriter.h @@ -21,10 +21,12 @@ #define RIPPLE_SERVER_SIMPLEWRITER_H_INCLUDED #include + #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Writer.h b/include/xrpl/server/Writer.h index 18cbb35b6f..b63a1e89e4 100644 --- a/include/xrpl/server/Writer.h +++ b/include/xrpl/server/Writer.h @@ -21,6 +21,7 @@ #define RIPPLE_SERVER_WRITER_H_INCLUDED #include + #include #include diff --git a/include/xrpl/server/detail/BaseHTTPPeer.h b/include/xrpl/server/detail/BaseHTTPPeer.h index bcdddcc711..51ac866e1e 100644 --- a/include/xrpl/server/detail/BaseHTTPPeer.h +++ b/include/xrpl/server/detail/BaseHTTPPeer.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -34,6 +35,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/server/detail/BasePeer.h b/include/xrpl/server/detail/BasePeer.h index 97ad77f7f2..35975efafb 100644 --- a/include/xrpl/server/detail/BasePeer.h +++ b/include/xrpl/server/detail/BasePeer.h @@ -25,7 +25,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/server/detail/Door.h b/include/xrpl/server/detail/Door.h index 20bdf421e3..90de885579 100644 --- a/include/xrpl/server/detail/Door.h +++ b/include/xrpl/server/detail/Door.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -34,6 +35,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/server/detail/JSONRPCUtil.h b/include/xrpl/server/detail/JSONRPCUtil.h index 7eb0009626..88efc077d8 100644 --- a/include/xrpl/server/detail/JSONRPCUtil.h +++ b/include/xrpl/server/detail/JSONRPCUtil.h @@ -20,6 +20,7 @@ #ifndef RIPPLE_SERVER_JSONRPCUTIL_H_INCLUDED #define RIPPLE_SERVER_JSONRPCUTIL_H_INCLUDED +#include #include #include diff --git a/include/xrpl/server/detail/PlainHTTPPeer.h b/include/xrpl/server/detail/PlainHTTPPeer.h index d4b24c0131..ee31c78cad 100644 --- a/include/xrpl/server/detail/PlainHTTPPeer.h +++ b/include/xrpl/server/detail/PlainHTTPPeer.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/PlainWSPeer.h b/include/xrpl/server/detail/PlainWSPeer.h index 8bcddee7e7..4fdc1f6f49 100644 --- a/include/xrpl/server/detail/PlainWSPeer.h +++ b/include/xrpl/server/detail/PlainWSPeer.h @@ -21,7 +21,9 @@ #define RIPPLE_SERVER_PLAINWSPEER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/SSLHTTPPeer.h b/include/xrpl/server/detail/SSLHTTPPeer.h index db6af46b5b..fac4b866d3 100644 --- a/include/xrpl/server/detail/SSLHTTPPeer.h +++ b/include/xrpl/server/detail/SSLHTTPPeer.h @@ -22,11 +22,13 @@ #include #include + #include #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/SSLWSPeer.h b/include/xrpl/server/detail/SSLWSPeer.h index 9c88b27539..d7cc0395c7 100644 --- a/include/xrpl/server/detail/SSLWSPeer.h +++ b/include/xrpl/server/detail/SSLWSPeer.h @@ -22,12 +22,14 @@ #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/io_list.h b/include/xrpl/server/detail/io_list.h index 4475f59ab7..fbf60c9a7f 100644 --- a/include/xrpl/server/detail/io_list.h +++ b/include/xrpl/server/detail/io_list.h @@ -21,6 +21,7 @@ #define RIPPLE_SERVER_IO_LIST_H_INCLUDED #include + #include #include #include diff --git a/src/libxrpl/basics/Archive.cpp b/src/libxrpl/basics/Archive.cpp index e5672bd953..2ddbc8200c 100644 --- a/src/libxrpl/basics/Archive.cpp +++ b/src/libxrpl/basics/Archive.cpp @@ -20,10 +20,15 @@ #include #include +#include +#include + #include #include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/basics/BasicConfig.cpp b/src/libxrpl/basics/BasicConfig.cpp index 2ad47ab7ee..7d6f09b391 100644 --- a/src/libxrpl/basics/BasicConfig.cpp +++ b/src/libxrpl/basics/BasicConfig.cpp @@ -19,8 +19,17 @@ #include #include -#include -#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/CountedObject.cpp b/src/libxrpl/basics/CountedObject.cpp index c18152938a..d3b9455480 100644 --- a/src/libxrpl/basics/CountedObject.cpp +++ b/src/libxrpl/basics/CountedObject.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/libxrpl/basics/FileUtilities.cpp b/src/libxrpl/basics/FileUtilities.cpp index e133143355..c0456b0556 100644 --- a/src/libxrpl/basics/FileUtilities.cpp +++ b/src/libxrpl/basics/FileUtilities.cpp @@ -19,6 +19,20 @@ #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + namespace ripple { std::string diff --git a/src/libxrpl/basics/Log.cpp b/src/libxrpl/basics/Log.cpp index ac42aa9ec4..14873a3fd7 100644 --- a/src/libxrpl/basics/Log.cpp +++ b/src/libxrpl/basics/Log.cpp @@ -19,14 +19,22 @@ #include #include -#include +#include #include -#include + +#include +#include + +#include +#include #include #include #include #include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 3bc58970ef..1515177ab9 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -19,10 +19,15 @@ #include #include -#include + #include +#include +#include +#include +#include #include #include +#include #include #include diff --git a/src/libxrpl/basics/ResolverAsio.cpp b/src/libxrpl/basics/ResolverAsio.cpp index 8951d809de..fde27189e7 100644 --- a/src/libxrpl/basics/ResolverAsio.cpp +++ b/src/libxrpl/basics/ResolverAsio.cpp @@ -18,17 +18,31 @@ //============================================================================== #include +#include #include #include #include +#include #include -#include + +#include +#include +#include +#include + +#include #include +#include #include #include +#include +#include #include #include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/StringUtilities.cpp b/src/libxrpl/basics/StringUtilities.cpp index cd9bdfbd03..5008730718 100644 --- a/src/libxrpl/basics/StringUtilities.cpp +++ b/src/libxrpl/basics/StringUtilities.cpp @@ -17,15 +17,24 @@ */ //============================================================================== -#include +#include #include -#include -#include #include #include -#include -#include -#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/UptimeClock.cpp b/src/libxrpl/basics/UptimeClock.cpp index 4394d02f78..42ba479fae 100644 --- a/src/libxrpl/basics/UptimeClock.cpp +++ b/src/libxrpl/basics/UptimeClock.cpp @@ -19,6 +19,10 @@ #include +#include +#include +#include + namespace ripple { std::atomic UptimeClock::now_{0}; // seconds since start diff --git a/src/libxrpl/basics/base64.cpp b/src/libxrpl/basics/base64.cpp index a8b4e35299..741d978aa0 100644 --- a/src/libxrpl/basics/base64.cpp +++ b/src/libxrpl/basics/base64.cpp @@ -56,7 +56,10 @@ #include -#include +#include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/basics/contract.cpp b/src/libxrpl/basics/contract.cpp index 4f0a74644a..b5a7b3f368 100644 --- a/src/libxrpl/basics/contract.cpp +++ b/src/libxrpl/basics/contract.cpp @@ -20,24 +20,13 @@ #include #include #include + #include #include +#include namespace ripple { -namespace detail { - -[[noreturn]] void -accessViolation() noexcept -{ - // dereference memory location zero - int volatile* j = 0; - (void)*j; - std::abort(); -} - -} // namespace detail - void LogThrow(std::string const& title) { @@ -55,7 +44,7 @@ LogicError(std::string const& s) noexcept // here. // For the above reasons, we want this contract to stand out. UNREACHABLE("LogicError", {{"message", s}}); - detail::accessViolation(); + std::abort(); } } // namespace ripple diff --git a/src/libxrpl/basics/make_SSLContext.cpp b/src/libxrpl/basics/make_SSLContext.cpp index 4a9ea321d5..980f2d48a6 100644 --- a/src/libxrpl/basics/make_SSLContext.cpp +++ b/src/libxrpl/basics/make_SSLContext.cpp @@ -19,8 +19,29 @@ #include #include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include -#include +#include +#include +#include namespace ripple { namespace openssl { diff --git a/src/libxrpl/basics/mulDiv.cpp b/src/libxrpl/basics/mulDiv.cpp index 7f9ffa4526..882878ebec 100644 --- a/src/libxrpl/basics/mulDiv.cpp +++ b/src/libxrpl/basics/mulDiv.cpp @@ -18,7 +18,12 @@ //============================================================================== #include + #include +#include +#include + +#include #include namespace ripple { diff --git a/src/libxrpl/beast/core/CurrentThreadName.cpp b/src/libxrpl/beast/core/CurrentThreadName.cpp index 71b5d21fec..b393844972 100644 --- a/src/libxrpl/beast/core/CurrentThreadName.cpp +++ b/src/libxrpl/beast/core/CurrentThreadName.cpp @@ -22,8 +22,12 @@ //============================================================================== #include + #include +#include +#include + //------------------------------------------------------------------------------ #if BOOST_OS_WINDOWS diff --git a/src/libxrpl/beast/core/SemanticVersion.cpp b/src/libxrpl/beast/core/SemanticVersion.cpp index dfe699848d..e659d63570 100644 --- a/src/libxrpl/beast/core/SemanticVersion.cpp +++ b/src/libxrpl/beast/core/SemanticVersion.cpp @@ -22,7 +22,11 @@ #include #include +#include +#include #include +#include +#include namespace beast { diff --git a/src/libxrpl/beast/insight/Groups.cpp b/src/libxrpl/beast/insight/Groups.cpp index fcf7e65787..c846ceff3b 100644 --- a/src/libxrpl/beast/insight/Groups.cpp +++ b/src/libxrpl/beast/insight/Groups.cpp @@ -18,10 +18,20 @@ //============================================================================== #include +#include +#include +#include +#include #include #include +#include +#include +#include + #include +#include #include +#include namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/Hook.cpp b/src/libxrpl/beast/insight/Hook.cpp index 6253884634..d15e001ace 100644 --- a/src/libxrpl/beast/insight/Hook.cpp +++ b/src/libxrpl/beast/insight/Hook.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/NullCollector.cpp b/src/libxrpl/beast/insight/NullCollector.cpp index 12ea817014..4801bcecab 100644 --- a/src/libxrpl/beast/insight/NullCollector.cpp +++ b/src/libxrpl/beast/insight/NullCollector.cpp @@ -17,8 +17,22 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include + namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/StatsDCollector.cpp b/src/libxrpl/beast/insight/StatsDCollector.cpp index a9febbb307..b0e00c3cfd 100644 --- a/src/libxrpl/beast/insight/StatsDCollector.cpp +++ b/src/libxrpl/beast/insight/StatsDCollector.cpp @@ -21,20 +21,35 @@ #include #include #include +#include #include #include #include -#include +#include +#include #include -#include -#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include #include +#include +#include #include #include -#include #include +#include #include +#include +#include #ifndef BEAST_STATSDCOLLECTOR_TRACING_ENABLED #define BEAST_STATSDCOLLECTOR_TRACING_ENABLED 0 diff --git a/src/libxrpl/beast/net/IPAddressConversion.cpp b/src/libxrpl/beast/net/IPAddressConversion.cpp index 2ab84c3701..abaf1bb7b8 100644 --- a/src/libxrpl/beast/net/IPAddressConversion.cpp +++ b/src/libxrpl/beast/net/IPAddressConversion.cpp @@ -18,6 +18,10 @@ //============================================================================== #include +#include + +#include +#include namespace beast { namespace IP { diff --git a/src/libxrpl/beast/net/IPAddressV4.cpp b/src/libxrpl/beast/net/IPAddressV4.cpp index 8354147987..29455024f6 100644 --- a/src/libxrpl/beast/net/IPAddressV4.cpp +++ b/src/libxrpl/beast/net/IPAddressV4.cpp @@ -19,9 +19,6 @@ #include -#include -#include - namespace beast { namespace IP { diff --git a/src/libxrpl/beast/net/IPEndpoint.cpp b/src/libxrpl/beast/net/IPEndpoint.cpp index 490777111b..ffe664498c 100644 --- a/src/libxrpl/beast/net/IPEndpoint.cpp +++ b/src/libxrpl/beast/net/IPEndpoint.cpp @@ -17,8 +17,18 @@ */ //============================================================================== +#include #include -#include + +#include +#include + +#include +#include +#include +#include +#include +#include namespace beast { namespace IP { diff --git a/src/libxrpl/beast/utility/src/beast_Journal.cpp b/src/libxrpl/beast/utility/beast_Journal.cpp similarity index 98% rename from src/libxrpl/beast/utility/src/beast_Journal.cpp rename to src/libxrpl/beast/utility/beast_Journal.cpp index dd160a5870..828f2fa619 100644 --- a/src/libxrpl/beast/utility/src/beast_Journal.cpp +++ b/src/libxrpl/beast/utility/beast_Journal.cpp @@ -18,7 +18,10 @@ //============================================================================== #include -#include + +#include +#include +#include namespace beast { diff --git a/src/libxrpl/beast/utility/src/beast_PropertyStream.cpp b/src/libxrpl/beast/utility/beast_PropertyStream.cpp similarity index 99% rename from src/libxrpl/beast/utility/src/beast_PropertyStream.cpp rename to src/libxrpl/beast/utility/beast_PropertyStream.cpp index 3d68ea30cf..22d1f898d6 100644 --- a/src/libxrpl/beast/utility/src/beast_PropertyStream.cpp +++ b/src/libxrpl/beast/utility/beast_PropertyStream.cpp @@ -19,9 +19,12 @@ #include #include + #include #include -#include +#include +#include +#include namespace beast { diff --git a/src/libxrpl/crypto/RFC1751.cpp b/src/libxrpl/crypto/RFC1751.cpp index 952e246f5f..48bd8dc0f8 100644 --- a/src/libxrpl/crypto/RFC1751.cpp +++ b/src/libxrpl/crypto/RFC1751.cpp @@ -19,10 +19,19 @@ #include #include -#include + +#include +#include +#include +#include #include + +#include +#include #include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/crypto/csprng.cpp b/src/libxrpl/crypto/csprng.cpp index 948500734c..986c30d8fd 100644 --- a/src/libxrpl/crypto/csprng.cpp +++ b/src/libxrpl/crypto/csprng.cpp @@ -18,10 +18,14 @@ //============================================================================== #include -#include #include -#include + #include +#include + +#include +#include +#include #include #include diff --git a/src/libxrpl/crypto/secure_erase.cpp b/src/libxrpl/crypto/secure_erase.cpp index 93f189d519..d5f2e25059 100644 --- a/src/libxrpl/crypto/secure_erase.cpp +++ b/src/libxrpl/crypto/secure_erase.cpp @@ -18,8 +18,11 @@ //============================================================================== #include + #include +#include + namespace ripple { void diff --git a/src/libxrpl/json/JsonPropertyStream.cpp b/src/libxrpl/json/JsonPropertyStream.cpp index 19387013b5..a8441f39ec 100644 --- a/src/libxrpl/json/JsonPropertyStream.cpp +++ b/src/libxrpl/json/JsonPropertyStream.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace ripple { JsonPropertyStream::JsonPropertyStream() : m_top(Json::objectValue) diff --git a/src/libxrpl/json/Object.cpp b/src/libxrpl/json/Object.cpp index f1f30af9a2..62f686e228 100644 --- a/src/libxrpl/json/Object.cpp +++ b/src/libxrpl/json/Object.cpp @@ -20,6 +20,12 @@ #include #include #include +#include +#include +#include + +#include +#include namespace Json { diff --git a/src/libxrpl/json/Output.cpp b/src/libxrpl/json/Output.cpp index c24c75b32d..84388884da 100644 --- a/src/libxrpl/json/Output.cpp +++ b/src/libxrpl/json/Output.cpp @@ -19,6 +19,9 @@ #include #include +#include + +#include namespace Json { diff --git a/src/libxrpl/json/Writer.cpp b/src/libxrpl/json/Writer.cpp index 2f7c0b523c..94c7344788 100644 --- a/src/libxrpl/json/Writer.cpp +++ b/src/libxrpl/json/Writer.cpp @@ -17,10 +17,18 @@ */ //============================================================================== +#include #include #include + +#include +#include +#include #include #include +#include +#include +#include namespace Json { diff --git a/src/libxrpl/json/json_reader.cpp b/src/libxrpl/json/json_reader.cpp index 5f027e5189..6818d73ded 100644 --- a/src/libxrpl/json/json_reader.cpp +++ b/src/libxrpl/json/json_reader.cpp @@ -19,10 +19,15 @@ #include #include +#include #include #include +#include +#include +#include #include +#include #include namespace Json { diff --git a/src/libxrpl/json/json_value.cpp b/src/libxrpl/json/json_value.cpp index 90926afc6c..709b425d63 100644 --- a/src/libxrpl/json/json_value.cpp +++ b/src/libxrpl/json/json_value.cpp @@ -17,11 +17,17 @@ */ //============================================================================== -#include #include +#include #include +#include +#include #include -#include + +#include +#include +#include +#include namespace Json { diff --git a/src/libxrpl/json/json_valueiterator.cpp b/src/libxrpl/json/json_valueiterator.cpp index c1a1bcc56a..20dedf2bb2 100644 --- a/src/libxrpl/json/json_valueiterator.cpp +++ b/src/libxrpl/json/json_valueiterator.cpp @@ -19,6 +19,7 @@ // included by json_value.cpp +#include #include namespace Json { diff --git a/src/libxrpl/json/json_writer.cpp b/src/libxrpl/json/json_writer.cpp index de0ed5848a..a830f2855f 100644 --- a/src/libxrpl/json/json_writer.cpp +++ b/src/libxrpl/json/json_writer.cpp @@ -18,8 +18,15 @@ //============================================================================== #include +#include +#include #include + +#include +#include #include +#include +#include #include #include #include diff --git a/src/libxrpl/json/to_string.cpp b/src/libxrpl/json/to_string.cpp index 7bf5824120..f6fb65d10a 100644 --- a/src/libxrpl/json/to_string.cpp +++ b/src/libxrpl/json/to_string.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace Json { std::string diff --git a/src/libxrpl/protocol/AMMCore.cpp b/src/libxrpl/protocol/AMMCore.cpp index 3bebfc4659..aa48827195 100644 --- a/src/libxrpl/protocol/AMMCore.cpp +++ b/src/libxrpl/protocol/AMMCore.cpp @@ -17,13 +17,26 @@ */ //============================================================================== +#include +#include +#include #include +#include #include +#include #include +#include #include #include +#include +#include #include +#include +#include +#include +#include + namespace ripple { AccountID diff --git a/src/libxrpl/protocol/AccountID.cpp b/src/libxrpl/protocol/AccountID.cpp index f271882158..109ac3d028 100644 --- a/src/libxrpl/protocol/AccountID.cpp +++ b/src/libxrpl/protocol/AccountID.cpp @@ -19,13 +19,21 @@ #include #include +#include +#include #include #include #include #include -#include + +#include +#include #include +#include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Asset.cpp b/src/libxrpl/protocol/Asset.cpp index 5a49635284..d4a2fccb4a 100644 --- a/src/libxrpl/protocol/Asset.cpp +++ b/src/libxrpl/protocol/Asset.cpp @@ -17,10 +17,18 @@ */ //============================================================================== +#include +#include +#include #include -#include +#include +#include #include +#include +#include +#include + namespace ripple { AccountID const& diff --git a/src/libxrpl/protocol/Book.cpp b/src/libxrpl/protocol/Book.cpp index c096dba2b4..cfd1fc61dc 100644 --- a/src/libxrpl/protocol/Book.cpp +++ b/src/libxrpl/protocol/Book.cpp @@ -18,6 +18,10 @@ //============================================================================== #include +#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/BuildInfo.cpp b/src/libxrpl/protocol/BuildInfo.cpp index 151f8f570c..39d34c43e7 100644 --- a/src/libxrpl/protocol/BuildInfo.cpp +++ b/src/libxrpl/protocol/BuildInfo.cpp @@ -21,8 +21,11 @@ #include #include #include -#include + #include +#include +#include +#include namespace ripple { @@ -33,7 +36,7 @@ namespace BuildInfo { // and follow the format described at http://semver.org/ //------------------------------------------------------------------------------ // clang-format off -char const* const versionString = "2.4.0-rc4" +char const* const versionString = "2.4.0" // clang-format on #if defined(DEBUG) || defined(SANITIZER) diff --git a/src/libxrpl/protocol/ErrorCodes.cpp b/src/libxrpl/protocol/ErrorCodes.cpp index 4cb2a874ae..ca853c690e 100644 --- a/src/libxrpl/protocol/ErrorCodes.cpp +++ b/src/libxrpl/protocol/ErrorCodes.cpp @@ -18,9 +18,13 @@ //============================================================================== #include +#include #include +#include + #include #include +#include namespace ripple { namespace RPC { diff --git a/src/libxrpl/protocol/Feature.cpp b/src/libxrpl/protocol/Feature.cpp index 05164489ec..3065bdf41c 100644 --- a/src/libxrpl/protocol/Feature.cpp +++ b/src/libxrpl/protocol/Feature.cpp @@ -17,17 +17,26 @@ */ //============================================================================== -#include - #include +#include #include +#include +#include #include + #include #include -#include +#include +#include #include +#include #include -#include + +#include +#include +#include +#include +#include namespace ripple { @@ -250,12 +259,9 @@ FeatureCollections::registerFeature( Feature const* i = getByName(name); if (!i) { - // If this check fails, and you just added a feature, increase the - // numFeatures value in Feature.h check( features.size() < detail::numFeatures, - "More features defined than allocated. Adjust numFeatures in " - "Feature.h."); + "More features defined than allocated."); auto const f = sha512Half(Slice(name.data(), name.size())); @@ -424,45 +430,26 @@ featureToName(uint256 const& f) #undef XRPL_FEATURE #pragma push_macro("XRPL_FIX") #undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE #define XRPL_FEATURE(name, supported, vote) \ uint256 const feature##name = registerFeature(#name, supported, vote); #define XRPL_FIX(name, supported, vote) \ uint256 const fix##name = registerFeature("fix" #name, supported, vote); +#define XRPL_RETIRE(name) \ + [[deprecated("The referenced amendment has been retired"), maybe_unused]] \ + uint256 const retired##name = retireFeature(#name); #include +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") #undef XRPL_FIX #pragma pop_macro("XRPL_FIX") #undef XRPL_FEATURE #pragma pop_macro("XRPL_FEATURE") -// clang-format off - -// The following amendments have been active for at least two years. Their -// pre-amendment code has been removed and the identifiers are deprecated. -// All known amendments and amendments that may appear in a validated -// ledger must be registered either here or above with the "active" amendments -[[deprecated("The referenced amendment has been retired"), maybe_unused]] -uint256 const - retiredMultiSign = retireFeature("MultiSign"), - retiredTrustSetAuth = retireFeature("TrustSetAuth"), - retiredFeeEscalation = retireFeature("FeeEscalation"), - retiredPayChan = retireFeature("PayChan"), - retiredCryptoConditions = retireFeature("CryptoConditions"), - retiredTickSize = retireFeature("TickSize"), - retiredFix1368 = retireFeature("fix1368"), - retiredEscrow = retireFeature("Escrow"), - retiredFix1373 = retireFeature("fix1373"), - retiredEnforceInvariants = retireFeature("EnforceInvariants"), - retiredSortedDirectories = retireFeature("SortedDirectories"), - retiredFix1201 = retireFeature("fix1201"), - retiredFix1512 = retireFeature("fix1512"), - retiredFix1523 = retireFeature("fix1523"), - retiredFix1528 = retireFeature("fix1528"); - -// clang-format on - // All of the features should now be registered, since variables in a cpp file // are initialized from top to bottom. // diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 7fc879609e..9bd1ceb5eb 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -17,13 +17,21 @@ */ //============================================================================== +#include +#include #include +#include #include + #include + #include +#include #include -#include +#include #include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Indexes.cpp b/src/libxrpl/protocol/Indexes.cpp index 046be44422..fe8f0c4778 100644 --- a/src/libxrpl/protocol/Indexes.cpp +++ b/src/libxrpl/protocol/Indexes.cpp @@ -17,17 +17,32 @@ */ //============================================================================== +#include +#include +#include #include +#include #include +#include #include #include +#include #include #include #include +#include #include #include +#include + #include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Issue.cpp b/src/libxrpl/protocol/Issue.cpp index 179cb1eb14..b6edf77b2a 100644 --- a/src/libxrpl/protocol/Issue.cpp +++ b/src/libxrpl/protocol/Issue.cpp @@ -17,13 +17,18 @@ */ //============================================================================== -#include - +#include #include +#include #include +#include #include #include +#include +#include +#include + namespace ripple { std::string diff --git a/src/libxrpl/protocol/Keylet.cpp b/src/libxrpl/protocol/Keylet.cpp index 846c3bc07b..8deb2d735a 100644 --- a/src/libxrpl/protocol/Keylet.cpp +++ b/src/libxrpl/protocol/Keylet.cpp @@ -17,7 +17,9 @@ */ //============================================================================== +#include #include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/LedgerFormats.cpp b/src/libxrpl/protocol/LedgerFormats.cpp index 518c3771d6..9755eedf3b 100644 --- a/src/libxrpl/protocol/LedgerFormats.cpp +++ b/src/libxrpl/protocol/LedgerFormats.cpp @@ -18,8 +18,11 @@ //============================================================================== #include +#include +#include #include -#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/LedgerHeader.cpp b/src/libxrpl/protocol/LedgerHeader.cpp index 284c4dc055..9984a971c8 100644 --- a/src/libxrpl/protocol/LedgerHeader.cpp +++ b/src/libxrpl/protocol/LedgerHeader.cpp @@ -17,7 +17,10 @@ */ //============================================================================== +#include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/MPTIssue.cpp b/src/libxrpl/protocol/MPTIssue.cpp index 38022a0ed3..c8decb2b3f 100644 --- a/src/libxrpl/protocol/MPTIssue.cpp +++ b/src/libxrpl/protocol/MPTIssue.cpp @@ -17,10 +17,19 @@ */ //============================================================================== +#include +#include #include +#include +#include #include +#include #include +#include +#include +#include + namespace ripple { MPTIssue::MPTIssue(MPTID const& issuanceID) : mptID_(issuanceID) diff --git a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp index 03c9e79e26..0c0a657512 100644 --- a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp +++ b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp @@ -17,11 +17,16 @@ */ //============================================================================== +#include #include #include #include +#include +#include #include +#include + namespace ripple { void diff --git a/src/libxrpl/protocol/NFTokenID.cpp b/src/libxrpl/protocol/NFTokenID.cpp index 72fb8b87bb..55b03b10a5 100644 --- a/src/libxrpl/protocol/NFTokenID.cpp +++ b/src/libxrpl/protocol/NFTokenID.cpp @@ -17,9 +17,25 @@ */ //============================================================================== +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include + namespace ripple { bool diff --git a/src/libxrpl/protocol/NFTokenOfferID.cpp b/src/libxrpl/protocol/NFTokenOfferID.cpp index 3d761e6b93..921ba4e1d1 100644 --- a/src/libxrpl/protocol/NFTokenOfferID.cpp +++ b/src/libxrpl/protocol/NFTokenOfferID.cpp @@ -17,9 +17,21 @@ */ //============================================================================== +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include +#include + namespace ripple { bool diff --git a/src/libxrpl/protocol/PublicKey.cpp b/src/libxrpl/protocol/PublicKey.cpp index fdab288cea..cdf646e0f8 100644 --- a/src/libxrpl/protocol/PublicKey.cpp +++ b/src/libxrpl/protocol/PublicKey.cpp @@ -17,13 +17,29 @@ */ //============================================================================== +#include +#include #include #include +#include #include +#include #include #include -#include +#include + +#include +#include + #include +#include + +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Quality.cpp b/src/libxrpl/protocol/Quality.cpp index ba669d9bd1..f7a970a3b9 100644 --- a/src/libxrpl/protocol/Quality.cpp +++ b/src/libxrpl/protocol/Quality.cpp @@ -17,8 +17,13 @@ */ //============================================================================== +#include #include +#include #include +#include + +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/QualityFunction.cpp b/src/libxrpl/protocol/QualityFunction.cpp index 64e5a36989..9f898dca25 100644 --- a/src/libxrpl/protocol/QualityFunction.cpp +++ b/src/libxrpl/protocol/QualityFunction.cpp @@ -17,9 +17,14 @@ */ //============================================================================== +#include +#include +#include +#include #include -#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/RPCErr.cpp b/src/libxrpl/protocol/RPCErr.cpp index e9ca3c3c1e..2fc9ba173b 100644 --- a/src/libxrpl/protocol/RPCErr.cpp +++ b/src/libxrpl/protocol/RPCErr.cpp @@ -17,8 +17,10 @@ */ //============================================================================== +#include #include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Rate2.cpp b/src/libxrpl/protocol/Rate2.cpp index 64ac6c4631..dfdf60f02e 100644 --- a/src/libxrpl/protocol/Rate2.cpp +++ b/src/libxrpl/protocol/Rate2.cpp @@ -17,8 +17,14 @@ */ //============================================================================== +#include +#include +#include #include #include +#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/Rules.cpp b/src/libxrpl/protocol/Rules.cpp index 7043acff96..3d1c718e65 100644 --- a/src/libxrpl/protocol/Rules.cpp +++ b/src/libxrpl/protocol/Rules.cpp @@ -18,10 +18,18 @@ //============================================================================== #include +#include +#include +#include +#include #include #include +#include +#include #include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/SField.cpp b/src/libxrpl/protocol/SField.cpp index 20e1e11265..b59e2a2b69 100644 --- a/src/libxrpl/protocol/SField.cpp +++ b/src/libxrpl/protocol/SField.cpp @@ -17,11 +17,10 @@ */ //============================================================================== -#include #include + +#include #include -#include -#include namespace ripple { diff --git a/src/libxrpl/protocol/SOTemplate.cpp b/src/libxrpl/protocol/SOTemplate.cpp index d75261c0a6..0b6e321bf4 100644 --- a/src/libxrpl/protocol/SOTemplate.cpp +++ b/src/libxrpl/protocol/SOTemplate.cpp @@ -17,8 +17,14 @@ */ //============================================================================== +#include +#include #include +#include +#include +#include + namespace ripple { SOTemplate::SOTemplate( diff --git a/src/libxrpl/protocol/STAccount.cpp b/src/libxrpl/protocol/STAccount.cpp index c033e4cb58..ba9a2d1919 100644 --- a/src/libxrpl/protocol/STAccount.cpp +++ b/src/libxrpl/protocol/STAccount.cpp @@ -17,9 +17,21 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STAmount.cpp b/src/libxrpl/protocol/STAmount.cpp index 37830830ad..e0815fbef3 100644 --- a/src/libxrpl/protocol/STAmount.cpp +++ b/src/libxrpl/protocol/STAmount.cpp @@ -17,21 +17,53 @@ */ //============================================================================== +#include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include #include #include +#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include #include +#include #include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STArray.cpp b/src/libxrpl/protocol/STArray.cpp index 0dea9c7665..0c5b4e198c 100644 --- a/src/libxrpl/protocol/STArray.cpp +++ b/src/libxrpl/protocol/STArray.cpp @@ -19,8 +19,17 @@ #include #include +#include +#include #include #include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STBase.cpp b/src/libxrpl/protocol/STBase.cpp index 6986957b61..86e52a1f73 100644 --- a/src/libxrpl/protocol/STBase.cpp +++ b/src/libxrpl/protocol/STBase.cpp @@ -18,8 +18,15 @@ //============================================================================== #include +#include +#include #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STBlob.cpp b/src/libxrpl/protocol/STBlob.cpp index 34e759b4c3..33245a1e16 100644 --- a/src/libxrpl/protocol/STBlob.cpp +++ b/src/libxrpl/protocol/STBlob.cpp @@ -17,8 +17,16 @@ */ //============================================================================== -#include +#include +#include +#include +#include #include +#include + +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STCurrency.cpp b/src/libxrpl/protocol/STCurrency.cpp index 56ac19da11..a17ed2e0d2 100644 --- a/src/libxrpl/protocol/STCurrency.cpp +++ b/src/libxrpl/protocol/STCurrency.cpp @@ -17,10 +17,19 @@ */ //============================================================================== -#include -#include - #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index 9525a47c46..bc5b7e855e 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -18,14 +18,22 @@ //============================================================================== #include -#include #include -#include +#include +#include #include +#include +#include #include +#include #include #include + #include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STIssue.cpp b/src/libxrpl/protocol/STIssue.cpp index 5a2008cb17..8483b8cfe3 100644 --- a/src/libxrpl/protocol/STIssue.cpp +++ b/src/libxrpl/protocol/STIssue.cpp @@ -17,20 +17,24 @@ */ //============================================================================== -#include - -#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include -#include -#include - -#include -#include -#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STLedgerEntry.cpp b/src/libxrpl/protocol/STLedgerEntry.cpp index 0350dd883b..ae80abb69f 100644 --- a/src/libxrpl/protocol/STLedgerEntry.cpp +++ b/src/libxrpl/protocol/STLedgerEntry.cpp @@ -17,20 +17,33 @@ */ //============================================================================== -#include - #include +#include #include #include +#include #include #include #include +#include +#include #include +#include +#include +#include +#include +#include #include -#include + +#include + #include #include -#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STNumber.cpp b/src/libxrpl/protocol/STNumber.cpp index 74961bfbca..c0cdcccd6e 100644 --- a/src/libxrpl/protocol/STNumber.cpp +++ b/src/libxrpl/protocol/STNumber.cpp @@ -17,10 +17,17 @@ */ //============================================================================== -#include - +#include #include #include +#include +#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 821f8f05c9..d0873561e3 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -17,16 +17,46 @@ */ //============================================================================== +#include #include +#include +#include +#include +#include +#include +#include #include +#include #include #include +#include +#include #include +#include #include +#include +#include #include #include +#include +#include #include #include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index 7d08993a8b..0488189a66 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -18,10 +18,13 @@ //============================================================================== #include +#include #include #include #include -#include +#include +#include +#include #include #include #include @@ -30,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -39,11 +43,20 @@ #include #include #include -#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STPathSet.cpp b/src/libxrpl/protocol/STPathSet.cpp index 57bcaca6b2..d2bd20cfe8 100644 --- a/src/libxrpl/protocol/STPathSet.cpp +++ b/src/libxrpl/protocol/STPathSet.cpp @@ -18,12 +18,22 @@ //============================================================================== #include -#include #include -#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include +#include + namespace ripple { std::size_t diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index bd1c461c8c..a60f7325f0 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -17,26 +17,53 @@ */ //============================================================================== -#include +#include +#include +#include #include +#include #include #include -#include -#include +#include +#include +#include +#include +#include #include +#include #include #include +#include +#include +#include #include +#include #include +#include +#include #include +#include +#include +#include #include #include -#include +#include #include -#include + +#include +#include +#include #include +#include +#include +#include +#include #include +#include +#include +#include +#include #include #include diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index f14fce4321..948a47f0ac 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -17,11 +17,23 @@ */ //============================================================================== -#include -#include -#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index c5d3102bfa..3af0345c4e 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include - #include +#include +#include #include #include #include @@ -29,12 +29,16 @@ #include #include #include -#include #include #include #include #include -#include +#include +#include + +#include +#include +#include namespace ripple { namespace detail { diff --git a/src/libxrpl/protocol/STVector256.cpp b/src/libxrpl/protocol/STVector256.cpp index 6f70a3849c..50b022d294 100644 --- a/src/libxrpl/protocol/STVector256.cpp +++ b/src/libxrpl/protocol/STVector256.cpp @@ -17,10 +17,19 @@ */ //============================================================================== -#include -#include +#include +#include +#include +#include +#include +#include #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STXChainBridge.cpp b/src/libxrpl/protocol/STXChainBridge.cpp index 2347e63379..1499d790cb 100644 --- a/src/libxrpl/protocol/STXChainBridge.cpp +++ b/src/libxrpl/protocol/STXChainBridge.cpp @@ -17,21 +17,24 @@ */ //============================================================================== -#include - -#include +#include +#include +#include #include -#include #include #include +#include #include #include #include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/SecretKey.cpp b/src/libxrpl/protocol/SecretKey.cpp index 474c37ac80..06b1061c1e 100644 --- a/src/libxrpl/protocol/SecretKey.cpp +++ b/src/libxrpl/protocol/SecretKey.cpp @@ -17,16 +17,34 @@ */ //============================================================================== +#include +#include +#include #include #include #include #include #include +#include +#include #include +#include #include #include -#include +#include + +#include + #include +#include + +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Seed.cpp b/src/libxrpl/protocol/Seed.cpp index 453b4593bf..095c09e7c0 100644 --- a/src/libxrpl/protocol/Seed.cpp +++ b/src/libxrpl/protocol/Seed.cpp @@ -17,7 +17,9 @@ */ //============================================================================== -#include +#include +#include +#include #include #include #include @@ -28,9 +30,14 @@ #include #include #include +#include + #include +#include +#include #include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index f46104f638..339e25db1d 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -17,11 +17,24 @@ */ //============================================================================== -#include +#include +#include +#include #include +#include +#include +#include #include #include + +#include + +#include +#include #include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/Sign.cpp b/src/libxrpl/protocol/Sign.cpp index 32645c3762..27c2b0435c 100644 --- a/src/libxrpl/protocol/Sign.cpp +++ b/src/libxrpl/protocol/Sign.cpp @@ -17,6 +17,15 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index dc0bdb4a59..3766f33c54 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -18,8 +18,14 @@ //============================================================================== #include + #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/TxFormats.cpp b/src/libxrpl/protocol/TxFormats.cpp index 76b1ae8ad4..b2dd3a656f 100644 --- a/src/libxrpl/protocol/TxFormats.cpp +++ b/src/libxrpl/protocol/TxFormats.cpp @@ -17,12 +17,13 @@ */ //============================================================================== -#include - #include #include +#include #include +#include + namespace ripple { TxFormats::TxFormats() diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index dad67c1334..d9a9f0db87 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -17,11 +17,24 @@ */ //============================================================================== -#include +#include +#include #include -#include +#include +#include +#include #include +#include +#include +#include +#include +#include #include + +#include + +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/UintTypes.cpp b/src/libxrpl/protocol/UintTypes.cpp index c57bcc153a..dadfccfa9f 100644 --- a/src/libxrpl/protocol/UintTypes.cpp +++ b/src/libxrpl/protocol/UintTypes.cpp @@ -17,10 +17,14 @@ */ //============================================================================== +#include #include -#include #include #include + +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/XChainAttestations.cpp b/src/libxrpl/protocol/XChainAttestations.cpp index 82e7344569..e61224b570 100644 --- a/src/libxrpl/protocol/XChainAttestations.cpp +++ b/src/libxrpl/protocol/XChainAttestations.cpp @@ -17,26 +17,29 @@ */ //============================================================================== -#include - -#include -#include -#include +#include +#include +#include +#include #include -#include #include #include #include #include #include #include +#include #include #include #include #include -#include +#include #include +#include +#include +#include +#include namespace ripple { namespace Attestations { diff --git a/src/libxrpl/protocol/digest.cpp b/src/libxrpl/protocol/digest.cpp index 237e7aa49f..2626ec0968 100644 --- a/src/libxrpl/protocol/digest.cpp +++ b/src/libxrpl/protocol/digest.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include -#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/tokens.cpp b/src/libxrpl/protocol/tokens.cpp index 49ec926a77..a822b1937f 100644 --- a/src/libxrpl/protocol/tokens.cpp +++ b/src/libxrpl/protocol/tokens.cpp @@ -25,21 +25,25 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php. */ -#include - +#include #include #include #include +#include #include +#include #include -#include #include +#include +#include +#include #include -#include +#include +#include +#include #include -#include #include /* diff --git a/src/libxrpl/resource/Charge.cpp b/src/libxrpl/resource/Charge.cpp index 53df4e592d..8c96e3696f 100644 --- a/src/libxrpl/resource/Charge.cpp +++ b/src/libxrpl/resource/Charge.cpp @@ -18,7 +18,11 @@ //============================================================================== #include + +#include +#include #include +#include namespace ripple { namespace Resource { diff --git a/src/libxrpl/resource/Consumer.cpp b/src/libxrpl/resource/Consumer.cpp index 6f0d6dcc49..71a84340cd 100644 --- a/src/libxrpl/resource/Consumer.cpp +++ b/src/libxrpl/resource/Consumer.cpp @@ -17,11 +17,18 @@ */ //============================================================================== +#include +#include #include +#include #include +#include #include #include +#include +#include + namespace ripple { namespace Resource { diff --git a/src/libxrpl/resource/Fees.cpp b/src/libxrpl/resource/Fees.cpp index 17fb475394..6d81cbbd25 100644 --- a/src/libxrpl/resource/Fees.cpp +++ b/src/libxrpl/resource/Fees.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include namespace ripple { diff --git a/src/libxrpl/resource/ResourceManager.cpp b/src/libxrpl/resource/ResourceManager.cpp index d73ca09002..08e0bcd408 100644 --- a/src/libxrpl/resource/ResourceManager.cpp +++ b/src/libxrpl/resource/ResourceManager.cpp @@ -17,18 +17,29 @@ */ //============================================================================== -#include #include #include +#include #include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include + +#include +#include + +#include #include #include #include +#include +#include +#include namespace ripple { namespace Resource { diff --git a/src/libxrpl/server/JSONRPCUtil.cpp b/src/libxrpl/server/JSONRPCUtil.cpp index ce173b1e9e..69adb235ee 100644 --- a/src/libxrpl/server/JSONRPCUtil.cpp +++ b/src/libxrpl/server/JSONRPCUtil.cpp @@ -18,12 +18,14 @@ //============================================================================== #include -#include +#include +#include #include #include -#include #include -#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/server/Port.cpp b/src/libxrpl/server/Port.cpp index 9c1f16cda0..95709fc298 100644 --- a/src/libxrpl/server/Port.cpp +++ b/src/libxrpl/server/Port.cpp @@ -17,13 +17,27 @@ */ //============================================================================== +#include +#include #include #include +#include #include #include + #include #include +#include +#include +#include +#include + +#include +#include +#include #include +#include +#include namespace ripple { diff --git a/src/test/app/AMMCalc_test.cpp b/src/test/app/AMMCalc_test.cpp index 058cdfd1d2..bebf2844b6 100644 --- a/src/test/app/AMMCalc_test.cpp +++ b/src/test/app/AMMCalc_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/AMMClawback_test.cpp b/src/test/app/AMMClawback_test.cpp index c547a537bf..878c570a12 100644 --- a/src/test/app/AMMClawback_test.cpp +++ b/src/test/app/AMMClawback_test.cpp @@ -14,16 +14,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include -#include -#include -#include + #include -#include + #include + namespace ripple { namespace test { class AMMClawback_test : public jtx::AMMTest diff --git a/src/test/app/AMMExtended_test.cpp b/src/test/app/AMMExtended_test.cpp index 96053b93b4..ed9fa0f1f8 100644 --- a/src/test/app/AMMExtended_test.cpp +++ b/src/test/app/AMMExtended_test.cpp @@ -16,27 +16,24 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include #include -#include + #include #include #include #include #include #include -#include -#include -#include + #include #include -#include -#include #include #include diff --git a/src/test/app/AMM_test.cpp b/src/test/app/AMM_test.cpp index f1e81132c5..9eee2b8805 100644 --- a/src/test/app/AMM_test.cpp +++ b/src/test/app/AMM_test.cpp @@ -16,30 +16,26 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include + #include #include -#include -#include #include -#include -#include + #include #include #include -#include -#include - -#include -#include -#include #include +#include +#include + namespace ripple { namespace test { diff --git a/src/test/app/AccountDelete_test.cpp b/src/test/app/AccountDelete_test.cpp index f8d3cf4692..c903f95f77 100644 --- a/src/test/app/AccountDelete_test.cpp +++ b/src/test/app/AccountDelete_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/AccountTxPaging_test.cpp b/src/test/app/AccountTxPaging_test.cpp index 680e006a74..46a56f58e3 100644 --- a/src/test/app/AccountTxPaging_test.cpp +++ b/src/test/app/AccountTxPaging_test.cpp @@ -16,15 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include -#include -#include -#include -#include +#include #include -#include -#include + +#include +#include + +#include namespace ripple { diff --git a/src/test/app/AmendmentTable_test.cpp b/src/test/app/AmendmentTable_test.cpp index 2f95fc0280..5ba820da95 100644 --- a/src/test/app/AmendmentTable_test.cpp +++ b/src/test/app/AmendmentTable_test.cpp @@ -19,8 +19,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/test/app/Check_test.cpp b/src/test/app/Check_test.cpp index 2c4f44ce79..d27df46468 100644 --- a/src/test/app/Check_test.cpp +++ b/src/test/app/Check_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/Clawback_test.cpp b/src/test/app/Clawback_test.cpp index c000433d2a..d41f6de556 100644 --- a/src/test/app/Clawback_test.cpp +++ b/src/test/app/Clawback_test.cpp @@ -19,12 +19,8 @@ #include #include -#include -#include -#include + #include -#include -#include namespace ripple { diff --git a/src/test/app/Credentials_test.cpp b/src/test/app/Credentials_test.cpp index 481850562f..24e656672d 100644 --- a/src/test/app/Credentials_test.cpp +++ b/src/test/app/Credentials_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include @@ -27,7 +29,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/app/CrossingLimits_test.cpp b/src/test/app/CrossingLimits_test.cpp index 6f6a7eb3e7..1e19a178c2 100644 --- a/src/test/app/CrossingLimits_test.cpp +++ b/src/test/app/CrossingLimits_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/DID_test.cpp b/src/test/app/DID_test.cpp index 3f9cce1d33..3a2ed260c6 100644 --- a/src/test/app/DID_test.cpp +++ b/src/test/app/DID_test.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include + #include #include -#include -#include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/DNS_test.cpp b/src/test/app/DNS_test.cpp index 7a39c5f079..7e209deb1c 100644 --- a/src/test/app/DNS_test.cpp +++ b/src/test/app/DNS_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/DeliverMin_test.cpp b/src/test/app/DeliverMin_test.cpp index 3c62a47a4a..3c5fd43c18 100644 --- a/src/test/app/DeliverMin_test.cpp +++ b/src/test/app/DeliverMin_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/DepositAuth_test.cpp b/src/test/app/DepositAuth_test.cpp index 463c606dc6..9e04c5e496 100644 --- a/src/test/app/DepositAuth_test.cpp +++ b/src/test/app/DepositAuth_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/Discrepancy_test.cpp b/src/test/app/Discrepancy_test.cpp index 1eaa1ad86d..8e306282a7 100644 --- a/src/test/app/Discrepancy_test.cpp +++ b/src/test/app/Discrepancy_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 123b654835..1f872d2bdc 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index a49dbb0bca..73bb539a22 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include namespace ripple { diff --git a/src/test/app/FixNFTokenPageLinks_test.cpp b/src/test/app/FixNFTokenPageLinks_test.cpp index f8db4df4f9..f87d70aacf 100644 --- a/src/test/app/FixNFTokenPageLinks_test.cpp +++ b/src/test/app/FixNFTokenPageLinks_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include diff --git a/src/test/app/Flow_test.cpp b/src/test/app/Flow_test.cpp index 4d1397eab8..aa7e819e07 100644 --- a/src/test/app/Flow_test.cpp +++ b/src/test/app/Flow_test.cpp @@ -19,15 +19,15 @@ #include #include + #include #include #include -#include #include #include + #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/Freeze_test.cpp b/src/test/app/Freeze_test.cpp index 99696c11f6..36578cbc6b 100644 --- a/src/test/app/Freeze_test.cpp +++ b/src/test/app/Freeze_test.cpp @@ -16,8 +16,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include #include diff --git a/src/test/app/HashRouter_test.cpp b/src/test/app/HashRouter_test.cpp index 1234bc5b9c..d8d7ca6851 100644 --- a/src/test/app/HashRouter_test.cpp +++ b/src/test/app/HashRouter_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/LedgerHistory_test.cpp b/src/test/app/LedgerHistory_test.cpp index e1a837a9cb..7b1910bd4d 100644 --- a/src/test/app/LedgerHistory_test.cpp +++ b/src/test/app/LedgerHistory_test.cpp @@ -19,14 +19,16 @@ #include #include + #include #include #include #include + #include #include + #include -#include #include namespace ripple { diff --git a/src/test/app/LedgerLoad_test.cpp b/src/test/app/LedgerLoad_test.cpp index 5b6df353d8..c151bc7b4a 100644 --- a/src/test/app/LedgerLoad_test.cpp +++ b/src/test/app/LedgerLoad_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include @@ -28,6 +29,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/app/LedgerMaster_test.cpp b/src/test/app/LedgerMaster_test.cpp index d53d27b318..a5517cccee 100644 --- a/src/test/app/LedgerMaster_test.cpp +++ b/src/test/app/LedgerMaster_test.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/LedgerReplay_test.cpp b/src/test/app/LedgerReplay_test.cpp index 883aca7bce..15f51889bb 100644 --- a/src/test/app/LedgerReplay_test.cpp +++ b/src/test/app/LedgerReplay_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include @@ -29,6 +30,7 @@ #include #include #include + #include #include diff --git a/src/test/app/LoadFeeTrack_test.cpp b/src/test/app/LoadFeeTrack_test.cpp index fa7489bf1b..9b0cf2fa2d 100644 --- a/src/test/app/LoadFeeTrack_test.cpp +++ b/src/test/app/LoadFeeTrack_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/app/MPToken_test.cpp b/src/test/app/MPToken_test.cpp index 9fd4927d5e..31e5368691 100644 --- a/src/test/app/MPToken_test.cpp +++ b/src/test/app/MPToken_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/test/app/Manifest_test.cpp b/src/test/app/Manifest_test.cpp index 0e25300417..deaa2adbad 100644 --- a/src/test/app/Manifest_test.cpp +++ b/src/test/app/Manifest_test.cpp @@ -18,16 +18,18 @@ //============================================================================== #include + #include #include #include #include -#include + #include #include #include #include #include + #include #include #include diff --git a/src/test/app/MultiSign_test.cpp b/src/test/app/MultiSign_test.cpp index 9648bed886..ecac8ac67b 100644 --- a/src/test/app/MultiSign_test.cpp +++ b/src/test/app/MultiSign_test.cpp @@ -16,7 +16,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/NFTokenBurn_test.cpp b/src/test/app/NFTokenBurn_test.cpp index a56f0a4567..a970b11789 100644 --- a/src/test/app/NFTokenBurn_test.cpp +++ b/src/test/app/NFTokenBurn_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/NFTokenDir_test.cpp b/src/test/app/NFTokenDir_test.cpp index 23e4c67152..fe21e02739 100644 --- a/src/test/app/NFTokenDir_test.cpp +++ b/src/test/app/NFTokenDir_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include diff --git a/src/test/app/NFToken_test.cpp b/src/test/app/NFToken_test.cpp index ec1ee5111e..62a7b00da9 100644 --- a/src/test/app/NFToken_test.cpp +++ b/src/test/app/NFToken_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include diff --git a/src/test/app/NetworkID_test.cpp b/src/test/app/NetworkID_test.cpp index 2f02a1fd7d..07a4641c0e 100644 --- a/src/test/app/NetworkID_test.cpp +++ b/src/test/app/NetworkID_test.cpp @@ -19,8 +19,7 @@ #include #include -#include -#include + #include namespace ripple { diff --git a/src/test/app/OfferStream_test.cpp b/src/test/app/OfferStream_test.cpp index bf71250368..691d327cd8 100644 --- a/src/test/app/OfferStream_test.cpp +++ b/src/test/app/OfferStream_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/app/Offer_test.cpp b/src/test/app/Offer_test.cpp index 2b4245a1ae..8ba4113341 100644 --- a/src/test/app/Offer_test.cpp +++ b/src/test/app/Offer_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/test/app/Oracle_test.cpp b/src/test/app/Oracle_test.cpp index 44eeb1c9f9..291349309a 100644 --- a/src/test/app/Oracle_test.cpp +++ b/src/test/app/Oracle_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/app/OversizeMeta_test.cpp b/src/test/app/OversizeMeta_test.cpp index 0a7f42e180..f6e4466bab 100644 --- a/src/test/app/OversizeMeta_test.cpp +++ b/src/test/app/OversizeMeta_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/Path_test.cpp b/src/test/app/Path_test.cpp index 1db15388ff..b500014578 100644 --- a/src/test/app/Path_test.cpp +++ b/src/test/app/Path_test.cpp @@ -19,24 +19,22 @@ #include #include + #include #include #include #include #include #include -#include + #include #include -#include #include #include #include #include -#include -#include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PayChan_test.cpp b/src/test/app/PayChan_test.cpp index bc1cbba69c..dc839f89ec 100644 --- a/src/test/app/PayChan_test.cpp +++ b/src/test/app/PayChan_test.cpp @@ -18,15 +18,16 @@ //============================================================================== #include + #include #include + #include #include #include #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PayStrand_test.cpp b/src/test/app/PayStrand_test.cpp index f00a736129..4d743d9d7c 100644 --- a/src/test/app/PayStrand_test.cpp +++ b/src/test/app/PayStrand_test.cpp @@ -17,18 +17,16 @@ #include #include + #include -#include #include #include #include -#include #include -#include + #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PermissionedDomains_test.cpp b/src/test/app/PermissionedDomains_test.cpp index 7d78652b28..65f75897ae 100644 --- a/src/test/app/PermissionedDomains_test.cpp +++ b/src/test/app/PermissionedDomains_test.cpp @@ -18,12 +18,10 @@ //============================================================================== #include + #include -#include -#include -#include + #include -#include #include #include diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 55622e4923..1101f56c69 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -16,9 +16,11 @@ //============================================================================== #include + #include + #include -#include + #include #include diff --git a/src/test/app/RCLCensorshipDetector_test.cpp b/src/test/app/RCLCensorshipDetector_test.cpp index b5440b9090..85ba0ab78d 100644 --- a/src/test/app/RCLCensorshipDetector_test.cpp +++ b/src/test/app/RCLCensorshipDetector_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/RCLValidations_test.cpp b/src/test/app/RCLValidations_test.cpp index 540d98bc1f..31c38f23b1 100644 --- a/src/test/app/RCLValidations_test.cpp +++ b/src/test/app/RCLValidations_test.cpp @@ -18,11 +18,10 @@ //============================================================================== #include + #include #include -#include -#include -#include + #include #include diff --git a/src/test/app/ReducedOffer_test.cpp b/src/test/app/ReducedOffer_test.cpp index a070051e43..5af06d594d 100644 --- a/src/test/app/ReducedOffer_test.cpp +++ b/src/test/app/ReducedOffer_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/app/Regression_test.cpp b/src/test/app/Regression_test.cpp index ec52d603eb..ca8dcdf5e2 100644 --- a/src/test/app/Regression_test.cpp +++ b/src/test/app/Regression_test.cpp @@ -18,12 +18,13 @@ #include #include #include + #include #include + #include #include #include -#include #include #include diff --git a/src/test/app/SHAMapStore_test.cpp b/src/test/app/SHAMapStore_test.cpp index 5fd3f79c9f..d3b5917434 100644 --- a/src/test/app/SHAMapStore_test.cpp +++ b/src/test/app/SHAMapStore_test.cpp @@ -19,12 +19,14 @@ #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/src/test/app/SetAuth_test.cpp b/src/test/app/SetAuth_test.cpp index 3dd8ab590a..c531de2d75 100644 --- a/src/test/app/SetAuth_test.cpp +++ b/src/test/app/SetAuth_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/SetRegularKey_test.cpp b/src/test/app/SetRegularKey_test.cpp index 024d8de137..6a3a5ff2a9 100644 --- a/src/test/app/SetRegularKey_test.cpp +++ b/src/test/app/SetRegularKey_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/test/app/SetTrust_test.cpp b/src/test/app/SetTrust_test.cpp index 57e18d712f..c99a1dafa1 100644 --- a/src/test/app/SetTrust_test.cpp +++ b/src/test/app/SetTrust_test.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include diff --git a/src/test/app/Taker_test.cpp b/src/test/app/Taker_test.cpp index 89e44b2b98..3b3f338625 100644 --- a/src/test/app/Taker_test.cpp +++ b/src/test/app/Taker_test.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include + #include -#include namespace ripple { diff --git a/src/test/app/TheoreticalQuality_test.cpp b/src/test/app/TheoreticalQuality_test.cpp index 917d23377b..0269d206cc 100644 --- a/src/test/app/TheoreticalQuality_test.cpp +++ b/src/test/app/TheoreticalQuality_test.cpp @@ -19,14 +19,13 @@ #include #include + #include #include #include #include -#include -#include #include -#include + #include #include #include diff --git a/src/test/app/Ticket_test.cpp b/src/test/app/Ticket_test.cpp index 9467390502..dd83e3036e 100644 --- a/src/test/app/Ticket_test.cpp +++ b/src/test/app/Ticket_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/Transaction_ordering_test.cpp b/src/test/app/Transaction_ordering_test.cpp index 928fcdb838..472d4e2ab8 100644 --- a/src/test/app/Transaction_ordering_test.cpp +++ b/src/test/app/Transaction_ordering_test.cpp @@ -16,8 +16,8 @@ //============================================================================== #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/TrustAndBalance_test.cpp b/src/test/app/TrustAndBalance_test.cpp index b438d79727..037a7e0d89 100644 --- a/src/test/app/TrustAndBalance_test.cpp +++ b/src/test/app/TrustAndBalance_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/test/app/TxQ_test.cpp b/src/test/app/TxQ_test.cpp index 5201cb601e..2bedee17ca 100644 --- a/src/test/app/TxQ_test.cpp +++ b/src/test/app/TxQ_test.cpp @@ -22,11 +22,12 @@ #include #include #include + #include #include #include #include -#include + #include #include #include diff --git a/src/test/app/ValidatorKeys_test.cpp b/src/test/app/ValidatorKeys_test.cpp index 9281ec4bd7..7c8584698e 100644 --- a/src/test/app/ValidatorKeys_test.cpp +++ b/src/test/app/ValidatorKeys_test.cpp @@ -18,10 +18,12 @@ //============================================================================== #include + #include #include #include #include + #include #include diff --git a/src/test/app/ValidatorList_test.cpp b/src/test/app/ValidatorList_test.cpp index 465723b1a7..819340bfa4 100644 --- a/src/test/app/ValidatorList_test.cpp +++ b/src/test/app/ValidatorList_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/app/ValidatorSite_test.cpp b/src/test/app/ValidatorSite_test.cpp index 1ec302efef..f7db0463c1 100644 --- a/src/test/app/ValidatorSite_test.cpp +++ b/src/test/app/ValidatorSite_test.cpp @@ -20,23 +20,22 @@ #include #include #include + #include -#include -#include + #include -#include #include -#include -#include -#include #include + #include #include #include #include -#include + #include +#include + namespace ripple { namespace test { namespace detail { diff --git a/src/test/app/XChain_test.cpp b/src/test/app/XChain_test.cpp index 3d25e9e989..777cd5a68f 100644 --- a/src/test/app/XChain_test.cpp +++ b/src/test/app/XChain_test.cpp @@ -17,6 +17,12 @@ */ //============================================================================== +#include +#include +#include +#include +#include + #include #include #include @@ -27,12 +33,6 @@ #include #include -#include -#include -#include -#include -#include - #include #include #include @@ -42,9 +42,6 @@ #include #include -#include -#include - namespace ripple::test { // SEnv class - encapsulate jtx::Env to make it more user-friendly, diff --git a/src/test/app/tx/apply_test.cpp b/src/test/app/tx/apply_test.cpp index df76e839a7..63fecde65f 100644 --- a/src/test/app/tx/apply_test.cpp +++ b/src/test/app/tx/apply_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/basics/Buffer_test.cpp b/src/test/basics/Buffer_test.cpp index da8bcc8f12..43ca048d7f 100644 --- a/src/test/basics/Buffer_test.cpp +++ b/src/test/basics/Buffer_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/basics/Expected_test.cpp b/src/test/basics/Expected_test.cpp index 2f8b92eb91..d022d07461 100644 --- a/src/test/basics/Expected_test.cpp +++ b/src/test/basics/Expected_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #if BOOST_VERSION >= 107500 #include // Not part of boost before version 1.75 #endif // BOOST_VERSION diff --git a/src/test/basics/FeeUnits_test.cpp b/src/test/basics/FeeUnits_test.cpp index c32f98f192..6266288896 100644 --- a/src/test/basics/FeeUnits_test.cpp +++ b/src/test/basics/FeeUnits_test.cpp @@ -19,7 +19,6 @@ #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/basics/FileUtilities_test.cpp b/src/test/basics/FileUtilities_test.cpp index 2b84998da7..b78173f35f 100644 --- a/src/test/basics/FileUtilities_test.cpp +++ b/src/test/basics/FileUtilities_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/basics/KeyCache_test.cpp b/src/test/basics/KeyCache_test.cpp index eab0e87d0a..d39fd4a716 100644 --- a/src/test/basics/KeyCache_test.cpp +++ b/src/test/basics/KeyCache_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include #include #include -#include #include namespace ripple { diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index 8a0a6702a6..13d8b259d1 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/test/basics/PerfLog_test.cpp b/src/test/basics/PerfLog_test.cpp index 756988cbda..7ec62a1701 100644 --- a/src/test/basics/PerfLog_test.cpp +++ b/src/test/basics/PerfLog_test.cpp @@ -19,8 +19,10 @@ #include #include + #include #include + #include #include #include @@ -30,7 +32,6 @@ #include #include #include -#include #include #include diff --git a/src/test/basics/Slice_test.cpp b/src/test/basics/Slice_test.cpp index a169de9853..3d474def79 100644 --- a/src/test/basics/Slice_test.cpp +++ b/src/test/basics/Slice_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/basics/TaggedCache_test.cpp b/src/test/basics/TaggedCache_test.cpp index 6fbba1a479..519bc235cd 100644 --- a/src/test/basics/TaggedCache_test.cpp +++ b/src/test/basics/TaggedCache_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/basics/base_uint_test.cpp b/src/test/basics/base_uint_test.cpp index 9f3194f4fb..8058e0d6f0 100644 --- a/src/test/basics/base_uint_test.cpp +++ b/src/test/basics/base_uint_test.cpp @@ -21,9 +21,10 @@ #include #include #include -#include -#include +#include + +#include #include namespace ripple { diff --git a/src/test/basics/contract_test.cpp b/src/test/basics/contract_test.cpp index 99f118794e..9595dbabcc 100644 --- a/src/test/basics/contract_test.cpp +++ b/src/test/basics/contract_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/basics/hardened_hash_test.cpp b/src/test/basics/hardened_hash_test.cpp index 343894e52b..248e807035 100644 --- a/src/test/basics/hardened_hash_test.cpp +++ b/src/test/basics/hardened_hash_test.cpp @@ -19,10 +19,9 @@ #include #include -#include + #include #include -#include #include #include #include diff --git a/src/test/basics/tagged_integer_test.cpp b/src/test/basics/tagged_integer_test.cpp index 22cdc5ad53..cb15d246a6 100644 --- a/src/test/basics/tagged_integer_test.cpp +++ b/src/test/basics/tagged_integer_test.cpp @@ -20,6 +20,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/beast/IPEndpoint_test.cpp b/src/test/beast/IPEndpoint_test.cpp index 1ad49443dc..7b3eba55f1 100644 --- a/src/test/beast/IPEndpoint_test.cpp +++ b/src/test/beast/IPEndpoint_test.cpp @@ -21,13 +21,14 @@ // ../impl/IPAddressV6.cpp #include + #include #include #include + #include #include #include -#include namespace beast { namespace IP { diff --git a/src/test/beast/SemanticVersion_test.cpp b/src/test/beast/SemanticVersion_test.cpp index 2f24a0c892..fb7a3e3e4f 100644 --- a/src/test/beast/SemanticVersion_test.cpp +++ b/src/test/beast/SemanticVersion_test.cpp @@ -16,8 +16,10 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + namespace beast { class SemanticVersion_test : public unit_test::suite @@ -279,4 +281,4 @@ public: }; BEAST_DEFINE_TESTSUITE(SemanticVersion, beast_core, beast); -} // namespace beast \ No newline at end of file +} // namespace beast diff --git a/src/test/beast/aged_associative_container_test.cpp b/src/test/beast/aged_associative_container_test.cpp index e5736764e0..f88d5acc27 100644 --- a/src/test/beast/aged_associative_container_test.cpp +++ b/src/test/beast/aged_associative_container_test.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include - #include #include #include @@ -28,6 +26,7 @@ #include #include #include +#include #include #include diff --git a/src/test/beast/beast_CurrentThreadName_test.cpp b/src/test/beast/beast_CurrentThreadName_test.cpp index 653b0a8961..839aaaef0a 100644 --- a/src/test/beast/beast_CurrentThreadName_test.cpp +++ b/src/test/beast/beast_CurrentThreadName_test.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/test/beast/beast_PropertyStream_test.cpp b/src/test/beast/beast_PropertyStream_test.cpp index e91f527d3c..bbbc2fc0e0 100644 --- a/src/test/beast/beast_PropertyStream_test.cpp +++ b/src/test/beast/beast_PropertyStream_test.cpp @@ -16,8 +16,10 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + namespace beast { class PropertyStream_test : public unit_test::suite @@ -237,4 +239,4 @@ public: }; BEAST_DEFINE_TESTSUITE(PropertyStream, utility, beast); -} // namespace beast \ No newline at end of file +} // namespace beast diff --git a/src/test/beast/beast_Zero_test.cpp b/src/test/beast/beast_Zero_test.cpp index 8fd16a4d51..9a645334ab 100644 --- a/src/test/beast/beast_Zero_test.cpp +++ b/src/test/beast/beast_Zero_test.cpp @@ -17,9 +17,8 @@ */ //============================================================================== -#include - #include +#include namespace beast { diff --git a/src/test/beast/beast_abstract_clock_test.cpp b/src/test/beast/beast_abstract_clock_test.cpp index a026df2637..b86afdb139 100644 --- a/src/test/beast/beast_abstract_clock_test.cpp +++ b/src/test/beast/beast_abstract_clock_test.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/test/beast/beast_basic_seconds_clock_test.cpp b/src/test/beast/beast_basic_seconds_clock_test.cpp index f3926634dc..c769cde07a 100644 --- a/src/test/beast/beast_basic_seconds_clock_test.cpp +++ b/src/test/beast/beast_basic_seconds_clock_test.cpp @@ -17,9 +17,8 @@ */ //============================================================================== -#include - #include +#include namespace beast { diff --git a/src/test/beast/beast_io_latency_probe_test.cpp b/src/test/beast/beast_io_latency_probe_test.cpp index 9622819430..de3c5d1d20 100644 --- a/src/test/beast/beast_io_latency_probe_test.cpp +++ b/src/test/beast/beast_io_latency_probe_test.cpp @@ -16,21 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include -#include +#include #include +#include #include #include #include #include -#include #include #include #include -#include #include using namespace std::chrono_literals; diff --git a/src/test/beast/define_print.cpp b/src/test/beast/define_print.cpp index 0d36cd7698..ec86d5d7d7 100644 --- a/src/test/beast/define_print.cpp +++ b/src/test/beast/define_print.cpp @@ -8,6 +8,7 @@ #include #include #include + #include // Include this .cpp in your project to gain access to the printing suite diff --git a/src/test/conditions/PreimageSha256_test.cpp b/src/test/conditions/PreimageSha256_test.cpp index 9a6840b11c..820b005a3f 100644 --- a/src/test/conditions/PreimageSha256_test.cpp +++ b/src/test/conditions/PreimageSha256_test.cpp @@ -20,11 +20,13 @@ #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/test/consensus/ByzantineFailureSim_test.cpp b/src/test/consensus/ByzantineFailureSim_test.cpp index 92dbfc0174..b979943477 100644 --- a/src/test/consensus/ByzantineFailureSim_test.cpp +++ b/src/test/consensus/ByzantineFailureSim_test.cpp @@ -16,9 +16,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include + #include + #include namespace ripple { diff --git a/src/test/consensus/Consensus_test.cpp b/src/test/consensus/Consensus_test.cpp index 88280994c1..db56ab58c6 100644 --- a/src/test/consensus/Consensus_test.cpp +++ b/src/test/consensus/Consensus_test.cpp @@ -16,13 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include -#include -#include + #include -#include +#include namespace ripple { namespace test { @@ -40,6 +41,7 @@ public: testShouldCloseLedger() { using namespace std::chrono_literals; + testcase("should close ledger"); // Use default parameters ConsensusParms const p{}; @@ -78,46 +80,102 @@ public: testCheckConsensus() { using namespace std::chrono_literals; + testcase("check consensus"); // Use default parameterss ConsensusParms const p{}; + /////////////// + // Disputes still in doubt + // // Not enough time has elapsed BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 2, 0, 3s, 2s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 2s, false, p, true, journal_)); // If not enough peers have propsed, ensure // more time for proposals BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 2, 0, 3s, 4s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 4s, false, p, true, journal_)); // Enough time has elapsed and we all agree BEAST_EXPECT( ConsensusState::Yes == - checkConsensus(10, 2, 2, 0, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 10s, false, p, true, journal_)); // Enough time has elapsed and we don't yet agree BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 1, 0, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 1, 0, 3s, 10s, false, p, true, journal_)); // Our peers have moved on // Enough time has elapsed and we all agree BEAST_EXPECT( ConsensusState::MovedOn == - checkConsensus(10, 2, 1, 8, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 1, 8, 3s, 10s, false, p, true, journal_)); // If no peers, don't agree until time has passed. BEAST_EXPECT( ConsensusState::No == - checkConsensus(0, 0, 0, 0, 3s, 10s, p, true, journal_)); + checkConsensus(0, 0, 0, 0, 3s, 10s, false, p, true, journal_)); // Agree if no peers and enough time has passed. BEAST_EXPECT( ConsensusState::Yes == - checkConsensus(0, 0, 0, 0, 3s, 16s, p, true, journal_)); + checkConsensus(0, 0, 0, 0, 3s, 16s, false, p, true, journal_)); + + // Expire if too much time has passed without agreement + BEAST_EXPECT( + ConsensusState::Expired == + checkConsensus(10, 8, 1, 0, 1s, 19s, false, p, true, journal_)); + + /////////////// + // Stalled + // + // Not enough time has elapsed + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(10, 2, 2, 0, 3s, 2s, true, p, true, journal_)); + + // If not enough peers have propsed, ensure + // more time for proposals + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(10, 2, 2, 0, 3s, 4s, true, p, true, journal_)); + + // Enough time has elapsed and we all agree + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 2, 0, 3s, 10s, true, p, true, journal_)); + + // Enough time has elapsed and we don't yet agree, but there's nothing + // left to dispute + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 1, 0, 3s, 10s, true, p, true, journal_)); + + // Our peers have moved on + // Enough time has elapsed and we all agree, nothing left to dispute + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 1, 8, 3s, 10s, true, p, true, journal_)); + + // If no peers, don't agree until time has passed. + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(0, 0, 0, 0, 3s, 10s, true, p, true, journal_)); + + // Agree if no peers and enough time has passed. + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(0, 0, 0, 0, 3s, 16s, true, p, true, journal_)); + + // We are done if there's nothing left to dispute, no matter how much + // time has passed + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 8, 1, 0, 1s, 19s, true, p, true, journal_)); } void @@ -125,6 +183,7 @@ public: { using namespace std::chrono_literals; using namespace csf; + testcase("standalone"); Sim s; PeerGroup peers = s.createGroup(1); @@ -149,6 +208,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("peers agree"); ConsensusParms const parms{}; Sim sim; @@ -186,6 +246,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("slow peers"); // Several tests of a complete trust graph with a subset of peers // that have significantly longer network delays to the rest of the @@ -351,6 +412,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("close time disagree"); // This is a very specialized test to get ledgers to disagree on // the close time. It unfortunately assumes knowledge about current @@ -417,6 +479,8 @@ public: { using namespace csf; using namespace std::chrono; + testcase("wrong LCL"); + // Specialized test to exercise a temporary fork in which some peers // are working on an incorrect prior ledger. @@ -589,6 +653,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("consensus close time rounding"); // This is a specialized test engineered to yield ledgers with different // close times even though the peers believe they had close time @@ -604,9 +669,6 @@ public: PeerGroup fast = sim.createGroup(4); PeerGroup network = fast + slow; - for (Peer* peer : network) - peer->consensusParms = parms; - // Connected trust graph network.trust(network); @@ -692,6 +754,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("fork"); std::uint32_t numPeers = 10; // Vary overlap between two UNLs @@ -748,6 +811,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("hub network"); // Simulate a set of 5 validators that aren't directly connected but // rely on a single hub node for communication @@ -835,6 +899,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("preferred by branch"); // Simulate network splits that are prevented from forking when using // preferred ledger by trie. This is a contrived example that involves @@ -967,6 +1032,7 @@ public: { using namespace csf; using namespace std::chrono; + testcase("pause for laggards"); // Test that validators that jump ahead of the network slow // down. @@ -1052,6 +1118,302 @@ public: BEAST_EXPECT(sim.synchronized()); } + void + testDisputes() + { + testcase("disputes"); + + using namespace csf; + + // Test dispute objects directly + using Dispute = DisputedTx; + + Tx const txTrue{99}; + Tx const txFalse{98}; + Tx const txFollowingTrue{97}; + Tx const txFollowingFalse{96}; + int const numPeers = 100; + ConsensusParms p; + std::size_t peersUnchanged = 0; + + // Three cases: + // 1 proposing, initial vote yes + // 2 proposing, initial vote no + // 3 not proposing, initial vote doesn't matter after the first update, + // use yes + { + Dispute proposingTrue{txTrue.id(), true, numPeers, journal_}; + Dispute proposingFalse{txFalse.id(), false, numPeers, journal_}; + Dispute followingTrue{ + txFollowingTrue.id(), true, numPeers, journal_}; + Dispute followingFalse{ + txFollowingFalse.id(), false, numPeers, journal_}; + BEAST_EXPECT(proposingTrue.ID() == 99); + BEAST_EXPECT(proposingFalse.ID() == 98); + BEAST_EXPECT(followingTrue.ID() == 97); + BEAST_EXPECT(followingFalse.ID() == 96); + + // Create an even split in the peer votes + for (int i = 0; i < numPeers; ++i) + { + BEAST_EXPECT(proposingTrue.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(proposingFalse.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(followingTrue.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(followingFalse.setVote(PeerID(i), i < 50)); + } + // Switch the middle vote to match mine + BEAST_EXPECT(proposingTrue.setVote(PeerID(50), true)); + BEAST_EXPECT(proposingFalse.setVote(PeerID(49), false)); + BEAST_EXPECT(followingTrue.setVote(PeerID(50), true)); + BEAST_EXPECT(followingFalse.setVote(PeerID(49), false)); + + // no changes yet + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // I'm in the majority, my vote should not change + BEAST_EXPECT(!proposingTrue.updateVote(5, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(5, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(5, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(5, false, p)); + + BEAST_EXPECT(!proposingTrue.updateVote(10, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(10, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(10, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(10, false, p)); + + peersUnchanged = 2; + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // Right now, the vote is 51%. The requirement is about to jump to + // 65% + BEAST_EXPECT(proposingTrue.updateVote(55, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(55, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(55, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(55, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + // 16 validators change their vote to match my original vote + for (int i = 0; i < 16; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + // The vote should now be 66%, threshold is 65% + BEAST_EXPECT(proposingTrue.updateVote(60, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(60, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(60, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(60, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // Threshold jumps to 70% + BEAST_EXPECT(proposingTrue.updateVote(86, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(86, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(86, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(86, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // 5 more validators change their vote to match my original vote + for (int i = 16; i < 21; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(proposingTrue.updateVote(90, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(90, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(90, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(90, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(!proposingTrue.updateVote(150, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(150, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(150, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(150, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(!proposingTrue.updateVote(190, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(190, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(190, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(190, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + peersUnchanged = 3; + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // Threshold jumps to 95% + BEAST_EXPECT(proposingTrue.updateVote(220, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(220, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(220, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(220, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // 25 more validators change their vote to match my original vote + for (int i = 21; i < 46; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + + // The vote should now be 96%, threshold is 95% + BEAST_EXPECT(proposingTrue.updateVote(250, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(250, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + for (peersUnchanged = 0; peersUnchanged < 6; ++peersUnchanged) + { + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + } + + for (int i = 0; i < 1; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // true vote has changed recently, so not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, 0)); + // remaining votes have been unchanged in so long that we only + // need to hit the second round at 95% to be stalled, regardless + // of peers + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + // true vote has changed recently, so not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + // remaining votes have been unchanged in so long that we only + // need to hit the second round at 95% to be stalled, regardless + // of peers + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + for (int i = 1; i < 3; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // true vote changed 2 rounds ago, and peers are changing, so + // not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, 0)); + // still stalled + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + // true vote changed 2 rounds ago, and peers are NOT changing, + // so stalled + BEAST_EXPECT(proposingTrue.stalled(p, true, peersUnchanged)); + // still stalled + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + for (int i = 3; i < 5; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + BEAST_EXPECT(proposingTrue.stalled(p, true, 0)); + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + BEAST_EXPECT(proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + } + } + void run() override { @@ -1068,6 +1430,7 @@ public: testHubNetwork(); testPreferredByBranch(); testPauseForLaggards(); + testDisputes(); } }; diff --git a/src/test/consensus/DistributedValidatorsSim_test.cpp b/src/test/consensus/DistributedValidatorsSim_test.cpp index 3abac36b4f..2f6ed74c23 100644 --- a/src/test/consensus/DistributedValidatorsSim_test.cpp +++ b/src/test/consensus/DistributedValidatorsSim_test.cpp @@ -16,17 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include + #include -#include #include #include + #include #include #include #include +#include namespace ripple { namespace test { diff --git a/src/test/consensus/LedgerTiming_test.cpp b/src/test/consensus/LedgerTiming_test.cpp index 95e27f5c85..79c0f3f884 100644 --- a/src/test/consensus/LedgerTiming_test.cpp +++ b/src/test/consensus/LedgerTiming_test.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include namespace ripple { diff --git a/src/test/consensus/LedgerTrie_test.cpp b/src/test/consensus/LedgerTrie_test.cpp index 6f13db43be..f46fea8e6e 100644 --- a/src/test/consensus/LedgerTrie_test.cpp +++ b/src/test/consensus/LedgerTrie_test.cpp @@ -16,11 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include + #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/consensus/NegativeUNL_test.cpp b/src/test/consensus/NegativeUNL_test.cpp index 4993f679e1..7eb05e68bb 100644 --- a/src/test/consensus/NegativeUNL_test.cpp +++ b/src/test/consensus/NegativeUNL_test.cpp @@ -18,13 +18,14 @@ //============================================================================== #include + #include #include #include #include #include #include -#include + #include namespace ripple { diff --git a/src/test/consensus/ScaleFreeSim_test.cpp b/src/test/consensus/ScaleFreeSim_test.cpp index 3e3cec9761..226cf5bfed 100644 --- a/src/test/consensus/ScaleFreeSim_test.cpp +++ b/src/test/consensus/ScaleFreeSim_test.cpp @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include -#include + #include + #include namespace ripple { diff --git a/src/test/consensus/Validations_test.cpp b/src/test/consensus/Validations_test.cpp index 0279d6330c..4424d7619d 100644 --- a/src/test/consensus/Validations_test.cpp +++ b/src/test/consensus/Validations_test.cpp @@ -19,13 +19,13 @@ #include #include + #include + #include #include #include -#include -#include -#include + #include namespace ripple { diff --git a/src/test/core/ClosureCounter_test.cpp b/src/test/core/ClosureCounter_test.cpp index 83d2fdb6e4..a426a4aea4 100644 --- a/src/test/core/ClosureCounter_test.cpp +++ b/src/test/core/ClosureCounter_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/core/Config_test.cpp b/src/test/core/Config_test.cpp index 2bf398c9a9..8b0fce1e20 100644 --- a/src/test/core/Config_test.cpp +++ b/src/test/core/Config_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include @@ -29,7 +30,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/core/Coroutine_test.cpp b/src/test/core/Coroutine_test.cpp index 0fdc5a4f49..8458da647d 100644 --- a/src/test/core/Coroutine_test.cpp +++ b/src/test/core/Coroutine_test.cpp @@ -18,9 +18,10 @@ //============================================================================== #include + #include + #include -#include #include namespace ripple { diff --git a/src/test/core/CryptoPRNG_test.cpp b/src/test/core/CryptoPRNG_test.cpp index 303a217631..21924e582c 100644 --- a/src/test/core/CryptoPRNG_test.cpp +++ b/src/test/core/CryptoPRNG_test.cpp @@ -18,11 +18,9 @@ //============================================================================== #include + #include #include -#include -#include -#include namespace ripple { diff --git a/src/test/core/JobQueue_test.cpp b/src/test/core/JobQueue_test.cpp index 42338063db..66f110be9c 100644 --- a/src/test/core/JobQueue_test.cpp +++ b/src/test/core/JobQueue_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/core/SociDB_test.cpp b/src/test/core/SociDB_test.cpp index 82d0cbe903..8f2a3c6646 100644 --- a/src/test/core/SociDB_test.cpp +++ b/src/test/core/SociDB_test.cpp @@ -18,10 +18,12 @@ //============================================================================== #include -#include + #include + #include #include + #include #include diff --git a/src/test/core/Workers_test.cpp b/src/test/core/Workers_test.cpp index 3fac4808f9..e37f7a71f8 100644 --- a/src/test/core/Workers_test.cpp +++ b/src/test/core/Workers_test.cpp @@ -17,13 +17,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include #include #include + #include #include + #include -#include #include #include #include diff --git a/src/test/csf/BasicNetwork_test.cpp b/src/test/csf/BasicNetwork_test.cpp index 61660ae4c4..4173db6502 100644 --- a/src/test/csf/BasicNetwork_test.cpp +++ b/src/test/csf/BasicNetwork_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include diff --git a/src/test/csf/CollectorRef.h b/src/test/csf/CollectorRef.h index 72d1e9545d..309b48af1f 100644 --- a/src/test/csf/CollectorRef.h +++ b/src/test/csf/CollectorRef.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_COLLECTOREF_H_INCLUDED #define RIPPLE_TEST_CSF_COLLECTOREF_H_INCLUDED diff --git a/src/test/csf/Digraph_test.cpp b/src/test/csf/Digraph_test.cpp index 80319445ca..0cc4be1976 100644 --- a/src/test/csf/Digraph_test.cpp +++ b/src/test/csf/Digraph_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/csf/Histogram.h b/src/test/csf/Histogram.h index 2df1844a21..fb0f532396 100644 --- a/src/test/csf/Histogram.h +++ b/src/test/csf/Histogram.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_HISTOGRAM_H_INCLUDED #define RIPPLE_TEST_CSF_HISTOGRAM_H_INCLUDED diff --git a/src/test/csf/Histogram_test.cpp b/src/test/csf/Histogram_test.cpp index ea8b864780..40274c9046 100644 --- a/src/test/csf/Histogram_test.cpp +++ b/src/test/csf/Histogram_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/csf/Peer.h b/src/test/csf/Peer.h index dceafb9648..678924112e 100644 --- a/src/test/csf/Peer.h +++ b/src/test/csf/Peer.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PEER_H_INCLUDED #define RIPPLE_TEST_CSF_PEER_H_INCLUDED @@ -26,12 +27,16 @@ #include #include #include + #include #include + #include #include + #include #include + #include namespace ripple { diff --git a/src/test/csf/PeerGroup.h b/src/test/csf/PeerGroup.h index b59bfa6763..0da1ef69c9 100644 --- a/src/test/csf/PeerGroup.h +++ b/src/test/csf/PeerGroup.h @@ -16,11 +16,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PEERGROUP_H_INCLUDED #define RIPPLE_TEST_CSF_PEERGROUP_H_INCLUDED #include #include + #include #include diff --git a/src/test/csf/Proposal.h b/src/test/csf/Proposal.h index 1d70464bab..eae258a251 100644 --- a/src/test/csf/Proposal.h +++ b/src/test/csf/Proposal.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PROPOSAL_H_INCLUDED #define RIPPLE_TEST_CSF_PROPOSAL_H_INCLUDED #include #include #include + #include namespace ripple { @@ -36,4 +38,4 @@ using Proposal = ConsensusProposal; } // namespace test } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/src/test/csf/Scheduler_test.cpp b/src/test/csf/Scheduler_test.cpp index 931150bbeb..1935e40236 100644 --- a/src/test/csf/Scheduler_test.cpp +++ b/src/test/csf/Scheduler_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include diff --git a/src/test/csf/SimTime.h b/src/test/csf/SimTime.h index 930338108e..32d657b625 100644 --- a/src/test/csf/SimTime.h +++ b/src/test/csf/SimTime.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_CSF_SIMTIME_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/csf/TrustGraph.h b/src/test/csf/TrustGraph.h index 649f210646..5770c792bc 100644 --- a/src/test/csf/TrustGraph.h +++ b/src/test/csf/TrustGraph.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_CSF_UNL_H_INCLUDED #include + #include #include diff --git a/src/test/csf/Tx.h b/src/test/csf/Tx.h index f87f382167..066aee2268 100644 --- a/src/test/csf/Tx.h +++ b/src/test/csf/Tx.h @@ -16,12 +16,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_TX_H_INCLUDED #define RIPPLE_TEST_CSF_TX_H_INCLUDED + #include #include + #include #include + #include #include #include @@ -48,7 +52,7 @@ public: { } - ID + ID const& id() const { return id_; diff --git a/src/test/csf/Validation.h b/src/test/csf/Validation.h index 57c2bc6668..e79222c84f 100644 --- a/src/test/csf/Validation.h +++ b/src/test/csf/Validation.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED #define RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED #include + #include #include diff --git a/src/test/csf/collectors.h b/src/test/csf/collectors.h index 8dcaa03531..0494178ae9 100644 --- a/src/test/csf/collectors.h +++ b/src/test/csf/collectors.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_COLLECTORS_H_INCLUDED #define RIPPLE_TEST_CSF_COLLECTORS_H_INCLUDED #include #include #include + #include #include diff --git a/src/test/csf/events.h b/src/test/csf/events.h index 37d1b4b0bd..2209a10f60 100644 --- a/src/test/csf/events.h +++ b/src/test/csf/events.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_EVENTS_H_INCLUDED #define RIPPLE_TEST_CSF_EVENTS_H_INCLUDED @@ -23,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/csf/impl/Sim.cpp b/src/test/csf/impl/Sim.cpp index 8f78ad9233..6cc950180c 100644 --- a/src/test/csf/impl/Sim.cpp +++ b/src/test/csf/impl/Sim.cpp @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include namespace ripple { diff --git a/src/test/csf/impl/ledgers.cpp b/src/test/csf/impl/ledgers.cpp index 775ec2e58b..74be491b39 100644 --- a/src/test/csf/impl/ledgers.cpp +++ b/src/test/csf/impl/ledgers.cpp @@ -16,10 +16,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include -#include -#include +#include + +#include namespace ripple { namespace test { diff --git a/src/test/csf/ledgers.h b/src/test/csf/ledgers.h index 1c8d4eb54c..a02adb9c87 100644 --- a/src/test/csf/ledgers.h +++ b/src/test/csf/ledgers.h @@ -16,17 +16,22 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_LEDGERS_H_INCLUDED #define RIPPLE_TEST_CSF_LEDGERS_H_INCLUDED #include + #include + #include #include #include #include #include + #include + #include #include diff --git a/src/test/csf/submitters.h b/src/test/csf/submitters.h index 35752de89b..2680c09712 100644 --- a/src/test/csf/submitters.h +++ b/src/test/csf/submitters.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_SUBMITTERS_H_INCLUDED #define RIPPLE_TEST_CSF_SUBMITTERS_H_INCLUDED @@ -23,7 +24,9 @@ #include #include #include + #include + namespace ripple { namespace test { namespace csf { diff --git a/src/test/csf/timers.h b/src/test/csf/timers.h index 7e5d88c669..94b421e4b4 100644 --- a/src/test/csf/timers.h +++ b/src/test/csf/timers.h @@ -16,11 +16,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_TIMERS_H_INCLUDED #define RIPPLE_TEST_CSF_TIMERS_H_INCLUDED #include #include + #include #include diff --git a/src/test/json/Object_test.cpp b/src/test/json/Object_test.cpp index 4a64d6538a..94a9e96cf6 100644 --- a/src/test/json/Object_test.cpp +++ b/src/test/json/Object_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/json/Output_test.cpp b/src/test/json/Output_test.cpp index ddc5f08992..2343843fe3 100644 --- a/src/test/json/Output_test.cpp +++ b/src/test/json/Output_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/json/TestOutputSuite.h b/src/test/json/TestOutputSuite.h index a4f36dac4e..44992df64b 100644 --- a/src/test/json/TestOutputSuite.h +++ b/src/test/json/TestOutputSuite.h @@ -21,6 +21,7 @@ #define RIPPLE_RPC_TESTOUTPUTSUITE_H_INCLUDED #include + #include #include diff --git a/src/test/json/Writer_test.cpp b/src/test/json/Writer_test.cpp index 97d4297c92..c5305876ff 100644 --- a/src/test/json/Writer_test.cpp +++ b/src/test/json/Writer_test.cpp @@ -18,9 +18,9 @@ //============================================================================== #include + #include #include -#include namespace Json { diff --git a/src/test/json/json_value_test.cpp b/src/test/json/json_value_test.cpp index dacc22cc01..0858786f04 100644 --- a/src/test/json/json_value_test.cpp +++ b/src/test/json/json_value_test.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include #include #include #include diff --git a/src/test/jtx.h b/src/test/jtx.h index f3c69ce33c..6b73ca63ec 100644 --- a/src/test/jtx.h +++ b/src/test/jtx.h @@ -69,6 +69,7 @@ #include #include #include + #include #endif diff --git a/src/test/jtx/AMM.h b/src/test/jtx/AMM.h index 52039f74ae..71e2e5f34c 100644 --- a/src/test/jtx/AMM.h +++ b/src/test/jtx/AMM.h @@ -25,7 +25,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/test/jtx/AMMTest.h b/src/test/jtx/AMMTest.h index 0481dc98a4..5ff2d21a19 100644 --- a/src/test/jtx/AMMTest.h +++ b/src/test/jtx/AMMTest.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED #define RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED #include #include #include + #include #include diff --git a/src/test/jtx/Account.h b/src/test/jtx/Account.h index f49070dff0..d91bb4a383 100644 --- a/src/test/jtx/Account.h +++ b/src/test/jtx/Account.h @@ -24,6 +24,7 @@ #include #include #include + #include #include diff --git a/src/test/jtx/CaptureLogs.h b/src/test/jtx/CaptureLogs.h index ddb04cb3ff..a8afb521c3 100644 --- a/src/test/jtx/CaptureLogs.h +++ b/src/test/jtx/CaptureLogs.h @@ -17,6 +17,9 @@ */ //============================================================================== +#ifndef RIPPLE_TEST_JTX_CAPTURELOGS_H_INCLUDED +#define RIPPLE_TEST_JTX_CAPTURELOGS_H_INCLUDED + #include namespace ripple { @@ -92,3 +95,5 @@ public: } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/CheckMessageLogs.h b/src/test/jtx/CheckMessageLogs.h index e51b84b1c0..fd3915440e 100644 --- a/src/test/jtx/CheckMessageLogs.h +++ b/src/test/jtx/CheckMessageLogs.h @@ -17,6 +17,9 @@ */ //============================================================================== +#ifndef RIPPLE_TEST_JTX_CHECKMESSAGELOGS_H_INCLUDED +#define RIPPLE_TEST_JTX_CHECKMESSAGELOGS_H_INCLUDED + #include namespace ripple { @@ -80,3 +83,5 @@ public: } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/Env.h b/src/test/jtx/Env.h index 66845ae91d..4e8bb64f59 100644 --- a/src/test/jtx/Env.h +++ b/src/test/jtx/Env.h @@ -29,12 +29,14 @@ #include #include #include + #include #include #include #include #include #include + #include #include #include @@ -46,6 +48,7 @@ #include #include #include + #include #include #include diff --git a/src/test/jtx/Env_test.cpp b/src/test/jtx/Env_test.cpp index 691f96c259..622efe297d 100644 --- a/src/test/jtx/Env_test.cpp +++ b/src/test/jtx/Env_test.cpp @@ -18,16 +18,18 @@ //============================================================================== #include + #include #include + #include #include -#include #include #include #include #include + #include #include diff --git a/src/test/jtx/JSONRPCClient.h b/src/test/jtx/JSONRPCClient.h index bbffc72669..3765893eb7 100644 --- a/src/test/jtx/JSONRPCClient.h +++ b/src/test/jtx/JSONRPCClient.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_HTTPCLIENT_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/test/jtx/JTx.h b/src/test/jtx/JTx.h index 81ba1b406a..198839dd28 100644 --- a/src/test/jtx/JTx.h +++ b/src/test/jtx/JTx.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/test/jtx/ManualTimeKeeper.h b/src/test/jtx/ManualTimeKeeper.h index 86477bf99f..c9bf4d4763 100644 --- a/src/test/jtx/ManualTimeKeeper.h +++ b/src/test/jtx/ManualTimeKeeper.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_MANUALTIMEKEEPER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/Oracle.h b/src/test/jtx/Oracle.h index 32ec0b2e85..9d2554c18f 100644 --- a/src/test/jtx/Oracle.h +++ b/src/test/jtx/Oracle.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_ORACLE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/PathSet.h b/src/test/jtx/PathSet.h index 0f4c4ddd3d..df9de540a1 100644 --- a/src/test/jtx/PathSet.h +++ b/src/test/jtx/PathSet.h @@ -21,6 +21,7 @@ #define RIPPLE_LEDGER_TESTS_PATHSET_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 262c6ebeb8..16bb966317 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED #define RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED #include + #include #include #include diff --git a/src/test/jtx/TestSuite.h b/src/test/jtx/TestSuite.h index 22b8fb7e53..d54439d846 100644 --- a/src/test/jtx/TestSuite.h +++ b/src/test/jtx/TestSuite.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_TESTSUITE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/TrustedPublisherServer.h b/src/test/jtx/TrustedPublisherServer.h index b786cae284..6138673484 100644 --- a/src/test/jtx/TrustedPublisherServer.h +++ b/src/test/jtx/TrustedPublisherServer.h @@ -16,16 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_TRUSTED_PUBLISHER_SERVER_H_INCLUDED #define RIPPLE_TEST_TRUSTED_PUBLISHER_SERVER_H_INCLUDED #include + #include #include #include #include #include #include + #include #include #include diff --git a/src/test/jtx/WSClient.h b/src/test/jtx/WSClient.h index d0356dbcbf..8a479f97c3 100644 --- a/src/test/jtx/WSClient.h +++ b/src/test/jtx/WSClient.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_WSCLIENT_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/WSClient_test.cpp b/src/test/jtx/WSClient_test.cpp index 18dadb0bf9..471e6ff31b 100644 --- a/src/test/jtx/WSClient_test.cpp +++ b/src/test/jtx/WSClient_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/amount.h b/src/test/jtx/amount.h index 9990c77c38..589347b12c 100644 --- a/src/test/jtx/amount.h +++ b/src/test/jtx/amount.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include #include #include diff --git a/src/test/jtx/credentials.h b/src/test/jtx/credentials.h index 2f5c63dccb..9161b7241d 100644 --- a/src/test/jtx/credentials.h +++ b/src/test/jtx/credentials.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TEST_JTX_CREDENTIALS_H_INCLUDED +#define RIPPLE_TEST_JTX_CREDENTIALS_H_INCLUDED #include #include @@ -97,8 +98,8 @@ Json::Value ledgerEntry(jtx::Env& env, std::string const& credIdx); } // namespace credentials - } // namespace jtx - } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/delivermin.h b/src/test/jtx/delivermin.h index 46e633dab2..f8b0da2c19 100644 --- a/src/test/jtx/delivermin.h +++ b/src/test/jtx/delivermin.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_DELIVERMIN_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/fee.h b/src/test/jtx/fee.h index 4e29fad152..7d54804f87 100644 --- a/src/test/jtx/fee.h +++ b/src/test/jtx/fee.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/test/jtx/flags.h b/src/test/jtx/flags.h index c8887cdee4..b5e8207803 100644 --- a/src/test/jtx/flags.h +++ b/src/test/jtx/flags.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_FLAGS_H_INCLUDED #include + #include #include #include diff --git a/src/test/jtx/impl/AMM.cpp b/src/test/jtx/impl/AMM.cpp index 089d3508d7..3482e7e867 100644 --- a/src/test/jtx/impl/AMM.cpp +++ b/src/test/jtx/impl/AMM.cpp @@ -18,10 +18,11 @@ //============================================================================== #include - #include + #include #include + #include #include #include diff --git a/src/test/jtx/impl/AMMTest.cpp b/src/test/jtx/impl/AMMTest.cpp index 575e2e1d88..8555be01a9 100644 --- a/src/test/jtx/impl/AMMTest.cpp +++ b/src/test/jtx/impl/AMMTest.cpp @@ -17,13 +17,14 @@ */ //============================================================================== -#include - #include +#include #include #include + #include #include + #include #include diff --git a/src/test/jtx/impl/Account.cpp b/src/test/jtx/impl/Account.cpp index 9d41456ef7..b61048e66f 100644 --- a/src/test/jtx/impl/Account.cpp +++ b/src/test/jtx/impl/Account.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/Env.cpp b/src/test/jtx/impl/Env.cpp index 43286ab782..e006f268cf 100644 --- a/src/test/jtx/impl/Env.cpp +++ b/src/test/jtx/impl/Env.cpp @@ -23,31 +23,27 @@ #include #include #include -#include #include #include #include #include + #include #include -#include -#include #include #include + #include #include #include #include -#include -#include #include -#include #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/JSONRPCClient.cpp b/src/test/jtx/impl/JSONRPCClient.cpp index 19c20b5bab..4db13c95fd 100644 --- a/src/test/jtx/impl/JSONRPCClient.cpp +++ b/src/test/jtx/impl/JSONRPCClient.cpp @@ -16,17 +16,21 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/Oracle.cpp b/src/test/jtx/impl/Oracle.cpp index df9483cbaa..721a1c299d 100644 --- a/src/test/jtx/impl/Oracle.cpp +++ b/src/test/jtx/impl/Oracle.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include @@ -377,4 +377,4 @@ validDocumentID(AnyValue const& v) } // namespace oracle } // namespace jtx } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/jtx/impl/TestHelpers.cpp b/src/test/jtx/impl/TestHelpers.cpp index 3bf69729ab..e5b136e9c0 100644 --- a/src/test/jtx/impl/TestHelpers.cpp +++ b/src/test/jtx/impl/TestHelpers.cpp @@ -18,9 +18,9 @@ //============================================================================== #include - #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/WSClient.cpp b/src/test/jtx/impl/WSClient.cpp index 03e2b2d608..20cca3179a 100644 --- a/src/test/jtx/impl/WSClient.cpp +++ b/src/test/jtx/impl/WSClient.cpp @@ -19,21 +19,19 @@ #include #include + #include #include #include #include + #include #include -#include +#include #include #include -#include - -#include - namespace ripple { namespace test { diff --git a/src/test/jtx/impl/acctdelete.cpp b/src/test/jtx/impl/acctdelete.cpp index d7f8f10e04..842eea7fc2 100644 --- a/src/test/jtx/impl/acctdelete.cpp +++ b/src/test/jtx/impl/acctdelete.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/amount.cpp b/src/test/jtx/impl/amount.cpp index 5be53dc0a9..9134122da9 100644 --- a/src/test/jtx/impl/amount.cpp +++ b/src/test/jtx/impl/amount.cpp @@ -19,8 +19,9 @@ #include #include + #include -#include + #include namespace ripple { diff --git a/src/test/jtx/impl/attester.cpp b/src/test/jtx/impl/attester.cpp index 66be9da83b..91abfc459b 100644 --- a/src/test/jtx/impl/attester.cpp +++ b/src/test/jtx/impl/attester.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include diff --git a/src/test/jtx/impl/check.cpp b/src/test/jtx/impl/check.cpp index 21af6c9cc3..f5aa76658c 100644 --- a/src/test/jtx/impl/check.cpp +++ b/src/test/jtx/impl/check.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/credentials.cpp b/src/test/jtx/impl/credentials.cpp index bc7ccf93cd..f29bc45e20 100644 --- a/src/test/jtx/impl/credentials.cpp +++ b/src/test/jtx/impl/credentials.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/delivermin.cpp b/src/test/jtx/impl/delivermin.cpp index 6e4838c7c0..fe9f4e8fe6 100644 --- a/src/test/jtx/impl/delivermin.cpp +++ b/src/test/jtx/impl/delivermin.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/deposit.cpp b/src/test/jtx/impl/deposit.cpp index d91607c990..5f4ae6bdb3 100644 --- a/src/test/jtx/impl/deposit.cpp +++ b/src/test/jtx/impl/deposit.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/did.cpp b/src/test/jtx/impl/did.cpp index a9a6e974ef..67a523403c 100644 --- a/src/test/jtx/impl/did.cpp +++ b/src/test/jtx/impl/did.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index fd4949d5a4..b94c79ccb8 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -17,9 +17,9 @@ */ //============================================================================== +#include #include -#include #include namespace ripple { diff --git a/src/test/jtx/impl/fee.cpp b/src/test/jtx/impl/fee.cpp index e390136a3c..71e3dd089a 100644 --- a/src/test/jtx/impl/fee.cpp +++ b/src/test/jtx/impl/fee.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/flags.cpp b/src/test/jtx/impl/flags.cpp index 6658d3eba9..a6ddfc1d71 100644 --- a/src/test/jtx/impl/flags.cpp +++ b/src/test/jtx/impl/flags.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/jtx_json.cpp b/src/test/jtx/impl/jtx_json.cpp index c9cf6636cf..b76ad2ef0c 100644 --- a/src/test/jtx/impl/jtx_json.cpp +++ b/src/test/jtx/impl/jtx_json.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/last_ledger_sequence.cpp b/src/test/jtx/impl/last_ledger_sequence.cpp index 57742bab2a..4b4368429f 100644 --- a/src/test/jtx/impl/last_ledger_sequence.cpp +++ b/src/test/jtx/impl/last_ledger_sequence.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/ledgerStateFix.cpp b/src/test/jtx/impl/ledgerStateFix.cpp index 2f121dc267..8c78069191 100644 --- a/src/test/jtx/impl/ledgerStateFix.cpp +++ b/src/test/jtx/impl/ledgerStateFix.cpp @@ -20,6 +20,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/memo.cpp b/src/test/jtx/impl/memo.cpp index 6469748b4f..1214ec2a2c 100644 --- a/src/test/jtx/impl/memo.cpp +++ b/src/test/jtx/impl/memo.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/multisign.cpp b/src/test/jtx/impl/multisign.cpp index 42c3bfc78b..a802528247 100644 --- a/src/test/jtx/impl/multisign.cpp +++ b/src/test/jtx/impl/multisign.cpp @@ -19,13 +19,12 @@ #include #include + #include -#include #include -#include #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/offer.cpp b/src/test/jtx/impl/offer.cpp index 55a1af4bea..f48c0f2d21 100644 --- a/src/test/jtx/impl/offer.cpp +++ b/src/test/jtx/impl/offer.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/paths.cpp b/src/test/jtx/impl/paths.cpp index 393e36e9d6..2a45909eb9 100644 --- a/src/test/jtx/impl/paths.cpp +++ b/src/test/jtx/impl/paths.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/jtx/impl/pay.cpp b/src/test/jtx/impl/pay.cpp index 2a627223fd..82fe910e9b 100644 --- a/src/test/jtx/impl/pay.cpp +++ b/src/test/jtx/impl/pay.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/permissioned_domains.cpp b/src/test/jtx/impl/permissioned_domains.cpp index 9cdf7c664f..866ca3bb7e 100644 --- a/src/test/jtx/impl/permissioned_domains.cpp +++ b/src/test/jtx/impl/permissioned_domains.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/quality2.cpp b/src/test/jtx/impl/quality2.cpp index dd10b3c611..46f36cb6d6 100644 --- a/src/test/jtx/impl/quality2.cpp +++ b/src/test/jtx/impl/quality2.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/rate.cpp b/src/test/jtx/impl/rate.cpp index f95170537f..0526cdc28f 100644 --- a/src/test/jtx/impl/rate.cpp +++ b/src/test/jtx/impl/rate.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/regkey.cpp b/src/test/jtx/impl/regkey.cpp index 9fc260d2d0..cff2de3e8e 100644 --- a/src/test/jtx/impl/regkey.cpp +++ b/src/test/jtx/impl/regkey.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/sendmax.cpp b/src/test/jtx/impl/sendmax.cpp index 9514b92316..168ce4659d 100644 --- a/src/test/jtx/impl/sendmax.cpp +++ b/src/test/jtx/impl/sendmax.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/seq.cpp b/src/test/jtx/impl/seq.cpp index 3a3de002db..82f0e98b4c 100644 --- a/src/test/jtx/impl/seq.cpp +++ b/src/test/jtx/impl/seq.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/tag.cpp b/src/test/jtx/impl/tag.cpp index be456a1e0e..9a8c491da2 100644 --- a/src/test/jtx/impl/tag.cpp +++ b/src/test/jtx/impl/tag.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/ticket.cpp b/src/test/jtx/impl/ticket.cpp index 69bcab4d9f..ef1ffd416b 100644 --- a/src/test/jtx/impl/ticket.cpp +++ b/src/test/jtx/impl/ticket.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/token.cpp b/src/test/jtx/impl/token.cpp index 49f473fcd8..bea974a016 100644 --- a/src/test/jtx/impl/token.cpp +++ b/src/test/jtx/impl/token.cpp @@ -21,6 +21,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/trust.cpp b/src/test/jtx/impl/trust.cpp index dee4b28236..5e9eadca8d 100644 --- a/src/test/jtx/impl/trust.cpp +++ b/src/test/jtx/impl/trust.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/txflags.cpp b/src/test/jtx/impl/txflags.cpp index 7bc59876a9..77c46f35b3 100644 --- a/src/test/jtx/impl/txflags.cpp +++ b/src/test/jtx/impl/txflags.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/utility.cpp b/src/test/jtx/impl/utility.cpp index c10fb91854..afa7ee8f35 100644 --- a/src/test/jtx/impl/utility.cpp +++ b/src/test/jtx/impl/utility.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include @@ -27,7 +29,6 @@ #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/xchain_bridge.cpp b/src/test/jtx/impl/xchain_bridge.cpp index 43b0e7c2f9..c63734ee8f 100644 --- a/src/test/jtx/impl/xchain_bridge.cpp +++ b/src/test/jtx/impl/xchain_bridge.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include - #include #include +#include + #include #include #include diff --git a/src/test/jtx/jtx_json.h b/src/test/jtx/jtx_json.h index 837d652476..47f5a3c223 100644 --- a/src/test/jtx/jtx_json.h +++ b/src/test/jtx/jtx_json.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_JSON_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/multisign.h b/src/test/jtx/multisign.h index 44cee17b7b..6bcb1a671c 100644 --- a/src/test/jtx/multisign.h +++ b/src/test/jtx/multisign.h @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/test/jtx/offer.h b/src/test/jtx/offer.h index 3951f4f934..260b734ddd 100644 --- a/src/test/jtx/offer.h +++ b/src/test/jtx/offer.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_OFFER_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/owners.h b/src/test/jtx/owners.h index 2299af2d7f..fc904f9e87 100644 --- a/src/test/jtx/owners.h +++ b/src/test/jtx/owners.h @@ -21,9 +21,12 @@ #define RIPPLE_TEST_JTX_OWNERS_H_INCLUDED #include + #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/paths.h b/src/test/jtx/paths.h index cc9caf3af7..d1d5f5849a 100644 --- a/src/test/jtx/paths.h +++ b/src/test/jtx/paths.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_JTX_PATHS_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/test/jtx/pay.h b/src/test/jtx/pay.h index 6294b5b308..f9d8822f53 100644 --- a/src/test/jtx/pay.h +++ b/src/test/jtx/pay.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/permissioned_domains.h b/src/test/jtx/permissioned_domains.h index 49b420d3d2..ee80c6a69f 100644 --- a/src/test/jtx/permissioned_domains.h +++ b/src/test/jtx/permissioned_domains.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TEST_JTX_PERMISSIONED_DOMAINS_H_INCLUDED +#define RIPPLE_TEST_JTX_PERMISSIONED_DOMAINS_H_INCLUDED #include #include @@ -69,3 +70,5 @@ getNewDomain(std::shared_ptr const& meta); } // namespace jtx } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/prop.h b/src/test/jtx/prop.h index 8dc5f21917..70498074d6 100644 --- a/src/test/jtx/prop.h +++ b/src/test/jtx/prop.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_PROP_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/rate.h b/src/test/jtx/rate.h index 0f8186accf..6fb8c9a8e9 100644 --- a/src/test/jtx/rate.h +++ b/src/test/jtx/rate.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_RATE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/regkey.h b/src/test/jtx/regkey.h index 7d021e4f27..ce87c9b259 100644 --- a/src/test/jtx/regkey.h +++ b/src/test/jtx/regkey.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/require.h b/src/test/jtx/require.h index 271419e51b..bec21235a6 100644 --- a/src/test/jtx/require.h +++ b/src/test/jtx/require.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_REQUIRE_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/rpc.h b/src/test/jtx/rpc.h index f996284969..be9ce22bf7 100644 --- a/src/test/jtx/rpc.h +++ b/src/test/jtx/rpc.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_RPC_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/sendmax.h b/src/test/jtx/sendmax.h index 495c61c33b..54a1c25e2f 100644 --- a/src/test/jtx/sendmax.h +++ b/src/test/jtx/sendmax.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_SENDMAX_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/ter.h b/src/test/jtx/ter.h index d75d9f09d0..ab37275bad 100644 --- a/src/test/jtx/ter.h +++ b/src/test/jtx/ter.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_TER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/trust.h b/src/test/jtx/trust.h index 0d02c6e76c..5f0cebcbef 100644 --- a/src/test/jtx/trust.h +++ b/src/test/jtx/trust.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_TRUST_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/utility.h b/src/test/jtx/utility.h index 6d34452cdf..2c21fbd3ff 100644 --- a/src/test/jtx/utility.h +++ b/src/test/jtx/utility.h @@ -21,10 +21,13 @@ #define RIPPLE_TEST_JTX_UTILITY_H_INCLUDED #include + #include #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/xchain_bridge.h b/src/test/jtx/xchain_bridge.h index 9968317c8d..8ff19bd508 100644 --- a/src/test/jtx/xchain_bridge.h +++ b/src/test/jtx/xchain_bridge.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/test/ledger/BookDirs_test.cpp b/src/test/ledger/BookDirs_test.cpp index b50f4381f4..19a1b5d272 100644 --- a/src/test/ledger/BookDirs_test.cpp +++ b/src/test/ledger/BookDirs_test.cpp @@ -16,7 +16,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/ledger/Directory_test.cpp b/src/test/ledger/Directory_test.cpp index bea394f2f3..825d7ff340 100644 --- a/src/test/ledger/Directory_test.cpp +++ b/src/test/ledger/Directory_test.cpp @@ -16,12 +16,15 @@ //============================================================================== #include + #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/test/ledger/Invariants_test.cpp b/src/test/ledger/Invariants_test.cpp index ecf1c8e397..18b037cbbe 100644 --- a/src/test/ledger/Invariants_test.cpp +++ b/src/test/ledger/Invariants_test.cpp @@ -20,9 +20,10 @@ #include #include #include + #include #include -#include + #include #include #include diff --git a/src/test/ledger/PaymentSandbox_test.cpp b/src/test/ledger/PaymentSandbox_test.cpp index dd9b5c5d88..303e700f40 100644 --- a/src/test/ledger/PaymentSandbox_test.cpp +++ b/src/test/ledger/PaymentSandbox_test.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include #include + #include #include diff --git a/src/test/ledger/PendingSaves_test.cpp b/src/test/ledger/PendingSaves_test.cpp index 1bd42a64a6..e2a43eb585 100644 --- a/src/test/ledger/PendingSaves_test.cpp +++ b/src/test/ledger/PendingSaves_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/ledger/SkipList_test.cpp b/src/test/ledger/SkipList_test.cpp index 3e8987a806..c2088d77cf 100644 --- a/src/test/ledger/SkipList_test.cpp +++ b/src/test/ledger/SkipList_test.cpp @@ -17,10 +17,11 @@ */ //============================================================================== -#include +#include + #include #include -#include + #include namespace ripple { diff --git a/src/test/ledger/View_test.cpp b/src/test/ledger/View_test.cpp index fc9dce7de7..a9af8e2a40 100644 --- a/src/test/ledger/View_test.cpp +++ b/src/test/ledger/View_test.cpp @@ -18,14 +18,16 @@ //============================================================================== #include + #include #include #include #include #include #include + #include -#include + #include namespace ripple { diff --git a/src/test/nodestore/Backend_test.cpp b/src/test/nodestore/Backend_test.cpp index dc1fe8c7fe..488370fbe9 100644 --- a/src/test/nodestore/Backend_test.cpp +++ b/src/test/nodestore/Backend_test.cpp @@ -19,10 +19,14 @@ #include #include + #include #include #include + +#include #include + #include namespace ripple { diff --git a/src/test/nodestore/Basics_test.cpp b/src/test/nodestore/Basics_test.cpp index aa423e7dc0..62a66c9dce 100644 --- a/src/test/nodestore/Basics_test.cpp +++ b/src/test/nodestore/Basics_test.cpp @@ -18,8 +18,7 @@ //============================================================================== #include -#include -#include + #include #include diff --git a/src/test/nodestore/Database_test.cpp b/src/test/nodestore/Database_test.cpp index 59557f3c79..bbf6381ee5 100644 --- a/src/test/nodestore/Database_test.cpp +++ b/src/test/nodestore/Database_test.cpp @@ -22,9 +22,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/test/nodestore/TestBase.h b/src/test/nodestore/TestBase.h index 98608c5fb1..634f2bf005 100644 --- a/src/test/nodestore/TestBase.h +++ b/src/test/nodestore/TestBase.h @@ -23,12 +23,15 @@ #include #include #include + #include #include #include #include #include + #include + #include namespace ripple { diff --git a/src/test/nodestore/Timing_test.cpp b/src/test/nodestore/Timing_test.cpp index 73789c0244..3df18eee66 100644 --- a/src/test/nodestore/Timing_test.cpp +++ b/src/test/nodestore/Timing_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include #include @@ -29,16 +30,16 @@ #include #include #include + #include + #include #include #include #include -#include #include #include #include -#include #include #include diff --git a/src/test/nodestore/import_test.cpp b/src/test/nodestore/import_test.cpp index e13fe9c0c8..d7865a20fc 100644 --- a/src/test/nodestore/import_test.cpp +++ b/src/test/nodestore/import_test.cpp @@ -18,24 +18,27 @@ //============================================================================== #include +#include + #include #include #include #include #include + #include #include + +#include +#include +#include + #include #include #include #include -#include -#include -#include #include -#include - /* Math: diff --git a/src/test/nodestore/varint_test.cpp b/src/test/nodestore/varint_test.cpp index da7ae9d285..4f6d3c141c 100644 --- a/src/test/nodestore/varint_test.cpp +++ b/src/test/nodestore/varint_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/overlay/ProtocolVersion_test.cpp b/src/test/overlay/ProtocolVersion_test.cpp index dfc0ee70b8..da976f8901 100644 --- a/src/test/overlay/ProtocolVersion_test.cpp +++ b/src/test/overlay/ProtocolVersion_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/overlay/cluster_test.cpp b/src/test/overlay/cluster_test.cpp index d22674d28c..76bbc9d4e3 100644 --- a/src/test/overlay/cluster_test.cpp +++ b/src/test/overlay/cluster_test.cpp @@ -19,8 +19,9 @@ #include #include + #include -#include + #include #include diff --git a/src/test/overlay/compression_test.cpp b/src/test/overlay/compression_test.cpp index 19669efc23..76c38fd59b 100644 --- a/src/test/overlay/compression_test.cpp +++ b/src/test/overlay/compression_test.cpp @@ -22,15 +22,16 @@ #include #include #include + #include #include -#include #include #include #include #include #include #include + #include #include #include @@ -41,9 +42,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/test/overlay/handshake_test.cpp b/src/test/overlay/handshake_test.cpp index 93038e522a..2d5155aaee 100644 --- a/src/test/overlay/handshake_test.cpp +++ b/src/test/overlay/handshake_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { @@ -61,4 +62,4 @@ public: BEAST_DEFINE_TESTSUITE(handshake, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/overlay/reduce_relay_test.cpp b/src/test/overlay/reduce_relay_test.cpp index e0edae5489..9fc105262b 100644 --- a/src/test/overlay/reduce_relay_test.cpp +++ b/src/test/overlay/reduce_relay_test.cpp @@ -16,11 +16,15 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include #include +#include #include + #include #include #include diff --git a/src/test/overlay/short_read_test.cpp b/src/test/overlay/short_read_test.cpp index 0efc49b84e..739d7ea954 100644 --- a/src/test/overlay/short_read_test.cpp +++ b/src/test/overlay/short_read_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include @@ -26,9 +27,7 @@ #include #include -#include #include -#include #include #include #include diff --git a/src/test/overlay/tx_reduce_relay_test.cpp b/src/test/overlay/tx_reduce_relay_test.cpp index 3d6c2a4d1e..07ff2bb14a 100644 --- a/src/test/overlay/tx_reduce_relay_test.cpp +++ b/src/test/overlay/tx_reduce_relay_test.cpp @@ -16,11 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include #include + #include #include @@ -283,4 +286,4 @@ private: BEAST_DEFINE_TESTSUITE(tx_reduce_relay, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/peerfinder/Livecache_test.cpp b/src/test/peerfinder/Livecache_test.cpp index 7fb9f02f42..a150f02f05 100644 --- a/src/test/peerfinder/Livecache_test.cpp +++ b/src/test/peerfinder/Livecache_test.cpp @@ -19,11 +19,13 @@ #include #include + #include + #include -#include #include #include + #include namespace ripple { diff --git a/src/test/peerfinder/PeerFinder_test.cpp b/src/test/peerfinder/PeerFinder_test.cpp index a1cb8d7408..9006b8c1c7 100644 --- a/src/test/peerfinder/PeerFinder_test.cpp +++ b/src/test/peerfinder/PeerFinder_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include -#include + #include -#include #include #include #include diff --git a/src/test/protocol/ApiVersion_test.cpp b/src/test/protocol/ApiVersion_test.cpp index 7d634dc569..2dc4f4d6bb 100644 --- a/src/test/protocol/ApiVersion_test.cpp +++ b/src/test/protocol/ApiVersion_test.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include diff --git a/src/test/protocol/Hooks_test.cpp b/src/test/protocol/Hooks_test.cpp index fb61d10a73..0637b52efa 100644 --- a/src/test/protocol/Hooks_test.cpp +++ b/src/test/protocol/Hooks_test.cpp @@ -18,8 +18,9 @@ //============================================================================== #include + #include -#include + #include #include diff --git a/src/test/protocol/InnerObjectFormats_test.cpp b/src/test/protocol/InnerObjectFormats_test.cpp index cfc8d123c2..f4d9722392 100644 --- a/src/test/protocol/InnerObjectFormats_test.cpp +++ b/src/test/protocol/InnerObjectFormats_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include -#include // Json::Reader -#include // RPC::containsError -#include +#include // Json::Reader +#include // RPC::containsError #include // STParsedJSONObject namespace ripple { diff --git a/src/test/protocol/Issue_test.cpp b/src/test/protocol/Issue_test.cpp index 7ec1507e04..53ebf5be24 100644 --- a/src/test/protocol/Issue_test.cpp +++ b/src/test/protocol/Issue_test.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/test/protocol/Memo_test.cpp b/src/test/protocol/Memo_test.cpp index bd63e7003a..a7fa846a4d 100644 --- a/src/test/protocol/Memo_test.cpp +++ b/src/test/protocol/Memo_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/test/protocol/PublicKey_test.cpp b/src/test/protocol/PublicKey_test.cpp index 7fa798d148..0f5aef261a 100644 --- a/src/test/protocol/PublicKey_test.cpp +++ b/src/test/protocol/PublicKey_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/protocol/Quality_test.cpp b/src/test/protocol/Quality_test.cpp index 64cf0c71b3..aa9918a064 100644 --- a/src/test/protocol/Quality_test.cpp +++ b/src/test/protocol/Quality_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/protocol/STAmount_test.cpp b/src/test/protocol/STAmount_test.cpp index b512c42a64..1836fa8595 100644 --- a/src/test/protocol/STAmount_test.cpp +++ b/src/test/protocol/STAmount_test.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include diff --git a/src/test/protocol/STIssue_test.cpp b/src/test/protocol/STIssue_test.cpp index 4c9eeb0ba1..6e8d37331b 100644 --- a/src/test/protocol/STIssue_test.cpp +++ b/src/test/protocol/STIssue_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include @@ -161,4 +162,4 @@ public: BEAST_DEFINE_TESTSUITE(STIssue, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/protocol/STObject_test.cpp b/src/test/protocol/STObject_test.cpp index 071a5f4f63..e02cfeeea4 100644 --- a/src/test/protocol/STObject_test.cpp +++ b/src/test/protocol/STObject_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/protocol/STTx_test.cpp b/src/test/protocol/STTx_test.cpp index 54037eaa5b..f48bea11aa 100644 --- a/src/test/protocol/STTx_test.cpp +++ b/src/test/protocol/STTx_test.cpp @@ -26,9 +26,8 @@ #include #include #include -#include #include -#include + #include namespace ripple { diff --git a/src/test/protocol/STValidation_test.cpp b/src/test/protocol/STValidation_test.cpp index 8efb584748..784fc43c24 100644 --- a/src/test/protocol/STValidation_test.cpp +++ b/src/test/protocol/STValidation_test.cpp @@ -18,14 +18,10 @@ //============================================================================== #include -#include + #include #include #include -#include -#include -#include -#include #include #include diff --git a/src/test/protocol/SecretKey_test.cpp b/src/test/protocol/SecretKey_test.cpp index bce89bce73..248be5a0da 100644 --- a/src/test/protocol/SecretKey_test.cpp +++ b/src/test/protocol/SecretKey_test.cpp @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/test/protocol/Seed_test.cpp b/src/test/protocol/Seed_test.cpp index 3619e84541..0b89eb22a7 100644 --- a/src/test/protocol/Seed_test.cpp +++ b/src/test/protocol/Seed_test.cpp @@ -20,10 +20,10 @@ #include #include #include -#include #include #include #include + #include namespace ripple { diff --git a/src/test/protocol/SeqProxy_test.cpp b/src/test/protocol/SeqProxy_test.cpp index 5e44bca5b4..7a660c10d2 100644 --- a/src/test/protocol/SeqProxy_test.cpp +++ b/src/test/protocol/SeqProxy_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/resource/Logic_test.cpp b/src/test/resource/Logic_test.cpp index b445890c32..49326e7dc5 100644 --- a/src/test/resource/Logic_test.cpp +++ b/src/test/resource/Logic_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include @@ -26,6 +27,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/rpc/AMMInfo_test.cpp b/src/test/rpc/AMMInfo_test.cpp index c1e059a3ea..a0985ea104 100644 --- a/src/test/rpc/AMMInfo_test.cpp +++ b/src/test/rpc/AMMInfo_test.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include diff --git a/src/test/rpc/AccountCurrencies_test.cpp b/src/test/rpc/AccountCurrencies_test.cpp index 7d16ca48a9..3ccb89c471 100644 --- a/src/test/rpc/AccountCurrencies_test.cpp +++ b/src/test/rpc/AccountCurrencies_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/AccountInfo_test.cpp b/src/test/rpc/AccountInfo_test.cpp index cb9712aef5..238b739611 100644 --- a/src/test/rpc/AccountInfo_test.cpp +++ b/src/test/rpc/AccountInfo_test.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include -#include - #include #include -#include -#include -#include + +#include +#include namespace ripple { namespace test { diff --git a/src/test/rpc/AccountLines_test.cpp b/src/test/rpc/AccountLines_test.cpp index bae00d7a76..6e6f0def19 100644 --- a/src/test/rpc/AccountLines_test.cpp +++ b/src/test/rpc/AccountLines_test.cpp @@ -18,13 +18,13 @@ //============================================================================== #include + #include #include #include #include namespace ripple { - namespace RPC { class AccountLines_test : public beast::unit_test::suite @@ -250,6 +250,10 @@ public: gw1.human() + R"("})"); BEAST_EXPECT(lines[jss::result][jss::lines].isArray()); BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26); + + // Check no ripple is not set for trustlines between alice and gw1 + auto const& line = lines[jss::result][jss::lines][0u]; + BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple)); } { // Use a malformed peer. diff --git a/src/test/rpc/AccountObjects_test.cpp b/src/test/rpc/AccountObjects_test.cpp index 232a091114..b723095aeb 100644 --- a/src/test/rpc/AccountObjects_test.cpp +++ b/src/test/rpc/AccountObjects_test.cpp @@ -20,7 +20,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/test/rpc/AccountOffers_test.cpp b/src/test/rpc/AccountOffers_test.cpp index da6acc97e9..2aa85ac9b9 100644 --- a/src/test/rpc/AccountOffers_test.cpp +++ b/src/test/rpc/AccountOffers_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/AccountSet_test.cpp b/src/test/rpc/AccountSet_test.cpp index 3c6cad00e2..7bca51ae96 100644 --- a/src/test/rpc/AccountSet_test.cpp +++ b/src/test/rpc/AccountSet_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include #include diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index f6a9225ec4..f10b5b8387 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/rpc/AmendmentBlocked_test.cpp b/src/test/rpc/AmendmentBlocked_test.cpp index 196ce0e463..bea9cdf57d 100644 --- a/src/test/rpc/AmendmentBlocked_test.cpp +++ b/src/test/rpc/AmendmentBlocked_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/test/rpc/Book_test.cpp b/src/test/rpc/Book_test.cpp index 6bcc0c2080..79e3f940f8 100644 --- a/src/test/rpc/Book_test.cpp +++ b/src/test/rpc/Book_test.cpp @@ -17,7 +17,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/Connect_test.cpp b/src/test/rpc/Connect_test.cpp index 8f3fe26adb..cc021ba08f 100644 --- a/src/test/rpc/Connect_test.cpp +++ b/src/test/rpc/Connect_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/DeliveredAmount_test.cpp b/src/test/rpc/DeliveredAmount_test.cpp index 9ed858e2a3..9a63f24842 100644 --- a/src/test/rpc/DeliveredAmount_test.cpp +++ b/src/test/rpc/DeliveredAmount_test.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include #include namespace ripple { diff --git a/src/test/rpc/DepositAuthorized_test.cpp b/src/test/rpc/DepositAuthorized_test.cpp index 46637d421e..2ccad9d779 100644 --- a/src/test/rpc/DepositAuthorized_test.cpp +++ b/src/test/rpc/DepositAuthorized_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/Feature_test.cpp b/src/test/rpc/Feature_test.cpp index 12d4b27745..bc789f9a74 100644 --- a/src/test/rpc/Feature_test.cpp +++ b/src/test/rpc/Feature_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/GRPCTestClientBase.h b/src/test/rpc/GRPCTestClientBase.h index f8b74ed6d5..06531ef552 100644 --- a/src/test/rpc/GRPCTestClientBase.h +++ b/src/test/rpc/GRPCTestClientBase.h @@ -21,7 +21,9 @@ #define RIPPLED_GRPCTESTCLIENTBASE_H #include + #include + #include namespace ripple { diff --git a/src/test/rpc/GatewayBalances_test.cpp b/src/test/rpc/GatewayBalances_test.cpp index 4e847c8dbd..730d58bcca 100644 --- a/src/test/rpc/GatewayBalances_test.cpp +++ b/src/test/rpc/GatewayBalances_test.cpp @@ -17,7 +17,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/GetAggregatePrice_test.cpp b/src/test/rpc/GetAggregatePrice_test.cpp index aad3c9be99..1e09219f57 100644 --- a/src/test/rpc/GetAggregatePrice_test.cpp +++ b/src/test/rpc/GetAggregatePrice_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/test/rpc/GetCounts_test.cpp b/src/test/rpc/GetCounts_test.cpp index 132ed93d7b..d0b3404781 100644 --- a/src/test/rpc/GetCounts_test.cpp +++ b/src/test/rpc/GetCounts_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/rpc/Handler_test.cpp b/src/test/rpc/Handler_test.cpp index 2c3bfd30d4..4883cf664f 100644 --- a/src/test/rpc/Handler_test.cpp +++ b/src/test/rpc/Handler_test.cpp @@ -18,13 +18,14 @@ //============================================================================== #include + #include + #include #include #include #include -#include #include namespace ripple::test { diff --git a/src/test/rpc/JSONRPC_test.cpp b/src/test/rpc/JSONRPC_test.cpp index 6e97301fc3..03f206707b 100644 --- a/src/test/rpc/JSONRPC_test.cpp +++ b/src/test/rpc/JSONRPC_test.cpp @@ -19,15 +19,16 @@ #include #include + #include #include #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/test/rpc/KeyGeneration_test.cpp b/src/test/rpc/KeyGeneration_test.cpp index e136bb04be..07ebd93dd3 100644 --- a/src/test/rpc/KeyGeneration_test.cpp +++ b/src/test/rpc/KeyGeneration_test.cpp @@ -16,9 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include + #include #include #include diff --git a/src/test/rpc/LedgerClosed_test.cpp b/src/test/rpc/LedgerClosed_test.cpp index c3f7f900e3..b0a2216b1f 100644 --- a/src/test/rpc/LedgerClosed_test.cpp +++ b/src/test/rpc/LedgerClosed_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/LedgerData_test.cpp b/src/test/rpc/LedgerData_test.cpp index 1e4f97a935..b56cb241dd 100644 --- a/src/test/rpc/LedgerData_test.cpp +++ b/src/test/rpc/LedgerData_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/LedgerHeader_test.cpp b/src/test/rpc/LedgerHeader_test.cpp index d8fe738b88..a80f706b6f 100644 --- a/src/test/rpc/LedgerHeader_test.cpp +++ b/src/test/rpc/LedgerHeader_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/rpc/LedgerRPC_test.cpp b/src/test/rpc/LedgerRPC_test.cpp index ebc6297fe4..d4fd2fd392 100644 --- a/src/test/rpc/LedgerRPC_test.cpp +++ b/src/test/rpc/LedgerRPC_test.cpp @@ -22,14 +22,13 @@ #include #include #include -#include + #include -#include + #include #include #include #include -#include #include namespace ripple { @@ -3190,7 +3189,18 @@ class LedgerRPC_test : public beast::unit_test::suite params[jss::permissioned_domain][jss::account] = 1; params[jss::permissioned_domain][jss::seq] = seq; auto const jrr = env.rpc("json", "ledger_entry", to_string(params)); - checkErrorValue(jrr[jss::result], "malformedRequest", ""); + checkErrorValue(jrr[jss::result], "malformedAddress", ""); + } + + { + // Fail, account is an object + Json::Value params; + params[jss::ledger_index] = jss::validated; + params[jss::permissioned_domain][jss::account] = + Json::Value{Json::ValueType::objectValue}; + params[jss::permissioned_domain][jss::seq] = seq; + auto const jrr = env.rpc("json", "ledger_entry", to_string(params)); + checkErrorValue(jrr[jss::result], "malformedAddress", ""); } { diff --git a/src/test/rpc/LedgerRequestRPC_test.cpp b/src/test/rpc/LedgerRequestRPC_test.cpp index 61905c99c1..221f639819 100644 --- a/src/test/rpc/LedgerRequestRPC_test.cpp +++ b/src/test/rpc/LedgerRequestRPC_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/rpc/ManifestRPC_test.cpp b/src/test/rpc/ManifestRPC_test.cpp index fcf47a5745..d040ed5632 100644 --- a/src/test/rpc/ManifestRPC_test.cpp +++ b/src/test/rpc/ManifestRPC_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/NoRippleCheck_test.cpp b/src/test/rpc/NoRippleCheck_test.cpp index 4551365029..6cd566e144 100644 --- a/src/test/rpc/NoRippleCheck_test.cpp +++ b/src/test/rpc/NoRippleCheck_test.cpp @@ -19,14 +19,16 @@ #include #include + #include #include + #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/test/rpc/NoRipple_test.cpp b/src/test/rpc/NoRipple_test.cpp index aa5e6e1efe..5c41f25128 100644 --- a/src/test/rpc/NoRipple_test.cpp +++ b/src/test/rpc/NoRipple_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/OwnerInfo_test.cpp b/src/test/rpc/OwnerInfo_test.cpp index 606f2274b8..8d9f9c401f 100644 --- a/src/test/rpc/OwnerInfo_test.cpp +++ b/src/test/rpc/OwnerInfo_test.cpp @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include diff --git a/src/test/rpc/Peers_test.cpp b/src/test/rpc/Peers_test.cpp index ab9b17b259..d325da12c3 100644 --- a/src/test/rpc/Peers_test.cpp +++ b/src/test/rpc/Peers_test.cpp @@ -19,9 +19,12 @@ #include #include + #include #include + #include + #include namespace ripple { diff --git a/src/test/rpc/RPCCall_test.cpp b/src/test/rpc/RPCCall_test.cpp index b812740fb3..8438ef533d 100644 --- a/src/test/rpc/RPCCall_test.cpp +++ b/src/test/rpc/RPCCall_test.cpp @@ -17,8 +17,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/RPCHelpers_test.cpp b/src/test/rpc/RPCHelpers_test.cpp index 11a0ef787d..531649b8af 100644 --- a/src/test/rpc/RPCHelpers_test.cpp +++ b/src/test/rpc/RPCHelpers_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/RPCOverload_test.cpp b/src/test/rpc/RPCOverload_test.cpp index c3328fb0b2..efe69496fb 100644 --- a/src/test/rpc/RPCOverload_test.cpp +++ b/src/test/rpc/RPCOverload_test.cpp @@ -18,7 +18,9 @@ #include #include #include + #include + #include #include diff --git a/src/test/rpc/RobustTransaction_test.cpp b/src/test/rpc/RobustTransaction_test.cpp index b0506224f7..ccef6e297e 100644 --- a/src/test/rpc/RobustTransaction_test.cpp +++ b/src/test/rpc/RobustTransaction_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include diff --git a/src/test/rpc/Roles_test.cpp b/src/test/rpc/Roles_test.cpp index 8cef5dcbc6..5ac8654330 100644 --- a/src/test/rpc/Roles_test.cpp +++ b/src/test/rpc/Roles_test.cpp @@ -19,11 +19,8 @@ #include #include -#include -#include -#include -#include +#include #include #include diff --git a/src/test/rpc/ServerInfo_test.cpp b/src/test/rpc/ServerInfo_test.cpp index 5e202f275a..21312ef8ff 100644 --- a/src/test/rpc/ServerInfo_test.cpp +++ b/src/test/rpc/ServerInfo_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include diff --git a/src/test/rpc/Simulate_test.cpp b/src/test/rpc/Simulate_test.cpp index 656e5f0577..089c444e11 100644 --- a/src/test/rpc/Simulate_test.cpp +++ b/src/test/rpc/Simulate_test.cpp @@ -20,8 +20,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/Status_test.cpp b/src/test/rpc/Status_test.cpp index c68131e813..e37fe2dabd 100644 --- a/src/test/rpc/Status_test.cpp +++ b/src/test/rpc/Status_test.cpp @@ -18,9 +18,9 @@ //============================================================================== #include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 662442676f..1546f2c859 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -18,14 +18,17 @@ #include #include #include + #include #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/test/rpc/TransactionEntry_test.cpp b/src/test/rpc/TransactionEntry_test.cpp index 09423ed25d..bafb01f5ff 100644 --- a/src/test/rpc/TransactionEntry_test.cpp +++ b/src/test/rpc/TransactionEntry_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/TransactionHistory_test.cpp b/src/test/rpc/TransactionHistory_test.cpp index 63151bdaeb..d5b1b27a35 100644 --- a/src/test/rpc/TransactionHistory_test.cpp +++ b/src/test/rpc/TransactionHistory_test.cpp @@ -20,8 +20,11 @@ #include #include #include + #include + #include + #include namespace ripple { diff --git a/src/test/rpc/Transaction_test.cpp b/src/test/rpc/Transaction_test.cpp index 2bd20eb370..6aef32dbf3 100644 --- a/src/test/rpc/Transaction_test.cpp +++ b/src/test/rpc/Transaction_test.cpp @@ -20,8 +20,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/ValidatorInfo_test.cpp b/src/test/rpc/ValidatorInfo_test.cpp index 5ca1af7a3c..4904923e0b 100644 --- a/src/test/rpc/ValidatorInfo_test.cpp +++ b/src/test/rpc/ValidatorInfo_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/ValidatorRPC_test.cpp b/src/test/rpc/ValidatorRPC_test.cpp index b53b8d1f82..d03cbbf841 100644 --- a/src/test/rpc/ValidatorRPC_test.cpp +++ b/src/test/rpc/ValidatorRPC_test.cpp @@ -19,13 +19,13 @@ #include #include + #include #include #include -#include + #include #include -#include #include #include diff --git a/src/test/rpc/Version_test.cpp b/src/test/rpc/Version_test.cpp index b66e502b9f..c0bc5d450b 100644 --- a/src/test/rpc/Version_test.cpp +++ b/src/test/rpc/Version_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/server/ServerStatus_test.cpp b/src/test/server/ServerStatus_test.cpp index f15085d6ef..bcd355e301 100644 --- a/src/test/server/ServerStatus_test.cpp +++ b/src/test/server/ServerStatus_test.cpp @@ -21,18 +21,22 @@ #include #include #include + #include #include #include #include + #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/test/server/Server_test.cpp b/src/test/server/Server_test.cpp index c17c752ff1..f8895ae7e9 100644 --- a/src/test/server/Server_test.cpp +++ b/src/test/server/Server_test.cpp @@ -17,18 +17,19 @@ */ //============================================================================== +#include +#include +#include +#include + #include + #include #include #include #include #include -#include -#include -#include -#include - #include #include #include diff --git a/src/test/shamap/FetchPack_test.cpp b/src/test/shamap/FetchPack_test.cpp index ac2d16ecc9..04385f9441 100644 --- a/src/test/shamap/FetchPack_test.cpp +++ b/src/test/shamap/FetchPack_test.cpp @@ -19,15 +19,17 @@ #include #include + #include #include -#include + #include #include #include #include #include #include + #include #include diff --git a/src/test/shamap/SHAMapSync_test.cpp b/src/test/shamap/SHAMapSync_test.cpp index 627e97e152..c3af07f036 100644 --- a/src/test/shamap/SHAMapSync_test.cpp +++ b/src/test/shamap/SHAMapSync_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include #include diff --git a/src/test/shamap/SHAMap_test.cpp b/src/test/shamap/SHAMap_test.cpp index c8c877935f..3197e0944d 100644 --- a/src/test/shamap/SHAMap_test.cpp +++ b/src/test/shamap/SHAMap_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/shamap/common.h b/src/test/shamap/common.h index db5a2c40ac..47308a82f8 100644 --- a/src/test/shamap/common.h +++ b/src/test/shamap/common.h @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/unit_test/FileDirGuard.h b/src/test/unit_test/FileDirGuard.h index 246ac26237..d247ae3015 100644 --- a/src/test/unit_test/FileDirGuard.h +++ b/src/test/unit_test/FileDirGuard.h @@ -21,7 +21,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define TEST_UNIT_TEST_DIRGUARD_H #include + #include + #include namespace ripple { diff --git a/src/test/unit_test/multi_runner.h b/src/test/unit_test/multi_runner.h index a4435dd1af..653bbead06 100644 --- a/src/test/unit_test/multi_runner.h +++ b/src/test/unit_test/multi_runner.h @@ -22,8 +22,8 @@ #include #include -#include +#include #include #include #include diff --git a/src/xrpld/app/consensus/RCLCensorshipDetector.h b/src/xrpld/app/consensus/RCLCensorshipDetector.h index 12a768ca4c..7cdf15949d 100644 --- a/src/xrpld/app/consensus/RCLCensorshipDetector.h +++ b/src/xrpld/app/consensus/RCLCensorshipDetector.h @@ -21,7 +21,9 @@ #define RIPPLE_APP_CONSENSUS_RCLCENSORSHIPDETECTOR_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLConsensus.cpp b/src/xrpld/app/consensus/RCLConsensus.cpp index fe368a69a6..0a5cee4121 100644 --- a/src/xrpld/app/consensus/RCLConsensus.cpp +++ b/src/xrpld/app/consensus/RCLConsensus.cpp @@ -37,6 +37,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLConsensus.h b/src/xrpld/app/consensus/RCLConsensus.h index 6519b90e4c..735c67fd01 100644 --- a/src/xrpld/app/consensus/RCLConsensus.h +++ b/src/xrpld/app/consensus/RCLConsensus.h @@ -28,13 +28,11 @@ #include #include #include -#include #include -#include -#include + #include #include -#include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLCxLedger.h b/src/xrpld/app/consensus/RCLCxLedger.h index ed7ad9faeb..cd14c30a94 100644 --- a/src/xrpld/app/consensus/RCLCxLedger.h +++ b/src/xrpld/app/consensus/RCLCxLedger.h @@ -23,8 +23,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.cpp b/src/xrpld/app/consensus/RCLCxPeerPos.cpp index 37f61a8c2d..83847b2e9e 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.cpp +++ b/src/xrpld/app/consensus/RCLCxPeerPos.cpp @@ -18,10 +18,8 @@ //============================================================================== #include -#include -#include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.h b/src/xrpld/app/consensus/RCLCxPeerPos.h index b5d3d152cb..63cfde8700 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.h +++ b/src/xrpld/app/consensus/RCLCxPeerPos.h @@ -21,15 +21,15 @@ #define RIPPLE_APP_CONSENSUS_RCLCXPEERPOS_H_INCLUDED #include -#include + #include #include #include #include #include -#include + #include -#include + #include #include diff --git a/src/xrpld/app/consensus/RCLCxTx.h b/src/xrpld/app/consensus/RCLCxTx.h index bbf3797887..baa0899f02 100644 --- a/src/xrpld/app/consensus/RCLCxTx.h +++ b/src/xrpld/app/consensus/RCLCxTx.h @@ -20,10 +20,7 @@ #ifndef RIPPLE_APP_CONSENSUS_RCLCXTX_H_INCLUDED #define RIPPLE_APP_CONSENSUS_RCLCXTX_H_INCLUDED -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLValidations.cpp b/src/xrpld/app/consensus/RCLValidations.cpp index c4d9389e89..a04047c78a 100644 --- a/src/xrpld/app/consensus/RCLValidations.cpp +++ b/src/xrpld/app/consensus/RCLValidations.cpp @@ -22,18 +22,15 @@ #include #include #include -#include #include -#include #include #include #include + #include -#include #include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLValidations.h b/src/xrpld/app/consensus/RCLValidations.h index 7b1559fba4..a9f872bee9 100644 --- a/src/xrpld/app/consensus/RCLValidations.h +++ b/src/xrpld/app/consensus/RCLValidations.h @@ -22,11 +22,12 @@ #include #include + #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/AbstractFetchPackContainer.h b/src/xrpld/app/ledger/AbstractFetchPackContainer.h index 2b27471c64..a93169800e 100644 --- a/src/xrpld/app/ledger/AbstractFetchPackContainer.h +++ b/src/xrpld/app/ledger/AbstractFetchPackContainer.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedger.cpp b/src/xrpld/app/ledger/AcceptedLedger.cpp index a82323f628..21efc4983f 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.cpp +++ b/src/xrpld/app/ledger/AcceptedLedger.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedger.h b/src/xrpld/app/ledger/AcceptedLedger.h index 65a782aef7..6b17d93c9d 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.h +++ b/src/xrpld/app/ledger/AcceptedLedger.h @@ -21,7 +21,6 @@ #define RIPPLE_APP_LEDGER_ACCEPTEDLEDGER_H_INCLUDED #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedgerTx.cpp b/src/xrpld/app/ledger/AcceptedLedgerTx.cpp index 6bdb602fd8..7944578f77 100644 --- a/src/xrpld/app/ledger/AcceptedLedgerTx.cpp +++ b/src/xrpld/app/ledger/AcceptedLedgerTx.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/ledger/AcceptedLedgerTx.h b/src/xrpld/app/ledger/AcceptedLedgerTx.h index 725057aa02..efa16371a7 100644 --- a/src/xrpld/app/ledger/AcceptedLedgerTx.h +++ b/src/xrpld/app/ledger/AcceptedLedgerTx.h @@ -21,7 +21,9 @@ #define RIPPLE_APP_LEDGER_ACCEPTEDLEDGERTX_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/BookListeners.cpp b/src/xrpld/app/ledger/BookListeners.cpp index 2379807a91..fa5fa65059 100644 --- a/src/xrpld/app/ledger/BookListeners.cpp +++ b/src/xrpld/app/ledger/BookListeners.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/BookListeners.h b/src/xrpld/app/ledger/BookListeners.h index 6ac52de28e..ca58bf3058 100644 --- a/src/xrpld/app/ledger/BookListeners.h +++ b/src/xrpld/app/ledger/BookListeners.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_LEDGER_BOOKLISTENERS_H_INCLUDED #include + #include #include diff --git a/src/xrpld/app/ledger/BuildLedger.h b/src/xrpld/app/ledger/BuildLedger.h index 409fa3529c..0805db6c8d 100644 --- a/src/xrpld/app/ledger/BuildLedger.h +++ b/src/xrpld/app/ledger/BuildLedger.h @@ -21,10 +21,9 @@ #define RIPPLE_APP_LEDGER_BUILD_LEDGER_H_INCLUDED #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp index 77a0370f7d..e62426b720 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp @@ -19,11 +19,11 @@ #include #include -#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.h b/src/xrpld/app/ledger/ConsensusTransSetSF.h index 857f2b8eae..4a68f577ad 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.h +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/InboundLedger.h b/src/xrpld/app/ledger/InboundLedger.h index 13f603e79d..e8f244bfc0 100644 --- a/src/xrpld/app/ledger/InboundLedger.h +++ b/src/xrpld/app/ledger/InboundLedger.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/xrpld/app/ledger/InboundLedgers.h b/src/xrpld/app/ledger/InboundLedgers.h index 937a151589..037897392f 100644 --- a/src/xrpld/app/ledger/InboundLedgers.h +++ b/src/xrpld/app/ledger/InboundLedgers.h @@ -21,9 +21,8 @@ #define RIPPLE_APP_LEDGER_INBOUNDLEDGERS_H_INCLUDED #include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/InboundTransactions.h b/src/xrpld/app/ledger/InboundTransactions.h index 368375c07c..6feee44004 100644 --- a/src/xrpld/app/ledger/InboundTransactions.h +++ b/src/xrpld/app/ledger/InboundTransactions.h @@ -22,7 +22,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 852f73cde1..d3c59fbeb6 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -17,28 +17,22 @@ */ //============================================================================== -#include #include #include -#include #include -#include #include -#include #include #include -#include -#include #include #include #include #include #include #include +#include + #include -#include #include -#include #include #include #include @@ -46,15 +40,12 @@ #include #include #include -#include #include #include -#include + #include #include -#include - namespace ripple { create_genesis_t const create_genesis{}; diff --git a/src/xrpld/app/ledger/Ledger.h b/src/xrpld/app/ledger/Ledger.h index 0eb102eb51..81c26526e5 100644 --- a/src/xrpld/app/ledger/Ledger.h +++ b/src/xrpld/app/ledger/Ledger.h @@ -20,18 +20,18 @@ #ifndef RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED #define RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED +#include #include #include #include #include + #include #include -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerCleaner.h b/src/xrpld/app/ledger/LedgerCleaner.h index 251e8d5128..b086e02134 100644 --- a/src/xrpld/app/ledger/LedgerCleaner.h +++ b/src/xrpld/app/ledger/LedgerCleaner.h @@ -21,10 +21,10 @@ #define RIPPLE_APP_LEDGER_LEDGERCLEANER_H_INCLUDED #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerHistory.cpp b/src/xrpld/app/ledger/LedgerHistory.cpp index ed0b11723b..bf866abf3f 100644 --- a/src/xrpld/app/ledger/LedgerHistory.cpp +++ b/src/xrpld/app/ledger/LedgerHistory.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/LedgerHistory.h b/src/xrpld/app/ledger/LedgerHistory.h index 9d414e4aad..33f8bf1d96 100644 --- a/src/xrpld/app/ledger/LedgerHistory.h +++ b/src/xrpld/app/ledger/LedgerHistory.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include diff --git a/src/xrpld/app/ledger/LedgerHolder.h b/src/xrpld/app/ledger/LedgerHolder.h index 5636a8ca20..c0c9d74f46 100644 --- a/src/xrpld/app/ledger/LedgerHolder.h +++ b/src/xrpld/app/ledger/LedgerHolder.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerMaster.h b/src/xrpld/app/ledger/LedgerMaster.h index dd7f0b6a61..f8d726ec8e 100644 --- a/src/xrpld/app/ledger/LedgerMaster.h +++ b/src/xrpld/app/ledger/LedgerMaster.h @@ -28,18 +28,17 @@ #include #include #include + #include -#include #include #include #include #include #include -#include #include -#include #include +#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplay.h b/src/xrpld/app/ledger/LedgerReplay.h index 8e52c8d5d5..a3bdedf821 100644 --- a/src/xrpld/app/ledger/LedgerReplay.h +++ b/src/xrpld/app/ledger/LedgerReplay.h @@ -21,9 +21,9 @@ #define RIPPLE_APP_LEDGER_LEDGERREPLAY_H_INCLUDED #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplayTask.h b/src/xrpld/app/ledger/LedgerReplayTask.h index 54863e7095..03110d8442 100644 --- a/src/xrpld/app/ledger/LedgerReplayTask.h +++ b/src/xrpld/app/ledger/LedgerReplayTask.h @@ -24,7 +24,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplayer.h b/src/xrpld/app/ledger/LedgerReplayer.h index 4ce4b20b22..b00430303a 100644 --- a/src/xrpld/app/ledger/LedgerReplayer.h +++ b/src/xrpld/app/ledger/LedgerReplayer.h @@ -23,9 +23,9 @@ #include #include #include + #include -#include #include #include diff --git a/src/xrpld/app/ledger/LedgerToJson.h b/src/xrpld/app/ledger/LedgerToJson.h index 8f9316cbc6..40be57fc9c 100644 --- a/src/xrpld/app/ledger/LedgerToJson.h +++ b/src/xrpld/app/ledger/LedgerToJson.h @@ -24,11 +24,9 @@ #include #include #include -#include + #include #include -#include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/LocalTxs.h b/src/xrpld/app/ledger/LocalTxs.h index 638e070f44..bf86992a69 100644 --- a/src/xrpld/app/ledger/LocalTxs.h +++ b/src/xrpld/app/ledger/LocalTxs.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/OpenLedger.h b/src/xrpld/app/ledger/OpenLedger.h index 95d4a7cb23..9fe56ff488 100644 --- a/src/xrpld/app/ledger/OpenLedger.h +++ b/src/xrpld/app/ledger/OpenLedger.h @@ -25,10 +25,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/OrderBookDB.cpp b/src/xrpld/app/ledger/OrderBookDB.cpp index 265e0b6290..5d3616ce20 100644 --- a/src/xrpld/app/ledger/OrderBookDB.cpp +++ b/src/xrpld/app/ledger/OrderBookDB.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/OrderBookDB.h b/src/xrpld/app/ledger/OrderBookDB.h index ce0d9f0faf..d120f43aea 100644 --- a/src/xrpld/app/ledger/OrderBookDB.h +++ b/src/xrpld/app/ledger/OrderBookDB.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/PendingSaves.h b/src/xrpld/app/ledger/PendingSaves.h index d296fcacc9..20263fd1f3 100644 --- a/src/xrpld/app/ledger/PendingSaves.h +++ b/src/xrpld/app/ledger/PendingSaves.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PENDINGSAVES_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/ledger/TransactionMaster.h b/src/xrpld/app/ledger/TransactionMaster.h index 65f27af602..ffbbe4ae09 100644 --- a/src/xrpld/app/ledger/TransactionMaster.h +++ b/src/xrpld/app/ledger/TransactionMaster.h @@ -23,7 +23,9 @@ #include #include #include + #include +#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/BuildLedger.cpp b/src/xrpld/app/ledger/detail/BuildLedger.cpp index 5d0f4966a4..3f099cd2ea 100644 --- a/src/xrpld/app/ledger/detail/BuildLedger.cpp +++ b/src/xrpld/app/ledger/detail/BuildLedger.cpp @@ -21,9 +21,9 @@ #include #include #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/InboundLedger.cpp b/src/xrpld/app/ledger/detail/InboundLedger.cpp index 32fdff76ab..c1eed3a9f3 100644 --- a/src/xrpld/app/ledger/detail/InboundLedger.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedger.cpp @@ -23,10 +23,10 @@ #include #include #include -#include #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index 99a26ce8f9..b05268f65b 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -23,11 +23,11 @@ #include #include #include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/ledger/detail/InboundTransactions.cpp b/src/xrpld/app/ledger/detail/InboundTransactions.cpp index b8f327ff8a..54477ccaed 100644 --- a/src/xrpld/app/ledger/detail/InboundTransactions.cpp +++ b/src/xrpld/app/ledger/detail/InboundTransactions.cpp @@ -23,9 +23,11 @@ #include #include #include + #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp index 27322e302c..7c0dccfb9b 100644 --- a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp +++ b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h index b0b2c76c24..2435964766 100644 --- a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h +++ b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h @@ -23,10 +23,10 @@ #include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerMaster.cpp b/src/xrpld/app/ledger/detail/LedgerMaster.cpp index 6bc894da48..0c6a5e786c 100644 --- a/src/xrpld/app/ledger/detail/LedgerMaster.cpp +++ b/src/xrpld/app/ledger/detail/LedgerMaster.cpp @@ -40,6 +40,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp index 7b9d881d54..5bfad61bf4 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp index 164fbf8cc5..a9d2657f9b 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp @@ -22,7 +22,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp index 3ef3201567..6de717be4f 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp @@ -20,7 +20,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerToJson.cpp b/src/xrpld/app/ledger/detail/LedgerToJson.cpp index 3f6869df1d..5f1e47e8b3 100644 --- a/src/xrpld/app/ledger/detail/LedgerToJson.cpp +++ b/src/xrpld/app/ledger/detail/LedgerToJson.cpp @@ -19,14 +19,14 @@ #include #include -#include #include #include #include #include #include -#include + #include +#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LocalTxs.cpp b/src/xrpld/app/ledger/detail/LocalTxs.cpp index a6eb7721a3..b6bfc8f850 100644 --- a/src/xrpld/app/ledger/detail/LocalTxs.cpp +++ b/src/xrpld/app/ledger/detail/LocalTxs.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include /* diff --git a/src/xrpld/app/ledger/detail/OpenLedger.cpp b/src/xrpld/app/ledger/detail/OpenLedger.cpp index a6b93b4694..86a3b4b840 100644 --- a/src/xrpld/app/ledger/detail/OpenLedger.cpp +++ b/src/xrpld/app/ledger/detail/OpenLedger.cpp @@ -25,8 +25,7 @@ #include #include #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp index 912c29a9f6..fc7e4d140c 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.h b/src/xrpld/app/ledger/detail/SkipListAcquire.h index 03c8181df6..0e97945174 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.h +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.h @@ -25,7 +25,6 @@ #include #include #include -#include namespace ripple { class InboundLedgers; diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp index 35d8f1fffb..0961488691 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp @@ -18,9 +18,7 @@ //============================================================================== #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.h b/src/xrpld/app/ledger/detail/TimeoutCounter.h index 228e879d4d..85ce6fc3b4 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.h +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.h @@ -22,9 +22,11 @@ #include #include -#include + #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp index fa4758ebcc..23694b3cb6 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.h b/src/xrpld/app/ledger/detail/TransactionAcquire.h index 230bce2fc9..f0d9b40928 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.h +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_APP_LEDGER_TRANSACTIONACQUIRE_H_INCLUDED #define RIPPLE_APP_LEDGER_TRANSACTIONACQUIRE_H_INCLUDED -#include #include #include diff --git a/src/xrpld/app/ledger/detail/TransactionMaster.cpp b/src/xrpld/app/ledger/detail/TransactionMaster.cpp index e2e1213a37..7acc3579b0 100644 --- a/src/xrpld/app/ledger/detail/TransactionMaster.cpp +++ b/src/xrpld/app/ledger/detail/TransactionMaster.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/main/Application.cpp b/src/xrpld/app/main/Application.cpp index 3953b56d67..aa502b4143 100644 --- a/src/xrpld/app/main/Application.cpp +++ b/src/xrpld/app/main/Application.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -57,10 +56,10 @@ #include #include #include + #include #include #include -#include #include #include #include @@ -86,7 +85,6 @@ #include #include #include -#include namespace ripple { @@ -1557,10 +1555,10 @@ ApplicationImp::run() if (!config_->standalone()) { // VFALCO NOTE This seems unnecessary. If we properly refactor the load - // manager then the deadlock detector can just always be + // manager then the stall detector can just always be // "armed" // - getLoadManager().activateDeadlockDetector(); + getLoadManager().activateStallDetector(); } { diff --git a/src/xrpld/app/main/Application.h b/src/xrpld/app/main/Application.h index 8f2dd606de..27d1840766 100644 --- a/src/xrpld/app/main/Application.h +++ b/src/xrpld/app/main/Application.h @@ -22,14 +22,15 @@ #include #include -#include #include + #include #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/main/BasicApp.cpp b/src/xrpld/app/main/BasicApp.cpp index 504309d083..a4b1a74685 100644 --- a/src/xrpld/app/main/BasicApp.cpp +++ b/src/xrpld/app/main/BasicApp.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include BasicApp::BasicApp(std::size_t numberOfThreads) diff --git a/src/xrpld/app/main/BasicApp.h b/src/xrpld/app/main/BasicApp.h index 1c42a3d333..cd1e8c1a71 100644 --- a/src/xrpld/app/main/BasicApp.h +++ b/src/xrpld/app/main/BasicApp.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_BASICAPP_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/main/CollectorManager.cpp b/src/xrpld/app/main/CollectorManager.cpp index ae7ff965f5..81f59d8e2b 100644 --- a/src/xrpld/app/main/CollectorManager.cpp +++ b/src/xrpld/app/main/CollectorManager.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index 7dc4d03b2c..2ee811dc19 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -18,11 +18,11 @@ //============================================================================== #include -#include -#include - #include + +#include #include +#include namespace ripple { @@ -447,8 +447,8 @@ GRPCServerImpl::handleRpcs() if (!ok) { - JLOG(journal_.debug()) << "Request listener cancelled. " - << "Destroying object"; + JLOG(journal_.debug()) + << "Request listener cancelled. " << "Destroying object"; erase(ptr); } else diff --git a/src/xrpld/app/main/GRPCServer.h b/src/xrpld/app/main/GRPCServer.h index 0298a40493..2ecbd5e7da 100644 --- a/src/xrpld/app/main/GRPCServer.h +++ b/src/xrpld/app/main/GRPCServer.h @@ -28,11 +28,10 @@ #include #include #include -#include -#include -#include #include +#include + #include namespace ripple { diff --git a/src/xrpld/app/main/LoadManager.cpp b/src/xrpld/app/main/LoadManager.cpp index 01b96a3d26..9ae9e44a3a 100644 --- a/src/xrpld/app/main/LoadManager.cpp +++ b/src/xrpld/app/main/LoadManager.cpp @@ -21,9 +21,10 @@ #include #include #include -#include + #include #include + #include #include #include @@ -31,7 +32,7 @@ namespace ripple { LoadManager::LoadManager(Application& app, beast::Journal journal) - : app_(app), journal_(journal), deadLock_(), armed_(false) + : app_(app), journal_(journal), lastHeartbeat_(), armed_(false) { } @@ -52,19 +53,19 @@ LoadManager::~LoadManager() //------------------------------------------------------------------------------ void -LoadManager::activateDeadlockDetector() +LoadManager::activateStallDetector() { std::lock_guard sl(mutex_); armed_ = true; - deadLock_ = std::chrono::steady_clock::now(); + lastHeartbeat_ = std::chrono::steady_clock::now(); } void -LoadManager::resetDeadlockDetector() +LoadManager::heartbeat() { - auto const detector_start = std::chrono::steady_clock::now(); + auto const heartbeat = std::chrono::steady_clock::now(); std::lock_guard sl(mutex_); - deadLock_ = detector_start; + lastHeartbeat_ = heartbeat; } //------------------------------------------------------------------------------ @@ -117,63 +118,62 @@ LoadManager::run() break; // Copy out shared data under a lock. Use copies outside lock. - auto const deadLock = deadLock_; + auto const lastHeartbeat = lastHeartbeat_; auto const armed = armed_; sl.unlock(); - // Measure the amount of time we have been deadlocked, in seconds. + // Measure the amount of time we have been stalled, in seconds. using namespace std::chrono; - auto const timeSpentDeadlocked = - duration_cast(steady_clock::now() - deadLock); + auto const timeSpentStalled = + duration_cast(steady_clock::now() - lastHeartbeat); constexpr auto reportingIntervalSeconds = 10s; - constexpr auto deadlockFatalLogMessageTimeLimit = 90s; - constexpr auto deadlockLogicErrorTimeLimit = 600s; + constexpr auto stallFatalLogMessageTimeLimit = 90s; + constexpr auto stallLogicErrorTimeLimit = 600s; - if (armed && (timeSpentDeadlocked >= reportingIntervalSeconds)) + if (armed && (timeSpentStalled >= reportingIntervalSeconds)) { - // Report the deadlocked condition every - // reportingIntervalSeconds - if ((timeSpentDeadlocked % reportingIntervalSeconds) == 0s) + // Report the stalled condition every reportingIntervalSeconds + if ((timeSpentStalled % reportingIntervalSeconds) == 0s) { - if (timeSpentDeadlocked < deadlockFatalLogMessageTimeLimit) + if (timeSpentStalled < stallFatalLogMessageTimeLimit) { JLOG(journal_.warn()) - << "Server stalled for " << timeSpentDeadlocked.count() + << "Server stalled for " << timeSpentStalled.count() << " seconds."; + if (app_.getJobQueue().isOverloaded()) { - JLOG(journal_.warn()) << app_.getJobQueue().getJson(0); + JLOG(journal_.warn()) + << "JobQueue: " << app_.getJobQueue().getJson(0); } } else { JLOG(journal_.fatal()) - << "Deadlock detected. Deadlocked time: " - << timeSpentDeadlocked.count() << "s"; + << "Server stalled for " << timeSpentStalled.count() + << " seconds."; JLOG(journal_.fatal()) << "JobQueue: " << app_.getJobQueue().getJson(0); } } - // If we go over the deadlockTimeLimit spent deadlocked, it - // means that the deadlock resolution code has failed, which - // qualifies as undefined behavior. - // - if (timeSpentDeadlocked >= deadlockLogicErrorTimeLimit) + // If we go over the stallLogicErrorTimeLimit spent stalled, it + // means that the stall resolution code has failed, which qualifies + // as a LogicError + if (timeSpentStalled >= stallLogicErrorTimeLimit) { JLOG(journal_.fatal()) - << "LogicError: Deadlock detected. Deadlocked time: " - << timeSpentDeadlocked.count() << "s"; + << "LogicError: Fatal server stall detected. Stalled time: " + << timeSpentStalled.count() << "s"; JLOG(journal_.fatal()) << "JobQueue: " << app_.getJobQueue().getJson(0); - LogicError("Deadlock detected"); + LogicError("Fatal server stall detected"); } } } - bool change; - + bool change = false; if (app_.getJobQueue().isOverloaded()) { JLOG(journal_.info()) << "Raising local fee (JQ overload): " diff --git a/src/xrpld/app/main/LoadManager.h b/src/xrpld/app/main/LoadManager.h index f818068dcf..166c40538c 100644 --- a/src/xrpld/app/main/LoadManager.h +++ b/src/xrpld/app/main/LoadManager.h @@ -21,8 +21,8 @@ #define RIPPLE_APP_MAIN_LOADMANAGER_H_INCLUDED #include + #include -#include #include #include #include @@ -58,28 +58,28 @@ public: */ ~LoadManager(); - /** Turn on deadlock detection. + /** Turn on stall detection. - The deadlock detector begins in a disabled state. After this function - is called, it will report deadlocks using a separate thread whenever + The stall detector begins in a disabled state. After this function + is called, it will report stalls using a separate thread whenever the reset function is not called at least once per 10 seconds. - @see resetDeadlockDetector + @see resetStallDetector */ - // VFALCO NOTE it seems that the deadlock detector has an "armed" state + // VFALCO NOTE it seems that the stall detector has an "armed" state // to prevent it from going off during program startup if // there's a lengthy initialization operation taking place? // void - activateDeadlockDetector(); + activateStallDetector(); - /** Reset the deadlock detection timer. + /** Reset the stall detection timer. - A dedicated thread monitors the deadlock timer, and if too much + A dedicated thread monitors the stall timer, and if too much time passes it will produce log warnings. */ void - resetDeadlockDetector(); + heartbeat(); //-------------------------------------------------------------------------- @@ -98,12 +98,12 @@ private: beast::Journal const journal_; std::thread thread_; - std::mutex mutex_; // Guards deadLock_, armed_, cv_ + std::mutex mutex_; // Guards lastHeartbeat_, armed_, cv_ std::condition_variable cv_; bool stop_ = false; - std::chrono::steady_clock::time_point - deadLock_; // Detect server deadlocks. + // Detect server stalls + std::chrono::steady_clock::time_point lastHeartbeat_; bool armed_; friend std::unique_ptr diff --git a/src/xrpld/app/main/Main.cpp b/src/xrpld/app/main/Main.cpp index 6e92c2e83a..2fa0f68df4 100644 --- a/src/xrpld/app/main/Main.cpp +++ b/src/xrpld/app/main/Main.cpp @@ -18,34 +18,26 @@ //============================================================================== #include -#include #include #include #include #include #include -#include + #include -#include -#include -#include #include -#include #include -#include #ifdef ENABLE_TESTS #include + #include #endif // ENABLE_TESTS - -#include - -#include -#include #include #include +#include + #include #include #include diff --git a/src/xrpld/app/main/NodeIdentity.cpp b/src/xrpld/app/main/NodeIdentity.cpp index e0b83d54c8..a1da64a0f9 100644 --- a/src/xrpld/app/main/NodeIdentity.cpp +++ b/src/xrpld/app/main/NodeIdentity.cpp @@ -22,7 +22,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeIdentity.h b/src/xrpld/app/main/NodeIdentity.h index b4da865194..3616255c13 100644 --- a/src/xrpld/app/main/NodeIdentity.h +++ b/src/xrpld/app/main/NodeIdentity.h @@ -21,10 +21,11 @@ #define RIPPLE_APP_MAIN_NODEIDENTITY_H_INCLUDED #include + #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeStoreScheduler.cpp b/src/xrpld/app/main/NodeStoreScheduler.cpp index f2dce5421f..6ef2ff3ca6 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.cpp +++ b/src/xrpld/app/main/NodeStoreScheduler.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeStoreScheduler.h b/src/xrpld/app/main/NodeStoreScheduler.h index b16142b261..c21cc93934 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.h +++ b/src/xrpld/app/main/NodeStoreScheduler.h @@ -22,7 +22,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/AMMHelpers.h b/src/xrpld/app/misc/AMMHelpers.h index c6c0c808bf..f27d542e32 100644 --- a/src/xrpld/app/misc/AMMHelpers.h +++ b/src/xrpld/app/misc/AMMHelpers.h @@ -30,11 +30,8 @@ #include #include #include -#include #include -#include - namespace ripple { namespace detail { diff --git a/src/xrpld/app/misc/AMMUtils.h b/src/xrpld/app/misc/AMMUtils.h index 52fe819a28..ebc2834109 100644 --- a/src/xrpld/app/misc/AMMUtils.h +++ b/src/xrpld/app/misc/AMMUtils.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED #define RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED #include + #include #include #include diff --git a/src/xrpld/app/misc/AmendmentTable.h b/src/xrpld/app/misc/AmendmentTable.h index d6193adca2..deb0386236 100644 --- a/src/xrpld/app/misc/AmendmentTable.h +++ b/src/xrpld/app/misc/AmendmentTable.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/misc/CredentialHelpers.cpp b/src/xrpld/app/misc/CredentialHelpers.cpp index a18cd40336..dcc5975b34 100644 --- a/src/xrpld/app/misc/CredentialHelpers.cpp +++ b/src/xrpld/app/misc/CredentialHelpers.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/misc/CredentialHelpers.h b/src/xrpld/app/misc/CredentialHelpers.h index acc4f2621d..8b52acf54e 100644 --- a/src/xrpld/app/misc/CredentialHelpers.h +++ b/src/xrpld/app/misc/CredentialHelpers.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED +#define RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED #include @@ -78,3 +79,5 @@ verifyDepositPreauth( std::shared_ptr const& sleDst); } // namespace ripple + +#endif diff --git a/src/xrpld/app/misc/DeliverMax.h b/src/xrpld/app/misc/DeliverMax.h index 3bc875ee4b..815bf52189 100644 --- a/src/xrpld/app/misc/DeliverMax.h +++ b/src/xrpld/app/misc/DeliverMax.h @@ -22,9 +22,6 @@ #include -#include -#include - namespace Json { class Value; } diff --git a/src/xrpld/app/misc/FeeVote.h b/src/xrpld/app/misc/FeeVote.h index 47769e21e4..35f723aa02 100644 --- a/src/xrpld/app/misc/FeeVote.h +++ b/src/xrpld/app/misc/FeeVote.h @@ -22,9 +22,8 @@ #include #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 5583b68862..e312ab042f 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include #include -#include + #include #include #include diff --git a/src/xrpld/app/misc/LoadFeeTrack.h b/src/xrpld/app/misc/LoadFeeTrack.h index 875a7bb7df..0064359c76 100644 --- a/src/xrpld/app/misc/LoadFeeTrack.h +++ b/src/xrpld/app/misc/LoadFeeTrack.h @@ -22,9 +22,8 @@ #include #include -#include -#include #include + #include #include #include diff --git a/src/xrpld/app/misc/NegativeUNLVote.h b/src/xrpld/app/misc/NegativeUNLVote.h index f0284f267a..72ed965717 100644 --- a/src/xrpld/app/misc/NegativeUNLVote.h +++ b/src/xrpld/app/misc/NegativeUNLVote.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_MISC_NEGATIVEUNLVOTE_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 2b3c38eea4..b721c80bfd 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -50,23 +50,22 @@ #include #include #include + #include #include #include #include -#include #include #include #include -#include #include #include #include #include -#include #include #include #include + #include #include @@ -79,7 +78,6 @@ #include #include #include -#include namespace ripple { @@ -252,6 +250,12 @@ public: beast::get_abstract_clock(), validatorKeys, app_.logs().journal("LedgerConsensus")) + , validatorPK_( + validatorKeys.keys ? validatorKeys.keys->publicKey + : decltype(validatorPK_){}) + , validatorMasterPK_( + validatorKeys.keys ? validatorKeys.keys->masterPublicKey + : decltype(validatorMasterPK_){}) , m_ledgerMaster(ledgerMaster) , m_job_queue(job_queue) , m_standalone(standalone) @@ -735,6 +739,9 @@ private: RCLConsensus mConsensus; + std::optional const validatorPK_; + std::optional const validatorMasterPK_; + ConsensusPhase mLastConsensusPhase; LedgerMaster& m_ledgerMaster; @@ -1018,7 +1025,7 @@ NetworkOPsImp::processHeartbeatTimer() // VFALCO NOTE This is for diagnosing a crash on exit LoadManager& mgr(app_.getLoadManager()); - mgr.resetDeadlockDetector(); + mgr.heartbeat(); std::size_t const numPeers = app_.overlay().size(); @@ -1920,6 +1927,23 @@ NetworkOPsImp::beginConsensus( bool NetworkOPsImp::processTrustedProposal(RCLCxPeerPos peerPos) { + auto const& peerKey = peerPos.publicKey(); + if (validatorPK_ == peerKey || validatorMasterPK_ == peerKey) + { + // Could indicate a operator misconfiguration where two nodes are + // running with the same validator key configured, so this isn't fatal, + // and it doesn't necessarily indicate peer misbehavior. But since this + // is a trusted message, it could be a very big deal. Either way, we + // don't want to relay the proposal. Note that the byzantine behavior + // detection in handleNewValidation will notify other peers. + UNREACHABLE( + "ripple::NetworkOPsImp::processTrustedProposal : received own " + "proposal"); + JLOG(m_journal.error()) + << "Received a TRUSTED proposal signed with my key from a peer"; + return false; + } + return mConsensus.peerProposal(app_.timeKeeper().closeTime(), peerPos); } diff --git a/src/xrpld/app/misc/NetworkOPs.h b/src/xrpld/app/misc/NetworkOPs.h index be849531e2..e353552213 100644 --- a/src/xrpld/app/misc/NetworkOPs.h +++ b/src/xrpld/app/misc/NetworkOPs.h @@ -25,12 +25,13 @@ #include #include #include + #include #include + #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/SHAMapStore.h b/src/xrpld/app/misc/SHAMapStore.h index d8415713a7..d2836be287 100644 --- a/src/xrpld/app/misc/SHAMapStore.h +++ b/src/xrpld/app/misc/SHAMapStore.h @@ -22,7 +22,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/misc/SHAMapStoreImp.cpp b/src/xrpld/app/misc/SHAMapStoreImp.cpp index e2e0e3b9c4..52ea40cf94 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.cpp +++ b/src/xrpld/app/misc/SHAMapStoreImp.cpp @@ -17,16 +17,16 @@ */ //============================================================================== -#include - #include #include +#include #include #include #include #include #include #include + #include #include diff --git a/src/xrpld/app/misc/SHAMapStoreImp.h b/src/xrpld/app/misc/SHAMapStoreImp.h index 7d36f092be..2b618f6538 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.h +++ b/src/xrpld/app/misc/SHAMapStoreImp.h @@ -22,15 +22,13 @@ #include #include -#include #include #include #include - #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/misc/TxQ.h b/src/xrpld/app/misc/TxQ.h index db5af4509f..6fc61055f1 100644 --- a/src/xrpld/app/misc/TxQ.h +++ b/src/xrpld/app/misc/TxQ.h @@ -23,12 +23,15 @@ #include #include #include + #include #include #include #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/ValidatorKeys.h b/src/xrpld/app/misc/ValidatorKeys.h index f5b9e5735a..d29d6cdc6d 100644 --- a/src/xrpld/app/misc/ValidatorKeys.h +++ b/src/xrpld/app/misc/ValidatorKeys.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/ValidatorList.h b/src/xrpld/app/misc/ValidatorList.h index 7576455798..4e18aa5db3 100644 --- a/src/xrpld/app/misc/ValidatorList.h +++ b/src/xrpld/app/misc/ValidatorList.h @@ -23,16 +23,16 @@ #include #include #include + #include #include #include #include #include -#include -#include + #include + #include -#include #include namespace protocol { diff --git a/src/xrpld/app/misc/ValidatorSite.h b/src/xrpld/app/misc/ValidatorSite.h index 39bf895807..88e30e28ab 100644 --- a/src/xrpld/app/misc/ValidatorSite.h +++ b/src/xrpld/app/misc/ValidatorSite.h @@ -23,14 +23,13 @@ #include #include #include -#include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/misc/detail/AMMUtils.cpp b/src/xrpld/app/misc/detail/AMMUtils.cpp index 0b83afc6d3..5078049a4a 100644 --- a/src/xrpld/app/misc/detail/AMMUtils.cpp +++ b/src/xrpld/app/misc/detail/AMMUtils.cpp @@ -16,11 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include -#include #include namespace ripple { @@ -149,8 +150,8 @@ ammLPHolds( } amount.setIssuer(ammAccount); - JLOG(j.trace()) << "ammLPHolds:" - << " lpAccount=" << to_string(lpAccount) + JLOG(j.trace()) << "ammLPHolds:" << " lpAccount=" + << to_string(lpAccount) << " amount=" << amount.getFullText(); } diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.cpp b/src/xrpld/app/misc/detail/AccountTxPaging.cpp index 898c41b40c..278680581e 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.cpp +++ b/src/xrpld/app/misc/detail/AccountTxPaging.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include #include #include #include + #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.h b/src/xrpld/app/misc/detail/AccountTxPaging.h index 23a5cbd9c2..062c3e867d 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.h +++ b/src/xrpld/app/misc/detail/AccountTxPaging.h @@ -21,9 +21,8 @@ #define RIPPLE_APP_MISC_IMPL_ACCOUNTTXPAGING_H_INCLUDED #include + #include -#include -#include //------------------------------------------------------------------------------ diff --git a/src/xrpld/app/misc/detail/AmendmentTable.cpp b/src/xrpld/app/misc/detail/AmendmentTable.cpp index d7a5ae8247..ae41a2aa7e 100644 --- a/src/xrpld/app/misc/detail/AmendmentTable.cpp +++ b/src/xrpld/app/misc/detail/AmendmentTable.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -30,6 +31,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp index 50fb0ac14d..96e7555401 100644 --- a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp +++ b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp @@ -18,18 +18,14 @@ //============================================================================== #include -#include #include + #include #include #include #include -#include -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/Manifest.cpp b/src/xrpld/app/misc/detail/Manifest.cpp index 04c8523aec..c42256495e 100644 --- a/src/xrpld/app/misc/detail/Manifest.cpp +++ b/src/xrpld/app/misc/detail/Manifest.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/misc/detail/Transaction.cpp b/src/xrpld/app/misc/detail/Transaction.cpp index 30af6b773d..89bf1a7202 100644 --- a/src/xrpld/app/misc/detail/Transaction.cpp +++ b/src/xrpld/app/misc/detail/Transaction.cpp @@ -23,12 +23,9 @@ #include #include #include -#include -#include + #include -#include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/misc/detail/TxQ.cpp b/src/xrpld/app/misc/detail/TxQ.cpp index 6e7a213908..11d81fb8ae 100644 --- a/src/xrpld/app/misc/detail/TxQ.cpp +++ b/src/xrpld/app/misc/detail/TxQ.cpp @@ -19,13 +19,14 @@ #include #include -#include #include #include + #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorKeys.cpp b/src/xrpld/app/misc/detail/ValidatorKeys.cpp index 2b36848c88..8227c5bcdb 100644 --- a/src/xrpld/app/misc/detail/ValidatorKeys.cpp +++ b/src/xrpld/app/misc/detail/ValidatorKeys.cpp @@ -17,11 +17,11 @@ */ //============================================================================== -#include - #include +#include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorList.cpp b/src/xrpld/app/misc/detail/ValidatorList.cpp index 3a81443db6..282c3c9e19 100644 --- a/src/xrpld/app/misc/detail/ValidatorList.cpp +++ b/src/xrpld/app/misc/detail/ValidatorList.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -31,6 +32,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorSite.cpp b/src/xrpld/app/misc/detail/ValidatorSite.cpp index 1994f49861..799689ef25 100644 --- a/src/xrpld/app/misc/detail/ValidatorSite.cpp +++ b/src/xrpld/app/misc/detail/ValidatorSite.cpp @@ -22,11 +22,11 @@ #include #include #include -#include -#include + #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/detail/Work.h b/src/xrpld/app/misc/detail/Work.h index afd49adf32..15be569566 100644 --- a/src/xrpld/app/misc/detail/Work.h +++ b/src/xrpld/app/misc/detail/Work.h @@ -20,10 +20,6 @@ #ifndef RIPPLE_APP_MISC_DETAIL_WORK_H_INCLUDED #define RIPPLE_APP_MISC_DETAIL_WORK_H_INCLUDED -// TODO: This include is a workaround for beast compilation bug. -// Remove when fix https://github.com/boostorg/beast/pull/2682/ is available. -#include - #include #include diff --git a/src/xrpld/app/misc/detail/WorkBase.h b/src/xrpld/app/misc/detail/WorkBase.h index cd90926511..a2b852edfd 100644 --- a/src/xrpld/app/misc/detail/WorkBase.h +++ b/src/xrpld/app/misc/detail/WorkBase.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_MISC_DETAIL_WORKBASE_H_INCLUDED #include + #include #include @@ -30,8 +31,6 @@ #include #include -#include - namespace ripple { namespace detail { diff --git a/src/xrpld/app/misc/detail/WorkFile.h b/src/xrpld/app/misc/detail/WorkFile.h index 9b8d86f5e1..51fd6db78c 100644 --- a/src/xrpld/app/misc/detail/WorkFile.h +++ b/src/xrpld/app/misc/detail/WorkFile.h @@ -21,10 +21,10 @@ #define RIPPLE_APP_MISC_DETAIL_WORKFILE_H_INCLUDED #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/detail/WorkSSL.cpp b/src/xrpld/app/misc/detail/WorkSSL.cpp similarity index 100% rename from src/xrpld/app/misc/detail/detail/WorkSSL.cpp rename to src/xrpld/app/misc/detail/WorkSSL.cpp diff --git a/src/xrpld/app/misc/detail/WorkSSL.h b/src/xrpld/app/misc/detail/WorkSSL.h index d48f0b5fdf..2d423a9e50 100644 --- a/src/xrpld/app/misc/detail/WorkSSL.h +++ b/src/xrpld/app/misc/detail/WorkSSL.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/src/xrpld/app/paths/AMMLiquidity.h b/src/xrpld/app/paths/AMMLiquidity.h index fe60d39262..b41e26ac84 100644 --- a/src/xrpld/app/paths/AMMLiquidity.h +++ b/src/xrpld/app/paths/AMMLiquidity.h @@ -25,9 +25,9 @@ #include #include #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/AMMOffer.h b/src/xrpld/app/paths/AMMOffer.h index e90a5b8611..9241ba2057 100644 --- a/src/xrpld/app/paths/AMMOffer.h +++ b/src/xrpld/app/paths/AMMOffer.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/paths/AccountCurrencies.h b/src/xrpld/app/paths/AccountCurrencies.h index 26282e742c..566fad9104 100644 --- a/src/xrpld/app/paths/AccountCurrencies.h +++ b/src/xrpld/app/paths/AccountCurrencies.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_ACCOUNTCURRENCIES_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/Credit.cpp b/src/xrpld/app/paths/Credit.cpp index e027949e76..ca721e4edf 100644 --- a/src/xrpld/app/paths/Credit.cpp +++ b/src/xrpld/app/paths/Credit.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/paths/Credit.h b/src/xrpld/app/paths/Credit.h index b71ec057ae..0ea2d687dd 100644 --- a/src/xrpld/app/paths/Credit.h +++ b/src/xrpld/app/paths/Credit.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_CREDIT_H_INCLUDED #include + #include #include diff --git a/src/xrpld/app/paths/Flow.cpp b/src/xrpld/app/paths/Flow.cpp index 3df8f6f999..66793fc74c 100644 --- a/src/xrpld/app/paths/Flow.cpp +++ b/src/xrpld/app/paths/Flow.cpp @@ -23,15 +23,11 @@ #include #include #include + #include #include #include -#include - -#include -#include - namespace ripple { template diff --git a/src/xrpld/app/paths/Flow.h b/src/xrpld/app/paths/Flow.h index 5390394b7f..048b8785f1 100644 --- a/src/xrpld/app/paths/Flow.h +++ b/src/xrpld/app/paths/Flow.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequest.cpp b/src/xrpld/app/paths/PathRequest.cpp index 643923320a..dc2868eaf2 100644 --- a/src/xrpld/app/paths/PathRequest.cpp +++ b/src/xrpld/app/paths/PathRequest.cpp @@ -26,15 +26,15 @@ #include #include #include +#include + #include #include #include #include #include -#include #include - #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequest.h b/src/xrpld/app/paths/PathRequest.h index 21f10d066b..3fdbecf7ed 100644 --- a/src/xrpld/app/paths/PathRequest.h +++ b/src/xrpld/app/paths/PathRequest.h @@ -24,13 +24,14 @@ #include #include #include + #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequests.cpp b/src/xrpld/app/paths/PathRequests.cpp index 86560445ec..9ada526751 100644 --- a/src/xrpld/app/paths/PathRequests.cpp +++ b/src/xrpld/app/paths/PathRequests.cpp @@ -21,11 +21,12 @@ #include #include #include + #include #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequests.h b/src/xrpld/app/paths/PathRequests.h index 670790518a..fadf6b7b7c 100644 --- a/src/xrpld/app/paths/PathRequests.h +++ b/src/xrpld/app/paths/PathRequests.h @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/app/paths/Pathfinder.cpp b/src/xrpld/app/paths/Pathfinder.cpp index 5864357aec..379bb07e4b 100644 --- a/src/xrpld/app/paths/Pathfinder.cpp +++ b/src/xrpld/app/paths/Pathfinder.cpp @@ -23,9 +23,9 @@ #include #include #include -#include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/Pathfinder.h b/src/xrpld/app/paths/Pathfinder.h index 01556a3c63..973fda8855 100644 --- a/src/xrpld/app/paths/Pathfinder.h +++ b/src/xrpld/app/paths/Pathfinder.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/RippleCalc.cpp b/src/xrpld/app/paths/RippleCalc.cpp index c7b2e1f01e..c783bb8e9f 100644 --- a/src/xrpld/app/paths/RippleCalc.cpp +++ b/src/xrpld/app/paths/RippleCalc.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/paths/RippleCalc.h b/src/xrpld/app/paths/RippleCalc.h index 9e03da9c90..45f68725cc 100644 --- a/src/xrpld/app/paths/RippleCalc.h +++ b/src/xrpld/app/paths/RippleCalc.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_RIPPLECALC_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/paths/RippleLineCache.cpp b/src/xrpld/app/paths/RippleLineCache.cpp index 38b630eeb7..f047dc9500 100644 --- a/src/xrpld/app/paths/RippleLineCache.cpp +++ b/src/xrpld/app/paths/RippleLineCache.cpp @@ -19,7 +19,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/RippleLineCache.h b/src/xrpld/app/paths/RippleLineCache.h index cde1d589f9..5a3188c810 100644 --- a/src/xrpld/app/paths/RippleLineCache.h +++ b/src/xrpld/app/paths/RippleLineCache.h @@ -22,11 +22,11 @@ #include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/paths/TrustLine.cpp b/src/xrpld/app/paths/TrustLine.cpp index 6390c8d211..28572b899e 100644 --- a/src/xrpld/app/paths/TrustLine.cpp +++ b/src/xrpld/app/paths/TrustLine.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include #include + #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/TrustLine.h b/src/xrpld/app/paths/TrustLine.h index 4189f7ff48..efbe281f5e 100644 --- a/src/xrpld/app/paths/TrustLine.h +++ b/src/xrpld/app/paths/TrustLine.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_RIPPLESTATE_H_INCLUDED #include + #include #include #include @@ -100,12 +101,6 @@ public: return mFlags & (!mViewLowest ? lsfLowAuth : lsfHighAuth); } - bool - getDefaultRipple() const - { - return mFlags & lsfDefaultRipple; - } - bool getNoRipple() const { diff --git a/src/xrpld/app/paths/detail/AMMLiquidity.cpp b/src/xrpld/app/paths/detail/AMMLiquidity.cpp index 813554ba7f..83894b2e76 100644 --- a/src/xrpld/app/paths/detail/AMMLiquidity.cpp +++ b/src/xrpld/app/paths/detail/AMMLiquidity.cpp @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include +#include #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/AMMOffer.cpp b/src/xrpld/app/paths/detail/AMMOffer.cpp index 16ea8628f3..c719c0a92d 100644 --- a/src/xrpld/app/paths/detail/AMMOffer.cpp +++ b/src/xrpld/app/paths/detail/AMMOffer.cpp @@ -15,10 +15,11 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -//==============================================================================/ -#include +//============================================================================== #include +#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/BookStep.cpp b/src/xrpld/app/paths/detail/BookStep.cpp index 1d35f80b18..5e650230fe 100644 --- a/src/xrpld/app/paths/detail/BookStep.cpp +++ b/src/xrpld/app/paths/detail/BookStep.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/detail/DirectStep.cpp b/src/xrpld/app/paths/detail/DirectStep.cpp index 46aa129ac7..4e5ccea3f1 100644 --- a/src/xrpld/app/paths/detail/DirectStep.cpp +++ b/src/xrpld/app/paths/detail/DirectStep.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -204,8 +205,7 @@ protected: logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " - << "\nSrc: " << src_ << "\nDst: " << dst_; + ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; return ostr.str(); } diff --git a/src/xrpld/app/paths/detail/FlowDebugInfo.h b/src/xrpld/app/paths/detail/FlowDebugInfo.h index 4c3ea5faf1..e28b34f5d1 100644 --- a/src/xrpld/app/paths/detail/FlowDebugInfo.h +++ b/src/xrpld/app/paths/detail/FlowDebugInfo.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/paths/detail/PaySteps.cpp b/src/xrpld/app/paths/detail/PaySteps.cpp index b73b1ac8ac..99f212d548 100644 --- a/src/xrpld/app/paths/detail/PaySteps.cpp +++ b/src/xrpld/app/paths/detail/PaySteps.cpp @@ -19,16 +19,13 @@ #include #include + #include -#include #include -#include #include #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/paths/detail/StepChecks.h b/src/xrpld/app/paths/detail/StepChecks.h index d4fda2bfe6..4acafd1b9a 100644 --- a/src/xrpld/app/paths/detail/StepChecks.h +++ b/src/xrpld/app/paths/detail/StepChecks.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/paths/detail/Steps.h b/src/xrpld/app/paths/detail/Steps.h index dee90f617a..bb9abf6545 100644 --- a/src/xrpld/app/paths/detail/Steps.h +++ b/src/xrpld/app/paths/detail/Steps.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_IMPL_PAYSTEPS_H_INCLUDED #include + #include #include #include @@ -28,6 +29,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/StrandFlow.h b/src/xrpld/app/paths/detail/StrandFlow.h index 0e168b73cc..47037c5f5e 100644 --- a/src/xrpld/app/paths/detail/StrandFlow.h +++ b/src/xrpld/app/paths/detail/StrandFlow.h @@ -28,8 +28,8 @@ #include #include #include + #include -#include #include #include #include @@ -39,7 +39,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp index ab211a7c85..4f38a7b422 100644 --- a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp +++ b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include @@ -30,7 +31,6 @@ #include -#include #include namespace ripple { diff --git a/src/xrpld/app/rdb/RelationalDatabase.h b/src/xrpld/app/rdb/RelationalDatabase.h index a7528e2370..927b08d385 100644 --- a/src/xrpld/app/rdb/RelationalDatabase.h +++ b/src/xrpld/app/rdb/RelationalDatabase.h @@ -25,11 +25,11 @@ #include #include #include -#include #include + #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/rdb/State.h b/src/xrpld/app/rdb/State.h index e65e9d4d57..595e749f18 100644 --- a/src/xrpld/app/rdb/State.h +++ b/src/xrpld/app/rdb/State.h @@ -25,6 +25,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/Wallet.h b/src/xrpld/app/rdb/Wallet.h index 6130c9fc26..5cbb356520 100644 --- a/src/xrpld/app/rdb/Wallet.h +++ b/src/xrpld/app/rdb/Wallet.h @@ -20,12 +20,10 @@ #ifndef RIPPLE_APP_RDB_WALLET_H_INCLUDED #define RIPPLE_APP_RDB_WALLET_H_INCLUDED -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/rdb/backend/detail/Node.cpp b/src/xrpld/app/rdb/backend/detail/Node.cpp index 493e277bfc..a230eac6e3 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.cpp +++ b/src/xrpld/app/rdb/backend/detail/Node.cpp @@ -22,16 +22,17 @@ #include #include #include -#include #include #include #include #include + #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/backend/detail/Node.h b/src/xrpld/app/rdb/backend/detail/Node.h index 59c484d206..0e8c678be5 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.h +++ b/src/xrpld/app/rdb/backend/detail/Node.h @@ -21,12 +21,8 @@ #define RIPPLE_APP_RDB_BACKEND_DETAIL_NODE_H_INCLUDED #include -#include #include #include -#include -#include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp index 95836a85bb..edd1fb2174 100644 --- a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp +++ b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp @@ -17,20 +17,15 @@ */ //============================================================================== -#include #include -#include #include -#include #include #include #include #include #include -#include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/rdb/detail/Vacuum.cpp b/src/xrpld/app/rdb/detail/Vacuum.cpp index 3c61fb5790..4231f090a3 100644 --- a/src/xrpld/app/rdb/detail/Vacuum.cpp +++ b/src/xrpld/app/rdb/detail/Vacuum.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/detail/Wallet.cpp b/src/xrpld/app/rdb/detail/Wallet.cpp index ffb2859691..0a329f2ccb 100644 --- a/src/xrpld/app/rdb/detail/Wallet.cpp +++ b/src/xrpld/app/rdb/detail/Wallet.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/apply.h b/src/xrpld/app/tx/apply.h index 38325252c9..101f9a946d 100644 --- a/src/xrpld/app/tx/apply.h +++ b/src/xrpld/app/tx/apply.h @@ -23,10 +23,10 @@ #include #include #include + #include #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/applySteps.h b/src/xrpld/app/tx/applySteps.h index c1eb17c992..2a5557ff4b 100644 --- a/src/xrpld/app/tx/applySteps.h +++ b/src/xrpld/app/tx/applySteps.h @@ -21,6 +21,7 @@ #define RIPPLE_TX_APPLYSTEPS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMBid.cpp b/src/xrpld/app/tx/detail/AMMBid.cpp index e8a14c1492..6fec46be90 100644 --- a/src/xrpld/app/tx/detail/AMMBid.cpp +++ b/src/xrpld/app/tx/detail/AMMBid.cpp @@ -17,15 +17,14 @@ */ //============================================================================== -#include - #include #include +#include #include #include + #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMClawback.cpp b/src/xrpld/app/tx/detail/AMMClawback.cpp index 162224ff91..64a42374ec 100644 --- a/src/xrpld/app/tx/detail/AMMClawback.cpp +++ b/src/xrpld/app/tx/detail/AMMClawback.cpp @@ -23,12 +23,12 @@ #include #include #include -#include + #include #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMCreate.cpp b/src/xrpld/app/tx/detail/AMMCreate.cpp index 31773166d4..deafa6f27a 100644 --- a/src/xrpld/app/tx/detail/AMMCreate.cpp +++ b/src/xrpld/app/tx/detail/AMMCreate.cpp @@ -17,16 +17,15 @@ */ //============================================================================== -#include - #include #include #include +#include #include #include + #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMDelete.cpp b/src/xrpld/app/tx/detail/AMMDelete.cpp index 430ac17e87..28d56eab98 100644 --- a/src/xrpld/app/tx/detail/AMMDelete.cpp +++ b/src/xrpld/app/tx/detail/AMMDelete.cpp @@ -17,13 +17,11 @@ */ //============================================================================== -#include - #include +#include #include + #include -#include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMDeposit.cpp b/src/xrpld/app/tx/detail/AMMDeposit.cpp index 675f560098..6a718a3f04 100644 --- a/src/xrpld/app/tx/detail/AMMDeposit.cpp +++ b/src/xrpld/app/tx/detail/AMMDeposit.cpp @@ -17,19 +17,16 @@ */ //============================================================================== -#include - #include #include +#include #include #include + #include #include -#include #include -#include - namespace ripple { NotTEC diff --git a/src/xrpld/app/tx/detail/AMMVote.cpp b/src/xrpld/app/tx/detail/AMMVote.cpp index 1b8b91e518..84d0905a22 100644 --- a/src/xrpld/app/tx/detail/AMMVote.cpp +++ b/src/xrpld/app/tx/detail/AMMVote.cpp @@ -17,14 +17,12 @@ */ //============================================================================== -#include - -#include #include +#include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMWithdraw.cpp b/src/xrpld/app/tx/detail/AMMWithdraw.cpp index 23e8529cfc..586f453c6f 100644 --- a/src/xrpld/app/tx/detail/AMMWithdraw.cpp +++ b/src/xrpld/app/tx/detail/AMMWithdraw.cpp @@ -17,18 +17,15 @@ */ //============================================================================== -#include - #include #include +#include #include + #include #include -#include #include -#include - namespace ripple { NotTEC diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index 5a37f74b2f..71fe246f15 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -19,12 +19,10 @@ #include #include -#include + #include #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 1ddcff5506..715d4ea471 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -23,11 +23,12 @@ #include #include #include + #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/BookTip.cpp b/src/xrpld/app/tx/detail/BookTip.cpp index 011d992dd7..a766efbde1 100644 --- a/src/xrpld/app/tx/detail/BookTip.cpp +++ b/src/xrpld/app/tx/detail/BookTip.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/BookTip.h b/src/xrpld/app/tx/detail/BookTip.h index 4de6b785b9..f215cdb620 100644 --- a/src/xrpld/app/tx/detail/BookTip.h +++ b/src/xrpld/app/tx/detail/BookTip.h @@ -21,11 +21,10 @@ #define RIPPLE_APP_BOOK_BOOKTIP_H_INCLUDED #include + #include #include -#include - namespace ripple { class Logs; diff --git a/src/xrpld/app/tx/detail/CancelCheck.cpp b/src/xrpld/app/tx/detail/CancelCheck.cpp index 7954e86cf3..cfa3bd10e2 100644 --- a/src/xrpld/app/tx/detail/CancelCheck.cpp +++ b/src/xrpld/app/tx/detail/CancelCheck.cpp @@ -17,14 +17,13 @@ */ //============================================================================== -#include - #include +#include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/CancelOffer.cpp b/src/xrpld/app/tx/detail/CancelOffer.cpp index 30e955a828..6d8c077a62 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.cpp +++ b/src/xrpld/app/tx/detail/CancelOffer.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/CancelOffer.h b/src/xrpld/app/tx/detail/CancelOffer.h index 0942e61282..0813dd0aef 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.h +++ b/src/xrpld/app/tx/detail/CancelOffer.h @@ -21,8 +21,7 @@ #define RIPPLE_TX_CANCELOFFER_H_INCLUDED #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CashCheck.cpp b/src/xrpld/app/tx/detail/CashCheck.cpp index f6e5f6f3e3..468adbd209 100644 --- a/src/xrpld/app/tx/detail/CashCheck.cpp +++ b/src/xrpld/app/tx/detail/CashCheck.cpp @@ -20,11 +20,11 @@ #include #include #include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index 2f5d1c6e31..e40e61ff94 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Change.h b/src/xrpld/app/tx/detail/Change.h index b0780a75c0..d710827dd6 100644 --- a/src/xrpld/app/tx/detail/Change.h +++ b/src/xrpld/app/tx/detail/Change.h @@ -20,12 +20,7 @@ #ifndef RIPPLE_TX_CHANGE_H_INCLUDED #define RIPPLE_TX_CHANGE_H_INCLUDED -#include -#include -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Clawback.cpp b/src/xrpld/app/tx/detail/Clawback.cpp index d60acf9fd7..e58faf2286 100644 --- a/src/xrpld/app/tx/detail/Clawback.cpp +++ b/src/xrpld/app/tx/detail/Clawback.cpp @@ -19,12 +19,12 @@ #include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateCheck.cpp b/src/xrpld/app/tx/detail/CreateCheck.cpp index 3a278eed73..19ef28b843 100644 --- a/src/xrpld/app/tx/detail/CreateCheck.cpp +++ b/src/xrpld/app/tx/detail/CreateCheck.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include +#include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/CreateOffer.cpp b/src/xrpld/app/tx/detail/CreateOffer.cpp index f1b6646884..92ba54f077 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.cpp +++ b/src/xrpld/app/tx/detail/CreateOffer.cpp @@ -21,10 +21,10 @@ #include #include #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateOffer.h b/src/xrpld/app/tx/detail/CreateOffer.h index 234267804c..35808c78fe 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.h +++ b/src/xrpld/app/tx/detail/CreateOffer.h @@ -23,7 +23,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateTicket.cpp b/src/xrpld/app/tx/detail/CreateTicket.cpp index b04f4af1d3..594335f489 100644 --- a/src/xrpld/app/tx/detail/CreateTicket.cpp +++ b/src/xrpld/app/tx/detail/CreateTicket.cpp @@ -17,13 +17,12 @@ */ //============================================================================== -#include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateTicket.h b/src/xrpld/app/tx/detail/CreateTicket.h index 099dcde934..86cf91bb5a 100644 --- a/src/xrpld/app/tx/detail/CreateTicket.h +++ b/src/xrpld/app/tx/detail/CreateTicket.h @@ -22,8 +22,6 @@ #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Credentials.cpp b/src/xrpld/app/tx/detail/Credentials.cpp index ca80bc159e..73c397cf37 100644 --- a/src/xrpld/app/tx/detail/Credentials.cpp +++ b/src/xrpld/app/tx/detail/Credentials.cpp @@ -19,15 +19,13 @@ #include #include - -#include #include #include + #include #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/Credentials.h b/src/xrpld/app/tx/detail/Credentials.h index 7e7522d82c..5b4acb3998 100644 --- a/src/xrpld/app/tx/detail/Credentials.h +++ b/src/xrpld/app/tx/detail/Credentials.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TX_CREDENTIALS_H_INCLUDED +#define RIPPLE_TX_CREDENTIALS_H_INCLUDED #include @@ -85,3 +86,5 @@ public: }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/DID.cpp b/src/xrpld/app/tx/detail/DID.cpp index 6e5a3108c7..31ce7c8770 100644 --- a/src/xrpld/app/tx/detail/DID.cpp +++ b/src/xrpld/app/tx/detail/DID.cpp @@ -18,14 +18,13 @@ //============================================================================== #include - #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteAccount.cpp b/src/xrpld/app/tx/detail/DeleteAccount.cpp index 18ddf01a8d..d562069460 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.cpp +++ b/src/xrpld/app/tx/detail/DeleteAccount.cpp @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteAccount.h b/src/xrpld/app/tx/detail/DeleteAccount.h index 5f88a9ba71..c9d3305562 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.h +++ b/src/xrpld/app/tx/detail/DeleteAccount.h @@ -21,8 +21,6 @@ #define RIPPLE_TX_DELETEACCOUNT_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteOracle.cpp b/src/xrpld/app/tx/detail/DeleteOracle.cpp index 807e52ee6b..78e3d55230 100644 --- a/src/xrpld/app/tx/detail/DeleteOracle.cpp +++ b/src/xrpld/app/tx/detail/DeleteOracle.cpp @@ -18,8 +18,8 @@ //============================================================================== #include -#include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/DepositPreauth.cpp b/src/xrpld/app/tx/detail/DepositPreauth.cpp index 599fcd6052..f10f09b38f 100644 --- a/src/xrpld/app/tx/detail/DepositPreauth.cpp +++ b/src/xrpld/app/tx/detail/DepositPreauth.cpp @@ -20,11 +20,11 @@ #include #include #include + #include #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 41b51b295f..165a6df5f4 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -17,24 +17,21 @@ */ //============================================================================== -#include - #include #include #include +#include #include #include #include #include + #include #include -#include #include #include #include #include -#include -#include // During an EscrowFinish, the transaction must specify both // a condition and a fulfillment. We track whether that diff --git a/src/xrpld/app/tx/detail/InvariantCheck.cpp b/src/xrpld/app/tx/detail/InvariantCheck.cpp index d39492c108..b97a0c02ee 100644 --- a/src/xrpld/app/tx/detail/InvariantCheck.cpp +++ b/src/xrpld/app/tx/detail/InvariantCheck.cpp @@ -17,13 +17,13 @@ */ //============================================================================== -#include - #include +#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/LedgerStateFix.cpp b/src/xrpld/app/tx/detail/LedgerStateFix.cpp index 568ed49304..008d9b6ae7 100644 --- a/src/xrpld/app/tx/detail/LedgerStateFix.cpp +++ b/src/xrpld/app/tx/detail/LedgerStateFix.cpp @@ -18,12 +18,11 @@ //============================================================================== #include - #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/LedgerStateFix.h b/src/xrpld/app/tx/detail/LedgerStateFix.h index b480d23929..bff51a723c 100644 --- a/src/xrpld/app/tx/detail/LedgerStateFix.h +++ b/src/xrpld/app/tx/detail/LedgerStateFix.h @@ -21,8 +21,6 @@ #define RIPPLE_TX_LEDGER_STATE_FIX_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp index 8042c9c698..cfc098ab0f 100644 --- a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp +++ b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp index 1297a918e1..1bd3fcadd7 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp @@ -19,9 +19,9 @@ #include #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp index a0f0b9d860..ed5d3c4f96 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp @@ -18,11 +18,10 @@ //============================================================================== #include - #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp index 4e395c30be..12208dba1b 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp @@ -18,10 +18,9 @@ //============================================================================== #include -#include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp b/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp index 9ae6616e38..4c5fdb7683 100644 --- a/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp @@ -20,10 +20,10 @@ #include #include #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenBurn.cpp b/src/xrpld/app/tx/detail/NFTokenBurn.cpp index 725e35791f..947a663f92 100644 --- a/src/xrpld/app/tx/detail/NFTokenBurn.cpp +++ b/src/xrpld/app/tx/detail/NFTokenBurn.cpp @@ -19,13 +19,10 @@ #include #include -#include + #include #include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp b/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp index ef66ceecd0..f6072bc953 100644 --- a/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp @@ -20,9 +20,10 @@ #include #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp b/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp index 43178d31b4..8e1a026415 100644 --- a/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp @@ -20,10 +20,9 @@ #include #include #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenMint.cpp b/src/xrpld/app/tx/detail/NFTokenMint.cpp index 76e561cfc3..42b551b3a4 100644 --- a/src/xrpld/app/tx/detail/NFTokenMint.cpp +++ b/src/xrpld/app/tx/detail/NFTokenMint.cpp @@ -19,14 +19,15 @@ #include #include + #include -#include #include #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenMint.h b/src/xrpld/app/tx/detail/NFTokenMint.h index c95fd5944e..f606120c54 100644 --- a/src/xrpld/app/tx/detail/NFTokenMint.h +++ b/src/xrpld/app/tx/detail/NFTokenMint.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenModify.cpp b/src/xrpld/app/tx/detail/NFTokenModify.cpp index 7e616ea6ca..a3803c423b 100644 --- a/src/xrpld/app/tx/detail/NFTokenModify.cpp +++ b/src/xrpld/app/tx/detail/NFTokenModify.cpp @@ -19,11 +19,9 @@ #include #include -#include + #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenUtils.cpp b/src/xrpld/app/tx/detail/NFTokenUtils.cpp index 04eb53ae76..9c9754aa95 100644 --- a/src/xrpld/app/tx/detail/NFTokenUtils.cpp +++ b/src/xrpld/app/tx/detail/NFTokenUtils.cpp @@ -20,12 +20,13 @@ #include #include #include + #include #include -#include #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/NFTokenUtils.h b/src/xrpld/app/tx/detail/NFTokenUtils.h index f5232630ee..38ced59e9c 100644 --- a/src/xrpld/app/tx/detail/NFTokenUtils.h +++ b/src/xrpld/app/tx/detail/NFTokenUtils.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include #include diff --git a/src/xrpld/app/tx/detail/Offer.h b/src/xrpld/app/tx/detail/Offer.h index 23129952c3..abc0212335 100644 --- a/src/xrpld/app/tx/detail/Offer.h +++ b/src/xrpld/app/tx/detail/Offer.h @@ -21,12 +21,13 @@ #define RIPPLE_APP_BOOK_OFFER_H_INCLUDED #include + #include #include #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/OfferStream.cpp b/src/xrpld/app/tx/detail/OfferStream.cpp index 4e1cdd9b23..7640cca206 100644 --- a/src/xrpld/app/tx/detail/OfferStream.cpp +++ b/src/xrpld/app/tx/detail/OfferStream.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/app/tx/detail/OfferStream.h b/src/xrpld/app/tx/detail/OfferStream.h index be224a67b4..cf6c1c3d2d 100644 --- a/src/xrpld/app/tx/detail/OfferStream.h +++ b/src/xrpld/app/tx/detail/OfferStream.h @@ -23,10 +23,10 @@ #include #include #include + #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/PayChan.cpp b/src/xrpld/app/tx/detail/PayChan.cpp index aa248075d5..fa5d44fb00 100644 --- a/src/xrpld/app/tx/detail/PayChan.cpp +++ b/src/xrpld/app/tx/detail/PayChan.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -30,7 +31,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Payment.cpp b/src/xrpld/app/tx/detail/Payment.cpp index 1ed3bacbbd..c2b7b23a6a 100644 --- a/src/xrpld/app/tx/detail/Payment.cpp +++ b/src/xrpld/app/tx/detail/Payment.cpp @@ -21,12 +21,12 @@ #include #include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Payment.h b/src/xrpld/app/tx/detail/Payment.h index 3176ae1c0d..775d4e8d46 100644 --- a/src/xrpld/app/tx/detail/Payment.h +++ b/src/xrpld/app/tx/detail/Payment.h @@ -20,10 +20,7 @@ #ifndef RIPPLE_TX_PAYMENT_H_INCLUDED #define RIPPLE_TX_PAYMENT_H_INCLUDED -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp b/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp index 4c2bd6f8d8..64c498b68b 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp +++ b/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/PermissionedDomainDelete.h b/src/xrpld/app/tx/detail/PermissionedDomainDelete.h index ce0d1f14d8..8b5fa68e59 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainDelete.h +++ b/src/xrpld/app/tx/detail/PermissionedDomainDelete.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TX_PERMISSIONEDDOMAINDELETE_H_INCLUDED +#define RIPPLE_TX_PERMISSIONEDDOMAINDELETE_H_INCLUDED #include @@ -44,3 +45,5 @@ public: }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp index a5141523b3..6e2df2a082 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp +++ b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.h b/src/xrpld/app/tx/detail/PermissionedDomainSet.h index 7419770946..502d576e32 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainSet.h +++ b/src/xrpld/app/tx/detail/PermissionedDomainSet.h @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#pragma once + +#ifndef RIPPLE_TX_PERMISSIONEDDOMAINSET_H_INCLUDED +#define RIPPLE_TX_PERMISSIONEDDOMAINSET_H_INCLUDED #include @@ -43,3 +45,5 @@ public: }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/SetAccount.cpp b/src/xrpld/app/tx/detail/SetAccount.cpp index c0e115c249..d871cc3280 100644 --- a/src/xrpld/app/tx/detail/SetAccount.cpp +++ b/src/xrpld/app/tx/detail/SetAccount.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetAccount.h b/src/xrpld/app/tx/detail/SetAccount.h index 62cae28e51..4604a11a6c 100644 --- a/src/xrpld/app/tx/detail/SetAccount.h +++ b/src/xrpld/app/tx/detail/SetAccount.h @@ -21,10 +21,7 @@ #define RIPPLE_TX_SETACCOUNT_H_INCLUDED #include -#include -#include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SetOracle.cpp b/src/xrpld/app/tx/detail/SetOracle.cpp index 055143cc6f..8559c3e7b9 100644 --- a/src/xrpld/app/tx/detail/SetOracle.cpp +++ b/src/xrpld/app/tx/detail/SetOracle.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetRegularKey.cpp b/src/xrpld/app/tx/detail/SetRegularKey.cpp index 9f165612f3..92d130a15a 100644 --- a/src/xrpld/app/tx/detail/SetRegularKey.cpp +++ b/src/xrpld/app/tx/detail/SetRegularKey.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetRegularKey.h b/src/xrpld/app/tx/detail/SetRegularKey.h index 89a714342f..055748aa25 100644 --- a/src/xrpld/app/tx/detail/SetRegularKey.h +++ b/src/xrpld/app/tx/detail/SetRegularKey.h @@ -21,9 +21,6 @@ #define RIPPLE_TX_SETREGULARKEY_H_INCLUDED #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SetSignerList.cpp b/src/xrpld/app/tx/detail/SetSignerList.cpp index 173107e02a..4a1ee703a0 100644 --- a/src/xrpld/app/tx/detail/SetSignerList.cpp +++ b/src/xrpld/app/tx/detail/SetSignerList.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include - #include +#include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetSignerList.h b/src/xrpld/app/tx/detail/SetSignerList.h index 35951645c2..1827aca975 100644 --- a/src/xrpld/app/tx/detail/SetSignerList.h +++ b/src/xrpld/app/tx/detail/SetSignerList.h @@ -20,16 +20,12 @@ #ifndef RIPPLE_TX_SETSIGNERLIST_H_INCLUDED #define RIPPLE_TX_SETSIGNERLIST_H_INCLUDED -#include #include #include -#include -#include + #include -#include -#include #include -#include + #include #include diff --git a/src/xrpld/app/tx/detail/SetTrust.cpp b/src/xrpld/app/tx/detail/SetTrust.cpp index b1e0494ba4..93abcdc4c4 100644 --- a/src/xrpld/app/tx/detail/SetTrust.cpp +++ b/src/xrpld/app/tx/detail/SetTrust.cpp @@ -19,12 +19,12 @@ #include #include + #include #include #include #include #include -#include namespace { diff --git a/src/xrpld/app/tx/detail/SetTrust.h b/src/xrpld/app/tx/detail/SetTrust.h index 6e5a72b306..7a5394c684 100644 --- a/src/xrpld/app/tx/detail/SetTrust.h +++ b/src/xrpld/app/tx/detail/SetTrust.h @@ -21,9 +21,7 @@ #define RIPPLE_TX_SETTRUST_H_INCLUDED #include -#include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SignerEntries.cpp b/src/xrpld/app/tx/detail/SignerEntries.cpp index cab362a8e3..e5e159862a 100644 --- a/src/xrpld/app/tx/detail/SignerEntries.cpp +++ b/src/xrpld/app/tx/detail/SignerEntries.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/SignerEntries.h b/src/xrpld/app/tx/detail/SignerEntries.h index 2227aa9810..bd16398f56 100644 --- a/src/xrpld/app/tx/detail/SignerEntries.h +++ b/src/xrpld/app/tx/detail/SignerEntries.h @@ -21,12 +21,11 @@ #define RIPPLE_TX_IMPL_SIGNER_ENTRIES_H_INCLUDED #include // NotTEC -#include // -#include // beast::Journal -#include // Rules -#include // STTx::maxMultiSigners -#include // temMALFORMED -#include // AccountID + +#include // +#include // beast::Journal +#include // temMALFORMED +#include // AccountID #include #include diff --git a/src/xrpld/app/tx/detail/Taker.cpp b/src/xrpld/app/tx/detail/Taker.cpp index e98d65fd11..9bfd6dc1d3 100644 --- a/src/xrpld/app/tx/detail/Taker.cpp +++ b/src/xrpld/app/tx/detail/Taker.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/app/tx/detail/Taker.h b/src/xrpld/app/tx/detail/Taker.h index 3e64c59b54..3702a30deb 100644 --- a/src/xrpld/app/tx/detail/Taker.h +++ b/src/xrpld/app/tx/detail/Taker.h @@ -21,14 +21,13 @@ #define RIPPLE_APP_BOOK_TAKER_H_INCLUDED #include -#include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index f192126387..d11c20c610 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -26,13 +26,13 @@ #include #include #include + #include #include #include #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Transactor.h b/src/xrpld/app/tx/detail/Transactor.h index a4ba3bfed2..e98269c38a 100644 --- a/src/xrpld/app/tx/detail/Transactor.h +++ b/src/xrpld/app/tx/detail/Transactor.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/XChainBridge.cpp b/src/xrpld/app/tx/detail/XChainBridge.cpp index 0c6be61040..5fa03557e5 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.cpp +++ b/src/xrpld/app/tx/detail/XChainBridge.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -41,8 +42,7 @@ #include #include #include -#include -#include + #include #include diff --git a/src/xrpld/app/tx/detail/XChainBridge.h b/src/xrpld/app/tx/detail/XChainBridge.h index 2e5e927d12..82b64cc0e3 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.h +++ b/src/xrpld/app/tx/detail/XChainBridge.h @@ -21,7 +21,7 @@ #define RIPPLE_TX_XCHAINBRIDGE_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/apply.cpp b/src/xrpld/app/tx/detail/apply.cpp index 03b0c3d74d..615fd6a92d 100644 --- a/src/xrpld/app/tx/detail/apply.cpp +++ b/src/xrpld/app/tx/detail/apply.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/applySteps.cpp b/src/xrpld/app/tx/detail/applySteps.cpp index 95cc3521a9..4cb505db50 100644 --- a/src/xrpld/app/tx/detail/applySteps.cpp +++ b/src/xrpld/app/tx/detail/applySteps.cpp @@ -61,6 +61,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/conditions/Condition.h b/src/xrpld/conditions/Condition.h index a3120f1b3c..52408127ec 100644 --- a/src/xrpld/conditions/Condition.h +++ b/src/xrpld/conditions/Condition.h @@ -21,14 +21,12 @@ #define RIPPLE_CONDITIONS_CONDITION_H #include + #include #include -#include + #include #include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/Fulfillment.h b/src/xrpld/conditions/Fulfillment.h index e70bcf54d4..8e770352a9 100644 --- a/src/xrpld/conditions/Fulfillment.h +++ b/src/xrpld/conditions/Fulfillment.h @@ -21,7 +21,7 @@ #define RIPPLE_CONDITIONS_FULFILLMENT_H #include -#include + #include #include diff --git a/src/xrpld/conditions/detail/Condition.cpp b/src/xrpld/conditions/detail/Condition.cpp index 3085ace0a3..84c0e4b01a 100644 --- a/src/xrpld/conditions/detail/Condition.cpp +++ b/src/xrpld/conditions/detail/Condition.cpp @@ -18,12 +18,8 @@ //============================================================================== #include -#include #include #include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/Fulfillment.cpp b/src/xrpld/conditions/detail/Fulfillment.cpp index 285113ebfb..47fde969a3 100644 --- a/src/xrpld/conditions/detail/Fulfillment.cpp +++ b/src/xrpld/conditions/detail/Fulfillment.cpp @@ -21,9 +21,8 @@ #include #include #include + #include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/PreimageSha256.h b/src/xrpld/conditions/detail/PreimageSha256.h index 5185ded7a6..273a29d653 100644 --- a/src/xrpld/conditions/detail/PreimageSha256.h +++ b/src/xrpld/conditions/detail/PreimageSha256.h @@ -23,9 +23,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/xrpld/conditions/detail/error.cpp b/src/xrpld/conditions/detail/error.cpp index 3594c9e14d..10a3a43921 100644 --- a/src/xrpld/conditions/detail/error.cpp +++ b/src/xrpld/conditions/detail/error.cpp @@ -18,10 +18,10 @@ //============================================================================== #include + #include + #include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/error.h b/src/xrpld/conditions/detail/error.h index 8e8f8cc842..a701ba8859 100644 --- a/src/xrpld/conditions/detail/error.h +++ b/src/xrpld/conditions/detail/error.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_CONDITIONS_ERROR_H #define RIPPLE_CONDITIONS_ERROR_H -#include #include namespace ripple { diff --git a/src/xrpld/conditions/detail/utils.h b/src/xrpld/conditions/detail/utils.h index 35d9c7dea5..28943bd640 100644 --- a/src/xrpld/conditions/detail/utils.h +++ b/src/xrpld/conditions/detail/utils.h @@ -21,17 +21,13 @@ #define RIPPLE_CONDITIONS_UTILS_H #include + #include #include -#include + #include -#include + #include -#include -#include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/consensus/Consensus.cpp b/src/xrpld/consensus/Consensus.cpp index 3720062fdb..fb57687df0 100644 --- a/src/xrpld/consensus/Consensus.cpp +++ b/src/xrpld/consensus/Consensus.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { @@ -108,6 +109,7 @@ checkConsensusReached( bool count_self, std::size_t minConsensusPct, bool reachedMax, + bool stalled, std::unique_ptr const& clog) { CLOG(clog) << "checkConsensusReached params: agreeing: " << agreeing @@ -137,6 +139,17 @@ checkConsensusReached( return false; } + // We only get stalled when every disputed transaction unequivocally has 80% + // (minConsensusPct) agreement, either for or against. That is: either under + // 20% or over 80% consensus (repectively "nay" or "yay"). This prevents + // manipulation by a minority of byzantine peers of which transactions make + // the cut to get into the ledger. + if (stalled) + { + CLOG(clog) << "consensus stalled. "; + return true; + } + if (count_self) { ++agreeing; @@ -146,6 +159,7 @@ checkConsensusReached( } std::size_t currentPercentage = (agreeing * 100) / total; + CLOG(clog) << "currentPercentage: " << currentPercentage; bool const ret = currentPercentage >= minConsensusPct; if (ret) @@ -167,6 +181,7 @@ checkConsensus( std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, + bool stalled, ConsensusParms const& parms, bool proposing, beast::Journal j, @@ -180,7 +195,7 @@ checkConsensus( << " minimum duration to reach consensus: " << parms.ledgerMIN_CONSENSUS.count() << "ms" << " max consensus time " << parms.ledgerMAX_CONSENSUS.count() - << "s" + << "ms" << " minimum consensus percentage: " << parms.minCONSENSUS_PCT << ". "; @@ -210,10 +225,12 @@ checkConsensus( proposing, parms.minCONSENSUS_PCT, currentAgreeTime > parms.ledgerMAX_CONSENSUS, + stalled, clog)) { - JLOG(j.debug()) << "normal consensus"; - CLOG(clog) << "reached. "; + JLOG((stalled ? j.warn() : j.debug())) + << "normal consensus" << (stalled ? ", but stalled" : ""); + CLOG(clog) << "reached" << (stalled ? ", but stalled." : "."); return ConsensusState::Yes; } @@ -225,6 +242,7 @@ checkConsensus( false, parms.minCONSENSUS_PCT, currentAgreeTime > parms.ledgerMAX_CONSENSUS, + false, clog)) { JLOG(j.warn()) << "We see no consensus, but 80% of nodes have moved on"; @@ -232,6 +250,19 @@ checkConsensus( return ConsensusState::MovedOn; } + std::chrono::milliseconds const maxAgreeTime = + previousAgreeTime * parms.ledgerABANDON_CONSENSUS_FACTOR; + if (currentAgreeTime > std::clamp( + maxAgreeTime, + parms.ledgerMAX_CONSENSUS, + parms.ledgerABANDON_CONSENSUS)) + { + JLOG(j.warn()) << "consensus taken too long"; + CLOG(clog) << "Consensus taken too long. "; + // Note the Expired result may be overridden by the caller. + return ConsensusState::Expired; + } + // no consensus yet JLOG(j.trace()) << "no consensus"; CLOG(clog) << "No consensus. "; diff --git a/src/xrpld/consensus/Consensus.h b/src/xrpld/consensus/Consensus.h index dd53c74b31..948c00a8b2 100644 --- a/src/xrpld/consensus/Consensus.h +++ b/src/xrpld/consensus/Consensus.h @@ -25,12 +25,13 @@ #include #include #include + #include #include #include #include -#include +#include #include #include #include @@ -81,6 +82,10 @@ shouldCloseLedger( last ledger @param currentAgreeTime how long, in milliseconds, we've been trying to agree + @param stalled the network appears to be stalled, where + neither we nor our peers have changed their vote on any disputes in a + while. This is undesirable, and will cause us to end consensus + without 80% agreement. @param parms Consensus constant parameters @param proposing whether we should count ourselves @param j journal for logging @@ -94,6 +99,7 @@ checkConsensus( std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, + bool stalled, ConsensusParms const& parms, bool proposing, beast::Journal j, @@ -574,6 +580,9 @@ private: NetClock::duration closeResolution_ = ledgerDefaultTimeResolution; + ConsensusParms::AvalancheState closeTimeAvalancheState_ = + ConsensusParms::init; + // Time it took for the last consensus round to converge std::chrono::milliseconds prevRoundTime_; @@ -599,6 +608,13 @@ private: std::optional result_; ConsensusCloseTimes rawCloseTimes_; + // The number of calls to phaseEstablish where none of our peers + // have changed any votes on disputed transactions. + std::size_t peerUnchangedCounter_ = 0; + + // The total number of times we have called phaseEstablish + std::size_t establishCounter_ = 0; + //------------------------------------------------------------------------- // Peer related consensus data @@ -696,6 +712,7 @@ Consensus::startRoundInternal( previousLedger_ = prevLedger; result_.reset(); convergePercent_ = 0; + closeTimeAvalancheState_ = ConsensusParms::init; haveCloseTimeConsensus_ = false; openTime_.reset(clock_.now()); currPeerPositions_.clear(); @@ -1196,8 +1213,7 @@ Consensus::phaseOpen(std::unique_ptr const& clog) adaptor_.parms().ledgerIDLE_INTERVAL, 2 * previousLedger_.closeTimeResolution()); CLOG(clog) << "idle interval set to " << idleInterval.count() - << "ms based on " - << "ledgerIDLE_INTERVAL: " + << "ms based on " << "ledgerIDLE_INTERVAL: " << adaptor_.parms().ledgerIDLE_INTERVAL.count() << ", previous ledger close time resolution: " << previousLedger_.closeTimeResolution().count() << "ms. "; @@ -1352,6 +1368,9 @@ Consensus::phaseEstablish( // can only establish consensus if we already took a stance XRPL_ASSERT(result_, "ripple::Consensus::phaseEstablish : result is set"); + ++peerUnchangedCounter_; + ++establishCounter_; + using namespace std::chrono; ConsensusParms const& parms = adaptor_.parms(); @@ -1418,6 +1437,8 @@ Consensus::closeLedger(std::unique_ptr const& clog) phase_ = ConsensusPhase::establish; JLOG(j_.debug()) << "transitioned to ConsensusPhase::establish"; rawCloseTimes_.self = now_; + peerUnchangedCounter_ = 0; + establishCounter_ = 0; result_.emplace(adaptor_.onClose(previousLedger_, now_, mode_.get())); result_->roundTime.reset(clock_.now()); @@ -1551,16 +1572,11 @@ Consensus::updateOurPositions( } else { - int neededWeight; - - if (convergePercent_ < parms.avMID_CONSENSUS_TIME) - neededWeight = parms.avINIT_CONSENSUS_PCT; - else if (convergePercent_ < parms.avLATE_CONSENSUS_TIME) - neededWeight = parms.avMID_CONSENSUS_PCT; - else if (convergePercent_ < parms.avSTUCK_CONSENSUS_TIME) - neededWeight = parms.avLATE_CONSENSUS_PCT; - else - neededWeight = parms.avSTUCK_CONSENSUS_PCT; + // We don't track rounds for close time, so just pass 0s + auto const [neededWeight, newState] = getNeededWeight( + parms, closeTimeAvalancheState_, convergePercent_, 0, 0); + if (newState) + closeTimeAvalancheState_ = *newState; CLOG(clog) << "neededWeight " << neededWeight << ". "; int participants = currPeerPositions_.size(); @@ -1682,7 +1698,8 @@ Consensus::haveConsensus( } else { - JLOG(j_.debug()) << nodeId << " has " << peerProp.position(); + JLOG(j_.debug()) << "Proposal disagreement: Peer " << nodeId + << " has " << peerProp.position(); ++disagree; } } @@ -1692,6 +1709,17 @@ Consensus::haveConsensus( JLOG(j_.debug()) << "Checking for TX consensus: agree=" << agree << ", disagree=" << disagree; + ConsensusParms const& parms = adaptor_.parms(); + // Stalling is BAD + bool const stalled = haveCloseTimeConsensus_ && + std::ranges::all_of(result_->disputes, + [this, &parms](auto const& dispute) { + return dispute.second.stalled( + parms, + mode_.get() == ConsensusMode::proposing, + peerUnchangedCounter_); + }); + // Determine if we actually have consensus or not result_->state = checkConsensus( prevProposers_, @@ -1700,7 +1728,8 @@ Consensus::haveConsensus( currentFinished, prevRoundTime_, result_->roundTime.read(), - adaptor_.parms(), + stalled, + parms, mode_.get() == ConsensusMode::proposing, j_, clog); @@ -1711,6 +1740,33 @@ Consensus::haveConsensus( return false; } + // Consensus has taken far too long. Drop out of the round. + if (result_->state == ConsensusState::Expired) + { + static auto const minimumCounter = + parms.avalancheCutoffs.size() * parms.avMIN_ROUNDS; + std::stringstream ss; + if (establishCounter_ < minimumCounter) + { + // If each round of phaseEstablish takes a very long time, we may + // "expire" before we've given consensus enough time at each + // avalanche level to actually come to a consensus. In that case, + // keep trying. This should only happen if there are an extremely + // large number of disputes such that each round takes an inordinate + // amount of time. + + ss << "Consensus time has expired in round " << establishCounter_ + << "; continue until round " << minimumCounter << ". " + << Json::Compact{getJson(false)}; + JLOG(j_.error()) << ss.str(); + CLOG(clog) << ss.str() << ". "; + return false; + } + ss << "Consensus expired. " << Json::Compact{getJson(true)}; + JLOG(j_.error()) << ss.str(); + CLOG(clog) << ss.str() << ". "; + leaveConsensus(clog); + } // There is consensus, but we need to track if the network moved on // without us. if (result_->state == ConsensusState::MovedOn) @@ -1803,8 +1859,9 @@ Consensus::createDisputes( { Proposal_t const& peerProp = peerPos.proposal(); auto const cit = acquired_.find(peerProp.position()); - if (cit != acquired_.end()) - dtx.setVote(nodeId, cit->second.exists(txID)); + if (cit != acquired_.end() && + dtx.setVote(nodeId, cit->second.exists(txID))) + peerUnchangedCounter_ = 0; } adaptor_.share(dtx.tx()); @@ -1829,7 +1886,8 @@ Consensus::updateDisputes(NodeID_t const& node, TxSet_t const& other) for (auto& it : result_->disputes) { auto& d = it.second; - d.setVote(node, other.exists(d.tx().id())); + if (d.setVote(node, other.exists(d.tx().id()))) + peerUnchangedCounter_ = 0; } } diff --git a/src/xrpld/consensus/ConsensusParms.h b/src/xrpld/consensus/ConsensusParms.h index a0b6c6be8d..9bfacfb8d6 100644 --- a/src/xrpld/consensus/ConsensusParms.h +++ b/src/xrpld/consensus/ConsensusParms.h @@ -20,8 +20,13 @@ #ifndef RIPPLE_CONSENSUS_CONSENSUS_PARMS_H_INCLUDED #define RIPPLE_CONSENSUS_CONSENSUS_PARMS_H_INCLUDED +#include + #include #include +#include +#include +#include namespace ripple { @@ -43,7 +48,7 @@ struct ConsensusParms This is a safety to protect against very old validations and the time it takes to adjust the close time accuracy window. */ - std::chrono::seconds validationVALID_WALL = std::chrono::minutes{5}; + std::chrono::seconds const validationVALID_WALL = std::chrono::minutes{5}; /** Duration a validation remains current after first observed. @@ -51,33 +56,34 @@ struct ConsensusParms first saw it. This provides faster recovery in very rare cases where the number of validations produced by the network is lower than normal */ - std::chrono::seconds validationVALID_LOCAL = std::chrono::minutes{3}; + std::chrono::seconds const validationVALID_LOCAL = std::chrono::minutes{3}; /** Duration pre-close in which validations are acceptable. The number of seconds before a close time that we consider a validation acceptable. This protects against extreme clock errors */ - std::chrono::seconds validationVALID_EARLY = std::chrono::minutes{3}; + std::chrono::seconds const validationVALID_EARLY = std::chrono::minutes{3}; //! How long we consider a proposal fresh - std::chrono::seconds proposeFRESHNESS = std::chrono::seconds{20}; + std::chrono::seconds const proposeFRESHNESS = std::chrono::seconds{20}; //! How often we force generating a new proposal to keep ours fresh - std::chrono::seconds proposeINTERVAL = std::chrono::seconds{12}; + std::chrono::seconds const proposeINTERVAL = std::chrono::seconds{12}; //------------------------------------------------------------------------- // Consensus durations are relative to the internal Consensus clock and use // millisecond resolution. //! The percentage threshold above which we can declare consensus. - std::size_t minCONSENSUS_PCT = 80; + std::size_t const minCONSENSUS_PCT = 80; //! The duration a ledger may remain idle before closing - std::chrono::milliseconds ledgerIDLE_INTERVAL = std::chrono::seconds{15}; + std::chrono::milliseconds const ledgerIDLE_INTERVAL = + std::chrono::seconds{15}; //! The number of seconds we wait minimum to ensure participation - std::chrono::milliseconds ledgerMIN_CONSENSUS = + std::chrono::milliseconds const ledgerMIN_CONSENSUS = std::chrono::milliseconds{1950}; /** The maximum amount of time to spend pausing for laggards. @@ -86,13 +92,26 @@ struct ConsensusParms * validators don't appear to be offline that are merely waiting for * laggards. */ - std::chrono::milliseconds ledgerMAX_CONSENSUS = std::chrono::seconds{15}; + std::chrono::milliseconds const ledgerMAX_CONSENSUS = + std::chrono::seconds{15}; //! Minimum number of seconds to wait to ensure others have computed the LCL - std::chrono::milliseconds ledgerMIN_CLOSE = std::chrono::seconds{2}; + std::chrono::milliseconds const ledgerMIN_CLOSE = std::chrono::seconds{2}; //! How often we check state or change positions - std::chrono::milliseconds ledgerGRANULARITY = std::chrono::seconds{1}; + std::chrono::milliseconds const ledgerGRANULARITY = std::chrono::seconds{1}; + + //! How long to wait before completely abandoning consensus + std::size_t const ledgerABANDON_CONSENSUS_FACTOR = 10; + + /** + * Maximum amount of time to give a consensus round + * + * Does not include the time to build the LCL, so there is no reason for a + * round to go this long, regardless of how big the ledger is. + */ + std::chrono::milliseconds const ledgerABANDON_CONSENSUS = + std::chrono::seconds{120}; /** The minimum amount of time to consider the previous round to have taken. @@ -104,38 +123,80 @@ struct ConsensusParms twice the interval between proposals (0.7s) divided by the interval between mid and late consensus ([85-50]/100). */ - std::chrono::milliseconds avMIN_CONSENSUS_TIME = std::chrono::seconds{5}; + std::chrono::milliseconds const avMIN_CONSENSUS_TIME = + std::chrono::seconds{5}; //------------------------------------------------------------------------------ // Avalanche tuning // As a function of the percent this round's duration is of the prior round, // we increase the threshold for yes votes to add a transaction to our // position. - - //! Percentage of nodes on our UNL that must vote yes - std::size_t avINIT_CONSENSUS_PCT = 50; - - //! Percentage of previous round duration before we advance - std::size_t avMID_CONSENSUS_TIME = 50; - - //! Percentage of nodes that most vote yes after advancing - std::size_t avMID_CONSENSUS_PCT = 65; - - //! Percentage of previous round duration before we advance - std::size_t avLATE_CONSENSUS_TIME = 85; - - //! Percentage of nodes that most vote yes after advancing - std::size_t avLATE_CONSENSUS_PCT = 70; - - //! Percentage of previous round duration before we are stuck - std::size_t avSTUCK_CONSENSUS_TIME = 200; - - //! Percentage of nodes that must vote yes after we are stuck - std::size_t avSTUCK_CONSENSUS_PCT = 95; + enum AvalancheState { init, mid, late, stuck }; + struct AvalancheCutoff + { + int const consensusTime; + std::size_t const consensusPct; + AvalancheState const next; + }; + //! Map the consensus requirement avalanche state to the amount of time that + //! must pass before moving to that state, the agreement percentage required + //! at that state, and the next state. "stuck" loops back on itself because + //! once we're stuck, we're stuck. + //! This structure allows for "looping" of states if needed. + std::map const avalancheCutoffs{ + // {state, {time, percent, nextState}}, + // Initial state: 50% of nodes must vote yes + {init, {0, 50, mid}}, + // mid-consensus starts after 50% of the previous round time, and + // requires 65% yes + {mid, {50, 65, late}}, + // late consensus starts after 85% time, and requires 70% yes + {late, {85, 70, stuck}}, + // we're stuck after 2x time, requires 95% yes votes + {stuck, {200, 95, stuck}}, + }; //! Percentage of nodes required to reach agreement on ledger close time - std::size_t avCT_CONSENSUS_PCT = 75; + std::size_t const avCT_CONSENSUS_PCT = 75; + + //! Number of rounds before certain actions can happen. + // (Moving to the next avalanche level, considering that votes are stalled + // without consensus.) + std::size_t const avMIN_ROUNDS = 2; + + //! Number of rounds before a stuck vote is considered unlikely to change + //! because voting stalled + std::size_t const avSTALLED_ROUNDS = 4; }; +inline std::pair> +getNeededWeight( + ConsensusParms const& p, + ConsensusParms::AvalancheState currentState, + int percentTime, + std::size_t currentRounds, + std::size_t minimumRounds) +{ + // at() can throw, but the map is built by hand to ensure all valid + // values are available. + auto const& currentCutoff = p.avalancheCutoffs.at(currentState); + // Should we consider moving to the next state? + if (currentCutoff.next != currentState && currentRounds >= minimumRounds) + { + // at() can throw, but the map is built by hand to ensure all + // valid values are available. + auto const& nextCutoff = p.avalancheCutoffs.at(currentCutoff.next); + // See if enough time has passed to move on to the next. + XRPL_ASSERT( + nextCutoff.consensusTime >= currentCutoff.consensusTime, + "ripple::getNeededWeight : next state valid"); + if (percentTime >= nextCutoff.consensusTime) + { + return {nextCutoff.consensusPct, currentCutoff.next}; + } + } + return {currentCutoff.consensusPct, {}}; +} + } // namespace ripple #endif diff --git a/src/xrpld/consensus/ConsensusProposal.h b/src/xrpld/consensus/ConsensusProposal.h index 18dcf60006..6734d59205 100644 --- a/src/xrpld/consensus/ConsensusProposal.h +++ b/src/xrpld/consensus/ConsensusProposal.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED #define RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED @@ -23,7 +24,9 @@ #include #include #include +#include #include + #include #include #include diff --git a/src/xrpld/consensus/ConsensusTypes.h b/src/xrpld/consensus/ConsensusTypes.h index ba8e0a8b1a..ccb421abed 100644 --- a/src/xrpld/consensus/ConsensusTypes.h +++ b/src/xrpld/consensus/ConsensusTypes.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include @@ -186,6 +188,7 @@ struct ConsensusCloseTimes enum class ConsensusState { No, //!< We do not have consensus MovedOn, //!< The network has consensus without us + Expired, //!< Consensus time limit has hard-expired Yes //!< We have consensus along with the network }; @@ -235,7 +238,7 @@ struct ConsensusResult ConsensusTimer roundTime; // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn + // will be either Yes or MovedOn or Expired ConsensusState state = ConsensusState::No; // The number of peers proposing during the round diff --git a/src/xrpld/consensus/DisputedTx.h b/src/xrpld/consensus/DisputedTx.h index bffb100932..513f240829 100644 --- a/src/xrpld/consensus/DisputedTx.h +++ b/src/xrpld/consensus/DisputedTx.h @@ -21,14 +21,12 @@ #define RIPPLE_APP_CONSENSUS_IMPL_DISPUTEDTX_H_INCLUDED #include + #include -#include #include #include -#include -#include + #include -#include namespace ripple { @@ -84,6 +82,51 @@ public: return ourVote_; } + //! Are we and our peers "stalled" where we probably won't change + //! our vote? + bool + stalled(ConsensusParms const& p, bool proposing, int peersUnchanged) const + { + // at() can throw, but the map is built by hand to ensure all valid + // values are available. + auto const& currentCutoff = p.avalancheCutoffs.at(avalancheState_); + auto const& nextCutoff = p.avalancheCutoffs.at(currentCutoff.next); + + // We're have not reached the final avalanche state, or been there long + // enough, so there's room for change. Check the times in case the state + // machine is altered to allow states to loop. + if (nextCutoff.consensusTime > currentCutoff.consensusTime || + avalancheCounter_ < p.avMIN_ROUNDS) + return false; + + // We've haven't had this vote for minimum rounds yet. Things could + // change. + if (proposing && currentVoteCounter_ < p.avMIN_ROUNDS) + return false; + + // If we or any peers have changed a vote in several rounds, then + // things could still change. But if _either_ has not changed in that + // long, we're unlikely to change our vote any time soon. (This prevents + // a malicious peer from flip-flopping a vote to prevent consensus.) + if (peersUnchanged < p.avSTALLED_ROUNDS && + (proposing && currentVoteCounter_ < p.avSTALLED_ROUNDS)) + return false; + + // Does this transaction have more than 80% agreement + + // Compute the percentage of nodes voting 'yes' (possibly including us) + int const support = (yays_ + (proposing && ourVote_ ? 1 : 0)) * 100; + int total = nays_ + yays_ + (proposing ? 1 : 0); + if (!total) + // There are no votes, so we know nothing + return false; + int const weight = support / total; + // Returns true if the tx has more than minCONSENSUS_PCT (80) percent + // agreement. Either voting for _or_ voting against the tx. + return weight > p.minCONSENSUS_PCT || + weight < (100 - p.minCONSENSUS_PCT); + } + //! The disputed transaction. Tx_t const& tx() const @@ -102,8 +145,12 @@ public: @param peer Identifier of peer. @param votesYes Whether peer votes to include the disputed transaction. + + @return bool Whether the peer changed its vote. (A new vote counts as a + change.) */ - void + [[nodiscard]] + bool setVote(NodeID_t const& peer, bool votesYes); /** Remove a peer's vote @@ -137,12 +184,18 @@ private: bool ourVote_; //< Our vote (true is yes) Tx_t tx_; //< Transaction under dispute Map_t votes_; //< Map from NodeID to vote + //! The number of rounds we've gone without changing our vote + std::size_t currentVoteCounter_ = 0; + //! Which minimum acceptance percentage phase we are currently in + ConsensusParms::AvalancheState avalancheState_ = ConsensusParms::init; + //! How long we have been in the current acceptance phase + std::size_t avalancheCounter_ = 0; beast::Journal const j_; }; // Track a peer's yes/no vote on a particular disputed tx_ template -void +bool DisputedTx::setVote(NodeID_t const& peer, bool votesYes) { auto const [it, inserted] = votes_.insert(std::make_pair(peer, votesYes)); @@ -160,6 +213,7 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) JLOG(j_.debug()) << "Peer " << peer << " votes NO on " << tx_.id(); ++nays_; } + return true; } // changes vote to yes else if (votesYes && !it->second) @@ -168,6 +222,7 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) --nays_; ++yays_; it->second = true; + return true; } // changes vote to no else if (!votesYes && it->second) @@ -176,7 +231,9 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) ++nays_; --yays_; it->second = false; + return true; } + return false; } // Remove a peer's vote on this disputed transaction @@ -213,21 +270,26 @@ DisputedTx::updateVote( bool newPosition; int weight; + // When proposing, to prevent avalanche stalls, we increase the needed + // weight slightly over time. We also need to ensure that the consensus has + // made a minimum number of attempts at each "state" before moving + // to the next. + // Proposing or not, we need to keep track of which state we've reached so + // we can determine if the vote has stalled. + auto const [requiredPct, newState] = getNeededWeight( + p, avalancheState_, percentTime, ++avalancheCounter_, p.avMIN_ROUNDS); + if (newState) + { + avalancheState_ = *newState; + avalancheCounter_ = 0; + } + if (proposing) // give ourselves full weight { // This is basically the percentage of nodes voting 'yes' (including us) weight = (yays_ * 100 + (ourVote_ ? 100 : 0)) / (nays_ + yays_ + 1); - // To prevent avalanche stalls, we increase the needed weight slightly - // over time. - if (percentTime < p.avMID_CONSENSUS_TIME) - newPosition = weight > p.avINIT_CONSENSUS_PCT; - else if (percentTime < p.avLATE_CONSENSUS_TIME) - newPosition = weight > p.avMID_CONSENSUS_PCT; - else if (percentTime < p.avSTUCK_CONSENSUS_TIME) - newPosition = weight > p.avLATE_CONSENSUS_PCT; - else - newPosition = weight > p.avSTUCK_CONSENSUS_PCT; + newPosition = weight > requiredPct; } else { @@ -238,13 +300,16 @@ DisputedTx::updateVote( if (newPosition == ourVote_) { - JLOG(j_.info()) << "No change (" << (ourVote_ ? "YES" : "NO") - << ") : weight " << weight << ", percent " - << percentTime; + ++currentVoteCounter_; + JLOG(j_.info()) << "No change (" << (ourVote_ ? "YES" : "NO") << ") on " + << tx_.id() << " : weight " << weight << ", percent " + << percentTime + << ", round(s) with this vote: " << currentVoteCounter_; JLOG(j_.debug()) << Json::Compact{getJson()}; return false; } + currentVoteCounter_ = 0; ourVote_ = newPosition; JLOG(j_.debug()) << "We now vote " << (ourVote_ ? "YES" : "NO") << " on " << tx_.id(); diff --git a/src/xrpld/consensus/LedgerTiming.h b/src/xrpld/consensus/LedgerTiming.h index b3ef5ee59c..434f19b081 100644 --- a/src/xrpld/consensus/LedgerTiming.h +++ b/src/xrpld/consensus/LedgerTiming.h @@ -22,8 +22,8 @@ #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/consensus/Validations.h b/src/xrpld/consensus/Validations.h index 582d36cbcd..c333aeaefd 100644 --- a/src/xrpld/consensus/Validations.h +++ b/src/xrpld/consensus/Validations.h @@ -21,6 +21,7 @@ #define RIPPLE_CONSENSUS_VALIDATIONS_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/core/ClosureCounter.h b/src/xrpld/core/ClosureCounter.h index 9b1a69bf95..92117a91c4 100644 --- a/src/xrpld/core/ClosureCounter.h +++ b/src/xrpld/core/ClosureCounter.h @@ -21,11 +21,11 @@ #define RIPPLE_CORE_CLOSURE_COUNTER_H_INCLUDED #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index c0cedcc1a4..8e29ecdcf4 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -24,20 +24,13 @@ #include #include #include -#include #include // VFALCO Breaks levelization -#include #include // VFALCO FIX: This include should not be here -#include -#include -#include #include -#include #include #include -#include #include #include #include diff --git a/src/xrpld/core/DatabaseCon.h b/src/xrpld/core/DatabaseCon.h index 8c6ba73032..299861e1b0 100644 --- a/src/xrpld/core/DatabaseCon.h +++ b/src/xrpld/core/DatabaseCon.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/xrpld/core/Job.h b/src/xrpld/core/Job.h index 76d26c39e7..66048f4f21 100644 --- a/src/xrpld/core/Job.h +++ b/src/xrpld/core/Job.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include diff --git a/src/xrpld/core/JobQueue.h b/src/xrpld/core/JobQueue.h index 06f90dd1c4..051c298251 100644 --- a/src/xrpld/core/JobQueue.h +++ b/src/xrpld/core/JobQueue.h @@ -24,11 +24,11 @@ #include #include #include + #include #include + #include -#include // workaround for boost 1.72 bug -#include // workaround for boost 1.72 bug namespace ripple { diff --git a/src/xrpld/core/JobTypeData.h b/src/xrpld/core/JobTypeData.h index 43d63895d8..89532c15d9 100644 --- a/src/xrpld/core/JobTypeData.h +++ b/src/xrpld/core/JobTypeData.h @@ -21,6 +21,7 @@ #define RIPPLE_CORE_JOBTYPEDATA_H_INCLUDED #include + #include #include diff --git a/src/xrpld/core/JobTypes.h b/src/xrpld/core/JobTypes.h index 29b096b7a3..29863893d9 100644 --- a/src/xrpld/core/JobTypes.h +++ b/src/xrpld/core/JobTypes.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/core/LoadEvent.h b/src/xrpld/core/LoadEvent.h index 458c8a0cd6..3b5f69194f 100644 --- a/src/xrpld/core/LoadEvent.h +++ b/src/xrpld/core/LoadEvent.h @@ -21,7 +21,6 @@ #define RIPPLE_CORE_LOADEVENT_H_INCLUDED #include -#include #include namespace ripple { diff --git a/src/xrpld/core/LoadMonitor.h b/src/xrpld/core/LoadMonitor.h index e57429da23..c65a0e6870 100644 --- a/src/xrpld/core/LoadMonitor.h +++ b/src/xrpld/core/LoadMonitor.h @@ -21,8 +21,10 @@ #define RIPPLE_CORE_LOADMONITOR_H_INCLUDED #include + #include #include + #include #include diff --git a/src/xrpld/core/SociDB.h b/src/xrpld/core/SociDB.h index 20f210d4e3..a741504e97 100644 --- a/src/xrpld/core/SociDB.h +++ b/src/xrpld/core/SociDB.h @@ -34,10 +34,13 @@ #endif #include + #include + #define SOCI_USE_BOOST -#include #include + +#include #include #include diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index 6a34b1db91..fb4a4aab21 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include @@ -28,11 +29,12 @@ #include #include #include + #include #include #include #include -#include + #include #include #include diff --git a/src/xrpld/core/detail/DatabaseCon.cpp b/src/xrpld/core/detail/DatabaseCon.cpp index 6d49c647a6..89e4daf90e 100644 --- a/src/xrpld/core/detail/DatabaseCon.cpp +++ b/src/xrpld/core/detail/DatabaseCon.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/core/detail/Job.cpp b/src/xrpld/core/detail/Job.cpp index 17f600a4f4..d62f49ff49 100644 --- a/src/xrpld/core/detail/Job.cpp +++ b/src/xrpld/core/detail/Job.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/xrpld/core/detail/JobQueue.cpp b/src/xrpld/core/detail/JobQueue.cpp index 5eb1f24d43..1ea1df51ab 100644 --- a/src/xrpld/core/detail/JobQueue.cpp +++ b/src/xrpld/core/detail/JobQueue.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/xrpld/core/detail/LoadEvent.cpp b/src/xrpld/core/detail/LoadEvent.cpp index 2602c0691f..bee2a14579 100644 --- a/src/xrpld/core/detail/LoadEvent.cpp +++ b/src/xrpld/core/detail/LoadEvent.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/core/detail/LoadMonitor.cpp b/src/xrpld/core/detail/LoadMonitor.cpp index 80b08bbdfc..98fa959d6c 100644 --- a/src/xrpld/core/detail/LoadMonitor.cpp +++ b/src/xrpld/core/detail/LoadMonitor.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/core/detail/SociDB.cpp b/src/xrpld/core/detail/SociDB.cpp index 94f9098d9c..96b1f97977 100644 --- a/src/xrpld/core/detail/SociDB.cpp +++ b/src/xrpld/core/detail/SociDB.cpp @@ -23,15 +23,18 @@ #endif #include -#include #include #include + #include #include + #include -#include + #include +#include + namespace ripple { static auto checkpointPageCount = 1000; diff --git a/src/xrpld/core/detail/Workers.cpp b/src/xrpld/core/detail/Workers.cpp index 7286f378e8..53b5944ac0 100644 --- a/src/xrpld/core/detail/Workers.cpp +++ b/src/xrpld/core/detail/Workers.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/core/detail/Workers.h b/src/xrpld/core/detail/Workers.h index 3645d4fbcf..3f41e382b0 100644 --- a/src/xrpld/core/detail/Workers.h +++ b/src/xrpld/core/detail/Workers.h @@ -21,7 +21,9 @@ #define RIPPLE_CORE_WORKERS_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/ledger/ApplyView.h b/src/xrpld/ledger/ApplyView.h index e99e8b2976..1abff33be0 100644 --- a/src/xrpld/ledger/ApplyView.h +++ b/src/xrpld/ledger/ApplyView.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index 74ee290829..1c282565b1 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/ledger/BookDirs.h b/src/xrpld/ledger/BookDirs.h index 2c27a5b659..dc58905c5a 100644 --- a/src/xrpld/ledger/BookDirs.h +++ b/src/xrpld/ledger/BookDirs.h @@ -22,6 +22,8 @@ #include +#include + namespace ripple { class BookDirs diff --git a/src/xrpld/ledger/CachedView.h b/src/xrpld/ledger/CachedView.h index fd921c63ca..ae59312f98 100644 --- a/src/xrpld/ledger/CachedView.h +++ b/src/xrpld/ledger/CachedView.h @@ -22,9 +22,9 @@ #include #include + #include -#include -#include + #include #include diff --git a/src/xrpld/ledger/Dir.h b/src/xrpld/ledger/Dir.h index 0e92d7dbca..d3a52558fd 100644 --- a/src/xrpld/ledger/Dir.h +++ b/src/xrpld/ledger/Dir.h @@ -21,6 +21,7 @@ #define RIPPLE_LEDGER_DIR_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/ledger/OpenView.h b/src/xrpld/ledger/OpenView.h index c8e1911bf9..ecc618e185 100644 --- a/src/xrpld/ledger/OpenView.h +++ b/src/xrpld/ledger/OpenView.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/ledger/PaymentSandbox.h b/src/xrpld/ledger/PaymentSandbox.h index d7299b2efb..a41a0211a2 100644 --- a/src/xrpld/ledger/PaymentSandbox.h +++ b/src/xrpld/ledger/PaymentSandbox.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/src/xrpld/ledger/RawView.h b/src/xrpld/ledger/RawView.h index cd9bcff876..fb6dcffe06 100644 --- a/src/xrpld/ledger/RawView.h +++ b/src/xrpld/ledger/RawView.h @@ -21,11 +21,9 @@ #define RIPPLE_LEDGER_RAWVIEW_H_INCLUDED #include + #include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/ledger/ReadView.h b/src/xrpld/ledger/ReadView.h index fb695b9a36..53e12083f3 100644 --- a/src/xrpld/ledger/ReadView.h +++ b/src/xrpld/ledger/ReadView.h @@ -21,11 +21,9 @@ #define RIPPLE_LEDGER_READVIEW_H_INCLUDED #include + #include #include -#include -#include -#include #include #include #include @@ -35,9 +33,8 @@ #include #include #include -#include + #include -#include #include #include diff --git a/src/xrpld/ledger/View.h b/src/xrpld/ledger/View.h index aca3f9fa6d..85aa02f1b4 100644 --- a/src/xrpld/ledger/View.h +++ b/src/xrpld/ledger/View.h @@ -20,27 +20,23 @@ #ifndef RIPPLE_LEDGER_VIEW_H_INCLUDED #define RIPPLE_LEDGER_VIEW_H_INCLUDED -#include #include #include -#include #include + #include #include #include #include #include #include -#include #include #include + #include #include -#include #include -#include - namespace ripple { enum class WaiveTransferFee : bool { No = false, Yes }; diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 2c76b9b587..c11a72d782 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index b95e41363c..b1bac733fc 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ApplyView.cpp b/src/xrpld/ledger/detail/ApplyView.cpp index 8b491bdcb2..3191b47cbb 100644 --- a/src/xrpld/ledger/detail/ApplyView.cpp +++ b/src/xrpld/ledger/detail/ApplyView.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyViewBase.cpp b/src/xrpld/ledger/detail/ApplyViewBase.cpp index 647927ae96..1d93eae7aa 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.cpp +++ b/src/xrpld/ledger/detail/ApplyViewBase.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/ledger/detail/ApplyViewBase.h b/src/xrpld/ledger/detail/ApplyViewBase.h index 8cc38e4143..f9c9c80af0 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.h +++ b/src/xrpld/ledger/detail/ApplyViewBase.h @@ -21,9 +21,9 @@ #define RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index b9b333eb8b..74b71c8324 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/ledger/detail/BookDirs.cpp b/src/xrpld/ledger/detail/BookDirs.cpp index f584db89e8..41a14945a6 100644 --- a/src/xrpld/ledger/detail/BookDirs.cpp +++ b/src/xrpld/ledger/detail/BookDirs.cpp @@ -20,6 +20,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/CachedView.cpp b/src/xrpld/ledger/detail/CachedView.cpp index 0463e5de05..5d6d354688 100644 --- a/src/xrpld/ledger/detail/CachedView.cpp +++ b/src/xrpld/ledger/detail/CachedView.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/ledger/detail/OpenView.cpp b/src/xrpld/ledger/detail/OpenView.cpp index 619006161f..5c62d8cef8 100644 --- a/src/xrpld/ledger/detail/OpenView.cpp +++ b/src/xrpld/ledger/detail/OpenView.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/PaymentSandbox.cpp b/src/xrpld/ledger/detail/PaymentSandbox.cpp index 745d8a90c7..3eab845472 100644 --- a/src/xrpld/ledger/detail/PaymentSandbox.cpp +++ b/src/xrpld/ledger/detail/PaymentSandbox.cpp @@ -20,10 +20,9 @@ #include #include #include + #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/ledger/detail/RawStateTable.cpp b/src/xrpld/ledger/detail/RawStateTable.cpp index b93fc4a2aa..f19eed8297 100644 --- a/src/xrpld/ledger/detail/RawStateTable.cpp +++ b/src/xrpld/ledger/detail/RawStateTable.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ReadViewFwdRange.h b/src/xrpld/ledger/detail/ReadViewFwdRange.h index 626a5f4743..0dab5e9464 100644 --- a/src/xrpld/ledger/detail/ReadViewFwdRange.h +++ b/src/xrpld/ledger/detail/ReadViewFwdRange.h @@ -21,7 +21,6 @@ #define RIPPLE_LEDGER_READVIEWFWDRANGE_H_INCLUDED #include -#include #include #include diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index 85abf7fc62..1860f61445 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -19,14 +19,15 @@ #include #include + #include #include -#include #include #include #include #include #include + #include namespace ripple { @@ -529,8 +530,7 @@ xrpLiquid( STAmount const amount = (balance < reserve) ? STAmount{0} : balance - reserve; - JLOG(j.trace()) << "accountHolds:" - << " account=" << to_string(id) + JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(id) << " amount=" << amount.getFullText() << " fullBalance=" << fullBalance.getFullText() << " balance=" << balance.getFullText() diff --git a/src/xrpld/net/AutoSocket.h b/src/xrpld/net/AutoSocket.h index be35c08246..7486d6128d 100644 --- a/src/xrpld/net/AutoSocket.h +++ b/src/xrpld/net/AutoSocket.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/net/HTTPClient.h b/src/xrpld/net/HTTPClient.h index 3b7da776ea..2a33500aa4 100644 --- a/src/xrpld/net/HTTPClient.h +++ b/src/xrpld/net/HTTPClient.h @@ -21,7 +21,9 @@ #define RIPPLE_NET_HTTPCLIENT_H_INCLUDED #include + #include + #include #include diff --git a/src/xrpld/net/HTTPClientSSLContext.h b/src/xrpld/net/HTTPClientSSLContext.h index 64ca2461d2..2da5ac38de 100644 --- a/src/xrpld/net/HTTPClientSSLContext.h +++ b/src/xrpld/net/HTTPClientSSLContext.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/xrpld/net/InfoSub.h b/src/xrpld/net/InfoSub.h index 08fba26ff0..c8762c31fd 100644 --- a/src/xrpld/net/InfoSub.h +++ b/src/xrpld/net/InfoSub.h @@ -21,12 +21,12 @@ #define RIPPLE_NET_INFOSUB_H_INCLUDED #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/net/RPCCall.h b/src/xrpld/net/RPCCall.h index 9c78bb20d2..612d80c663 100644 --- a/src/xrpld/net/RPCCall.h +++ b/src/xrpld/net/RPCCall.h @@ -21,13 +21,15 @@ #define RIPPLE_NET_RPCCALL_H_INCLUDED #include + #include #include + #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/net/RPCSub.h b/src/xrpld/net/RPCSub.h index b2a751d4a1..9730ca2dec 100644 --- a/src/xrpld/net/RPCSub.h +++ b/src/xrpld/net/RPCSub.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/net/RegisterSSLCerts.h b/src/xrpld/net/RegisterSSLCerts.h index 88664139f1..58c8c6c82d 100644 --- a/src/xrpld/net/RegisterSSLCerts.h +++ b/src/xrpld/net/RegisterSSLCerts.h @@ -21,6 +21,7 @@ #define RIPPLE_NET_REGISTER_SSL_CERTS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/HTTPClient.cpp b/src/xrpld/net/detail/HTTPClient.cpp index 61c2875a5f..0ead4cf0dc 100644 --- a/src/xrpld/net/detail/HTTPClient.cpp +++ b/src/xrpld/net/detail/HTTPClient.cpp @@ -20,14 +20,15 @@ #include #include #include + #include -#include -#include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/InfoSub.cpp b/src/xrpld/net/detail/InfoSub.cpp index e22a370480..7acd7f07a7 100644 --- a/src/xrpld/net/detail/InfoSub.cpp +++ b/src/xrpld/net/detail/InfoSub.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/net/detail/RPCCall.cpp b/src/xrpld/net/detail/RPCCall.cpp index c91005a66d..814ea362e4 100644 --- a/src/xrpld/net/detail/RPCCall.cpp +++ b/src/xrpld/net/detail/RPCCall.cpp @@ -23,17 +23,16 @@ #include #include #include + #include #include #include #include #include #include -#include #include #include #include -#include #include #include #include @@ -41,7 +40,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/net/detail/RPCSub.cpp b/src/xrpld/net/detail/RPCSub.cpp index 13bdf9119b..96f91cdcf5 100644 --- a/src/xrpld/net/detail/RPCSub.cpp +++ b/src/xrpld/net/detail/RPCSub.cpp @@ -19,10 +19,12 @@ #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/RegisterSSLCerts.cpp b/src/xrpld/net/detail/RegisterSSLCerts.cpp index ede42b03af..0dbf036e01 100644 --- a/src/xrpld/net/detail/RegisterSSLCerts.cpp +++ b/src/xrpld/net/detail/RegisterSSLCerts.cpp @@ -16,17 +16,20 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include #if BOOST_OS_WINDOWS #include #include -#include + #include #include #include + #include + +#include #endif namespace ripple { diff --git a/src/xrpld/nodestore/Backend.h b/src/xrpld/nodestore/Backend.h index 29f3755332..1097895416 100644 --- a/src/xrpld/nodestore/Backend.h +++ b/src/xrpld/nodestore/Backend.h @@ -21,7 +21,7 @@ #define RIPPLE_NODESTORE_BACKEND_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/Database.h b/src/xrpld/nodestore/Database.h index c22ede8248..e1aa801c44 100644 --- a/src/xrpld/nodestore/Database.h +++ b/src/xrpld/nodestore/Database.h @@ -23,11 +23,12 @@ #include #include #include -#include + +#include +#include #include #include -#include namespace ripple { diff --git a/src/xrpld/nodestore/Factory.h b/src/xrpld/nodestore/Factory.h index 8853a6ce9a..b0768907da 100644 --- a/src/xrpld/nodestore/Factory.h +++ b/src/xrpld/nodestore/Factory.h @@ -22,7 +22,10 @@ #include #include + +#include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/NodeObject.h b/src/xrpld/nodestore/NodeObject.h index f5a1fdb075..dd7f4c4dc7 100644 --- a/src/xrpld/nodestore/NodeObject.h +++ b/src/xrpld/nodestore/NodeObject.h @@ -22,7 +22,7 @@ #include #include -#include +#include // VFALCO NOTE Intentionally not in the NodeStore namespace diff --git a/src/xrpld/nodestore/Scheduler.h b/src/xrpld/nodestore/Scheduler.h index 236c2260ee..663db7eb74 100644 --- a/src/xrpld/nodestore/Scheduler.h +++ b/src/xrpld/nodestore/Scheduler.h @@ -21,6 +21,7 @@ #define RIPPLE_NODESTORE_SCHEDULER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/Types.h b/src/xrpld/nodestore/Types.h index a5792fe7df..5e22eb4ddf 100644 --- a/src/xrpld/nodestore/Types.h +++ b/src/xrpld/nodestore/Types.h @@ -21,7 +21,7 @@ #define RIPPLE_NODESTORE_TYPES_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/backend/MemoryFactory.cpp b/src/xrpld/nodestore/backend/MemoryFactory.cpp index aac305cea0..dc3106cc91 100644 --- a/src/xrpld/nodestore/backend/MemoryFactory.cpp +++ b/src/xrpld/nodestore/backend/MemoryFactory.cpp @@ -19,9 +19,12 @@ #include #include + #include + #include #include + #include #include #include diff --git a/src/xrpld/nodestore/backend/NuDBFactory.cpp b/src/xrpld/nodestore/backend/NuDBFactory.cpp index 24ebffd33a..2f4e9d502e 100644 --- a/src/xrpld/nodestore/backend/NuDBFactory.cpp +++ b/src/xrpld/nodestore/backend/NuDBFactory.cpp @@ -22,15 +22,19 @@ #include #include #include + #include #include + #include + +#include + #include #include #include #include #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/backend/NullFactory.cpp b/src/xrpld/nodestore/backend/NullFactory.cpp index 47254cd50f..5aae8ca7cf 100644 --- a/src/xrpld/nodestore/backend/NullFactory.cpp +++ b/src/xrpld/nodestore/backend/NullFactory.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/backend/RocksDBFactory.cpp b/src/xrpld/nodestore/backend/RocksDBFactory.cpp index 2034128949..0e421cd6bd 100644 --- a/src/xrpld/nodestore/backend/RocksDBFactory.cpp +++ b/src/xrpld/nodestore/backend/RocksDBFactory.cpp @@ -20,13 +20,13 @@ #include #if RIPPLE_ROCKSDB_AVAILABLE - #include // VFALCO Bad dependency #include #include #include #include #include + #include #include #include @@ -191,8 +191,12 @@ public: if (keyValues.exists("bbt_options")) { + rocksdb::ConfigOptions config_options; auto const s = rocksdb::GetBlockBasedTableOptionsFromString( - table_options, get(keyValues, "bbt_options"), &table_options); + config_options, + table_options, + get(keyValues, "bbt_options"), + &table_options); if (!s.ok()) Throw( std::string("Unable to set RocksDB bbt_options: ") + diff --git a/src/xrpld/nodestore/detail/BatchWriter.h b/src/xrpld/nodestore/detail/BatchWriter.h index c48002f4f8..15ba508f64 100644 --- a/src/xrpld/nodestore/detail/BatchWriter.h +++ b/src/xrpld/nodestore/detail/BatchWriter.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/nodestore/detail/Database.cpp b/src/xrpld/nodestore/detail/Database.cpp index 7564ca60b5..4edafcddca 100644 --- a/src/xrpld/nodestore/detail/Database.cpp +++ b/src/xrpld/nodestore/detail/Database.cpp @@ -18,11 +18,13 @@ //============================================================================== #include + #include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp b/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp index 85e5d3c0da..2502d52815 100644 --- a/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp +++ b/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/DatabaseNodeImp.h b/src/xrpld/nodestore/detail/DatabaseNodeImp.h index d90f02ce87..160bf92d5e 100644 --- a/src/xrpld/nodestore/detail/DatabaseNodeImp.h +++ b/src/xrpld/nodestore/detail/DatabaseNodeImp.h @@ -21,6 +21,7 @@ #define RIPPLE_NODESTORE_DATABASENODEIMP_H_INCLUDED #include + #include #include diff --git a/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp b/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp index c7e6c8c349..a4828ab2c2 100644 --- a/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp +++ b/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/DecodedBlob.cpp b/src/xrpld/nodestore/detail/DecodedBlob.cpp index fbf9f532a0..adec27a68f 100644 --- a/src/xrpld/nodestore/detail/DecodedBlob.cpp +++ b/src/xrpld/nodestore/detail/DecodedBlob.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/EncodedBlob.h b/src/xrpld/nodestore/detail/EncodedBlob.h index 01b167159e..a238f2b856 100644 --- a/src/xrpld/nodestore/detail/EncodedBlob.h +++ b/src/xrpld/nodestore/detail/EncodedBlob.h @@ -21,9 +21,11 @@ #define RIPPLE_NODESTORE_ENCODEDBLOB_H_INCLUDED #include -#include + #include + #include + #include #include #include diff --git a/src/xrpld/nodestore/detail/NodeObject.cpp b/src/xrpld/nodestore/detail/NodeObject.cpp index f633014b09..0e81c047c6 100644 --- a/src/xrpld/nodestore/detail/NodeObject.cpp +++ b/src/xrpld/nodestore/detail/NodeObject.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/codec.h b/src/xrpld/nodestore/detail/codec.h index f19672b812..7bc3ab2caa 100644 --- a/src/xrpld/nodestore/detail/codec.h +++ b/src/xrpld/nodestore/detail/codec.h @@ -25,15 +25,18 @@ #include #include + #include #include #include + +#include + +#include + #include #include -#include -#include #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/varint.h b/src/xrpld/nodestore/detail/varint.h index 75d8e58a75..6ccbe68b87 100644 --- a/src/xrpld/nodestore/detail/varint.h +++ b/src/xrpld/nodestore/detail/varint.h @@ -20,8 +20,9 @@ #ifndef BEAST_NUDB_VARINT_H_INCLUDED #define BEAST_NUDB_VARINT_H_INCLUDED -#include #include + +#include #include namespace ripple { diff --git a/src/xrpld/overlay/Cluster.h b/src/xrpld/overlay/Cluster.h index 42bda586c0..a2fd7f9c53 100644 --- a/src/xrpld/overlay/Cluster.h +++ b/src/xrpld/overlay/Cluster.h @@ -20,18 +20,16 @@ #ifndef RIPPLE_OVERLAY_CLUSTER_H_INCLUDED #define RIPPLE_OVERLAY_CLUSTER_H_INCLUDED -#include #include + #include #include -#include #include #include + #include -#include #include #include -#include namespace ripple { diff --git a/src/xrpld/overlay/ClusterNode.h b/src/xrpld/overlay/ClusterNode.h index 1ca78208dd..02b4709c52 100644 --- a/src/xrpld/overlay/ClusterNode.h +++ b/src/xrpld/overlay/ClusterNode.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/overlay/Compression.h b/src/xrpld/overlay/Compression.h index c7437badc4..3a278a3403 100644 --- a/src/xrpld/overlay/Compression.h +++ b/src/xrpld/overlay/Compression.h @@ -22,7 +22,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/overlay/Message.h b/src/xrpld/overlay/Message.h index 247e53ec9f..92e2824327 100644 --- a/src/xrpld/overlay/Message.h +++ b/src/xrpld/overlay/Message.h @@ -21,17 +21,13 @@ #define RIPPLE_OVERLAY_MESSAGE_H_INCLUDED #include + #include #include #include -#include -#include + #include -#include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/overlay/Overlay.h b/src/xrpld/overlay/Overlay.h index 9aff156068..7f5c858f67 100644 --- a/src/xrpld/overlay/Overlay.h +++ b/src/xrpld/overlay/Overlay.h @@ -21,21 +21,18 @@ #define RIPPLE_OVERLAY_OVERLAY_H_INCLUDED #include -#include + #include #include #include -#include + #include #include -#include #include -#include #include + #include -#include #include -#include namespace boost { namespace asio { diff --git a/src/xrpld/overlay/Peer.h b/src/xrpld/overlay/Peer.h index 2646b24a3e..9a5bd7136b 100644 --- a/src/xrpld/overlay/Peer.h +++ b/src/xrpld/overlay/Peer.h @@ -21,6 +21,7 @@ #define RIPPLE_OVERLAY_PEER_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/overlay/PeerReservationTable.h b/src/xrpld/overlay/PeerReservationTable.h index fb3add61f7..ddd6526161 100644 --- a/src/xrpld/overlay/PeerReservationTable.h +++ b/src/xrpld/overlay/PeerReservationTable.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff --git a/src/xrpld/overlay/PeerSet.h b/src/xrpld/overlay/PeerSet.h index aca6242f9d..6fb4b65643 100644 --- a/src/xrpld/overlay/PeerSet.h +++ b/src/xrpld/overlay/PeerSet.h @@ -23,11 +23,6 @@ #include #include #include -#include -#include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/overlay/ReduceRelayCommon.h b/src/xrpld/overlay/ReduceRelayCommon.h index 8289e467e6..01d7dc597f 100644 --- a/src/xrpld/overlay/ReduceRelayCommon.h +++ b/src/xrpld/overlay/ReduceRelayCommon.h @@ -62,4 +62,4 @@ static constexpr std::size_t MAX_TX_QUEUE_SIZE = 10000; } // namespace ripple -#endif // RIPPLED_REDUCERELAYCOMMON_H_INCLUDED \ No newline at end of file +#endif // RIPPLED_REDUCERELAYCOMMON_H_INCLUDED diff --git a/src/xrpld/overlay/Slot.h b/src/xrpld/overlay/Slot.h index 92ec09de12..b2db772f5b 100644 --- a/src/xrpld/overlay/Slot.h +++ b/src/xrpld/overlay/Slot.h @@ -22,9 +22,10 @@ #include #include -#include + #include #include +#include #include #include #include diff --git a/src/xrpld/overlay/Squelch.h b/src/xrpld/overlay/Squelch.h index 2919922da9..0507bd4d2d 100644 --- a/src/xrpld/overlay/Squelch.h +++ b/src/xrpld/overlay/Squelch.h @@ -21,7 +21,7 @@ #define RIPPLE_OVERLAY_SQUELCH_H_INCLUDED #include -#include + #include #include diff --git a/src/xrpld/overlay/detail/Cluster.cpp b/src/xrpld/overlay/detail/Cluster.cpp index 9d25248e8d..b4e5b6fc50 100644 --- a/src/xrpld/overlay/detail/Cluster.cpp +++ b/src/xrpld/overlay/detail/Cluster.cpp @@ -21,10 +21,11 @@ #include #include #include + #include #include -#include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/ConnectAttempt.cpp b/src/xrpld/overlay/detail/ConnectAttempt.cpp index 4bb76369c4..30763b1357 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.cpp +++ b/src/xrpld/overlay/detail/ConnectAttempt.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/ConnectAttempt.h b/src/xrpld/overlay/detail/ConnectAttempt.h index 474ac3c069..c3e07f956a 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.h +++ b/src/xrpld/overlay/detail/ConnectAttempt.h @@ -21,7 +21,6 @@ #define RIPPLE_OVERLAY_CONNECTATTEMPT_H_INCLUDED #include -#include namespace ripple { diff --git a/src/xrpld/overlay/detail/Handshake.cpp b/src/xrpld/overlay/detail/Handshake.cpp index 8f1aae8c02..657d28072f 100644 --- a/src/xrpld/overlay/detail/Handshake.cpp +++ b/src/xrpld/overlay/detail/Handshake.cpp @@ -20,11 +20,14 @@ #include #include #include + #include #include #include #include + #include + #include // VFALCO Shouldn't we have to include the OpenSSL diff --git a/src/xrpld/overlay/detail/Handshake.h b/src/xrpld/overlay/detail/Handshake.h index 76c11b287c..37f138b88b 100644 --- a/src/xrpld/overlay/detail/Handshake.h +++ b/src/xrpld/overlay/detail/Handshake.h @@ -22,18 +22,17 @@ #include #include + #include #include -#include -#include -#include -#include -#include #include +#include #include #include #include +#include + #include #include diff --git a/src/xrpld/overlay/detail/Message.cpp b/src/xrpld/overlay/detail/Message.cpp index cdcf433f61..6473f30c89 100644 --- a/src/xrpld/overlay/detail/Message.cpp +++ b/src/xrpld/overlay/detail/Message.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/OverlayImpl.cpp b/src/xrpld/overlay/detail/OverlayImpl.cpp index b69a074e99..2209414d9f 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.cpp +++ b/src/xrpld/overlay/detail/OverlayImpl.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include @@ -27,10 +26,12 @@ #include #include #include +#include #include #include #include #include + #include #include #include @@ -502,6 +503,9 @@ OverlayImpl::start() // Pool of servers operated by @Xrpkuwait - https://xrpkuwait.com bootstrapIps.push_back("hubs.xrpkuwait.com 51235"); + + // Pool of servers operated by XRPL Commons - https://xrpl-commons.org + bootstrapIps.push_back("hub.xrpl-commons.org 51235"); } m_resolver.resolve( diff --git a/src/xrpld/overlay/detail/OverlayImpl.h b/src/xrpld/overlay/detail/OverlayImpl.h index c5cfe6274e..4112e6dfd9 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.h +++ b/src/xrpld/overlay/detail/OverlayImpl.h @@ -30,17 +30,20 @@ #include #include #include + #include #include #include #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 8989f89fb3..6df9b78df8 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -32,6 +32,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerImp.h b/src/xrpld/overlay/detail/PeerImp.h index 23916db217..459b359ffb 100644 --- a/src/xrpld/overlay/detail/PeerImp.h +++ b/src/xrpld/overlay/detail/PeerImp.h @@ -24,11 +24,10 @@ #include #include #include -#include #include #include + #include -#include #include #include #include @@ -39,6 +38,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerReservationTable.cpp b/src/xrpld/overlay/detail/PeerReservationTable.cpp index 6fd0112f46..1a2842591c 100644 --- a/src/xrpld/overlay/detail/PeerReservationTable.cpp +++ b/src/xrpld/overlay/detail/PeerReservationTable.cpp @@ -17,17 +17,14 @@ */ //============================================================================== -#include - #include #include -#include +#include + #include #include #include -#include - #include #include #include diff --git a/src/xrpld/overlay/detail/ProtocolMessage.h b/src/xrpld/overlay/detail/ProtocolMessage.h index 54f99eb73d..26c83055a3 100644 --- a/src/xrpld/overlay/detail/ProtocolMessage.h +++ b/src/xrpld/overlay/detail/ProtocolMessage.h @@ -23,14 +23,14 @@ #include #include #include -#include + #include #include + #include #include -#include + #include -#include #include #include #include diff --git a/src/xrpld/overlay/detail/ProtocolVersion.cpp b/src/xrpld/overlay/detail/ProtocolVersion.cpp index 0fecb301f7..9da1d6416e 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.cpp +++ b/src/xrpld/overlay/detail/ProtocolVersion.cpp @@ -18,10 +18,13 @@ //============================================================================== #include + #include #include + #include #include + #include #include diff --git a/src/xrpld/overlay/detail/ProtocolVersion.h b/src/xrpld/overlay/detail/ProtocolVersion.h index 71ab0d59d7..efdb4908f0 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.h +++ b/src/xrpld/overlay/detail/ProtocolVersion.h @@ -21,6 +21,7 @@ #define RIPPLE_OVERLAY_PROTOCOLVERSION_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/overlay/detail/TrafficCount.h b/src/xrpld/overlay/detail/TrafficCount.h index 9b4fabdc34..b508970e44 100644 --- a/src/xrpld/overlay/detail/TrafficCount.h +++ b/src/xrpld/overlay/detail/TrafficCount.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED #define RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED -#include #include #include diff --git a/src/xrpld/overlay/detail/TxMetrics.cpp b/src/xrpld/overlay/detail/TxMetrics.cpp index 8759e0122e..bd493d7467 100644 --- a/src/xrpld/overlay/detail/TxMetrics.cpp +++ b/src/xrpld/overlay/detail/TxMetrics.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/overlay/detail/TxMetrics.h b/src/xrpld/overlay/detail/TxMetrics.h index eda7f1bb1b..7f369cdda8 100644 --- a/src/xrpld/overlay/detail/TxMetrics.h +++ b/src/xrpld/overlay/detail/TxMetrics.h @@ -138,4 +138,4 @@ struct TxMetrics } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/src/xrpld/overlay/detail/ZeroCopyStream.h b/src/xrpld/overlay/detail/ZeroCopyStream.h index ac210bf6b9..41d94578b0 100644 --- a/src/xrpld/overlay/detail/ZeroCopyStream.h +++ b/src/xrpld/overlay/detail/ZeroCopyStream.h @@ -23,7 +23,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/overlay/make_Overlay.h b/src/xrpld/overlay/make_Overlay.h index 6532281f3d..3476026562 100644 --- a/src/xrpld/overlay/make_Overlay.h +++ b/src/xrpld/overlay/make_Overlay.h @@ -22,10 +22,10 @@ #include #include + #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/peerfinder/PeerfinderManager.h b/src/xrpld/peerfinder/PeerfinderManager.h index 10de99abe6..a670fb8780 100644 --- a/src/xrpld/peerfinder/PeerfinderManager.h +++ b/src/xrpld/peerfinder/PeerfinderManager.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/Slot.h b/src/xrpld/peerfinder/Slot.h index 879c6a5331..171faed945 100644 --- a/src/xrpld/peerfinder/Slot.h +++ b/src/xrpld/peerfinder/Slot.h @@ -22,7 +22,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Bootcache.cpp b/src/xrpld/peerfinder/detail/Bootcache.cpp index 1af5f0e1c9..9652d55802 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.cpp +++ b/src/xrpld/peerfinder/detail/Bootcache.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Bootcache.h b/src/xrpld/peerfinder/detail/Bootcache.h index 07e8869594..4a5d95fd41 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.h +++ b/src/xrpld/peerfinder/detail/Bootcache.h @@ -22,9 +22,11 @@ #include #include + #include #include #include + #include #include #include diff --git a/src/xrpld/peerfinder/detail/Checker.h b/src/xrpld/peerfinder/detail/Checker.h index 338bd83954..e7983471a5 100644 --- a/src/xrpld/peerfinder/detail/Checker.h +++ b/src/xrpld/peerfinder/detail/Checker.h @@ -21,15 +21,14 @@ #define RIPPLE_PEERFINDER_CHECKER_H_INCLUDED #include -#include + #include #include #include -#include + #include #include #include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Counts.h b/src/xrpld/peerfinder/detail/Counts.h index 0078ae2841..c91b27b026 100644 --- a/src/xrpld/peerfinder/detail/Counts.h +++ b/src/xrpld/peerfinder/detail/Counts.h @@ -23,9 +23,8 @@ #include #include #include -#include -#include +#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Handouts.h b/src/xrpld/peerfinder/detail/Handouts.h index 36e9c712e3..4c30af4805 100644 --- a/src/xrpld/peerfinder/detail/Handouts.h +++ b/src/xrpld/peerfinder/detail/Handouts.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Livecache.h b/src/xrpld/peerfinder/detail/Livecache.h index 03d9959210..503ea0161a 100644 --- a/src/xrpld/peerfinder/detail/Livecache.h +++ b/src/xrpld/peerfinder/detail/Livecache.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include #include diff --git a/src/xrpld/peerfinder/detail/Logic.h b/src/xrpld/peerfinder/detail/Logic.h index 01f38ad7fd..b3922f63b3 100644 --- a/src/xrpld/peerfinder/detail/Logic.h +++ b/src/xrpld/peerfinder/detail/Logic.h @@ -30,10 +30,10 @@ #include #include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp index 8baa2b50b9..86093fa166 100644 --- a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp +++ b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp @@ -22,11 +22,11 @@ #include #include #include + #include -#include + #include #include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/SlotImp.h b/src/xrpld/peerfinder/detail/SlotImp.h index 45143a9012..e5d8b1e6c5 100644 --- a/src/xrpld/peerfinder/detail/SlotImp.h +++ b/src/xrpld/peerfinder/detail/SlotImp.h @@ -22,8 +22,9 @@ #include #include -#include + #include + #include #include diff --git a/src/xrpld/peerfinder/detail/Source.h b/src/xrpld/peerfinder/detail/Source.h index a64da7b9e7..0f388ec3bb 100644 --- a/src/xrpld/peerfinder/detail/Source.h +++ b/src/xrpld/peerfinder/detail/Source.h @@ -21,6 +21,7 @@ #define RIPPLE_PEERFINDER_SOURCE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/SourceStrings.h b/src/xrpld/peerfinder/detail/SourceStrings.h index 52d985a701..0c858dca85 100644 --- a/src/xrpld/peerfinder/detail/SourceStrings.h +++ b/src/xrpld/peerfinder/detail/SourceStrings.h @@ -21,6 +21,7 @@ #define RIPPLE_PEERFINDER_SOURCESTRINGS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Store.h b/src/xrpld/peerfinder/detail/Store.h index f0c033c7a6..2d51dfc204 100644 --- a/src/xrpld/peerfinder/detail/Store.h +++ b/src/xrpld/peerfinder/detail/Store.h @@ -1,3 +1,4 @@ + //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled diff --git a/src/xrpld/peerfinder/detail/StoreSqdb.h b/src/xrpld/peerfinder/detail/StoreSqdb.h index ad8b886d4a..a8e74e6db4 100644 --- a/src/xrpld/peerfinder/detail/StoreSqdb.h +++ b/src/xrpld/peerfinder/detail/StoreSqdb.h @@ -23,8 +23,6 @@ #include #include #include -#include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/make_Manager.h b/src/xrpld/peerfinder/make_Manager.h index 3a4f68d94c..fba95e8f22 100644 --- a/src/xrpld/peerfinder/make_Manager.h +++ b/src/xrpld/peerfinder/make_Manager.h @@ -21,7 +21,9 @@ #define RIPPLE_PEERFINDER_MAKE_MANAGER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/perflog/PerfLog.h b/src/xrpld/perflog/PerfLog.h index a7d66f57ad..58df185e09 100644 --- a/src/xrpld/perflog/PerfLog.h +++ b/src/xrpld/perflog/PerfLog.h @@ -22,8 +22,11 @@ #include #include + #include + #include + #include #include #include diff --git a/src/xrpld/perflog/detail/PerfLogImp.cpp b/src/xrpld/perflog/detail/PerfLogImp.cpp index 559bdb1743..a34faf885c 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.cpp +++ b/src/xrpld/perflog/detail/PerfLogImp.cpp @@ -17,18 +17,17 @@ */ //============================================================================== +#include #include -#include #include #include #include #include -#include + #include #include #include -#include #include #include #include diff --git a/src/xrpld/perflog/detail/PerfLogImp.h b/src/xrpld/perflog/detail/PerfLogImp.h index 937486f75d..d9354471f1 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.h +++ b/src/xrpld/perflog/detail/PerfLogImp.h @@ -22,20 +22,18 @@ #include #include -#include + #include -#include + #include + #include #include #include #include -#include #include #include -#include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/CTID.h b/src/xrpld/rpc/CTID.h index 8cac8d6317..8407d51526 100644 --- a/src/xrpld/rpc/CTID.h +++ b/src/xrpld/rpc/CTID.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_RPC_CTID_H_INCLUDED #define RIPPLE_RPC_CTID_H_INCLUDED -#include #include + #include #include #include diff --git a/src/xrpld/rpc/Context.h b/src/xrpld/rpc/Context.h index edc5582a40..32a7cca653 100644 --- a/src/xrpld/rpc/Context.h +++ b/src/xrpld/rpc/Context.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_RPC_CONTEXT_H_INCLUDED #define RIPPLE_RPC_CONTEXT_H_INCLUDED -#include #include #include #include diff --git a/src/xrpld/rpc/GRPCHandlers.h b/src/xrpld/rpc/GRPCHandlers.h index 679b16fd8a..29e3b1b9ca 100644 --- a/src/xrpld/rpc/GRPCHandlers.h +++ b/src/xrpld/rpc/GRPCHandlers.h @@ -21,7 +21,9 @@ #define RIPPLE_RPC_GRPCHANDLER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/rpc/RPCHandler.h b/src/xrpld/rpc/RPCHandler.h index c056ca27eb..0b5f73bcbe 100644 --- a/src/xrpld/rpc/RPCHandler.h +++ b/src/xrpld/rpc/RPCHandler.h @@ -20,8 +20,6 @@ #ifndef RIPPLE_RPC_RPCHANDLER_H_INCLUDED #define RIPPLE_RPC_RPCHANDLER_H_INCLUDED -#include -#include #include #include diff --git a/src/xrpld/rpc/Role.h b/src/xrpld/rpc/Role.h index 0ce84e09ef..c65db622e7 100644 --- a/src/xrpld/rpc/Role.h +++ b/src/xrpld/rpc/Role.h @@ -25,11 +25,12 @@ #include #include #include + #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/ServerHandler.h b/src/xrpld/rpc/ServerHandler.h index 032011ca77..5f72673313 100644 --- a/src/xrpld/rpc/ServerHandler.h +++ b/src/xrpld/rpc/ServerHandler.h @@ -20,10 +20,11 @@ #ifndef RIPPLE_RPC_SERVERHANDLER_H_INCLUDED #define RIPPLE_RPC_SERVERHANDLER_H_INCLUDED +#include #include #include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/detail/DeliveredAmount.cpp b/src/xrpld/rpc/detail/DeliveredAmount.cpp index 93af859914..9a6d0e9dc8 100644 --- a/src/xrpld/rpc/detail/DeliveredAmount.cpp +++ b/src/xrpld/rpc/detail/DeliveredAmount.cpp @@ -17,18 +17,14 @@ */ //============================================================================== -#include - #include #include #include -#include #include -#include -#include +#include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/Handler.cpp b/src/xrpld/rpc/detail/Handler.cpp index 7414a4b088..abdfa921bb 100644 --- a/src/xrpld/rpc/detail/Handler.cpp +++ b/src/xrpld/rpc/detail/Handler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/detail/Handler.h b/src/xrpld/rpc/detail/Handler.h index cb1a2579ec..e0fb66f6fd 100644 --- a/src/xrpld/rpc/detail/Handler.h +++ b/src/xrpld/rpc/detail/Handler.h @@ -22,12 +22,10 @@ #include #include -#include #include #include #include #include -#include namespace Json { class Object; diff --git a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp index 721be65262..5054ca9cb4 100644 --- a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp +++ b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp @@ -19,11 +19,6 @@ #include -#include -#include -#include -#include - namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/RPCHandler.cpp b/src/xrpld/rpc/detail/RPCHandler.cpp index 19b33709c8..c261666eb9 100644 --- a/src/xrpld/rpc/detail/RPCHandler.cpp +++ b/src/xrpld/rpc/detail/RPCHandler.cpp @@ -31,17 +31,15 @@ #include #include #include + #include -#include -#include #include #include -#include #include #include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/RPCHelpers.cpp b/src/xrpld/rpc/detail/RPCHelpers.cpp index 11c7a7698f..3449a744d6 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCHelpers.cpp @@ -28,8 +28,8 @@ #include #include #include + #include -#include #include #include #include diff --git a/src/xrpld/rpc/detail/RPCHelpers.h b/src/xrpld/rpc/detail/RPCHelpers.h index 74171af28e..89af005292 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.h +++ b/src/xrpld/rpc/detail/RPCHelpers.h @@ -20,16 +20,15 @@ #ifndef RIPPLE_RPC_RPCHELPERS_H_INCLUDED #define RIPPLE_RPC_RPCHELPERS_H_INCLUDED -#include -#include -#include -#include - #include #include #include #include #include + +#include +#include +#include #include #include diff --git a/src/xrpld/rpc/detail/Role.cpp b/src/xrpld/rpc/detail/Role.cpp index b374f03588..94da34efa2 100644 --- a/src/xrpld/rpc/detail/Role.cpp +++ b/src/xrpld/rpc/detail/Role.cpp @@ -18,10 +18,11 @@ //============================================================================== #include + #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/detail/ServerHandler.cpp b/src/xrpld/rpc/detail/ServerHandler.cpp index e5b7d9e327..a5aca59657 100644 --- a/src/xrpld/rpc/detail/ServerHandler.cpp +++ b/src/xrpld/rpc/detail/ServerHandler.cpp @@ -17,18 +17,17 @@ */ //============================================================================== -#include - #include -#include #include #include #include #include #include +#include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/detail/Status.cpp b/src/xrpld/rpc/detail/Status.cpp index 7b23c2cc13..738219b6b5 100644 --- a/src/xrpld/rpc/detail/Status.cpp +++ b/src/xrpld/rpc/detail/Status.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/rpc/detail/TransactionSign.cpp b/src/xrpld/rpc/detail/TransactionSign.cpp index 376a0ce24a..2a7807f8ca 100644 --- a/src/xrpld/rpc/detail/TransactionSign.cpp +++ b/src/xrpld/rpc/detail/TransactionSign.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include @@ -29,16 +28,16 @@ #include #include #include + #include #include #include #include -#include #include -#include #include #include #include + #include #include diff --git a/src/xrpld/rpc/detail/TransactionSign.h b/src/xrpld/rpc/detail/TransactionSign.h index 13e963644a..406707a6a8 100644 --- a/src/xrpld/rpc/detail/TransactionSign.h +++ b/src/xrpld/rpc/detail/TransactionSign.h @@ -22,7 +22,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/rpc/detail/WSInfoSub.h b/src/xrpld/rpc/detail/WSInfoSub.h index 2267b9147f..1652617455 100644 --- a/src/xrpld/rpc/detail/WSInfoSub.h +++ b/src/xrpld/rpc/detail/WSInfoSub.h @@ -22,10 +22,11 @@ #include #include + #include #include #include -#include + #include #include diff --git a/src/xrpld/rpc/handlers/AMMInfo.cpp b/src/xrpld/rpc/handlers/AMMInfo.cpp index 1990cdafd3..b312264f90 100644 --- a/src/xrpld/rpc/handlers/AMMInfo.cpp +++ b/src/xrpld/rpc/handlers/AMMInfo.cpp @@ -16,15 +16,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include + #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountChannels.cpp b/src/xrpld/rpc/handlers/AccountChannels.cpp index 4b9ff7e43c..5d810d61a0 100644 --- a/src/xrpld/rpc/handlers/AccountChannels.cpp +++ b/src/xrpld/rpc/handlers/AccountChannels.cpp @@ -17,18 +17,18 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include -#include #include #include + namespace ripple { void diff --git a/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp b/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp index 6c8fe28267..2d08561ec9 100644 --- a/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp +++ b/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp @@ -17,11 +17,11 @@ */ //============================================================================== -#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/AccountInfo.cpp b/src/xrpld/rpc/handlers/AccountInfo.cpp index 90e3a8d46e..6416309e2e 100644 --- a/src/xrpld/rpc/handlers/AccountInfo.cpp +++ b/src/xrpld/rpc/handlers/AccountInfo.cpp @@ -23,13 +23,12 @@ #include #include #include + #include #include #include -#include #include #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountLines.cpp b/src/xrpld/rpc/handlers/AccountLines.cpp index 5170342eb9..e921eee386 100644 --- a/src/xrpld/rpc/handlers/AccountLines.cpp +++ b/src/xrpld/rpc/handlers/AccountLines.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -54,10 +54,10 @@ addLine(Json::Value& jsonLines, RPCTrustLine const& line) jPeer[jss::authorized] = true; if (line.getAuthPeer()) jPeer[jss::peer_authorized] = true; - if (line.getNoRipple() || !line.getDefaultRipple()) - jPeer[jss::no_ripple] = line.getNoRipple(); - if (line.getNoRipplePeer() || !line.getDefaultRipple()) - jPeer[jss::no_ripple_peer] = line.getNoRipplePeer(); + if (line.getNoRipple()) + jPeer[jss::no_ripple] = true; + if (line.getNoRipplePeer()) + jPeer[jss::no_ripple_peer] = true; if (line.getFreeze()) jPeer[jss::freeze] = true; if (line.getFreezePeer()) diff --git a/src/xrpld/rpc/handlers/AccountObjects.cpp b/src/xrpld/rpc/handlers/AccountObjects.cpp index 1bdd95a74c..03ea427b12 100644 --- a/src/xrpld/rpc/handlers/AccountObjects.cpp +++ b/src/xrpld/rpc/handlers/AccountObjects.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -31,7 +31,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountOffers.cpp b/src/xrpld/rpc/handlers/AccountOffers.cpp index 86559a79f4..bc575d2d86 100644 --- a/src/xrpld/rpc/handlers/AccountOffers.cpp +++ b/src/xrpld/rpc/handlers/AccountOffers.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/AccountTx.cpp b/src/xrpld/rpc/handlers/AccountTx.cpp index ae50401b63..26c8065edf 100644 --- a/src/xrpld/rpc/handlers/AccountTx.cpp +++ b/src/xrpld/rpc/handlers/AccountTx.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -28,7 +27,7 @@ #include #include #include -#include + #include #include #include @@ -37,8 +36,6 @@ #include #include -#include - namespace ripple { using TxnsData = RelationalDatabase::AccountTxs; diff --git a/src/xrpld/rpc/handlers/BlackList.cpp b/src/xrpld/rpc/handlers/BlackList.cpp index 3e887ff730..ee8326a3d6 100644 --- a/src/xrpld/rpc/handlers/BlackList.cpp +++ b/src/xrpld/rpc/handlers/BlackList.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/BookOffers.cpp b/src/xrpld/rpc/handlers/BookOffers.cpp index dccc03de5b..bede01b927 100644 --- a/src/xrpld/rpc/handlers/BookOffers.cpp +++ b/src/xrpld/rpc/handlers/BookOffers.cpp @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/CanDelete.cpp b/src/xrpld/rpc/handlers/CanDelete.cpp index df2301d03e..b7056e7439 100644 --- a/src/xrpld/rpc/handlers/CanDelete.cpp +++ b/src/xrpld/rpc/handlers/CanDelete.cpp @@ -19,14 +19,14 @@ #include #include -#include #include #include + #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Connect.cpp b/src/xrpld/rpc/handlers/Connect.cpp index eb4f67e76f..81a85fd5ae 100644 --- a/src/xrpld/rpc/handlers/Connect.cpp +++ b/src/xrpld/rpc/handlers/Connect.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ConsensusInfo.cpp b/src/xrpld/rpc/handlers/ConsensusInfo.cpp index ce727bb400..113a2f2815 100644 --- a/src/xrpld/rpc/handlers/ConsensusInfo.cpp +++ b/src/xrpld/rpc/handlers/ConsensusInfo.cpp @@ -17,12 +17,11 @@ */ //============================================================================== -#include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/DepositAuthorized.cpp b/src/xrpld/rpc/handlers/DepositAuthorized.cpp index 50aa9ef289..1bb480544d 100644 --- a/src/xrpld/rpc/handlers/DepositAuthorized.cpp +++ b/src/xrpld/rpc/handlers/DepositAuthorized.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Feature1.cpp b/src/xrpld/rpc/handlers/Feature1.cpp index 75e583a352..b2c8098ad1 100644 --- a/src/xrpld/rpc/handlers/Feature1.cpp +++ b/src/xrpld/rpc/handlers/Feature1.cpp @@ -21,8 +21,8 @@ #include #include #include + #include -#include #include #include diff --git a/src/xrpld/rpc/handlers/Fee1.cpp b/src/xrpld/rpc/handlers/Fee1.cpp index de5bdc4f6c..6d15a4d95f 100644 --- a/src/xrpld/rpc/handlers/Fee1.cpp +++ b/src/xrpld/rpc/handlers/Fee1.cpp @@ -22,8 +22,8 @@ #include #include #include + #include -#include namespace ripple { Json::Value diff --git a/src/xrpld/rpc/handlers/FetchInfo.cpp b/src/xrpld/rpc/handlers/FetchInfo.cpp index a4287266e5..1e0fa82480 100644 --- a/src/xrpld/rpc/handlers/FetchInfo.cpp +++ b/src/xrpld/rpc/handlers/FetchInfo.cpp @@ -17,12 +17,11 @@ */ //============================================================================== -#include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/GatewayBalances.cpp b/src/xrpld/rpc/handlers/GatewayBalances.cpp index 26f338cb4f..e8b95bd75c 100644 --- a/src/xrpld/rpc/handlers/GatewayBalances.cpp +++ b/src/xrpld/rpc/handlers/GatewayBalances.cpp @@ -22,9 +22,9 @@ #include #include #include + #include #include -#include #include #include #include diff --git a/src/xrpld/rpc/handlers/GetAggregatePrice.cpp b/src/xrpld/rpc/handlers/GetAggregatePrice.cpp index 7467b94b63..8001071f85 100644 --- a/src/xrpld/rpc/handlers/GetAggregatePrice.cpp +++ b/src/xrpld/rpc/handlers/GetAggregatePrice.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/GetCounts.cpp b/src/xrpld/rpc/handlers/GetCounts.cpp index 690106ebbd..9f57f08a24 100644 --- a/src/xrpld/rpc/handlers/GetCounts.cpp +++ b/src/xrpld/rpc/handlers/GetCounts.cpp @@ -23,13 +23,12 @@ #include #include #include -#include #include #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/GetCounts.h b/src/xrpld/rpc/handlers/GetCounts.h index dacf93fa91..57b43e44bd 100644 --- a/src/xrpld/rpc/handlers/GetCounts.h +++ b/src/xrpld/rpc/handlers/GetCounts.h @@ -21,6 +21,7 @@ #define RIPPLE_RPC_HANDLERS_GETCOUNTS_H_INCLUDED #include + #include namespace ripple { @@ -30,4 +31,4 @@ getCountsJson(Application& app, int minObjectCount); } -#endif \ No newline at end of file +#endif diff --git a/src/xrpld/rpc/handlers/LedgerAccept.cpp b/src/xrpld/rpc/handlers/LedgerAccept.cpp index dbd7eb9f1c..8784513363 100644 --- a/src/xrpld/rpc/handlers/LedgerAccept.cpp +++ b/src/xrpld/rpc/handlers/LedgerAccept.cpp @@ -22,9 +22,8 @@ #include #include #include + #include -#include -#include #include #include diff --git a/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp b/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp index 48f024c051..943065e522 100644 --- a/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp +++ b/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LedgerClosed.cpp b/src/xrpld/rpc/handlers/LedgerClosed.cpp index b5644d9910..9a18870046 100644 --- a/src/xrpld/rpc/handlers/LedgerClosed.cpp +++ b/src/xrpld/rpc/handlers/LedgerClosed.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerCurrent.cpp b/src/xrpld/rpc/handlers/LedgerCurrent.cpp index 7f1d83c17a..8927e44953 100644 --- a/src/xrpld/rpc/handlers/LedgerCurrent.cpp +++ b/src/xrpld/rpc/handlers/LedgerCurrent.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LedgerData.cpp b/src/xrpld/rpc/handlers/LedgerData.cpp index ad26b83b43..7bd50cc1e5 100644 --- a/src/xrpld/rpc/handlers/LedgerData.cpp +++ b/src/xrpld/rpc/handlers/LedgerData.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -169,16 +170,23 @@ doLedgerDataGrpc( } auto e = ledger->sles.end(); - if (auto key = uint256::fromVoidChecked(request.end_marker())) + if (request.end_marker().size() != 0) { + auto const key = uint256::fromVoidChecked(request.end_marker()); + + if (!key) + return { + response, + {grpc::StatusCode::INVALID_ARGUMENT, "end marker malformed"}}; + + if (*key < startKey) + return { + response, + {grpc::StatusCode::INVALID_ARGUMENT, + "end marker out of range"}}; + e = ledger->sles.upper_bound(*key); } - else if (request.end_marker().size() != 0) - { - grpc::Status errorStatus{ - grpc::StatusCode::INVALID_ARGUMENT, "end marker malformed"}; - return {response, errorStatus}; - } int maxLimit = RPC::Tuning::pageLength(true); diff --git a/src/xrpld/rpc/handlers/LedgerEntry.cpp b/src/xrpld/rpc/handlers/LedgerEntry.cpp index 7298ee290d..7da99b3a76 100644 --- a/src/xrpld/rpc/handlers/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/LedgerEntry.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -32,6 +32,7 @@ #include #include #include + #include namespace ripple { @@ -821,12 +822,18 @@ parsePermissionedDomains(Json::Value const& pd, Json::Value& jvResult) return std::nullopt; } - if (!pd.isMember(jss::account) || !pd[jss::account].isString()) + if (!pd.isMember(jss::account)) { jvResult[jss::error] = "malformedRequest"; return std::nullopt; } + if (!pd[jss::account].isString()) + { + jvResult[jss::error] = "malformedAddress"; + return std::nullopt; + } + if (!pd.isMember(jss::seq) || (pd[jss::seq].isInt() && pd[jss::seq].asInt() < 0) || (!pd[jss::seq].isInt() && !pd[jss::seq].isUInt())) diff --git a/src/xrpld/rpc/handlers/LedgerHandler.cpp b/src/xrpld/rpc/handlers/LedgerHandler.cpp index 486c587d7e..4015bb9fcc 100644 --- a/src/xrpld/rpc/handlers/LedgerHandler.cpp +++ b/src/xrpld/rpc/handlers/LedgerHandler.cpp @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/LedgerHandler.h b/src/xrpld/rpc/handlers/LedgerHandler.h index 0a1ba2b427..0e47164ad3 100644 --- a/src/xrpld/rpc/handlers/LedgerHandler.h +++ b/src/xrpld/rpc/handlers/LedgerHandler.h @@ -29,6 +29,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerHeader.cpp b/src/xrpld/rpc/handlers/LedgerHeader.cpp index b73ee260d4..1815c8db56 100644 --- a/src/xrpld/rpc/handlers/LedgerHeader.cpp +++ b/src/xrpld/rpc/handlers/LedgerHeader.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerRequest.cpp b/src/xrpld/rpc/handlers/LedgerRequest.cpp index 8f79bb04f3..fed89daaf2 100644 --- a/src/xrpld/rpc/handlers/LedgerRequest.cpp +++ b/src/xrpld/rpc/handlers/LedgerRequest.cpp @@ -17,17 +17,13 @@ */ //============================================================================== -#include -#include #include -#include #include #include -#include + #include -#include #include -#include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LogLevel.cpp b/src/xrpld/rpc/handlers/LogLevel.cpp index bf0a0e1e28..0fc266569e 100644 --- a/src/xrpld/rpc/handlers/LogLevel.cpp +++ b/src/xrpld/rpc/handlers/LogLevel.cpp @@ -19,11 +19,13 @@ #include #include + #include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LogRotate.cpp b/src/xrpld/rpc/handlers/LogRotate.cpp index b7a887b0e2..959c77d718 100644 --- a/src/xrpld/rpc/handlers/LogRotate.cpp +++ b/src/xrpld/rpc/handlers/LogRotate.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Manifest.cpp b/src/xrpld/rpc/handlers/Manifest.cpp index 1debd48422..4d783c1d3b 100644 --- a/src/xrpld/rpc/handlers/Manifest.cpp +++ b/src/xrpld/rpc/handlers/Manifest.cpp @@ -19,10 +19,10 @@ #include #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/NFTOffers.cpp b/src/xrpld/rpc/handlers/NFTOffers.cpp index bffb3dfbb6..52a5c69ab0 100644 --- a/src/xrpld/rpc/handlers/NFTOffers.cpp +++ b/src/xrpld/rpc/handlers/NFTOffers.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/NoRippleCheck.cpp b/src/xrpld/rpc/handlers/NoRippleCheck.cpp index 94830a4f39..a6007e9eab 100644 --- a/src/xrpld/rpc/handlers/NoRippleCheck.cpp +++ b/src/xrpld/rpc/handlers/NoRippleCheck.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/OwnerInfo.cpp b/src/xrpld/rpc/handlers/OwnerInfo.cpp index 83bf8b0ef2..36c14cecaf 100644 --- a/src/xrpld/rpc/handlers/OwnerInfo.cpp +++ b/src/xrpld/rpc/handlers/OwnerInfo.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/PathFind.cpp b/src/xrpld/rpc/handlers/PathFind.cpp index 6c9021ce97..29304227c2 100644 --- a/src/xrpld/rpc/handlers/PathFind.cpp +++ b/src/xrpld/rpc/handlers/PathFind.cpp @@ -19,9 +19,9 @@ #include #include -#include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/PayChanClaim.cpp b/src/xrpld/rpc/handlers/PayChanClaim.cpp index f9c40ee776..aaa559895c 100644 --- a/src/xrpld/rpc/handlers/PayChanClaim.cpp +++ b/src/xrpld/rpc/handlers/PayChanClaim.cpp @@ -17,18 +17,15 @@ */ //============================================================================== -#include #include #include #include -#include + #include #include #include #include -#include #include -#include #include diff --git a/src/xrpld/rpc/handlers/Peers.cpp b/src/xrpld/rpc/handlers/Peers.cpp index f3be0df558..33f3af27e6 100644 --- a/src/xrpld/rpc/handlers/Peers.cpp +++ b/src/xrpld/rpc/handlers/Peers.cpp @@ -17,13 +17,14 @@ */ //============================================================================== +#include #include #include #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Ping.cpp b/src/xrpld/rpc/handlers/Ping.cpp index cb0dabcb9d..e96ff19054 100644 --- a/src/xrpld/rpc/handlers/Ping.cpp +++ b/src/xrpld/rpc/handlers/Ping.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/Print.cpp b/src/xrpld/rpc/handlers/Print.cpp index df50124088..d9a7f3484e 100644 --- a/src/xrpld/rpc/handlers/Print.cpp +++ b/src/xrpld/rpc/handlers/Print.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Reservations.cpp b/src/xrpld/rpc/handlers/Reservations.cpp index 1ff2d506af..b19b948469 100644 --- a/src/xrpld/rpc/handlers/Reservations.cpp +++ b/src/xrpld/rpc/handlers/Reservations.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/RipplePathFind.cpp b/src/xrpld/rpc/handlers/RipplePathFind.cpp index 80c336004b..abe1b3b9bb 100644 --- a/src/xrpld/rpc/handlers/RipplePathFind.cpp +++ b/src/xrpld/rpc/handlers/RipplePathFind.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/ServerInfo.cpp b/src/xrpld/rpc/handlers/ServerInfo.cpp index 1cb90c0b9d..b303402e2d 100644 --- a/src/xrpld/rpc/handlers/ServerInfo.cpp +++ b/src/xrpld/rpc/handlers/ServerInfo.cpp @@ -17,14 +17,13 @@ */ //============================================================================== -#include #include #include #include + #include #include #include -#include #include #include #include diff --git a/src/xrpld/rpc/handlers/ServerState.cpp b/src/xrpld/rpc/handlers/ServerState.cpp index dec18eca11..dbe80c6599 100644 --- a/src/xrpld/rpc/handlers/ServerState.cpp +++ b/src/xrpld/rpc/handlers/ServerState.cpp @@ -20,9 +20,8 @@ #include #include #include -#include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/SignFor.cpp b/src/xrpld/rpc/handlers/SignFor.cpp index 80f5594e1e..5a26450dbe 100644 --- a/src/xrpld/rpc/handlers/SignFor.cpp +++ b/src/xrpld/rpc/handlers/SignFor.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/SignHandler.cpp b/src/xrpld/rpc/handlers/SignHandler.cpp index 2547ef8ead..f6b068ddd3 100644 --- a/src/xrpld/rpc/handlers/SignHandler.cpp +++ b/src/xrpld/rpc/handlers/SignHandler.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/Simulate.cpp b/src/xrpld/rpc/handlers/Simulate.cpp index 7d391497f6..3c7340ece3 100644 --- a/src/xrpld/rpc/handlers/Simulate.cpp +++ b/src/xrpld/rpc/handlers/Simulate.cpp @@ -21,11 +21,12 @@ #include #include #include +#include #include #include #include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Stop.cpp b/src/xrpld/rpc/handlers/Stop.cpp index ea37a1aaa1..03e73fb6b7 100644 --- a/src/xrpld/rpc/handlers/Stop.cpp +++ b/src/xrpld/rpc/handlers/Stop.cpp @@ -19,9 +19,8 @@ #include #include -#include -#include +#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Submit.cpp b/src/xrpld/rpc/handlers/Submit.cpp index 0a3fe41923..b0ea437cf1 100644 --- a/src/xrpld/rpc/handlers/Submit.cpp +++ b/src/xrpld/rpc/handlers/Submit.cpp @@ -18,13 +18,11 @@ //============================================================================== #include -#include #include #include #include -#include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp b/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp index 5535e37681..48ac8245e8 100644 --- a/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp +++ b/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Subscribe.cpp b/src/xrpld/rpc/handlers/Subscribe.cpp index 66fe89dea0..35b82edb3f 100644 --- a/src/xrpld/rpc/handlers/Subscribe.cpp +++ b/src/xrpld/rpc/handlers/Subscribe.cpp @@ -25,6 +25,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/TransactionEntry.cpp b/src/xrpld/rpc/handlers/TransactionEntry.cpp index e81e043459..c94e95063b 100644 --- a/src/xrpld/rpc/handlers/TransactionEntry.cpp +++ b/src/xrpld/rpc/handlers/TransactionEntry.cpp @@ -18,11 +18,11 @@ //============================================================================== #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Tx.cpp b/src/xrpld/rpc/handlers/Tx.cpp index b603e3945a..c3b3305af7 100644 --- a/src/xrpld/rpc/handlers/Tx.cpp +++ b/src/xrpld/rpc/handlers/Tx.cpp @@ -29,13 +29,13 @@ #include #include #include + #include #include #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/TxHistory.cpp b/src/xrpld/rpc/handlers/TxHistory.cpp index 1122eab51c..786f7c6398 100644 --- a/src/xrpld/rpc/handlers/TxHistory.cpp +++ b/src/xrpld/rpc/handlers/TxHistory.cpp @@ -22,16 +22,13 @@ #include #include #include -#include -#include #include #include -#include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/TxReduceRelay.cpp b/src/xrpld/rpc/handlers/TxReduceRelay.cpp index d8c21b3fa4..665e78f4de 100644 --- a/src/xrpld/rpc/handlers/TxReduceRelay.cpp +++ b/src/xrpld/rpc/handlers/TxReduceRelay.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/UnlList.cpp b/src/xrpld/rpc/handlers/UnlList.cpp index b339453437..4edb86b7b3 100644 --- a/src/xrpld/rpc/handlers/UnlList.cpp +++ b/src/xrpld/rpc/handlers/UnlList.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Unsubscribe.cpp b/src/xrpld/rpc/handlers/Unsubscribe.cpp index bab0d99744..c890de593a 100644 --- a/src/xrpld/rpc/handlers/Unsubscribe.cpp +++ b/src/xrpld/rpc/handlers/Unsubscribe.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidationCreate.cpp b/src/xrpld/rpc/handlers/ValidationCreate.cpp index ce53f84d95..6690e7f284 100644 --- a/src/xrpld/rpc/handlers/ValidationCreate.cpp +++ b/src/xrpld/rpc/handlers/ValidationCreate.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidatorInfo.cpp b/src/xrpld/rpc/handlers/ValidatorInfo.cpp index d1a6337198..638aeb7842 100644 --- a/src/xrpld/rpc/handlers/ValidatorInfo.cpp +++ b/src/xrpld/rpc/handlers/ValidatorInfo.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidatorListSites.cpp b/src/xrpld/rpc/handlers/ValidatorListSites.cpp index 39bc4e3647..fc24107233 100644 --- a/src/xrpld/rpc/handlers/ValidatorListSites.cpp +++ b/src/xrpld/rpc/handlers/ValidatorListSites.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Validators.cpp b/src/xrpld/rpc/handlers/Validators.cpp index 599e76f847..4d8318d194 100644 --- a/src/xrpld/rpc/handlers/Validators.cpp +++ b/src/xrpld/rpc/handlers/Validators.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/WalletPropose.cpp b/src/xrpld/rpc/handlers/WalletPropose.cpp index f3300b9ed0..2c9cadcbba 100644 --- a/src/xrpld/rpc/handlers/WalletPropose.cpp +++ b/src/xrpld/rpc/handlers/WalletPropose.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include @@ -28,8 +29,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/Family.h b/src/xrpld/shamap/Family.h index bbb22c273d..eb04df05e4 100644 --- a/src/xrpld/shamap/Family.h +++ b/src/xrpld/shamap/Family.h @@ -23,8 +23,9 @@ #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/shamap/FullBelowCache.h b/src/xrpld/shamap/FullBelowCache.h index eed7e6294a..f792b9035f 100644 --- a/src/xrpld/shamap/FullBelowCache.h +++ b/src/xrpld/shamap/FullBelowCache.h @@ -25,6 +25,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/shamap/SHAMap.h b/src/xrpld/shamap/SHAMap.h index c10f4eb1cb..e63245b51c 100644 --- a/src/xrpld/shamap/SHAMap.h +++ b/src/xrpld/shamap/SHAMap.h @@ -23,17 +23,16 @@ #include #include #include -#include #include #include #include #include #include #include -#include -#include + #include #include + #include #include diff --git a/src/xrpld/shamap/SHAMapAccountStateLeafNode.h b/src/xrpld/shamap/SHAMapAccountStateLeafNode.h index 842c1092dd..1069c363ec 100644 --- a/src/xrpld/shamap/SHAMapAccountStateLeafNode.h +++ b/src/xrpld/shamap/SHAMapAccountStateLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapInnerNode.h b/src/xrpld/shamap/SHAMapInnerNode.h index d2791915c3..c45621d0c1 100644 --- a/src/xrpld/shamap/SHAMapInnerNode.h +++ b/src/xrpld/shamap/SHAMapInnerNode.h @@ -20,20 +20,12 @@ #ifndef RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED #define RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED -#include #include #include #include -#include -#include #include -#include -#include #include -#include -#include -#include #include #include diff --git a/src/xrpld/shamap/SHAMapItem.h b/src/xrpld/shamap/SHAMapItem.h index 2aba5d5d8e..4c9ce65469 100644 --- a/src/xrpld/shamap/SHAMapItem.h +++ b/src/xrpld/shamap/SHAMapItem.h @@ -26,6 +26,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapLeafNode.h b/src/xrpld/shamap/SHAMapLeafNode.h index d5d84d3f00..9ff46a9bb7 100644 --- a/src/xrpld/shamap/SHAMapLeafNode.h +++ b/src/xrpld/shamap/SHAMapLeafNode.h @@ -25,7 +25,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapMissingNode.h b/src/xrpld/shamap/SHAMapMissingNode.h index 50aa193b2b..73ffe0090a 100644 --- a/src/xrpld/shamap/SHAMapMissingNode.h +++ b/src/xrpld/shamap/SHAMapMissingNode.h @@ -21,7 +21,9 @@ #define RIPPLE_SHAMAP_SHAMAPMISSINGNODE_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapNodeID.h b/src/xrpld/shamap/SHAMapNodeID.h index 176553fd7d..abdca3a55a 100644 --- a/src/xrpld/shamap/SHAMapNodeID.h +++ b/src/xrpld/shamap/SHAMapNodeID.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include diff --git a/src/xrpld/shamap/SHAMapSyncFilter.h b/src/xrpld/shamap/SHAMapSyncFilter.h index b14effac88..a2ac2f99e8 100644 --- a/src/xrpld/shamap/SHAMapSyncFilter.h +++ b/src/xrpld/shamap/SHAMapSyncFilter.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_SHAMAP_SHAMAPSYNCFILTER_H_INCLUDED #define RIPPLE_SHAMAP_SHAMAPSYNCFILTER_H_INCLUDED -#include #include + #include /** Callback for filtering SHAMap during sync. */ diff --git a/src/xrpld/shamap/SHAMapTreeNode.h b/src/xrpld/shamap/SHAMapTreeNode.h index d6b0ebce9e..6f209d13d7 100644 --- a/src/xrpld/shamap/SHAMapTreeNode.h +++ b/src/xrpld/shamap/SHAMapTreeNode.h @@ -22,15 +22,11 @@ #include #include -#include + #include -#include -#include #include #include -#include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapTxLeafNode.h b/src/xrpld/shamap/SHAMapTxLeafNode.h index f4d3f21e90..7444e61813 100644 --- a/src/xrpld/shamap/SHAMapTxLeafNode.h +++ b/src/xrpld/shamap/SHAMapTxLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h b/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h index 6ea55f4ac4..78cc919b4e 100644 --- a/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h +++ b/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/TreeNodeCache.h b/src/xrpld/shamap/TreeNodeCache.h index f59fdc9280..3eead799a3 100644 --- a/src/xrpld/shamap/TreeNodeCache.h +++ b/src/xrpld/shamap/TreeNodeCache.h @@ -22,6 +22,8 @@ #include +#include + namespace ripple { using TreeNodeCache = TaggedCache; diff --git a/src/xrpld/shamap/detail/NodeFamily.cpp b/src/xrpld/shamap/detail/NodeFamily.cpp index bf95003aef..21dbe7469e 100644 --- a/src/xrpld/shamap/detail/NodeFamily.cpp +++ b/src/xrpld/shamap/detail/NodeFamily.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMap.cpp b/src/xrpld/shamap/detail/SHAMap.cpp index 09a546be14..7c3fadbec9 100644 --- a/src/xrpld/shamap/detail/SHAMap.cpp +++ b/src/xrpld/shamap/detail/SHAMap.cpp @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapDelta.cpp b/src/xrpld/shamap/detail/SHAMapDelta.cpp index baabd4ef13..a6c54b6f22 100644 --- a/src/xrpld/shamap/detail/SHAMapDelta.cpp +++ b/src/xrpld/shamap/detail/SHAMapDelta.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/shamap/detail/SHAMapInnerNode.cpp b/src/xrpld/shamap/detail/SHAMapInnerNode.cpp index b2fba1f931..7d3c3c8fb2 100644 --- a/src/xrpld/shamap/detail/SHAMapInnerNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapInnerNode.cpp @@ -18,20 +18,17 @@ //============================================================================== #include - #include #include -#include + #include #include #include -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp index 72ec177fb3..cdf0f80a84 100644 --- a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapNodeID.cpp b/src/xrpld/shamap/detail/SHAMapNodeID.cpp index 7f093dbe46..efe4f95936 100644 --- a/src/xrpld/shamap/detail/SHAMapNodeID.cpp +++ b/src/xrpld/shamap/detail/SHAMapNodeID.cpp @@ -19,9 +19,9 @@ #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapSync.cpp b/src/xrpld/shamap/detail/SHAMapSync.cpp index 4f93825751..092b1efc5a 100644 --- a/src/xrpld/shamap/detail/SHAMapSync.cpp +++ b/src/xrpld/shamap/detail/SHAMapSync.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp index fe5b5377ee..c50683213c 100644 --- a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp @@ -19,18 +19,16 @@ #include #include -#include #include #include #include + #include #include #include #include -#include #include #include -#include #include diff --git a/src/xrpld/shamap/detail/TaggedPointer.h b/src/xrpld/shamap/detail/TaggedPointer.h index 4853407654..beee32a945 100644 --- a/src/xrpld/shamap/detail/TaggedPointer.h +++ b/src/xrpld/shamap/detail/TaggedPointer.h @@ -23,7 +23,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/shamap/detail/TaggedPointer.ipp b/src/xrpld/shamap/detail/TaggedPointer.ipp index 0e67947a8e..bed821b5c9 100644 --- a/src/xrpld/shamap/detail/TaggedPointer.ipp +++ b/src/xrpld/shamap/detail/TaggedPointer.ipp @@ -19,13 +19,13 @@ #include #include + #include -#include -#include - #include +#include + namespace ripple { namespace { From 1573a443b713cb6a119c4324a0a78ec14555de23 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:07:17 -0400 Subject: [PATCH 03/15] smart escrow devnet 1 host functions (#5353) * devnet 1 host functions * clang-format * fix build issues --- examples/example/src/example.cpp | 4 +- include/xrpl/protocol/FeeUnits.h | 4 +- include/xrpl/protocol/MPTAmount.h | 3 +- include/xrpl/protocol/XRPAmount.h | 3 +- src/test/app/Escrow_test.cpp | 56 +- src/test/app/Wasm_test.cpp | 6503 +++++++---------------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 118 + src/xrpld/app/misc/WasmHostFuncImpl.h | 69 + src/xrpld/app/misc/WasmVM.cpp | 849 ++- src/xrpld/app/misc/WasmVM.h | 109 +- src/xrpld/app/tx/detail/Escrow.cpp | 26 +- 11 files changed, 2625 insertions(+), 5119 deletions(-) create mode 100644 src/xrpld/app/misc/WasmHostFuncImpl.cpp create mode 100644 src/xrpld/app/misc/WasmHostFuncImpl.h diff --git a/examples/example/src/example.cpp b/examples/example/src/example.cpp index 8c3acdee07..41dcd62462 100644 --- a/examples/example/src/example.cpp +++ b/examples/example/src/example.cpp @@ -2,7 +2,9 @@ #include -int main(int argc, char const** argv) { +int +main(int argc, char const** argv) +{ std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str()); return 0; } diff --git a/include/xrpl/protocol/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h index 0cbf1b608a..fd760d07ae 100644 --- a/include/xrpl/protocol/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -451,8 +451,8 @@ mulDivU(Source1 value, Dest mul, Source2 div) } using namespace boost::multiprecision; - - uint128_t product; + using uint128 = boost::multiprecision::uint128_t; + uint128 product; product = multiply( product, static_cast(value.value()), diff --git a/include/xrpl/protocol/MPTAmount.h b/include/xrpl/protocol/MPTAmount.h index 244d683915..cf00aa81fb 100644 --- a/include/xrpl/protocol/MPTAmount.h +++ b/include/xrpl/protocol/MPTAmount.h @@ -152,11 +152,12 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; + using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128_t const amt128(amt.value()); + int128 const amt128(amt.value()); auto const neg = amt.value() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/include/xrpl/protocol/XRPAmount.h b/include/xrpl/protocol/XRPAmount.h index 1d6cae9ecf..bdd0f0b797 100644 --- a/include/xrpl/protocol/XRPAmount.h +++ b/include/xrpl/protocol/XRPAmount.h @@ -286,11 +286,12 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; + using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128_t const amt128(amt.drops()); + int128 const amt128(amt.drops()); auto const neg = amt.drops() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 1f872d2bdc..0ac8bba8a0 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1672,22 +1672,22 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] // pub fn ready() -> bool { - // unsafe { host_lib::get_ledger_sqn() >= 5} + // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; { // featureSmartEscrow disabled @@ -1827,22 +1827,22 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] // pub fn ready() -> bool { - // unsafe { host_lib::get_ledger_sqn() >= 5} + // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; { // basic FinishFunction situation diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 31e8007c72..ce8d836269 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -132,4601 +132,2020 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(true); } - void - testEscrowWasmP0() - { - testcase("escrow wasm P0 test"); - auto wasmHex = - "0061736d0100000001090260017f017f6000000305040001010004050170010101" - "05030100100609017f01418080c0000b071802066d656d6f727902000b6d6f636b" - "5f657363726f7700030a25040800200041056f450b02000b0e0010818080800010" - "81808080000b08002000100010020b0072046e616d650011106d6f636b5f657363" - "726f772e7761736d014404000b6d6f636b5f657363726f77010564756d6d790211" - "5f5f7761736d5f63616c6c5f64746f7273031a6d6f636b5f657363726f772e636f" - "6d6d616e645f6578706f7274071201000f5f5f737461636b5f706f696e74657200" - "c0010970726f64756365727302086c616e67756167650204527573740003433131" - "000c70726f6365737365642d62790205727573746325312e38332e302d6e696768" - "746c79202863326637346333663920323032342d30392d30392905636c616e675f" - "31382e312e322d776173692d73646b202868747470733a2f2f6769746875622e63" - "6f6d2f6c6c766d2f6c6c766d2d70726f6a65637420323661316436363031643732" - "376139366634333031643064383634376235613432373630616530632900560f74" - "61726765745f6665617475726573052b0b62756c6b2d6d656d6f72792b0a6d756c" - "746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e" - "63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, 15); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - - re = runEscrowWasm(wasm, funcName, 11); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - void testBadWasm() { testcase("bad wasm test"); + + HostFunctions hfs; auto wasmHex = "00000000"; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, 15); + auto re = runEscrowWasm(wasm, funcName, &hfs, 15); BEAST_EXPECT(re.error()); } void - testEscrowWasmP1() + testEscrowWasmDN1() { - testcase("escrow wasm P1 test"); + testcase("escrow wasm devnet 1 test"); auto wasmHex = - "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" - "00030c0b01010200000000000003000405017001030305030100110619037f0141" - "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" - "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" - "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" - "200010012200450d0120000f0b230041206b220024002000410036021820004101" - "36020c200041b480c00036020820004204370210200041086a41d080c000100500" - "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" - "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" - "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" - "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" - "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" - "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" - "0245044041002100410021010c040b4100210020054100411920074101766b2007" - "411f461b7421044100210103400240200228020441787122062005490d00200620" - "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" - "021422062000200620022004411d764104716a41106a2802002202471b20002006" - "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" - "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" - "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" - "000b20012000410372360204200020016a220020002802044101723602040c060b" - "024041022000742203410020036b72200120007471682206410374220041a483c0" - "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" - "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" - "360204200120056a2206200020056b2204410172360204200020016a2004360200" - "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" - "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" - "200220057236020020000c010b20002802080b2102200020033602082002200336" - "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" - "043602000c050b200068410274419482c0006a280200220128020441787120056b" - "2103200121020240034002400240200128021022000d00200128021422000d0020" - "022802182107024002402002200228020c22004604402002411441102002280214" - "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" - "013602080c010b200241146a200241106a20001b21040340200421062001220041" - "146a200041106a200028021422011b210420004114411020011b6a28020022010d" - "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" - "28020047044020074110411420072802102002461b6a20003602002000450d040c" - "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" - "77713602000c030b200028020441787120056b22012003200120034922011b2103" - "2000200220011b2102200021010c010b0b20002007360218200228021022010440" - "20002001360210200120003602180b20022802142201450d002000200136021420" - "0120003602180b02400240200341104f044020022005410372360204200220056a" - "22062003410172360204200320066a200336020041b485c0002802002204450d01" - "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" - "2205410120044103767422047145044041ac85c000200420057236020020000c01" - "0b20002802080b2104200020013602082004200136020c2001200036020c200120" - "043602080c010b2002200320056a2200410372360204200020026a220020002802" - "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" - "41086a0f0b20002001724504404100210141022007742200410020006b72200871" - "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" - "20012000280204417871220420056b220620034922071b21082000280210220245" - "0440200028021421020b20012008200420054922001b210120032006200320071b" - "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" - "200020056b4f710d0020012802182107024002402001200128020c220046044020" - "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" - "2202200036020c200020023602080c010b200141146a200141106a20001b210403" - "40200421062002220041146a200041106a200028021422021b2104200041144110" - "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" - "28021c410274419482c0006a220228020047044020074110411420072802102001" - "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" - "b085c000280200417e200128021c77713602000c010b2000200736021820012802" - "102202044020002002360210200220003602180b20012802142202450d00200020" - "02360214200220003602180b0240200341104f0440200120054103723602042001" - "20056a22022003410172360204200220036a200336020020034180024f04402002" - "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" - "410120034103767422037145044041ac85c000200320047236020020000c010b20" - "002802080b2103200020023602082003200236020c2002200036020c2002200336" - "02080c010b2001200320056a2200410372360204200020016a2200200028020441" - "01723602040b0c010b024002400240024002400240200541b485c0002802002201" - "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" - "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" - "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" - "02002201200020002001491b3602000240024041c085c000280200220304404194" - "83c0002100034020002802002201200028020422066a2002460d02200028020822" - "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" - "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" - "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" - "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" - "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" - "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" - "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" - "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" - "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" - "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" - "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" - "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" - "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" - "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" - "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" - "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" - "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" - "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" - "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" - "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" - "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" - "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" - "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" - "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" - "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" - "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" - "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" - "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" - "85c000200441286b220036020020022000410172360204200020026a4128360204" - "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" - "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" - "20046a2101419483c0002100024002400340200120002802002206470440200028" - "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" - "0028020022014f04402003200120002802046a2206490d010b200028020821000c" - "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" - "0172360204200020026a412836020441cc85c00041808080013602002003200641" - "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" - "002109200141106a419c83c00029020037020020012009370208419883c0002004" - "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" - "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" - "012003460d0720012001280204417e713602042003200120036b22004101723602" - "042001200036020020004180024f04402003200010070c080b200041f8017141a4" - "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" - "ac85c000200020027236020020010c010b20012802080b21002001200336020820" - "00200336020c2003200136020c200320003602080c070b20002002360200200020" - "0028020420046a360204200220054103723602042006410f6a41787141086b2201" - "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" - "460d04200128020422054103714101460440200120054178712200100820002001" - "6a22012802042105200020036a21030b20012005417e7136020420042003410172" - "360204200320046a200336020020034180024f04402004200310070c060b200341" - "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" - "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" - "043602082003200436020c2004200036020c200420033602080c050b41b885c000" - "200020056b220136020041c085c00041c085c000280200220020056a2202360200" - "2002200141017236020420002005410372360204200041086a21000c060b41bc85" - "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" - "85c000410036020020002001410372360204200020016a22012001280204410172" - "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" - "2002410172360204200020016a2002360200200020054103723602040b20004108" - "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" - "71220141086b220236020041b885c00041b885c00028020020046a220320002001" - "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" - "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" - "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" - "0041b485c00041b485c00028020020036a22003602002004200041017236020420" - "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" - "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" - "20056a22023602002002200141017236020420002005410372360204200041086a" - "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" - "402007410020076b41037122026a21062002044020072103418080c00021050340" - "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" - "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" - "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" - "6b411871210820052802002105034020062005200c762004280200220520087472" - "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" - "20022104034020062004280200360200200441046a2104200641046a2206200349" - "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" - "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" - "4122460440200021032007210241002105412221080240034020032d0000220920" - "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" - "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" - "0b000bd20601047f0240200041046b280200220241787122034104410820024103" - "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" - "0041046b280200220341787122006a21020240024020034101710d002003410271" - "450d012001280200220320006a2100200120036b220141bc85c000280200460440" - "20022802044103714103470d0141b485c000200036020020022002280204417e71" - "36020420012000410172360204200220003602000c020b2001200310080b024002" - "4002400240024020022802042203410271450440200241c085c000280200460d02" - "200241bc85c000280200460d0320022003417871220210082001200020026a2200" - "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" - "0020003602000c060b20022003417e713602042001200041017236020420002001" - "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" - "c00028020041016b220036020020000d04419c83c0002802002200044003402001" - "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" - "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" - "003602002001200041017236020441bc85c000280200200146044041b485c00041" - "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" - "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" - "00210103402002200128020022054f04402002200520012802046a490d040b2001" - "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" - "20006a220036020020012000410172360204200020016a20003602000c020b2000" - "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" - "007145044041ac85c000200020037236020020020c010b20022802080b21002002" - "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" - "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" - "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" - "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" - "7f230041206b220224002002410036021020024101360204200242043702082002" - "412e36021c200220003602182002200241186a360200200220011005000ba40201" - "037f230041206b22022400200241106a2203200041106a29020037030020024108" - "6a2204200041086a290200370300200241013b011c200220013602182002200029" - "0200370300230041206b2200240020022802182101200041106a20032902003703" - "00200041086a20042902003703002000200236021c200020013602182000200229" - "020037030041002102230041106b22012400200028020c21030240024002400240" - "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" - "2802042102200328020021030c010b20014180808080783602002001200036020c" - "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" - "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" - "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" - "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" - "2002410274419482c0006a21044101200274220341b085c0002802007145044020" - "042000360200200020043602182000200036020c2000200036020841b085c00041" - "b085c0002802002003723602000f0b024002402001200428020022032802044178" - "71460440200321020c010b20014100411920024101766b2002411f461b74210503" - "4020032005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c200220" - "00360208200041003602182000200236020c200020013602080f0b200420003602" - "00200020033602182000200036020c200020003602080bf10201047f200028020c" - "21020240024020014180024f044020002802182103024002402000200246044020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" - "2201200236020c200220013602080c010b200041146a200041106a20021b210403" - "40200421052001220241146a200241106a200228021422011b2104200241144110" - "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" - "0274419482c0006a220128020047044020034110411420032802102000461b6a20" - "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" - "280200417e200028021c77713602000c020b200028020822002002470440200020" - "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" - "77713602000f0b2002200336021820002802102201044020022001360210200120" - "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" - "017f230041106b22032400419082c000419082c000280200220441016a36020002" - "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" - "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" - "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" - "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" - "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" - "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" - "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" - "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" - "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" - "64006000100029000000a804000009000000617373657274696f6e206661696c65" - "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" - "6765010452757374000c70726f6365737365642d62790105727573746325312e38" - "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" - "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("check_accountID"); - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - std::vector data(str.begin(), str.end()); - auto re = runEscrowWasm(wasm, funcName, data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; - std::vector data(str.begin(), str.end()); - auto re = runEscrowWasm(wasm, funcName, data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - } - - void - testEscrowWasmP2P3() - { - testcase("escrow wasm P2 & P3 test"); - auto wasmHex = - "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" - "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" - "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" - "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" - "616004030305060001070808080809040702000000040403030304030500020306" - "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" - "0903020201020200000405000203030402020205100b0303000005030101010104" - "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" - "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" - "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" - "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" - "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" - "360228200320023602242003200136022020034180013a002c2003410036021c20" - "03428080808010370214200341c8006a200341146a108180808000024002400240" - "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" - "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" - "2903483703300240024020032802282202200328022422064f0d00200328022021" - "070340200720026a2d000041776a220141174b0d02410120017441938080047145" - "0d022006200241016a2202470d000b200320063602280b20002003290330370300" - "200041106a2004290300370300200041086a200529030037030020032802142202" - "450d04200328021820021082808080000c040b20032002360228200341086a2007" - "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" - "200328020c21012003280208210641141084808080002202450d01200220063602" - "0c2002411636020020002002360204200041063a00002002200136021020034130" - "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" - "032802142202450d00200328021820021082808080000b200341e0006a24808080" - "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" - "210302400240024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f0006a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" - "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" - "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241386a200320052005200441016a220420052004491b" - "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" - "84808080002207450d1f2007200836020c20074105360200200720043602100c08" - "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" - "c080001a200228024c21042002280248210841141084808080002207450d1e2007" - "200836020c20074107360200200720043602100c070b20022902dc02210e200228" - "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228024421042002280240210841141084808080002207450d1c2007200836020c" - "20074115360200200720043602100c050b200241b0016a20011081808080000240" - "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" - "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" - "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" - "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" - "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" - "000120042007360204200441106a2003290300370300200441036a20052d00003a" - "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" - "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" - "0000200420083602100c180b200628020021030b200241306a2003200520052004" - "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" - "042002280230210841141084808080002207450d172007200836020c2007410236" - "0200200720043602100b200241d8026a109180808000024020022802d802220445" - "0d002009200441186c1082808080000b200128020c210320012802142104200128" - "0210210541062106410121090b200120012d001841016a3a001802400240200420" - "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" - "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" - "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28021421082002280210210541141084808080002204450d1d200441163602000c" - "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" - "41776a220841174b0d024101200874419380800471450d022001200441016a2204" - "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" - "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" - "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" - "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" - "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" - "210541141084808080002204450d1a200441153602000c040b200241206a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228022421082002280220210541141084808080002204450d1920044116360200" - "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" - "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" - "001a200228021c21082002280218210541141084808080002204450d1620044102" - "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" - "01200220073602b401200220063a00b001024020090d00200241063a0078200220" - "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" - "200241c8016a1092808080000c110b200241086a20032005200520042005200449" - "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" - "1084808080002204450d142004200136020c200441183602002000200436020420" - "0041063a0000200420083602100c130b200141003602082001200441016a360214" - "200241b0016a2006200110938080800020022802b40121080240024020022802b0" - "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" - "948080800020022d00784106460d1320002002290378370300200041106a200241" - "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" - "150b41002101024020044100480d00024020040d0041012101410021050c030b41" - "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" - "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" - "086a220320012008200410df808080003602002002200536027c200241033a0078" - "2002200436028401200041106a200241f8006a41106a290300370300200041086a" - "2003290300370300200020022903783703000c120b2001200441016a3602142002" - "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" - "20024190016a109680808000024020022d00784106460d00200020022903783703" - "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" - "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" - "200020043602040c120b2000200228029801360204200041063a00000c110b0240" - "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" - "14200141bb80c0800041031086808080002204450d02200041063a000020002004" - "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" - "0a490d042002200320052005200441016a220420052004491b1083808080004100" - "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" - "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" - "200241003a007820002002290378370300200041086a200241f8006a41086a2903" - "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" - "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" - "00200020043602040c0e0b20024181023b01782000200229037837030020004108" - "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" - "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" - "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" - "02290378370300200041086a200241f8006a41086a290300370300200041106a20" - "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" - "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" - "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" - "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" - "21070c070b20022802d401220441003602082004200428021441016a3602142002" - "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" - "460d06200241d8026a200720022802b801109880808000024020022802d8022204" - "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" - "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" - "41003602dc01200220053602e002200220083602dc02200220043602d802200241" - "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" - "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" - "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" - "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" - "024020022d00b101450d0020022802d40122044100360208200420042802144101" - "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" - "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" - "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" - "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" - "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" - "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" - "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" - "290300220f370300200220022903b00122103703d802200541106a200e37020020" - "0541086a200f3702002005201037020020024180026a41086a200c290200370300" - "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" - "186a280200360200200220022902b00137038002200220033602a4022002200736" - "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" - "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" - "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" - "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" - "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" - "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" - "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" - "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" - "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" - "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" - "200820041082808080000b200241dc016a109b808080000b41062106410121090b" - "200120012d001841016a3a0018200128020c210302400240024020012802142204" - "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" - "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" - "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" - "21040c050b200241e8006a200320052005200441016a220420052004491b108380" - "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" - "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" - "200441016a220436021420052004470d000b200521040b200241e0006a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28026421082002280260210541141084808080002204450d072004200536020c20" - "044103360200200420083602100c010b200241d8006a200320052005200441016a" - "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" - "280258210541141084808080002204450d062004200536020c2004411636020020" - "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" - "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" - "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" - "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" - "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" - "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" - "80000c010b200241d0006a200320052005200420052004491b1083808080004100" - "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" - "0d042004200136020c2004411836020020002004360204200041063a0000200420" - "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" - "200041063a0000200020043602040c010b20002002290378370300200041106a20" - "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" - "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" - "002202417871220341044108200241037122021b20016a490d0002402002450d00" - "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" - "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" - "0301057f02400240024002400240024020022003490d0041012104410021052003" - "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" - "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" - "418a94a8d000736b20077241808182847871418081828478460d00034020062001" - "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" - "034109490d0103400240024020074108480d004180828408200120076a22064178" - "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" - "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" - "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" - "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" - "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" - "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" - "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" - "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" - "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" - "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" - "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" - "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" - "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" - "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" - "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" - "0041002100410021060c040b4100210020024100411920054101766b2005411f46" - "1b74210741002106034002402001220128020441787122082002490d0020082002" - "6b220820034f0d00200821032001210620080d004100210320012106200121000c" - "060b200128021422082000200820012007411d764104716a41106a280200220147" - "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" - "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" - "0022032802082206460d002006200236020c200220063602080c010b4100200141" - "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" - "0204410172360204200341086a0f0b024002402000200374410220037422004100" - "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" - "0022002802082207460d002007200636020c200620073602080c010b4100200141" - "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" - "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" - "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" - "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" - "d2c08000200621010c010b200628020821010b200620033602082001200336020c" - "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" - "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" - "787120026b2103200621010240024003400240200628021022000d002006280214" - "22000d0020012802182105024002400240200128020c22002001470d0020014114" - "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" - "0036020c200020063602080c010b200141146a200141106a20001b210703402007" - "21082006220041146a200041106a200028021422061b210720004114411020061b" - "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" - "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" - "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" - "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" - "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" - "360218024020012802102206450d0020002006360210200620003602180b200128" - "02142206450d0020002006360214200620003602180b0240024002402003411049" - "0d0020012002410372360204200120026a22022003410172360204200220036a20" - "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" - "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" - "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" - "0b200620003602082007200036020c2000200636020c200020073602080c010b20" - "01200320026a2200410372360204200120006a220020002802044101723602040c" - "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" - "4020002006720d004100210641022005742200410020006b722004712200450d03" - "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" - "280204417871220120026b220820034922051b2104200120024921072008200320" - "051b21080240200028021022010d00200028021421010b2006200420071b210620" - "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" - "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" - "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" - "410021000c020b20062802082201200036020c200020013602080c010b20064114" - "6a200641106a20001b21070340200721082001220041146a200041106a20002802" - "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" - "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" - "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" - "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" - "c080000c010b20002005360218024020062802102201450d002000200136021020" - "0120003602180b20062802142201450d0020002001360214200120003602180b02" - "40024020034110490d0020062002410372360204200620026a2200200341017236" - "0204200020036a200336020002402003418002490d002000200310d7808080000c" - "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" - "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" - "200228020821030b200220003602082003200036020c2000200236020c20002003" - "3602080c010b2006200320026a2200410372360204200620006a22002000280204" - "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" - "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" - "200241af80046a220641107640002203417f4622070d0720034110742201450d07" - "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" - "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" - "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" - "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" - "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" - "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" - "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" - "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" - "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" - "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" - "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" - "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" - "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" - "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" - "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" - "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" - "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" - "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" - "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" - "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" - "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" - "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" - "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" - "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" - "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" - "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" - "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" - "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" - "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" - "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" - "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" - "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" - "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" - "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" - "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" - "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" - "003602f0d2c0800020012000410172360204200120006a41283602044100418080" - "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" - "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" - "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" - "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" - "02402000280200220620034b0d002003200620002802046a2206490d020b200028" - "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" - "800020012000410172360204200120006a412836020441004180808001360284d3" - "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" - "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" - "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" - "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" - "200041046a22002006490d000b20072003460d0720072007280204417e71360204" - "2003200720036b22004101723602042007200036020002402000418002490d0020" - "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" - "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" - "c08000200621000c010b200628020821000b200620033602082000200336020c20" - "03200636020c200320003602080c070b200020013602002000200028020420086a" - "360204200120024103723602042007410f6a41787141786a2206200120026a2200" - "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" - "200628020422024103714101470d0020062002417871220210a880808000200220" - "036a2103200620026a220628020421020b20062002417e71360204200020034101" - "72360204200020036a200336020002402003418002490d002000200310d7808080" - "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" - "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" - "010b200228020821030b200220003602082003200036020c2000200236020c2000" - "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" - "8000220020026a22063602f8d2c080002006200341017236020420002002410372" - "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" - "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" - "410372360204200320006a220020002802044101723602040c010b410020063602" - "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" - "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" - "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" - "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" - "d2c0800020062001410172360204200020036a4128360204410041808080013602" - "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" - "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" - "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" - "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" - "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" - "0020026a22063602f8d2c080002006200341017236020420002002410372360204" - "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" - "02000b200041046a109b808080000c020b20002802042201450d01200028020820" - "011082808080000f0b200041046a10918080800020002802042201450d00200028" - "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" - "80808080002000280214220420002802102205200420054b1b2106200028020c21" - "0702400240024002400340024020020d00410021040c050b20062004460d012000" - "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" - "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" - "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" - "8080002204450d01200441093602000c020b200320072005200610838080800041" - "002d00c0cfc080001a200328020421012003280200210241141084808080002204" - "450d00200441053602000c010b000b2004200236020c200420013602100b200341" - "106a24808080800020040b970202027f027e23808080800041106b220424808080" - "8000024002400240024002400240024002402001280214220520012802104f0d00" - "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" - "020b2002450d02420121060c050b20042001200220034100108880808000200428" - "02000d020c030b200420012002200341001089808080002004280200450d022000" - "2004280204360208200042033703000c040b420021060240420020037d22074200" - "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" - "020b20002004280204360208200042033703000c020b2004290308210342002106" - "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" - "23808080800041106b220524808080800020012001280214220641016a22073602" - "140240024002402007200128021022084f0d00200720086b2109200128020c210a" - "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" - "410a490d00024020060d002005200a20082008200741016a220720082007491b10" - "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" - "808080002207450d072007200c36020c2007410d36020020002007360204200041" - "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" - "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" - "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" - "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" - "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" - "20002001200220032007108b808080000c010b200541086a200128020c20082008" - "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" - "0c21062005280208210c41141084808080002207450d012007200c36020c200741" - "053602002000200736020420004101360200200720063602100b200541106a2480" - "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" - "0620012001280214220741016a220836021402402008200128021022094f0d0041" - "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" - "2001200741026a22083602140b200128020c210a02400240024002400240024002" - "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" - "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" - "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" - "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" - "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" - "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" - "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" - "042007200836020c20074105360200200020073602042000410136020020072001" - "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" - "020421012005280200210841141084808080002207450d032007200836020c2007" - "410d3602002000200736020420004101360200200720013602100c040b20042008" - "6a2207411f7541808080807873200720084100482007200448731b21070b200020" - "01200220032007108b808080000c020b2000200120022003502006108c80808000" - "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" - "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" - "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" - "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" - "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" - "22052480808080002003ba2106024002400240024002400240024020042004411f" - "7522077320076b220741b502490d0003402006440000000000000000610d062004" - "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" - "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" - "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" - "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" - "84808080002204450d022004200136020c2004410e360200200020043602042004" - "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" - "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" - "28020c21072005280208210141141084808080002204450d012004200136020c20" - "04410e36020020002004360204200420073602100b410121040c020b000b200020" - "0620069a20021b390308410021040b20002004360200200541106a248080808000" - "0b840201027f23808080800041106b220524808080800002400240024002402004" - "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" - "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" - "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" - "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" - "1084808080002204450d002004200336020c2004410e3602002000200436020420" - "042001360210410121040c020b000b200044000000000000000044000000000000" - "008020021b390308410021040b20002004360200200541106a2480808080000b95" - "0502067f017e23808080800041306b2203248080808000200128020c2104024002" - "40024002400240024020012802142205200128021022064f0d002001200541016a" - "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" - "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" - "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" - "21072003280218210441141084808080002201450d022001200436020c20014105" - "3602002000200136020820004203370300200120073602100c040b200341086a20" - "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" - "1a200328020c21072003280208210441141084808080002201450d012001200436" - "020c2001410d3602002000200136020820004203370300200120073602100c030b" - "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" - "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" - "01450d012001200436020c2001410d360200200020013602082000420337030020" - "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" - "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" - "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" - "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" - "0b0b200341206a200120022009108e808080000240024020032802200d00200020" - "032b0328390308420021090c010b20002003280224360208420321090b20002009" - "3703000c020b000b20002001200220091087808080000b200341306a2480808080" - "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" - "0641016a2107200520066b2108200128020c20066a210541002104034002402005" - "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" - "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" - "200720046a3602142008200441016a2204470d000b200821040b20002001200220" - "032004108b808080000f0b200020012002200320041088808080000bc80101047f" - "23808080800041206b2202248080808000024002400240200028020c450d002000" - "21010c010b200241106a41086a2203200041086a28020036020020022000290200" - "370310200241086a200128020c2001280210200128021410838080800041002d00" - "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" - "200120022903103702002001200536020c20012004360210200141086a20032802" - "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" + "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" + "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" + "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" + "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" + "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" + "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" + "745f6c696213676574506172656e744c656467657254696d650005035453020603" + "070101080901010a01000202010102080008000b0c030101010104050802030303" + "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" + "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" + "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" + "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" + "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" + "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" + "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" + "14200142808080801037020c200141033a00382001412036022820014100360234" + "2001418080c08000360230200141003602202001410036021820012001410c6a36" + "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" + "808080000d00200128020c21002001280210220220012802141080808080000240" + "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" + "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" + "027f017e037f23808080800041306b220324808080800041272104024002402000" + "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" + "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" + "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" + "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" + "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" + "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" + "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" + "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" + "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" + "41096a20046a412720046b108c808080002104200341306a24808080800020040b" + "6c01027f024002402000417c6a2802002202417871220341044108200241037122" + "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" + "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" + "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" + "2005200136020c2005200036020820052003360214200520023602102005410236" + "021c200541b884c08000360218200542023702242005418180808000ad42208620" + "0541106aad843703382005418280808000ad422086200541086aad843703302005" + "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" + "0041c0006b220224808080800002400240200028020022032d00000d0020012802" + "14419582c080004104200128021828020c118080808000808080800021000c010b" + "4101210020012802142204419982c0800041042001280218220528020c22061180" + "8080800080808080000d00200341016a210302400240200128021c22074104710d" + "0041012100200441f184c080004101200611808080800080808080000d02200320" + "01108a80808000450d010c020b200441f284c08000410220061180808080008080" + "8080000d0141012100200241013a001b200220053602102002200436020c200220" + "07360238200241c884c08000360234200220012d00203a003c2002200128021036" + "022c200220012902083702242002200129020037021c20022002411b6a36021420" + "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" + "80004102200228023428020c11808080800080808080000d010b2001280214419c" + "97c080004101200128021828020c118080808000808080800021000b200241c000" + "6a24808080800020000be90201057f2380808080004180016b2202248080808000" + "0240024002400240200128021c22034110710d0020034120710d01200031000041" + "01200110868080800021000c030b20002d0000210041ff00210303402002200322" + "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" + "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" + "0041ff00210303402002200322046a22052000410f712203413072200341376a20" + "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" + "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" + "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" + "02402004418101490d002004418001418885c08000108b80808000000b20014101" + "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" + "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" + "20032000360200200320013602042003410236020c200341d887c0800036020820" + "0342023702142003418380808000ad4220862204200341046aad84370328200320" + "042003ad843703202003200341206a360210200341086a200210aa80808000000b" + "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" + "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" + "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" + "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" + "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" + "2802000d000240200028021422012000280218220920082002200310ad80808000" + "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" + "0240024002402000280204220120064b0d00200028021422012000280218220920" + "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" + "2000413036021020002d0020210b4101210c200041013a00202000280214220920" + "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" + "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" + "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" + "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" + "1180808080008080808000210c0c010b200120066b210702400240024020002d00" + "2022010e0402000100020b20072101410021070c010b2007410176210120074101" + "6a41017621070b200141016a210120002802102106200028021821092000280214" + "210a024003402001417f6a2201450d01200a200620092802101181808080008080" + "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" + "200a20042005200928020c11808080800080808080000d00410021010340024020" + "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" + "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" + "0041106b220224808080800020022000280200220041046a36020c200141e181c0" + "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" + "418580808000108f808080002100200241106a24808080800020000be70201057f" + "2380808080004180016b22022480808080000240024002400240200128021c2203" + "4110710d0020034120710d0120003502004101200110868080800021000c030b20" + "00280200210041ff00210303402002200322046a22052000410f71220341307220" + "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" + "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" + "004110492106200041047621002006450d000b02402004418101490d0020044180" + "01418885c08000108b80808000000b20014101419885c080004102200541810120" + "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" + "85c08000108b80808000000b20014101419885c080004102200541810120044101" + "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" + "8080800041106b220b248080808000200028021420012002200028021828020c11" + "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" + "200b41086a200320042005200610b680808000200720082009200a10b680808000" + "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" + "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" + "0028021828020c118080808000808080800021000c010b200028021441ee84c080" + "004101200028021828020c118080808000808080800021000b200b41106a248080" + "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" + "23808080800041306b2203248080808000200341033a002c2003412036021c4100" + "210420034100360228200320013602242003200036022020034100360214200341" + "0036020c02400240024002400240200228021022050d00200228020c2200450d01" + "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" + "280200210003400240200041046a2802002207450d002003280220200028020020" + "07200328022428020c11808080800080808080000d040b20012802002003410c6a" + "200128020411818080800080808080000d03200141086a2101200041086a210020" + "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" + "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" + "40200041046a2802002201450d0020032802202000280200200120032802242802" + "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" + "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" + "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" + "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" + "0b0b200320073602102003200b36020c200141046a280200210702400240024020" + "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" + "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a200128020411818080800080808080000d02" + "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" + "280220200228020020044103746a22012802002001280204200328022428020c11" + "80808080008080808000450d010b410121010c010b410021010b200341306a2480" + "8080800020010b1e01017f024020002802002201450d0020002802042001108780" + "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" + "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" + "808080000be30201027f23808080800041106b2202248080808000024002400240" + "02402001418001490d002002410036020c2001418010490d010240200141808004" + "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" + "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" + "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" + "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" + "032000280200470d0020001096808080000b2000200341016a3602082000280204" + "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" + "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" + "20032001109780808000200028020821030b200028020420036a2002410c6a2001" + "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "014108411810d480808000024020012802082200418180808078460d0020002001" - "28020c109580808000000b200141106a2480808080000b950101027f0240200028" - "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" - "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" - "0041046a28020020021082808080000c010b200010918080800020002802002202" - "450d00200041046a280200200241186c1082808080000b200041186a2100200141" - "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" - "01020b20002802082201450d01200028020420011082808080000c010b20002d00" - "044103470d00200028020822012802002102024020012802042203280200220445" - "0d002002200411808080800080808080000b024020032802042203450d00200220" - "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" - "097f017e23808080800041306b2203248080808000024002400240024002400240" - "0240024002400340024002402001280208220420012802042205460d0002400240" - "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" - "00460d0120074120490d012006200441016a22086a21094100200520086b417871" - "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" - "800020012802042105200128020821070c040b200741086a2107200b41086a2109" - "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" - "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" - "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" - "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" - "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" - "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" - "1084808080002207450d052007200936020c200741043602002000200736020420" - "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" - "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" - "024020094122470d002002280208450d0520072004490d072002200b20046a2007" - "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" - "0204200228020810ca8080800020032802282207450d032000200328022c360208" - "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" - "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" - "450d052007200936020c2007411036020020002007360204200041023602002007" - "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" - "80002001200741016a2209360208024020092005490d00200341206a200b200520" - "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" - "1084808080002207450d06200741043602000c090b2001200741026a2204360208" - "02400240024002400240024002400240024002400240200b20096a2d0000220741" - "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" - "00470d020240200228020822072002280200470d00200210cb808080000b200220" - "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" - "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" - "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" - "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" - "22072002280200470d00200210cb808080000b2002200741016a36020820022802" - "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" - "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" - "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" - "02200741016a360208200228020420076a41083a0000410021070c050b02402002" - "28020822072002280200470d00200210cb808080000b2002200741016a36020820" - "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" - "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" - "0000410021070c030b0240200228020822072002280200470d00200210cb808080" - "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" - "40200228020822072002280200470d00200210cb808080000b2002200741016a36" - "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" - "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" - "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" - "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" - "40024020032802282207450d002000200328022c3602084100210b0c010b410221" - "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" - "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" - "200936020c2007200b3602100b20004102360200200020073602040b200341306a" - "2480808080000b7901027f410021030240024020024100480d00024020020d0041" - "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" - "040d01410121030b20032002109580808000000b20042001200210df8080800021" - "012000200236020c2000200136020820002003360204200041033a00000b100002" - "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" - "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" - "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" - "370308200041023a0000200020012903083703100f0b200041023a000020002001" - "290308220337031020002003423f883703080bb40701077f23808080800041306b" - "22022480808080002001280200220328020c210402400240024002402003280214" - "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" - "174b0d024101200874419380800471450d022003200541016a2205360214200620" - "05470d000b200621050b41012108200241286a200420062006200541016a220520" - "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" - "210341141084808080002205450d022005200336020c2005410336020020002005" - "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" - "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" - "20053602140240200520064f0d00034002400240024002400240200420056a2d00" - "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" - "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" - "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" - "0c21062002280208210341141084808080002205450d092005200336020c200541" - "1136020020002005360204200520063602100c080b200041013a0001410021080c" - "070b41012108200241186a200420062006200541016a220520062005491b108380" - "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" - "80002205450d072005200336020c20054115360200200020053602042005200636" - "02100c060b2003200541016a220536021420062005470d000b200621050b410121" - "08200241106a200420062006200541016a220520062005491b1083808080004100" - "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" - "0d042005200336020c2005410536020020002005360204200520063602100c030b" - "41002108200141003a0004024020074122460d002002200420062006200541016a" - "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" - "280200210641141084808080002205450d042005200636020c2005411136020020" - "002005360204200520083602100c020b200041013a00010c020b200241206a2004" - "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" - "21082002280220210641141084808080002205450d022005200636020c20054108" - "36020020002005360204200520083602100b410121080b200020083a0000200241" - "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" - "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" - "8080800022040d01410121030b20032002109580808000000b20042001200210df" - "8080800021012000200236020820002001360204200020033602000bdc0201067f" - "23808080800041106b22022480808080002001280200220328020c210402400240" - "02400240024020032802142201200341106a28020022054f0d000340200420016a" - "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" - "41016a220136021420052001470d000b200521010b200241086a20042005200520" - "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" - "21072002280208210541141084808080002201450d03200141033602000c010b02" - "402006413a470d002003200141016a360214200020031081808080000c020b2002" - "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" - "001a200228020421072002280200210541141084808080002201450d0220014106" - "3602000b2001200536020c20002001360204200041063a0000200120073602100b" - "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" - "042480808080000240024002400240024002400240024002400240024002400240" - "20012802002205450d002002280208210620022802042107200128020421080240" - "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" - "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" - "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" - "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" - "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" - "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" - "2002290204220fa721092002280200220b418080808078470d03200921050c010b" - "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" - "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" - "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" - "028c02200142808080801037020420012009360200200920032903003703002009" - "41086a200341086a290300370300200941106a200341106a2903003703000c010b" - "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" - "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" - "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" - "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" - "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" - "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" - "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" - "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" - "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" - "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" - "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" - "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" - "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" - "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" - "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" - "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" - "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" - "200420042903880137026020042005360208200420063602782008280200220d41" - "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" - "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" - "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" - "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" - "370300200b2003290300370300200b41086a200341086a290300370300200d200e" - "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" - "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" - "246a200441dc006a41186a28020036020020042010370234200420073602302004" - "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" - "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" - "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" - "210d200b2f019203410b490d02200641016a210602400240024002400240024002" - "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" - "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" - "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" - "36027820044188016a200441f8006a10c18080800020042802b001410520044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" - "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" - "2105200d418080808078460d032004200d3602302008200441086a412410df8080" - "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" - "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" - "41003b019203200d410036028802200b41003b019003200b200d36028802200120" - "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" - "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" - "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" - "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" - "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" - "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" - "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" - "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" - "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" - "6a200941106a220d290300370300200041086a200941086a220b29030037030020" - "092003290300370300200b200341086a290300370300200d200341106a29030037" - "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" - "80808080004100210241002103024020002802002204450d002001200436021820" - "014100360214200120043602082001410036020420012000280204220336021c20" - "01200336020c20002802082103410121020b200120033602202001200236021020" - "01200236020002400240024003400240024002400240024020030d002001280200" - "450d0820012802082104200128020422030d0141002100200128020c2203450d06" - "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" - "024020024101712203450d0020012802040d0020012802082103200128020c2200" - "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" - "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" - "3702082001200336020441012102200141013602000b2001280208210002402001" - "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" - "20012802242203450d0120012802282100200128022c220520032f019203490d02" - "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" - "2001200436020c20014100360208200120033602040c010b200320044102746a41" - "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" - "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" - "2802002204450d00200028020420041082808080000b0240024002400240200320" - "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" - "20032802042200450d01200328020820001082808080000c010b200341046a1091" - "8080800020032802042200450d002003280208200041186c1082808080000b2001" - "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" - "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" - "03037f017e037f23808080800041f0006b22022480808080004100210302402000" - "2d0000220420012d0000470d00410121030240024002400240024020040e060500" - "01020304050b20002d000120012d00014621030c040b4100210320002903082205" - "2001290308520d030240024002402005a70e03000102000b200029031020012903" - "105121030c050b200029031020012903105121030c040b20002b031020012b0310" - "6121030c030b41002103200028020c2204200128020c470d022000280208200128" - "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" - "0d012001280208210420002802082100200641016a210103402001417f6a220145" - "21032001450d0220002004109c808080002106200441186a2104200041186a2100" - "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" - "6c2002420037026420024100360254200241003602442002410036023020024100" - "36022020022001280208220636025c200220012802042203360258200220063602" - "4c2002200336024820022000280208220636023820022000280204220136023420" - "0220063602282002200136022420022004410020031b3602602002200341004722" - "033602502002200336024020022004410020011b36023c20022001410047220336" - "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" - "80004101210320022802102201450d0120022802142104200241086a2007109d80" - "80800020022802082200450d0141002103200128020822062000280208470d0120" - "0228020c210820012802042000280204200610dc808080000d0120042008109c80" - "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" - "200128022022020d00410021020c010b20012002417f6a36022002400240024020" - "012802004101470d0020012802040d01200128020821030240200128020c220245" - "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" - "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" - "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" - "050c010b03402003280288022205450d03200241016a210220032f019003210420" - "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" - "21060c010b200520034102746a4198036a21030340200328020022064198036a21" - "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" - "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" - "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" - "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" - "001a200010848080800022010d01410121010b20012000109580808000000b2001" - "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" - "108080808000024002400240024020042d00384106460d00200441086a41106a20" - "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" - "29030037030020042004290338370308200441386a200220031080808080002004" - "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" - "0629030037030020042004290338370320200441086a10a0808080002205450d02" - "200441206a10a0808080002206450d0320052006109c808080002105200441206a" - "108580808000200441086a10858080800002402003450d00200220031082808080" - "000b02402001450d00200020011082808080000b200441d0006a24808080800020" - "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" - "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" - "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" - "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" - "004105470d0020002802042202450d002000280208210303402002418c026a2100" - "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" - "0c020b2000280208210120002802042107200641016a2106200541746a21052000" - "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" - "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" - "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" - "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" - "0041c0006b22052480808080002005200136020c20052000360208200520033602" - "14200520023602102005410236021c200541dc82c0800036021820054202370224" - "2005418180808000ad422086200541106aad843703382005418280808000ad4220" - "86200541086aad843703302005200541306a360220200541186a200410a4808080" - "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" - "41206b2200248080808000200041003602182000410136020c200041ac81c08000" - "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" - "23808080800041206b2202248080808000200241106a200041106a290200370300" - "200241086a200041086a290200370300200241013b011c20022001360218200220" - "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" - "6a280200220241787122006a21030240024020024101710d002002410271450d01" - "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" - "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" - "7136020420012000410172360204200320003602000f0b2001200210a880808000" - "0b024002400240024002400240200328020422024102710d00200341002802f8d2" - "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" - "80002001200220006a2200410172360204200120006a2000360200200141002802" - "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" - "2000410172360204200120006a20003602000b2000418002490d022001200010d7" - "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" - "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" - "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" - "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" - "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" - "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" - "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" - "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" - "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" - "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" - "00220241012000410376742200710d00410020022000723602e4d2c08000200321" - "000c010b200328020821000b200320013602082000200136020c2001200336020c" - "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" - "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" - "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" - "0041206b2203248080808000200341003602102003410136020420034204370208" - "2003200136021c200320003602182003200341186a3602002003200210a4808080" - "00000b840601057f0240024002402000417c6a2203280200220441787122054104" - "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" - "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" - "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" - "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" - "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" - "7871220420056a22052001490d042006200410a880808000200520016b22024110" - "490d0120032001200328020041017172410272360200200720016a220120024103" - "72360204200720056a220520052802044101723602042001200210a98080800020" - "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" - "20016a22052002410372360204200620062802044101723602042005200210a980" - "80800020000f0b20032005200328020041017172410272360200200720056a2202" - "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" - "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" - "200720056a2202200228020441017236020441002102410021010c010b20032001" - "200441017172410272360200200720016a22012002410172360204200720056a22" - "05200236020020052005280204417e713602040b410020013602f4d2c080004100" - "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" - "0240200210848080800022050d0041000f0b20052000417c417820032802002201" - "4103711b20014178716a2201200220012002491b10df808080002102200010a580" - "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" - "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" - "410272360200200720016a2202200520016b2205410172360204410020053602f0" - "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" - "4002402001418002490d002000280218210302400240024020022000470d002000" - "41144110200028021422021b6a28020022010d01410021020c020b200028020822" - "01200236020c200220013602080c010b200041146a200041106a20021b21040340" - "200421052001220241146a200241106a200228021422011b210420024114411020" - "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" - "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" - "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" - "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" - "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" - "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d0020022001360214" - "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" - "4101710d002003410271450d012000280200220320016a21010240200020036b22" - "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" - "d2c0800020022002280204417e7136020420002001410172360204200220013602" - "000c020b2000200310a8808080000b024002400240024020022802042203410271" - "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" - "03417871220310a8808080002000200320016a2201410172360204200020016a20" - "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" - "2003417e7136020420002001410172360204200020016a20013602000b02402001" - "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" - "0240024041002802e4d2c08000220341012001410376742201710d004100200320" - "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" - "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" - "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" - "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" - "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" - "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" - "7e23808080800041306b2203248080808000200320003602002003200136020420" - "03410236020c200341c485c08000360208200342023702142003418380808000ad" - "4220862204200341046aad84370328200320042003ad843703202003200341206a" - "360210200341086a200210a480808000000b110020003502004101200110ad8080" - "80000b7902017f017e23808080800041306b220324808080800020032001360204" - "200320003602002003410236020c200341c882c080003602082003420237021420" - "03418380808000ad42208622042003ad8437032820032004200341046aad843703" - "202003200341206a360210200341086a200210a480808000000bec0203027f017e" - "037f23808080800041306b2203248080808000412721040240024020004290ce00" - "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" - "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" - "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" - "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" - "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" - "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" - "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" - "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" - "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" - "23808080800041206b220124808080800020002802182102200141106a20004110" - "6a290200370300200141086a200041086a2902003703002001200036021c200120" - "0236021820012000290200370300200110d880808000000bcb0501077f02400240" - "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" - "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" - "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" - "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" - "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" - "28021422012000280218220920082002200310b080808000450d0041010f0b2001" - "20042005200928020c11818080800080808080000f0b0240024002400240200028" - "0204220120064b0d00200028021422012000280218220920082002200310b08080" - "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" - "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" - "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" - "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" - "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" - "00202000200736021041000f0b200120042005200928020c118180808000808080" - "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" - "020b20072101410021070c010b20074101762101200741016a41017621070b2001" - "41016a210120002802102106200028021821092000280214210a02400340200141" - "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" - "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" - "020c11818080800080808080000d00410021010340024020072001470d00200720" - "07490f0b200141016a2101200a200620092802101182808080008080808000450d" - "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" - "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" - "200020032004200128020c11818080800080808080000b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c200341e485c08000360208200342023702142003418380808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" - "200028020022040d002003410171450d010b02402003410171450d00200120026a" - "210502400240200028020c22060d0041002107200121080c010b41002107410021" - "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" - "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" - "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" - "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" - "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" - "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" - "2007200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a02402002" - "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" - "0641002103024020012007460d004100210302402009417c4b0d00410021034100" - "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" - "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" - "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" - "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" - "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" - "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" - "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" - "41002108024020054104490d002004200d41f007716a2109410021082004210303" - "40200328020c2207417f7341077620074106767241818284087120032802082207" - "417f7341077620074106767241818284087120032802042207417f734107762007" - "4106767241818284087120032802002207417f7341077620074106767241818284" - "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" - "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" - "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" - "4107762003410676724181828408712103200c4101460d0220082802042207417f" - "7341077620074106767241818284087120036a2103200c4102460d022008280208" - "2208417f7341077620084106767241818284087120036a21030c020b024020020d" - "00410021060c030b2002410371210802400240200241044f0d0041002106410021" - "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" - "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" - "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" - "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" - "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" - "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" - "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" - "024020002d00200e0402000102020b20052103410021050c010b20054101762103" - "200541016a41017621050b200341016a2103200028021021092000280218210820" - "00280214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c118180" - "80800080808080000f0b0240200720012002200828020c11818080800080808080" - "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" - "016a21032007200920082802101182808080008080808000450d000b2003417f6a" - "2005490b140020012000280200200028020410b2808080000b1c00200028020020" - "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" - "306b2203248080808000200341033a002c2003412036021c410021042003410036" - "02282003200136022420032000360220200341003602142003410036020c024002" - "40024002400240200228021022050d00200228020c2200450d0120022802082101" - "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" - "0240200041046a2802002207450d00200328022020002802002007200328022428" - "020c11818080800080808080000d040b20012802002003410c6a20012802041182" - "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" - "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" - "41016a210420022802082109200228020021004100210603400240200041046a28" - "02002201450d00200328022020002802002001200328022428020c118180808000" - "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" - "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" - "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" - "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" - "02102003200b36020c200141046a280200210702400240024020012802000e0301" - "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" - "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" - "2802002003410c6a200128020411828080800080808080000d02200041086a2100" - "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" - "0020044103746a22012802002001280204200328022428020c1181808080008080" - "808000450d010b410121010c010b410021010b200341306a24808080800020010b" - "d70201057f2380808080004180016b220224808080800002400240024002402001" - "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" - "030b41ff00210303402002200322046a22052000410f712203413072200341d700" - "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" - "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" - "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" - "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" - "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" - "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" - "20024180016a24808080800020000b7902017f017e23808080800041306b220324" - "808080800020032000360200200320013602042003410236020c2003419886c080" - "00360208200342023702142003418380808000ad4220862204200341046aad8437" - "0328200320042003ad843703202003200341206a360210200341086a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" - "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" - "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" - "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" - "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" - "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" - "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" - "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" - "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" - "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" - "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" - "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" - "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" - "0010a280808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641a888c0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541b089c080003602302005420537023c20054182" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418480808000ad422086200541286aad843703582005418580808000ad42" - "2086200541246aad843703502005418380808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541f089c080003602302005420337023c2005" - "418280808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418380808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541d088c080003602302005420437023c2005418280" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" - "000d00200128021441d881c080004102200128021828020c118180808000808080" - "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111828080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111828080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11818080800080808080000d010b2004412720011182808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410de808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" - "400240024041c8031084808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" - "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "df80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" - "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" - "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" - "00200028020021002002410036022c2002428080808010370224200241033a0050" - "200241203602402002410036024c200241c0a0c080003602482002410036023820" - "0241003602302002200241246a3602440240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002400240" - "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" - "1314151617180b024002400240024020002d00040e0400010203000b2002200028" - "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" - "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" - "2900e4ccc08000370000200241143602602002200336025c200241143602582002" - "410336026c200241ccccc08000360268200242023702742002418680808000ad42" - "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" - "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" - "8080002103024020022802582204450d00200228025c20041082808080000b2003" - "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" - "013702742002418280808000ad422086200241086aad8437035820022003410274" - "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" - "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" - "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" - "0c190b20002802082203280200200241306a200328020428021011828080800080" - "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" - "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" - "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" - "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" - "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" - "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" - "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" - "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" - "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" - "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" - "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" - "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" - "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" - "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" - "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" - "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" - "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" - "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" - "6a200241246a41086a280200360200200220022902243703582002418380808000" - "36027c2002418380808000360274200241888080800036026c2002410436020c20" - "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" - "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" - "280218200241086a10b5808080002100024020022802582201450d00200228025c" - "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" - "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" - "00280204200028020810b2808080000b4b01017f02402000280200200028020822" - "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" - "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" - "8080800041106b2202248080808000200028020821032000280204210441012105" - "024020012802142206412220012802182207280210220811828080800080808080" - "000d000240024020030d0041002103410021000c010b410021094100210a200421" - "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" - "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" - "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" - "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" - "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" - "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" - "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" - "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" - "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" - "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" - "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" - "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" - "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" - "0d010240024020022d0004418001470d0020062002280208200811828080800080" - "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" - "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" - "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" - "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" - "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" - "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" - "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" - "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" - "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" - "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" - "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" - "200728020c11818080800080808080000d00200641222008118280808000808080" - "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" - "05200128021828020c11818080800080808080000b1e01017f0240200028020022" - "01450d00200028020420011082808080000b0b5301047f02402000280208220120" - "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" - "200441dc00460d0120044120490d012000200141016a220136020820022001470d" - "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" - "0210cf80808000200028020821030b200028020420036a2001200210df80808000" - "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" - "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" - "20026b21074100210503400240024002400240200220056a2d00002208c0220941" - "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" - "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" - "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" - "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" - "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" - "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" - "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" - "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" - "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" - "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" - "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" - "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" - "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" - "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" - "0520042802082108024041141084808080002203450d002003200836020c200341" - "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" - "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" - "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" - "41106a2480808080000b5901017f23808080800041106b22012480808080002001" - "41086a2000200028020041014101410110d4808080000240200128020822004181" - "80808078460d002000200128020c109580808000000b200141106a248080808000" - "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" - "8080000240024020022f01140d0002400240024002400240024020022f01162203" - "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" - "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" - "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" - "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" - "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" - "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" - "2205418080046a210302402001280200200128020822006b41034b0d0020012000" - "410410cf80808000200128020821000b2001200041046a36020820012802042000" - "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" - "002005410676413f71418001723a000220002003410c76413f71418001723a0001" - "410021000c070b200220002802002000280204200028020810838080800041002d" - "00c0cfc080001a200228020421012002280200210341141084808080002200450d" - "042000200336020c20004114360200200020013602100c060b200241086a200028" - "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" - "21012002280208210341141084808080002200450d032000200336020c20004114" - "360200200020013602100c050b200241173602142000200241146a10d080808000" - "21000c040b200241173602142000200241146a10d08080800021000c030b024002" - "4002402003418001490d0002402001280200200128020822046b41034b0d002001" - "2004410410cf80808000200128020821040b200128020420046a21002003418010" - "4f0d0120034106764140722106410221050c020b02402001280208220020012802" - "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" - "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" - "60722106410321050b200020063a00002001200420056a360208200020056a417f" - "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" - "206a24808080800020000b910301057f23808080800041106b2202248080808000" - "02400240024002402001280204220320012802082204490d000240200320046b41" - "034b0d0020012003360208200241086a2001280200200320031083808080004100" - "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" - "0d022001200436020c2001410436020020002001360204200120033602100c030b" - "2001200441046a220536020802402001280200220620046a22012d000141017441" - "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" - "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" - "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" - "001a200228020421032002280200210441141084808080002201450d0220012004" - "36020c2001410c36020020002001360204200120033602100c030b200020013b01" - "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" - "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" - "022480808080000240024002402001280208220320012802042204490d00200241" - "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" - "032002280208210441141084808080002201450d022001200436020c2001410436" - "02002000200136020420012003360210410121010c010b2000200128020020036a" - "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" - "5601017f23808080800041106b2203248080808000200341086a20002001200241" - "01410110d480808000024020032802082202418180808078460d00200220032802" - "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" - "106b2202248080808000200241086a200028020020002802042000280208108380" - "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" - "8080800022000d00000b2000200436020c20002001290200370200200020033602" - "10200041086a200141086a280200360200200241106a24808080800020000b1f00" - "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" - "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" - "00200320016a3602080b200241106a24808080800041000b820101017f02400240" - "024002402003280204450d000240200328020822040d002002450d0341002d00c0" - "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" - "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" - "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" - "8080800041206b2206248080808000024002400240200220036a220320024f0d00" - "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" - "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" - "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" - "20080d00410021020c010b2006200820056c36021c200620012802043602142004" - "21020b20062002360218200641086a20042009200641146a10d380808000024020" - "062802080d00200628020c21022001200736020020012002360204418180808078" - "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" - "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" - "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" - "017120024101746b413e6a21020b200042003702102000200236021c2002410274" - "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" - "00360200200020033602182000200036020c20002000360208410041002802e8d2" - "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" - "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" - "03034020042003411d764104716a41106a22052802002202450d02200341017421" - "032002210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b20052000" - "360200200020043602182000200036020c200020003602080b0b00200010d98080" - "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" - "024002400240024020002802040e020001020b20020d0141012102410021030c02" - "0b20020d00200028020022022802042103200228020021020c010b200141808080" - "80783602002001200036020c2001418980808000200028021c22002d001c20002d" - "001d10da80808000000b20012003360204200120023602002001418a8080800020" - "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" - "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" - "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" - "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" - "086a200020011183808080008080808000000b410041003a0094d3c08000200245" - "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" - "02402002450d000240034020002d0000220420012d00002205470d01200041016a" - "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" - "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" - "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" - "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" - "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" - "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" - "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" - "280200210803402005417c6a220520082003742001280200220820027672360200" - "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" - "210103402005417c6a220520012802003602002001417c6a210120042005490d00" - "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" - "036a210502402003450d0020002104200121080340200420082d00003a00002008" - "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" - "6a210402400240200120036a2206410371450d0020074101480d01200641037422" - "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" - "21080340200520082002762001280200220820037472360200200141046a210120" - "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" - "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" - "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" - "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" - "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" - "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" - "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" - "00410020006b41037122046a210502402004450d00200021032001210603402003" - "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" - "01480d012009410374220641187121022009417c71220a41046a2101410020066b" - "4118712104200a2802002106034020052006200276200128020022062004747236" - "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" - "092101034020052001280200360200200141046a2101200541046a22052003490d" - "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" - "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" - "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" - "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" - "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" - "0a000000150000004b000000450010000a000000160000004b0000004163636f75" - "6e7400450010000a0000001700000033000000450010000a000000180000003300" - "00006361706163697479206f766572666c6f770000009800100011000000616c6c" - "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" - "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" - "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" - "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" - "686520696e6465782069732000150110002000000035011000120000003a200000" - "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" - "7273006c0110001300000066000000170000003078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230323132" - "323233323432353236323732383239333033313332333333343335333633373338" - "333934303431343234333434343534363437343834393530353135323533353435" - "353536353735383539363036313632363336343635363636373638363937303731" - "373237333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939636f72652f7372632f66" - "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" - "000000a40900001a00000072616e676520737461727420696e64657820206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" - "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" - "10000000a202100022000000736c69636520696e64657820737461727473206174" - "202062757420656e64732061742000f4021000160000000a0310000d0000000101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000020202020202" - "020202020202020202020202020202020202020202020202030303030303030303" - "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" - "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" - "000e0000003b041000040000003f041000100000004f0410000100000062797465" - "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" - "7420697320696e7369646520202862797465732029206f66206000700410000b00" - "00007b04100026000000a104100008000000a9041000060000004f041000010000" - "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" - "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" - "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" - "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" - "002c0510001d0000000a0000002b00000000060101030104020507070208080902" - "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" - "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" - "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" - "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" - "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" - "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" - "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" - "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" - "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" - "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" - "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" - "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" - "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" - "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" - "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" - "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" - "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" - "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" - "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" - "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" - "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" - "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" - "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" - "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" - "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" - "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" - "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" - "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" - "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" - "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" - "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" - "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" - "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" - "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" - "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" - "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" - "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" - "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" - "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" - "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" - "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" - "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" - "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" - "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" - "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" - "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" - "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" - "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" - "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" - "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" - "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" - "0239010405010204011402160601013a0101020104080107030a021e013b010101" - "0c01090128010301370101030503010407020b021d013a01020102010301050207" - "020b021c02390201010204080109010a021d014801040102030101080151010207" - "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" - "0202021902040310040d01020206010f01000300031d021e021e02400201070801" - "020b09012d030101750222017603040209010603db0202013a0101070101010102" - "08060a0201301f310430070101050128090c022004020201033801010203010103" - "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" - "04010a200250020001030104011902050197021a120d012608190b2e0330010204" - "020227014306020202020c0108012f01330101030202050201012a020801ee0102" - "01040100010010101000020001e201950500030102050428030401a50200040002" - "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" - "090a0402015f0302010102060102019d010308150239020101010116010e070305" - "c308020301011701510102060101020101020102eb010204060201021b02550802" - "0101026a0101010206010165030204010500090102f5010a020101040190040202" - "0401200a280602040801090602032e0d010200070106010152160207010201027a" - "06030101020107010148020301010100020b023405050101010001060f00053b07" - "00013f0451010002002e0217000101030405080802071e0494030037043208010e" - "011605010f000701110207010201056401a00700013d04000400076d07006080f0" - "002f72757374632f63326637346333663932386165623530336631356234653965" - "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" - "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" - "0e10006000000071010000360000002f72757374632f6332663734633366393238" - "61656235303366313562346539656635373738653737663330353862382f6c6962" - "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" - "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" - "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" - "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" - "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" - "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" - "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" - "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" - "00181d10005f00000058020000300000000d0000000c000000040000000e000000" - "0f00000010000000000000000000000001000000110000006120446973706c6179" - "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" - "20756e65787065637465646c792f72757374632f63326637346333663932386165" - "6235303366313562346539656635373738653737663330353862382f6c69627261" - "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" - "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" - "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" - "207768696c652070617273696e67206120737472696e67454f46207768696c6520" - "70617273696e6720612076616c7565657870656374656420603a60657870656374" - "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" - "78706563746564206964656e7465787065637465642076616c7565657870656374" - "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" - "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" - "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" - "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" - "206120737472696e676b6579206d757374206265206120737472696e67696e7661" - "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" - "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" - "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" - "6164696e6720737572726f6761746520696e206865782065736361706574726169" - "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" - "70656374656420656e64206f662068657820657363617065726563757273696f6e" - "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" - "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" - "4826100001000000000000000000f03f0000000000002440000000000000594000" - "00000000408f40000000000088c34000000000006af8400000000080842e410000" - "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" - "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" - "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" - "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" - "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" - "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" - "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" - "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" - "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" - "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" - "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" - "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" - "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" - "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" - "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" - "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" - "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" - "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" - "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" - "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" - "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" - "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" - "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" - "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" - "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" - "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" - "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" - "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" - "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" - "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" - "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" - "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" - "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" - "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" - "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" - "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" - "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" - "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" - "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" - "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" - "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" - "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" - "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" - "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" - "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" - "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" - "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" - "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" - "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" - "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" - "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" - "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" - "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" - "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" - "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" - "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" - "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" - "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" - "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" - "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" - "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" - "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" - "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" - "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" - "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" - "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" - "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" - "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" - "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" - "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" - "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" - "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" - "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" - "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" - "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" - "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" - "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" - "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" - "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" - "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" - "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" - "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" - "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" - "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" - "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" - "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" - "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" - "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" - "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" - "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" - "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" - "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" - "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" - "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" - "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" - "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" - "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" - "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" - "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" - "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" - "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" - "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" - "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" - "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" - "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" - "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" - "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" - "64656466696c6520746f6f206c617267657265736f757263652062757379657865" - "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" - "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" - "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" - "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" - "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" - "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" - "0048261000010000006f7065726174696f6e207375636365737366756c10000000" - "1100000012000000100000001000000013000000120000000d0000000e00000015" - "0000000c0000000b00000015000000150000000f0000000e000000130000002600" - "00003800000019000000170000000c000000090000000a00000010000000170000" - "00190000000e0000000d00000014000000080000001b0000000e00000010000000" - "16000000150000000b000000160000000d0000000b000000130000005023100060" - "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" - "1000f8231000042410000f24100024241000392410004824100056241000692410" - "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" - "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" - "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" - "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" - "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" - "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" - "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" - "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" - "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" - "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" - "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" - "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" - "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" - "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" - "243137683533326265333033376461316237656445064a5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" - "70617273655f6964656e743137683663353964643731393635353139313045074b" - "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" - "4c54245224475424313270617273655f6e756d6265723137683738336134316134" - "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" - "73657269616c697a6572244c54245224475424313370617273655f646563696d61" - "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" - "70617273655f6578706f6e656e7431376833366464376462643233653461346562" - "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" - "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" - "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" - "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" - "346636345f66726f6d5f7061727473313768633863316239626161613836666637" - "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" - "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" - "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" - "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" - "24313670617273655f616e795f6e756d6265723137683931643533303465356139" - "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" - "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" - "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" - "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" - "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" - "61775f7665633139526177566563244c54245424432441244754243867726f775f" - "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" - "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" - "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" - "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" - "62653863353535633862636433353545143c5f5a4e357365726465326465375669" - "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" - "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" - "68616e646c655f6572726f72313768393762376462643066373264643738384516" - "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" - "35766973697431376838366238393638313662613130613765451781015f5a4e37" - "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" - "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" - "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" - "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" - "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" - "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" - "244754243976697369745f73747231376835356436653830653061376366383938" - "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" - "6363657373244c5424522447542424753230246173247532302473657264652e2e" - "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" - "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" - "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" - "4c54244b24432456244324412447542436696e7365727431376834643164623464" - "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" - "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" - "244b244324562443244124475424247532302461732475323024636f72652e2e6f" - "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" - "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" - "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" - "702e2e5061727469616c4571244754243265713137683162323138393234373831" - "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" - "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" - "475424247532302461732475323024636f72652e2e697465722e2e747261697473" - "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" - "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" - "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" - "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" - "6e646578244754243130696e6465785f696e746f31376864333238633634636161" - "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" - "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" - "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" - "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" - "63617061636974795f6f766572666c6f7731376834393964343832613965643537" - "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" - "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" - "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" - "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" - "70616e69636b696e673570616e6963313768303465656239313764643933633232" - "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" - "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" - "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" - "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "244754243133646973706f73655f6368756e6b3137683665306363636434353836" - "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" - "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" - "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" - "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" - "2475323024666f7224753230247533322447542433666d74313768626633653032" - "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" - "70616e69635f626f756e64735f636865636b313768336436623861613463383034" - "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" - "363431376864353231666136656636613036373261452e11727573745f62656769" - "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" - "327061645f696e74656772616c3137686334656130376130626331333536633445" - "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" - "656772616c313277726974655f7072656669783137686139613433323830623630" - "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" - "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" - "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" - "706164313768343736396165333839333734636335314533495f5a4e34345f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" - "706c61792447542433666d74313768376666346430623836303963323437324534" - "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" - "2e666d742e2e44656275672447542433666d743137683361366261613162623437" - "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" - "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" - "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" - "3024666f7224753230247533322447542433666d74313768353533393862313635" - "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" - "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" - "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" - "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" - "6275675f657874313768656366613566303431373437393039384539345f5a4e34" - "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" - "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" - "6963655f6572726f725f6661696c31376862303364323439386438646362363433" - "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" - "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" - "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" - "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" - "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" - "656275672447542433666d7431376865613566643964626339343936626665453e" - "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" - "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" - "30246933322447542433666d743137686365643930633761363339633031646445" - "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" - "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" - "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" - "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" - "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" - "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" - "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" - "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" - "3130696e736572745f666974313768633861306366353339656666303131314541" - "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" - "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" - "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" - "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" - "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" - "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" - "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768343032353764366634326532" - "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" - "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" - "61792447542433666d74313768636534323236616131663732366331634544615f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" - "74655f73747231376835393964396535373839343664643938452e31393245575f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768623637326562313939633335643138364546555f5a4e35335f244c542463" - "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768663761653238353562323439" - "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" - "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" - "313768376236353738393966393837353963624548475f5a4e313073657264655f" - "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" - "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" - "616c6c6f63337665633136566563244c5424542443244124475424313765787465" - "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" - "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" - "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" - "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" - "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" - "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" - "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" - "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" - "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" - "6f64655f6865785f65736361706531376834376265353936383535663830346461" - "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" - "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" - "63377261775f7665633230526177566563496e6e6572244c542441244754243772" - "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" - "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" - "3472656164356572726f7231376865663535323764333333633963323666455130" - "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" - "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" - "666d742e2e577269746524475424313077726974655f6368617231376832313433" - "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" - "766563313166696e6973685f67726f773137683533383539626133383962373164" - "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" - "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" - "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" - "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" - "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" - "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" - "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" - "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" - "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" - "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" - "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" - "75376424247537642431376865313761333937376638396331313738455a3b5f5a" - "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" - "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" - "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" - "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" - "61735f73747231376865623366373232643232346534326638455c066d656d636d" - "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" - "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" - "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" - "2e726f6461746100550970726f64756365727302086c616e677561676501045275" - "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" - "6768746c79202863326637346333663920323032342d30392d30392900490f7461" - "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::string escrow_tx_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; - - std::vector escrow_tx_json_data( - escrow_tx_json_str.begin(), escrow_tx_json_str.end()); - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasm( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasm( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - } - - void - testEscrowWasmP4() - { - testcase("escrow wasm P4 test"); - auto wasmHex = - "0061736d0100000001791160037f7f7f017f60027f7f017f60017f0060027f7f00" - "60037e7f7f017f60037f7f7f0060067f7f7f7f7f7f017f60017f017f60047f7f7f" - "7f017f60057f7f7f7f7f0060000060057f7f7f7f7f017f60077f7f7f7f7f7f7f01" - "7f60047f7f7f7f0060067f7f7f7f7f7f0060047f7f7f7e0060057f7f7f7e7f0003" - "7c7b01010301040506010202020202010102050001000103010007070303080500" - "090201020a03020500030305020b05050101010001010a0505050c090901010105" - "0903010101030d0d0502050d01030301010d0e020a0a02030101020a0d0d000101" - "0a030302020d03030205050003030f0f1010101009030000000004050170011e1e" - "05030100110619037f01418080c0000b7f004184e0c0000b7f004190e0c0000b07" - "5106066d656d6f7279020008616c6c6f6361746500180a6465616c6c6f63617465" - "001b11636f6d706172655f6163636f756e744944001c0a5f5f646174615f656e64" - "03010b5f5f686561705f6261736503020923010041010b1d210307122f30433134" - "3c3d443e59626708110e500d160942585a5e5f600a9188037b6601017f23808080" - "800041106b220224808080800002400240200028020c450d00200021010c010b20" - "0241086a200041086a280200360200200220002902003703002001200210818080" - "80002101200041141082808080000b200241106a24808080800020010b8c010103" - "7f23808080800041106b2202248080808000200241086a200028020c2000280210" - "200028021410c78080800041002d00e0dbc080001a200228020c21032002280208" - "21040240411410998080800022000d00000b2000200436020c2000200129020037" - "020020002003360210200041086a200141086a280200360200200241106a248080" - "80800020000b7001027f024002402000417c6a2802002202417871220341044108" - "200241037122021b20016a490d0002402002450d002003200141276a4b0d020b20" - "0010a5808080000f0b419db8c08000412e41ccb8c0800010a680808000000b41dc" - "b8c08000412e418cb9c0800010a680808000000be90201057f2380808080004180" - "016b22022480808080000240024002400240200128021c22034110710d00200341" - "20710d0120003100004101200110848080800021000c030b20002d0000210041ff" - "00210303402002200322046a22052000410f712203413072200341d7006a200341" - "0a491b3a00002004417f6a2103200041ff017122064104762100200641104f0d00" - "0c020b0b20002d0000210041ff00210303402002200322046a22052000410f7122" - "03413072200341376a2003410a491b3a00002004417f6a2103200041ff01712206" - "4104762100200641104f0d000b02402004418101490d002004418001419887c080" - "00108580808000000b2001410141a887c0800041022005418101200441016a6b10" - "868080800021000c010b02402004418101490d002004418001419887c080001085" - "80808000000b2001410141a887c0800041022005418101200441016a6b10868080" - "800021000b20024180016a24808080800020000bec0203027f017e037f23808080" - "800041306b2203248080808000412721040240024020004290ce005a0d00200021" - "050c010b412721040340200341096a20046a2206417c6a20004290ce0080220542" - "f0b1037e20007ca7220741ffff037141e4006e220841017441aa87c080006a2f00" - "003b00002006417e6a2008419c7f6c20076a41ffff037141017441aa87c080006a" - "2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22046a" - "2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441aa" - "87c080006a2f00003b00000b024002402006410a490d00200341096a2004417e6a" - "22046a200641017441aa87c080006a2f00003b00000c010b200341096a2004417f" - "6a22046a20064130723a00000b2002200141014100200341096a20046a41272004" - "6b1086808080002104200341306a24808080800020040b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c2003419c8ac08000360208200342023702142003418180808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bcb0501077f0240024020010d00200541016a2106" - "200028021c2107412d21080c010b412b418080c400200028021c22074101712201" - "1b2108200120056a21060b0240024020074104710d00410021020c010b02400240" - "20030d00410021090c010b02402003410371220a0d000c010b4100210920022101" - "0340200920012c000041bf7f4a6a2109200141016a2101200a417f6a220a0d000b" - "0b200920066a21060b024020002802000d00024020002802142201200028021822" - "0920082002200310ac80808000450d0041010f0b200120042005200928020c1180" - "8080800080808080000f0b02400240024002402000280204220120064b0d002000" - "28021422012000280218220920082002200310ac80808000450d0141010f0b2007" - "410871450d01200028021021072000413036021020002d0020210b4101210c2000" - "41013a0020200028021422092000280218220a20082002200310ac808080000d02" - "200120066b41016a2101024003402001417f6a2201450d0120094130200a280210" - "1181808080008080808000450d000b41010f0b0240200920042005200a28020c11" - "80808080008080808000450d0041010f0b2000200b3a0020200020073602104100" - "0f0b200120042005200928020c1180808080008080808000210c0c010b20012006" - "6b210702400240024020002d002022010e0402000100020b20072101410021070c" - "010b20074101762101200741016a41017621070b200141016a2101200028021021" - "06200028021821092000280214210a024003402001417f6a2201450d01200a2006" - "20092802101181808080008080808000450d000b41010f0b4101210c200a200920" - "082002200310ac808080000d00200a20042005200928020c118080808000808080" - "80000d00410021010340024020072001470d0020072007490f0b200141016a2101" - "200a200620092802101181808080008080808000450d000b2001417f6a2007490f" - "0b200c0be70201057f2380808080004180016b2202248080808000024002400240" - "0240200128021c22034110710d0020034120710d01200035020041012001108480" - "80800021000c030b2000280200210041ff00210303402002200322046a22052000" - "410f712203413072200341d7006a2003410a491b3a00002004417f6a2103200041" - "10492106200041047621002006450d000c020b0b2000280200210041ff00210303" - "402002200322046a22052000410f712203413072200341376a2003410a491b3a00" - "002004417f6a210320004110492106200041047621002006450d000b0240200441" - "8101490d002004418001419887c08000108580808000000b2001410141a887c080" - "0041022005418101200441016a6b10868080800021000c010b0240200441810149" - "0d002004418001419887c08000108580808000000b2001410141a887c080004102" - "2005418101200441016a6b10868080800021000b20024180016a24808080800020" - "000b1e01017f024020002802002201450d00200028020420011082808080000b0b" - "970101047f024002400240200028020022002802000e020001020b200028020822" - "01450d01200028020420011082808080000c010b20002d00044103470d00200028" - "0208220128020021020240200128020422032802002204450d0020022004118280" - "80800080808080000b024020032802042203450d00200220031082808080000b20" - "01410c1082808080000b200041141082808080000b6801017f0240024002400240" - "20002d00000e050303030102000b200041046a108b808080000c020b2000280204" - "2201450d01200028020820011082808080000f0b200041046a108c808080002000" - "2802042201450d002000280208200141186c1082808080000f0b0be30501067f23" - "808080800041306b22012480808080004100210241002103024020002802002204" - "450d00200120043602182001410036021420012004360208200141003602042001" - "2000280204220336021c2001200336020c20002802082103410121020b20012003" - "360220200120023602102001200236020002400240024003400240024002400240" - "024020030d002001280200450d0820012802082104200128020422030d01410021" - "00200128020c2203450d06034020042802980321042003417f6a22030d000c070b" - "0b20012003417f6a360220024020024101712203450d0020012802040d00200128" - "02082103200128020c2200450d03034020032802980321032000417f6a22000d00" - "0c040b0b2003450d01200128020421030c030b200421000c050b41a8acc0800010" - "a080808000000b200142003702082001200336020441012102200141013602000b" - "200128020821000240200128020c220520032f019203490d000240034020014124" - "6a2003200010bf8080800020012802242203450d0120012802282100200128022c" - "220520032f019203490d020c000b0b4188a5c0800010a080808000000b20054101" - "6a21040240024020000d002001200436020c20014100360208200120033602040c" - "010b200320044102746a4198036a21040340200428020022064198036a21042000" - "417f6a22000d000b20014200370208200120063602042003450d040b0240200320" - "05410c6c6a418c026a22002802002204450d00200028020420041082808080000b" - "02400240024002402003200541186c6a22032d00000e050303030102000b200341" - "046a108b808080000c020b20032802042200450d01200328020820001082808080" - "000c010b200341046a108c8080800020032802042200450d002003280208200041" - "186c1082808080000b200128022021030c000b0b200421030b0340200141246a20" - "03200010bf8080800020012802242203450d01200128022821000c000b0b200141" - "306a2480808080000b950101027f024020002802082201450d0020002802044104" - "6a2100034002400240024002402000417c6a2d00000e050303030102000b200010" - "8b808080000c020b20002802002202450d01200041046a28020020021082808080" - "000c010b2000108c8080800020002802002202450d00200041046a280200200241" - "186c1082808080000b200041186a21002001417f6a22010d000b0b0b2200200128" - "021441d4a6c080004105200128021828020c11808080800080808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "002000108f808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110908080" - "8000200028020821030b200028020420036a2002410c6a200110fa808080001a20" - "00200320016a3602080b200241106a24808080800041000b5901017f2380808080" - "0041106b2201248080808000200141086a2000200028020041014101410110d280" - "808000024020012802082200418180808078460d002000200128020c109a808080" - "00000b200141106a2480808080000b5601017f23808080800041106b2203248080" - "808000200341086a2000200120024101410110d280808000024020032802082202" - "418180808078460d002002200328020c109a80808000000b200341106a24808080" + "01109c80808000024020012802082200418180808078460d002000200128020c10" + "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" + "03248080808000200341086a200020012002109c80808000024020032802082202" + "418180808078460d002002200328020c109d80808000000b200341106a24808080" "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109080808000200028020821030b200028020420036a2001200210fa808080001a" - "2000200320026a36020841000b1400200120002802042000280208109380808000" - "0bc20b010b7f200028020821030240024002400240200028020022040d00200341" - "0171450d010b02402003410171450d00200120026a210502400240200028020c22" - "060d0041002107200121080c010b41002107410021092001210803402008220320" - "05460d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21080c" - "010b200341046a21080b200820036b20076a21072006200941016a2209470d000b" - "0b20082005460d00024020082c00002203417f4a0d0020034160491a0b02400240" - "2007450d000240200720024f0d00200120076a2c000041bf7f4a0d01410021030c" - "020b20072002460d00410021030c010b200121030b2007200220031b2102200320" - "0120031b21010b024020040d00200028021420012002200028021828020c118080" - "80800080808080000f0b2000280204210a024020024110490d0020022001200141" - "036a417c7122076b22096a220b4103712104410021064100210302402001200746" - "0d004100210302402009417c4b0d00410021034100210503402003200120056a22" - "082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841026a2c000041bf7f" - "4a6a200841036a2c000041bf7f4a6a2103200541046a22050d000b0b2001210803" - "40200320082c000041bf7f4a6a2103200841016a2108200941016a22090d000b0b" - "02402004450d002007200b417c716a22082c000041bf7f4a210620044101460d00" - "200620082c000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a" - "21060b200b4102762105200620036a21060340200721042005450d04200541c001" - "200541c001491b220b410371210c200b410274210d41002108024020054104490d" - "002004200d41f007716a210941002108200421030340200328020c2207417f7341" - "077620074106767241818284087120032802082207417f73410776200741067672" - "41818284087120032802042207417f734107762007410676724181828408712003" - "2802002207417f7341077620074106767241818284087120086a6a6a6a21082003" - "41106a22032009470d000b0b2005200b6b21052004200d6a2107200841087641ff" - "81fc0771200841ff81fc07716a418180046c41107620066a2106200c450d000b20" - "04200b41fc01714102746a22082802002203417f73410776200341067672418182" - "8408712103200c4101460d0220082802042207417f734107762007410676724181" - "8284087120036a2103200c4102460d0220082802082208417f7341077620084106" - "767241818284087120036a21030c020b024020020d00410021060c030b20024103" - "71210802400240200241044f0d0041002106410021090c010b4100210620012103" - "2002410c71220921070340200620032c000041bf7f4a6a200341016a2c000041bf" - "7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a21062003" - "41046a21032007417c6a22070d000b0b2008450d02200120096a21030340200620" - "032c000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11808080800080808080000f0b2003410876" - "41ff811c71200341ff81fc07716a418180046c41107620066a21060b0240024020" - "0a20064d0d00200a20066b21054100210302400240024020002d00200e04020001" - "02020b20052103410021050c010b20054101762103200541016a41017621050b20" - "0341016a210320002802102109200028021821082000280214210703402003417f" - "6a2203450d022007200920082802101181808080008080808000450d000b41010f" - "0b200028021420012002200028021828020c11808080800080808080000f0b0240" - "200720012002200828020c1180808080008080808000450d0041010f0b41002103" - "0340024020052003470d0020052005490f0b200341016a21032007200920082802" - "101181808080008080808000450d000b2003417f6a2005490b890503037f017e03" - "7f23808080800041f0006b220224808080800041002103024020002d0000220420" - "012d0000470d00410121030240024002400240024020040e06050001020304050b" - "20002d000120012d00014621030c040b4100210320002903082205200129030852" - "0d030240024002402005a70e03000102000b200029031020012903105121030c05" - "0b200029031020012903105121030c040b20002b031020012b03106121030c030b" - "41002103200028020c2204200128020c470d0220002802082001280208200410f7" - "808080004521030c020b41002103200028020c2206200128020c470d0120012802" - "08210420002802082100200641016a210103402001417f6a22014521032001450d" - "02200020041094808080002106200441186a2104200041186a210020060d000c02" - "0b0b41002103200028020c2204200128020c470d002002410036026c2002420037" - "026420024100360254200241003602442002410036023020024100360220200220" - "01280208220636025c2002200128020422033602582002200636024c2002200336" - "024820022000280208220636023820022000280204220136023420022006360228" - "2002200136022420022004410020031b3602602002200341004722033602502002" - "200336024020022004410020011b36023c20022001410047220336022c20022003" - "36021c200241c0006a21070340200241106a2002411c6a10958080800041012103" - "20022802102201450d0120022802142104200241086a2007109580808000200228" - "02082200450d0141002103200128020822062000280208470d01200228020c2108" - "20012802042000280204200610f7808080000d01200420081094808080000d000b" - "0b200241f0006a24808080800020030bed0201057f024002400240200128022022" - "020d00410021020c010b20012002417f6a36022002400240024020012802004101" - "470d0020012802040d01200128020821030240200128020c2202450d0003402003" - "2802980321032002417f6a22020d000b0b20014200370208200120033602042001" - "41013602000c020b41c8acc0800010a080808000000b200128020421030b200128" - "0208210202400240200128020c220420032f0192034f0d00200321050c010b0340" - "2003280288022205450d03200241016a210220032f019003210420052103200420" - "052f0192034f0d000b0b200441016a21030240024020020d00200521060c010b20" - "0520034102746a4198036a21030340200328020022064198036a21032002417f6a" - "22020d000b410021030b2001200336020c20014100360208200120063602042005" - "200441186c6a210320052004410c6c6a418c026a21020b20002003360204200020" - "023602000f0b41b8acc0800010a080808000000bae0301057f2380808080004110" - "6b220224808080800041012103024020012802142204419f81c08000410d200128" - "0218220528020c220611808080800080808080000d00024020012d001c4104710d" - "00200441f886c080004103200611808080800080808080000d01200441ac81c080" - "004104200611808080800080808080000d012004418bc2c0800041022006118080" - "80800080808080000d01200420002d0000410274220141dc83c080006a28020020" - "0141c883c080006a280200200611808080800080808080000d012004418187c080" - "0041022006118080808000808080800021030c010b200441fb86c0800041032006" - "11808080800080808080000d002002200536020420022004360200410121032002" - "41013a000f20022002410f6a360208200241ac81c0800041041097808080000d00" - "2002418bc2c0800041021097808080000d00200220002d0000410274220141dc83" - "c080006a280200200141c883c080006a2802001097808080000d00410121032002" - "41fe86c0800041021097808080000d002004418087c08000410120061180808080" - "00808080800021030b200241106a24808080800020030bdf04010c7f2001417f6a" - "210320002802042104200028020021052000280208210641002107410021084100" - "21094100210a02400340200a4101710d0102400240200920024b0d000340200120" - "096a210a0240024002400240200220096b220b41074b0d0020022009470d012002" - "21090c050b02400240200a41036a417c71220c200a6b220d450d00410021000340" - "200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b41786a" - "220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a94" - "a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b2000" - "727141808182847871418081828478470d02200c41086a210c200d41086a220d20" - "0e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b20004101" - "6a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a20" - "0d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a46" - "0d01200b200041016a2200470d000b200221090c030b2000200d6a21000b200020" - "096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d004100" - "210a2009210d200921000c030b200920024d0d000b0b20082002460d024101210a" - "2008210d200221000b0240024020062d0000450d00200541f486c0800041042004" - "28020c11808080800080808080000d010b200020086b210b4100210c0240200020" - "08460d00200320006a2d0000410a46210c0b200120086a21002006200c3a000020" - "0d210820052000200b200428020c1180808080008080808000450d010b0b410121" - "070b20070b4901017f410021010240024020004100480d00024020000d00410121" - "010c020b41002d00e0dbc080001a200010998080800022010d01410121010b2001" - "2000109a80808000000b20010bcb2502087f017e02400240024002400240024002" - "400240200041f501490d0041002101200041cdff7b4f0d052000410b6a22014178" - "71210241002802c4dfc080002203450d04411f21040240200041f4ffff074b0d00" - "2002410620014108766722006b7641017120004101746b413e6a21040b41002002" - "6b21010240200441027441a8dcc080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b742107410021060340" - "02402005220528020441787122082002490d00200820026b220820014f0d002008" - "21012005210620080d004100210120052106200521000c040b2005280214220820" - "00200820052007411d764104716a41106a2802002205471b200020081b21002007" - "41017421072005450d020c000b0b024041002802c0dfc08000220541102000410b" - "6a41f803712000410b491b22024103762201762200410371450d00024002402000" - "417f7341017120016a2207410374220041b8ddc080006a2201200041c0ddc08000" - "6a28020022022802082206460d002006200136020c200120063602080c010b4100" - "2005417e200777713602c0dfc080000b20022000410372360204200220006a2200" - "2000280204410172360204200241086a0f0b200241002802c8dfc080004d0d0302" - "400240024020000d0041002802c4dfc080002200450d0620006841027441a8dcc0" - "80006a280200220628020441787120026b21012006210503400240200628021022" - "000d00200628021422000d0020052802182104024002400240200528020c220020" - "05470d00200541144110200528021422001b6a28020022060d01410021000c020b" - "20052802082206200036020c200020063602080c010b200541146a200541106a20" - "001b21070340200721082006220041146a200041106a200028021422061b210720" - "004114411020061b6a28020022060d000b200841003602000b2004450d04024020" - "0528021c41027441a8dcc080006a22062802002005460d00200441104114200428" - "02102005461b6a20003602002000450d050c040b2006200036020020000d034100" - "41002802c4dfc08000417e200528021c77713602c4dfc080000c040b2000280204" - "41787120026b22062001200620014922061b21012000200520061b210520002106" - "0c000b0b02400240200020017441022001742200410020006b7271682208410374" - "220141b8ddc080006a2206200141c0ddc080006a28020022002802082207460d00" - "2007200636020c200620073602080c010b41002005417e200877713602c0dfc080" - "000b20002002410372360204200020026a2207200120026b220641017236020420" - "0020016a2006360200024041002802c8dfc080002205450d00200541787141b8dd" - "c080006a210141002802d0dfc0800021020240024041002802c0dfc08000220841" - "012005410376742205710d00410020082005723602c0dfc08000200121050c010b" - "200128020821050b200120023602082005200236020c2002200136020c20022005" - "3602080b410020073602d0dfc08000410020063602c8dfc08000200041086a0f0b" - "20002004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b02400240024020" - "014110490d0020052002410372360204200520026a220220014101723602042002" - "20016a200136020041002802c8dfc080002207450d01200741787141b8ddc08000" - "6a210641002802d0dfc0800021000240024041002802c0dfc08000220841012007" - "410376742207710d00410020082007723602c0dfc08000200621070c010b200628" - "020821070b200620003602082007200036020c2000200636020c20002007360208" - "0c010b2005200120026a2200410372360204200520006a22002000280204410172" - "3602040c010b410020023602d0dfc08000410020013602c8dfc080000b20054108" - "6a0f0b024020002006720d004100210641022004742200410020006b7220037122" - "00450d0320006841027441a8dcc080006a28020021000b2000450d010b03402000" - "20062000280204417871220520026b220820014922041b21032005200249210720" - "08200120041b21080240200028021022050d00200028021421050b200620032007" - "1b21062001200820071b21012005210020050d000b0b2006450d00024041002802" - "c8dfc0800022002002490d002001200020026b4f0d010b20062802182104024002" - "400240200628020c22002006470d00200641144110200628021422001b6a280200" - "22050d01410021000c020b20062802082205200036020c200020053602080c010b" - "200641146a200641106a20001b21070340200721082005220041146a200041106a" - "200028021422051b210720004114411020051b6a28020022050d000b2008410036" - "02000b2004450d030240200628021c41027441a8dcc080006a2205280200200646" - "0d0020044110411420042802102006461b6a20003602002000450d040c030b2005" - "200036020020000d02410041002802c4dfc08000417e200628021c77713602c4df" - "c080000c030b02400240024002400240024041002802c8dfc08000220020024f0d" - "00024041002802ccdfc08000220020024b0d0041002101200241af80046a220641" - "107640002200417f4622070d0720004110742205450d07410041002802d8dfc080" - "00410020064180807c7120071b22086a22003602d8dfc08000410041002802dcdf" - "c0800022012000200120004b1b3602dcdfc0800002400240024041002802d4dfc0" - "80002201450d0041a8ddc080002100034020002802002206200028020422076a20" - "05460d02200028020822000d000c030b0b0240024041002802e4dfc08000220045" - "0d00200020054d0d010b410020053602e4dfc080000b410041ff1f3602e8dfc080" - "00410020083602acddc08000410020053602a8ddc08000410041b8ddc080003602" - "c4ddc08000410041c0ddc080003602ccddc08000410041b8ddc080003602c0ddc0" - "8000410041c8ddc080003602d4ddc08000410041c0ddc080003602c8ddc0800041" - "0041d0ddc080003602dcddc08000410041c8ddc080003602d0ddc08000410041d8" - "ddc080003602e4ddc08000410041d0ddc080003602d8ddc08000410041e0ddc080" - "003602ecddc08000410041d8ddc080003602e0ddc08000410041e8ddc080003602" - "f4ddc08000410041e0ddc080003602e8ddc08000410041f0ddc080003602fcddc0" - "8000410041e8ddc080003602f0ddc08000410041003602b4ddc08000410041f8dd" - "c08000360284dec08000410041f0ddc080003602f8ddc08000410041f8ddc08000" - "360280dec0800041004180dec0800036028cdec0800041004180dec08000360288" - "dec0800041004188dec08000360294dec0800041004188dec08000360290dec080" - "0041004190dec0800036029cdec0800041004190dec08000360298dec080004100" - "4198dec080003602a4dec0800041004198dec080003602a0dec08000410041a0de" - "c080003602acdec08000410041a0dec080003602a8dec08000410041a8dec08000" - "3602b4dec08000410041a8dec080003602b0dec08000410041b0dec080003602bc" - "dec08000410041b0dec080003602b8dec08000410041b8dec080003602c4dec080" - "00410041c0dec080003602ccdec08000410041b8dec080003602c0dec080004100" - "41c8dec080003602d4dec08000410041c0dec080003602c8dec08000410041d0de" - "c080003602dcdec08000410041c8dec080003602d0dec08000410041d8dec08000" - "3602e4dec08000410041d0dec080003602d8dec08000410041e0dec080003602ec" - "dec08000410041d8dec080003602e0dec08000410041e8dec080003602f4dec080" - "00410041e0dec080003602e8dec08000410041f0dec080003602fcdec080004100" - "41e8dec080003602f0dec08000410041f8dec08000360284dfc08000410041f0de" - "c080003602f8dec0800041004180dfc0800036028cdfc08000410041f8dec08000" - "360280dfc0800041004188dfc08000360294dfc0800041004180dfc08000360288" - "dfc0800041004190dfc0800036029cdfc0800041004188dfc08000360290dfc080" - "0041004198dfc080003602a4dfc0800041004190dfc08000360298dfc080004100" - "41a0dfc080003602acdfc0800041004198dfc080003602a0dfc08000410041a8df" - "c080003602b4dfc08000410041a0dfc080003602a8dfc08000410041b0dfc08000" - "3602bcdfc08000410041a8dfc080003602b0dfc08000410020053602d4dfc08000" - "410041b0dfc080003602b8dfc080004100200841586a22003602ccdfc080002005" - "2000410172360204200520006a4128360204410041808080013602e0dfc080000c" - "080b200120054f0d00200620014b0d00200028020c450d030b410041002802e4df" - "c080002200200520002005491b3602e4dfc08000200520086a210641a8ddc08000" - "21000240024002400340200028020022072006460d01200028020822000d000c02" - "0b0b200028020c450d010b41a8ddc0800021000240034002402000280200220620" - "014b0d002001200620002802046a2206490d020b200028020821000c000b0b4100" - "20053602d4dfc080004100200841586a22003602ccdfc080002005200041017236" - "0204200520006a4128360204410041808080013602e0dfc080002001200641606a" - "41787141786a22002000200141106a491b2207411b36020441002902a8ddc08000" - "2109200741106a41002902b0ddc0800037020020072009370208410020083602ac" - "ddc08000410020053602a8ddc080004100200741086a3602b0ddc0800041004100" - "3602b4ddc080002007411c6a2100034020004107360200200041046a2200200649" - "0d000b20072001460d0720072007280204417e713602042001200720016b220041" - "01723602042007200036020002402000418002490d002001200010e3808080000c" - "080b200041f8017141b8ddc080006a21060240024041002802c0dfc08000220541" - "012000410376742200710d00410020052000723602c0dfc08000200621000c010b" - "200628020821000b200620013602082000200136020c2001200636020c20012000" - "3602080c070b200020053602002000200028020420086a36020420052002410372" - "3602042007410f6a41787141786a2201200520026a22006b2102200141002802d4" - "dfc08000460d03200141002802d0dfc08000460d04024020012802042206410371" - "4101470d0020012006417871220610a880808000200620026a2102200120066a22" - "0128020421060b20012006417e7136020420002002410172360204200020026a20" - "0236020002402002418002490d002000200210e3808080000c060b200241f80171" - "41b8ddc080006a21010240024041002802c0dfc080002206410120024103767422" - "02710d00410020062002723602c0dfc08000200121020c010b200128020821020b" - "200120003602082002200036020c2000200136020c200020023602080c050b4100" - "200020026b22013602ccdfc08000410041002802d4dfc08000220020026a220636" - "02d4dfc080002006200141017236020420002002410372360204200041086a2101" - "0c060b41002802d0dfc08000210102400240200020026b2206410f4b0d00410041" - "003602d0dfc08000410041003602c8dfc080002001200041037236020420012000" - "6a220020002802044101723602040c010b410020063602c8dfc080004100200120" - "026a22053602d0dfc0800020052006410172360204200120006a20063602002001" - "20024103723602040b200141086a0f0b2000200720086a360204410041002802d4" - "dfc080002200410f6a417871220141786a22063602d4dfc080004100200020016b" - "41002802ccdfc0800020086a22016a41086a22053602ccdfc08000200620054101" - "72360204200020016a4128360204410041808080013602e0dfc080000c030b4100" - "20003602d4dfc08000410041002802ccdfc0800020026a22023602ccdfc0800020" - "0020024101723602040c010b410020003602d0dfc08000410041002802c8dfc080" - "0020026a22023602c8dfc0800020002002410172360204200020026a2002360200" - "0b200541086a0f0b4100210141002802ccdfc08000220020024d0d004100200020" - "026b22013602ccdfc08000410041002802d4dfc08000220020026a22063602d4df" - "c080002006200141017236020420002002410372360204200041086a0f0b20010f" - "0b20002004360218024020062802102205450d0020002005360210200520003602" - "180b20062802142205450d0020002005360214200520003602180b024002402001" - "4110490d0020062002410372360204200620026a22002001410172360204200020" - "016a200136020002402001418002490d002000200110e3808080000c020b200141" - "f8017141b8ddc080006a21020240024041002802c0dfc080002205410120014103" - "76742201710d00410020052001723602c0dfc08000200221010c010b2002280208" - "21010b200220003602082001200036020c2000200236020c200020013602080c01" - "0b2006200120026a2200410372360204200620006a220020002802044101723602" - "040b200641086a0b1000024020000d0010a3808080000b000b140002402001450d" - "00200020011082808080000b0ba20b03087f017e017f2380808080004190016b22" - "04248080808000200441e8006a20002001109d8080800002400240024002400240" - "024002400240024002400240024020042d00684106460d00200441106a200441e8" - "006a41106a2205290300370300200441086a200441e8006a41086a220629030037" - "030020042004290368370300200441e8006a20022003109d8080800020042d0068" - "4106460d01200441186a41106a2005290300370300200441186a41086a20062903" - "003703002004200429036837031841dc81c0800041072004109e80808000220745" - "0d0241dc81c080004107200441186a109e808080002208450d03418482c0800041" - "04200441186a109e808080002206450d0420062d00004103462205450d05410021" - "092006280208410020051b210502400240200628020c220a0e020c00010b410121" - "0920052d000041556a0e030b080b080b20052d0000412b470d06200541016a2105" - "200a410a492106200a417f6a2209210a20060d070c080b2004200428026c36024c" - "41b880c08000412b200441cc006a41e480c0800041bc81c08000109f8080800000" - "0b2004200428026c36024c41b880c08000412b200441cc006a41e480c0800041cc" - "81c08000109f80808000000b41e481c0800010a080808000000b41f481c0800010" - "a080808000000b418882c0800010a080808000000b419882c0800010a080808000" - "000b200a2109200a41094f0d010b41002106034020052d000041506a220a41094b" - "0d02200541016a2105200a2006410a6c6a21062009417f6a22090d000c040b0b41" - "0021060340200a450d0320052d000041506a220b41094b0d01410221092006ad42" - "0a7e220c422088a74100470d02200541016a2105200a417f6a210a200b200ca722" - "0d6a2206200d4f0d000c020b0b410121090b200420093a006841b880c08000412b" - "200441e8006a41a880c0800041a882c08000109f80808000000b20042006360230" - "02400240200720081094808080000d00200441003a00370c010b20042006417f6a" - "220536023002402005450d00200441003a00370c010b200441013a00370b200441" - "0336026c200441d482c08000360268200442023702742004418180808000360258" - "20044182808080003602502004200441cc006a3602702004200441306a36025420" - "04200441376a36024c200441e8006a10a28080800041002d00e0dbc080001a0240" - "02400240024041091099808080002205450d00200520042d00373a000020044100" - "360254200442808080801037024c200441033a0088012004412036027820044100" - "360284012004418080c08000360280012004410036027020044100360268200420" - "0441cc006a36027c20043502304101200441e8006a1084808080000d0120044138" - "6a41086a200441cc006a41086a2802003602002004200429024c37033841002d00" - "e0dbc080001a200428023c210641041099808080002209450d0220092006360000" - "2005200636000120042004280240220a36024841002d00e0dbc080001a20044104" - "3602444104109980808000220b450d032005200a360005200b200a360000200441" - "05360250200441a083c0800036024c200442043702582004418180808000360284" - "01200441818080800036027c200441838080800036027420044184808080003602" - "6c200420063602642004200441e8006a3602542004200441c8006a360280012004" - "200441c4006a3602782004200441e4006a3602702004200441386a360268200441" - "cc006a10a280808000200b41041082808080002009410410828080800020044118" - "6a108a808080002004108a8080800002402003450d00200220031082808080000b" - "02402001450d00200020011082808080000b20044190016a24808080800020050f" - "0b41014109109a80808000000b41c0a5c080004137200441e4006a419880c08000" - "41c4a6c08000109f80808000000b41014104109a80808000000b41014104109a80" - "808000000bea0301057f23808080800041e0006b22032480808080002003410036" - "0228200320023602242003200136022020034180013a002c2003410036021c2003" - "428080808010370214200341c8006a200341146a10e88080800002400240024002" - "4020032d00484106460d00200341306a41106a2204200341c8006a41106a290300" - "370300200341306a41086a2205200341c8006a41086a2903003703002003200329" - "03483703300240024020032802282202200328022422064f0d0020032802202107" - "0340200720026a2d000041776a220141174b0d024101200174419380800471450d" - "022006200241016a2202470d000b200320063602280b2000200329033037030020" - "0041106a2004290300370300200041086a20052903003703002003280214220245" - "0d04200328021820021082808080000c040b20032002360228200341086a200720" - "062006200241016a220220062002491b10c78080800041002d00e0dbc080001a20" - "0328020c21012003280208210641141099808080002202450d012002200636020c" - "2002411636020020002002360204200041063a000020022001360210200341306a" - "108a808080000c020b2000200328024c360204200041063a00000c010b000b2003" - "2802142202450d00200328021820021082808080000b200341e0006a2480808080" - "000be60101077f41002103024020022d00004105470d0020022802042204450d00" - "2002280208210503402004418c026a210220042f0192032206410c6c2107417f21" - "08024002400340024020070d00200621080c020b20022802082103200228020421" - "09200841016a2108200741746a21072002410c6a2102417f200020092001200320" - "012003491b10f7808080002209200120036b20091b220341004720034100481b22" - "034101460d000b200341ff0171450d010b024020050d0041000f0b2005417f6a21" - "05200420084102746a4198036a28020021040c010b0b2004200841186c6a21030b" - "20030b8f0101017f23808080800041c0006b22052480808080002005200136020c" - "2005200036020820052003360214200520023602102005410236021c200541e486" - "c08000360218200542023702242005418580808000ad422086200541106aad8437" - "03382005418680808000ad422086200541086aad843703302005200541306a3602" - "20200541186a200410a480808000000b130041ec84c08000412b200010a6808080" - "00000b11002000350200410120011084808080000bbe0604017f017e037f017e23" - "808080800041c0006b22012480808080002001410636020c200141b0c2c0800036" - "0208024041002d0090dcc080004103460d0010db808080000b0240024002400240" - "024041002903f8dfc0800022024200520d0002404100280280e0c0800022030d00" - "10d5808080004100280280e0c0800021030b20032003280200220441016a360200" - "2004417f4c0d012003450d02200320032802002204417f6a360200200329030821" - "0220044101470d00200310d6808080000b024002400240200241002903e8dbc080" - "00510d0041002d00f4dbc08000210441012103410041013a00f4dbc08000200120" - "043a00182004450d012001420037023420014281808080c00037022c200141d8c3" - "c08000360228200141186a200141286a10d780808000000b024041002802f0dbc0" - "80002203417f460d00200341016a21030c020b41b8c4c08000412641fcc4c08000" - "10b780808000000b410020023703e8dbc080000b410020033602f0dbc080002001" - "41e8dbc0800036021041042103200141043a00182001200141106a360220200141" - "186a41dcb7c08000200010b280808000210020012d001821040240024020000d00" - "420021024117200441ff0171764101710d01200128021c22032802002100024020" - "0341046a28020022042802002205450d002000200511828080800080808080000b" - "024020042802042204450d00200020041082808080000b2003410c108280808000" - "410421030c010b200441ff01714104460d032001290318220642807e8321022006" - "a721030b200128021022002000280208417f6a2204360208024020040d00200041" - "003a000c200042003703000b200341ff01714104470d03200141c0006a24808080" - "80000f0b000b419cb9c0800041de004190bac0800010b780808000000b20014100" - "3602382001410136022c200141a0c3c0800036022820014204370230200141286a" - "41a8c3c0800010a480808000000b200120022003ad42ff01838437031020014102" - "36022c20014190c2c08000360228200142023702342001418780808000ad422086" - "200141106aad843703202001418680808000ad422086200141086aad8437031820" - "01200141186a360230200141286a41a0c2c0800010a480808000000b4701017f23" - "808080800041206b2200248080808000200041003602182000410136020c200041" - "8484c0800036020820004204370210200041086a41a084c0800010a48080800000" - "0b5601017f23808080800041206b2202248080808000200241106a200041106a29" - "0200370300200241086a200041086a290200370300200241013b011c2002200136" - "021820022000290200370300200210ab80808000000bbe0601057f200041786a22" - "012000417c6a280200220241787122006a21030240024020024101710d00200241" - "0271450d012001280200220220006a21000240200120026b220141002802d0dfc0" - "8000470d0020032802044103714103470d01410020003602c8dfc0800020032003" - "280204417e7136020420012000410172360204200320003602000f0b2001200210" - "a8808080000b024002400240024002400240200328020422024102710d00200341" - "002802d4dfc08000460d02200341002802d0dfc08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a200036020020" - "0141002802d0dfc08000470d01410020003602c8dfc080000f0b20032002417e71" - "36020420012000410172360204200120006a20003602000b2000418002490d0220" - "01200010e38080800041002101410041002802e8dfc08000417f6a22003602e8df" - "c0800020000d04024041002802b0ddc080002200450d0041002101034020014101" - "6a2101200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602e8dfc0" - "80000f0b410020013602d4dfc08000410041002802ccdfc0800020006a22003602" - "ccdfc08000200120004101723602040240200141002802d0dfc08000470d004100" - "41003602c8dfc08000410041003602d0dfc080000b200041002802e0dfc0800022" - "044d0d0341002802d4dfc080002200450d034100210241002802ccdfc080002205" - "4129490d0241a8ddc080002101034002402001280200220320004b0d0020002003" - "20012802046a490d040b200128020821010c000b0b410020013602d0dfc0800041" - "0041002802c8dfc0800020006a22003602c8dfc080002001200041017236020420" - "0120006a20003602000f0b200041f8017141b8ddc080006a210302400240410028" - "02c0dfc08000220241012000410376742200710d00410020022000723602c0dfc0" - "8000200321000c010b200328020821000b200320013602082000200136020c2001" - "200336020c200120003602080f0b024041002802b0ddc080002201450d00410021" - "020340200241016a2102200128020822010d000b0b4100200241ff1f200241ff1f" - "4b1b3602e8dfc08000200520044d0d004100417f3602e0dfc080000b0b4d01017f" - "23808080800041206b220324808080800020034100360210200341013602042003" - "42043702082003200136021c200320003602182003200341186a36020020032002" - "10a480808000000b840601057f0240024002402000417c6a220328020022044178" - "71220541044108200441037122061b20016a490d0002402006450d002005200141" - "276a4b0d020b41102002410b6a4178712002410b491b210102400240024020060d" - "002001418002490d0120052001410472490d01200520016b418180084f0d010c02" - "0b200041786a220720056a21060240024002400240200520014f0d002006410028" - "02d4dfc08000460d03200641002802d0dfc08000460d0220062802042204410271" - "0d042004417871220420056a22052001490d042006200410a88080800020052001" - "6b22024110490d0120032001200328020041017172410272360200200720016a22" - "012002410372360204200720056a220520052802044101723602042001200210a9" - "8080800020000f0b200520016b2202410f4d0d0420032001200441017172410272" - "360200200720016a22052002410372360204200620062802044101723602042005" - "200210a98080800020000f0b200320052003280200410171724102723602002007" - "20056a2202200228020441017236020420000f0b41002802c8dfc0800020056a22" - "052001490d0102400240200520016b2202410f4b0d002003200441017120057241" - "0272360200200720056a2202200228020441017236020441002102410021010c01" - "0b20032001200441017172410272360200200720016a2201200241017236020420" - "0720056a2205200236020020052005280204417e713602040b410020013602d0df" - "c08000410020023602c8dfc0800020000f0b41002802ccdfc0800020056a220520" - "014b0d040b0240200210998080800022050d0041000f0b20052000417c41782003" - "28020022014103711b20014178716a2201200220012002491b10fa808080002102" - "200010a580808000200221000b20000f0b419db8c08000412e41ccb8c0800010a6" - "80808000000b41dcb8c08000412e418cb9c0800010a680808000000b2003200120" - "0441017172410272360200200720016a2202200520016b22054101723602044100" - "20053602ccdfc08000410020023602d4dfc0800020000b820301047f200028020c" + "109780808000200028020821030b200028020420036a2001200210d6808080001a" + "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" + "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" + "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" + "200136020820002002410120021b36020420002002453602000b800601057f0240" + "024002402000417c6a22032802002204417871220541044108200441037122061b" + "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" + "712002410b491b210102400240024020060d002001418002490d01200520014104" + "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" + "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" + "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" + "01490d042006200410a780808000200520016b22024110490d0120032001200328" + "020041017172410272360200200720016a22012002410372360204200720056a22" + "0520052802044101723602042001200210a88080800020000f0b200520016b2202" + "410f4d0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210a88080800020000f0b200320" + "05200328020041017172410272360200200720056a220220022802044101723602" + "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" + "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" + "020441017236020441002102410021010c010b2003200120044101717241027236" + "0200200720016a22012002410172360204200720056a2205200236020020052005" + "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" + "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" + "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" + "2201200220012002491b10d6808080002102200010a580808000200221000b2000" + "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" + "0010a680808000000b20032001200441017172410272360200200720016a220220" + "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" + "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" + "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" + "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" + "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" + "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" + "00411920044101766b2004411f461b742107410021060340024020052205280204" + "41787122082002490d00200820026b220820014f0d00200821012005210620080d" + "004100210120052106200521000c040b200528021422082000200820052007411d" + "764104716a41106a2802002205471b200020081b2100200741017421072005450d" + "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" + "491b22024103762201762200410371450d00024002402000417f7341017120016a" + "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" + "2206460d002006200136020c200120063602080c010b41002005417e2007777136" + "0298a2c080000b20022000410372360204200220006a2200200028020441017236" + "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" + "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" + "020441787120026b21012006210503400240200628021022000d00200628021422" + "000d0020052802182104024002400240200528020c22002005470d002005411441" + "10200528021422001b6a28020022060d01410021000c020b200528020822062000" + "36020c200020063602080c010b200541146a200541106a20001b21070340200721" + "082006220041146a200041106a200028021422061b210720004114411020061b6a" + "28020022060d000b200841003602000b2004450d040240200528021c4102744180" + "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" + "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" + "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" + "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" + "0020017441022001742200410020006b727168220841037422014190a0c080006a" + "220620014198a0c080006a28020022002802082207460d002007200636020c2006" + "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" + "360204200020026a2207200120026b2206410172360204200020016a2006360200" + "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" + "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" + "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" + "0120023602082005200236020c2002200136020c200220053602080b4100200736" + "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" + "20052802102206450d0020002006360210200620003602180b2005280214220645" + "0d0020002006360214200620003602180b02400240024020014110490d00200520" + "02410372360204200520026a22022001410172360204200220016a200136020041" + "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" + "c080002100024002404100280298a2c08000220841012007410376742207710d00" + "41002008200772360298a2c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200520012002" + "6a2200410372360204200520006a220020002802044101723602040c010b410020" + "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" + "720d004100210641022004742200410020006b722003712200450d032000684102" + "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" + "71220520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b2106200120082007" + "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" + "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" + "002006470d00200641144110200628021422001b6a28020022050d01410021000c" + "020b20062802082205200036020c200020053602080c010b200641146a20064110" + "6a20001b21070340200721082005220041146a200041106a200028021422051b21" + "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" + "40200628021c41027441809fc080006a22052802002006460d0020044110411420" + "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" + "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" + "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" + "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" + "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" + "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" + "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" + "a0c080002100034020002802002206200028020422076a2005460d022000280208" + "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" + "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" + "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" + "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" + "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" + "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" + "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" + "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" + "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" + "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" + "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" + "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" + "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" + "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" + "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" + "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" + "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" + "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" + "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" + "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" + "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" + "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" + "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" + "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" + "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" + "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" + "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" + "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" + "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" + "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" + "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" + "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" + "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" + "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" + "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" + "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" + "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" + "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" + "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" + "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" + "360204410041808080013602b8a2c080002001200641606a41787141786a220020" + "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" + "290288a0c080003702002007200937020841002008360284a0c080004100200536" + "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" + "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" + "0720072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010d0808080000c080b200041f8017141" + "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" + "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" + "0620013602082000200136020c2001200636020c200120003602080c070b200020" + "053602002000200028020420086a360204200520024103723602042007410f6a41" + "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" + "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" + "417871220610a780808000200620026a2102200120066a220128020421060b2001" + "2006417e7136020420002002410172360204200020026a20023602000240200241" + "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" + "024002404100280298a2c08000220641012002410376742202710d004100200620" + "0272360298a2c08000200121020c010b200128020821020b200120003602082002" + "200036020c2000200136020c200020023602080c050b4100200020026b22013602" + "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" + "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" + "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" + "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" + "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" + "800020052006410172360204200120006a2006360200200120024103723602040b" + "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" + "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" + "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" + "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" + "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" + "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" + "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" + "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" + "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" + "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" + "4020062802102205450d0020002005360210200520003602180b20062802142205" + "450d0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a20013602000240" + "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" + "6a2102024002404100280298a2c08000220541012001410376742201710d004100" + "2005200172360298a2c08000200221010c010b200228020821010b200220003602" + "082001200036020c2000200236020c200020013602080c010b2006200120026a22" + "00410372360204200620006a220020002802044101723602040b200641086a0be9" + "0101037f23808080800041206b2204248080808000024002400240200220036a22" + "0320024f0d00410021020c010b4100210220012802002205410174220620032006" + "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" + "0c010b2004200536021c20042001280204360214410121020b2004200236021820" + "0441086a2003200441146a109980808000024020042802080d00200428020c2102" + "200120033602002001200236020441818080807821020c010b2004280210210120" + "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" + "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" + "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" + "0041052000418680808000419082c0800041052002410c6a418780808000108f80" + "8080002100200241106a24808080800020000be00301097f23808080800041c000" + "6b2202248080808000200028020821032000280204210441012105200128021441" + "b083c080004101200128021828020c118080808000808080800021000240200345" + "0d0041002106034020062107410121062000410171210841012100024020080d00" + "02400240200128021c22084104710d002007410171450d01410121002001280214" + "41e784c080004102200128021828020c1180808080008080808000450d010c020b" + "200128021821092001280214210a024020074101710d0041012100200a41888bc0" + "80004101200928020c11808080800080808080000d020b200241013a001b200220" + "093602102002200a36020c20022008360238200241c884c0800036023420022001" + "2d00203a003c2002200128021036022c2002200129020837022420022001290200" + "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" + "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" + "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" + "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" + "4101200128021828020c118080808000808080800021050b200241c0006a248080" + "80800020050b4a01017f23808080800041106b2202248080808000200220003602" + "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" + "00200241106a24808080800020000b3d00200128021420002802002d0000410274" + "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" + "808080800080808080000be70101017f23808080800041106b2205248080808000" + "20002802142001410d200028021828020c11808080800080808080002101200541" + "003a000d200520013a000c20052000360208200541086a200241042003200410b6" + "80808000210320052d000d220120052d000c2204722100024020014101470d0020" + "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" + "004102200028021828020c118080808000808080800021000c010b200028021441" + "ee84c080004101200028021828020c118080808000808080800021000b20054110" + "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" + "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" + "02400240024002400240024002404107109b808080002201450d00200141036a41" + "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" + "800022022800042103200228000021042002410810878080800020014107108780" + "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" + "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" + "002202280004210520022800002106200241081087808080002001410710878080" + "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" + "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" + "2202280004210720022800002108200241081087808080002001410b1087808080" + "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" + "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" + "108380808000220928000421022009280000210a20094108108780808000200041" + "186a200a200210a48080800002400240024020002d00184101460d002000290320" + "210b02402002450d00200a20021087808080000b20014107108780808000410021" + "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" + "0000200141041082808080002202280000210c2002280004210a20024108108780" + "80800020014104108780808000024002400240200a4100480d000240200a0d0041" + "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" + "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" + "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" + "026b210f4100210103400240024002400240200220016a2d00002209c022104100" + "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" + "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" + "808080202111428080808010211202400240024002400240024002400240024002" + "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" + "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" + "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" + "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" + "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" + "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" + "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" + "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" + "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" + "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" + "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" + "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" + "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" + "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" + "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" + "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" + "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" + "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" + "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" + "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" + "41186a20142011a710a48080800020002d00184101460d01200029032021124100" + "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" + "201641076a41002800878cc08000360000201641002900808cc080003700002016" + "410b10828080800022012800002117200128000421132001410810878080800002" + "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" + "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" + "09201741016a210220134109490d024100210103402009450d0a20022d00004150" + "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" + "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" + "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" + "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" + "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" + "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" + "20090d040b410021010c050b201321092017210220134108490d020b4100210103" + "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" + "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" + "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" + "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" + "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" + "0b1087808080002004200310808080800020062005108080808000200820071080" + "80808000200c200a10808080800020004100360214200042808080801037020c20" + "0041033a003820004120360228200041003602342000418080c080003602302000" + "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" + "1086808080000d00200028020c2102200028021022092000280214108080808000" + "02402002450d00200920021087808080000b201510858080800020011085808080" + "0041002102024020032005470d0020042006200310d58080800045200b20125871" + "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" + "00200c200a1087808080000b02402007450d00200820071087808080000b024020" + "05450d00200620051087808080000b02402003450d00200420031087808080000b" + "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" + "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" + "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" + "80800041106b220324808080800002400240024002400240024002400240024002" + "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" + "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" + "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" + "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" + "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" + "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" + "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" + "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" + "0121010c010b20002005370308410021010b200020013a0000200341106a248080" + "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" + "030240024020024101710d002002410271450d012001280200220220006a210002" + "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" + "410020003602a0a2c0800020032003280204417e71360204200120004101723602" + "04200320003602000f0b2001200210a7808080000b024002400240024002400240" + "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" + "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" + "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" + "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" + "20003602000b2000418002490d022001200010d080808000410021014100410028" + "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" + "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" + "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" + "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" + "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" + "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" + "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b200128020821010c" + "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" + "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" + "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" + "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" + "0320013602082000200136020c2001200336020c200120003602080f0b02404100" + "280288a0c080002201450d00410021020340200241016a2102200128020822010d" + "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" + "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" + "02410036021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110aa80808000000b820301047f200028020c" "21020240024002402001418002490d002000280218210302400240024020022000" "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" "002802082201200236020c200220013602080c010b200041146a200041106a2002" "1b21040340200421052001220241146a200241106a200228021422011b21042002" "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441a8dcc080006a22012802002000460d0020034110411420032802" + "28021c41027441809fc080006a22012802002000460d0020034110411420032802" "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "002802c4dfc08000417e200028021c77713602c4dfc080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b410041002802c0dfc0" - "8000417e200141037677713602c0dfc080000f0b20022003360218024020002802" + "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" + "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" "102201450d0020022001360210200120023602180b20002802142201450d002002" "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802d0dfc08000470d0020022802044103714103470d014100" - "20013602c8dfc0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a8808080000b02400240024002402002280204" - "22034102710d00200241002802d4dfc08000460d02200241002802d0dfc0800046" - "0d0320022003417871220310a8808080002000200320016a220141017236020420" - "0020016a2001360200200041002802d0dfc08000470d01410020013602c8dfc080" + "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" + "20013602a0a2c0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a7808080000b02400240024002402002280204" + "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" + "0d0320022003417871220310a7808080002000200320016a220141017236020420" + "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110e3808080000f0b200141f8017141b8ddc0" - "80006a21020240024041002802c0dfc08000220341012001410376742201710d00" - "410020032001723602c0dfc08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602d4" - "dfc08000410041002802ccdfc0800020016a22013602ccdfc08000200020014101" - "72360204200041002802d0dfc08000470d01410041003602c8dfc0800041004100" - "3602d0dfc080000f0b410020003602d0dfc08000410041002802c8dfc080002001" - "6a22013602c8dfc0800020002001410172360204200020016a20013602000f0b0b" - "7902017f017e23808080800041306b220324808080800020032001360204200320" - "003602002003410236020c200341cc85c080003602082003420237021420034181" - "80808000ad42208622042003ad8437032820032004200341046aad843703202003" - "200341206a360210200341086a200210a480808000000b5d01027f238080808000" - "41206b220124808080800020002802182102200141106a200041106a2902003703" - "00200141086a200041086a2902003703002001200036021c200120023602182001" - "2000290200370300200110e480808000000b490002402002418080c400460d0020" - "00200220012802101181808080008080808000450d0041010f0b024020030d0041" - "000f0b200020032004200128020c11808080800080808080000b7902017f017e23" - "808080800041306b22032480808080002003200036020020032001360204200341" - "0236020c200341bc8ac08000360208200342023702142003418180808000ad4220" - "862204200341046aad84370328200320042003ad843703202003200341206a3602" - "10200341086a200210a480808000000b820302017f017e23808080800041f0006b" - "2203248080808000200341ccb7c0800036020c20032000360208200341ccb7c080" - "00360214200320013602102003410236021c200341dc85c0800036021802402002" - "2802000d002003410336025c2003419086c0800036025820034203370264200341" - "8580808000ad4220862204200341106aad8437034820032004200341086aad8437" - "03402003418680808000ad422086200341186aad843703382003200341386a3602" - "60200341d8006a4184c4c0800010a480808000000b200341206a41106a20024110" - "6a290200370300200341206a41086a200241086a29020037030020032002290200" - "3703202003410436025c200341c486c08000360258200342043702642003418580" - "808000ad4220862204200341106aad8437035020032004200341086aad84370348" - "2003418880808000ad422086200341206aad843703402003418680808000ad4220" - "86200341186aad843703382003200341386a360260200341d8006a4184c4c08000" - "10a480808000000b1c0020002802002001200028020428020c1181808080008080" - "8080000b14002001200028020020002802041093808080000b1400200128021420" - "01280218200010b2808080000bbf05010a7f23808080800041306b220324808080" - "8000200341033a002c2003412036021c4100210420034100360228200320013602" - "2420032000360220200341003602142003410036020c0240024002400240024020" - "0228021022050d00200228020c2200450d01200228020821012000410374210620" - "00417f6a41ffffffff017141016a21042002280200210003400240200041046a28" - "02002207450d00200328022020002802002007200328022428020c118080808000" - "80808080000d040b20012802002003410c6a200128020411818080800080808080" - "000d03200141086a2101200041086a2100200641786a22060d000c020b0b200228" - "02142201450d00200141057421082001417f6a41ffffff3f7141016a2104200228" - "02082109200228020021004100210603400240200041046a2802002201450d0020" - "0328022020002802002001200328022428020c11808080800080808080000d030b" - "2003200520066a220141106a28020036021c20032001411c6a2d00003a002c2003" - "200141186a2802003602282001410c6a28020021074100210a4100210b02400240" - "0240200141086a2802000e03010002010b2007410374210c4100210b2009200c6a" - "220c2802040d01200c28020021070b4101210b0b200320073602102003200b3602" - "0c200141046a280200210702400240024020012802000e03010002010b20074103" - "74210b2009200b6a220b2802040d01200b28020021070b4101210a0b2003200736" - "02182003200a3602142009200141146a2802004103746a22012802002003410c6a" - "200128020411818080800080808080000d02200041086a21002008200641206a22" - "06470d000b0b200420022802044f0d012003280220200228020020044103746a22" - "012802002001280204200328022428020c1180808080008080808000450d010b41" - "0121010c010b410021010b200341306a24808080800020010bd70201057f238080" - "8080004180016b22022480808080000240024002400240200128021c2203411071" - "0d0020034120710d012000ad4101200110848080800021000c030b41ff00210303" - "402002200322046a22052000410f712203413072200341d7006a2003410a491b3a" - "00002004417f6a210320004110492106200041047621002006450d000c020b0b41" - "ff00210303402002200322046a22052000410f712203413072200341376a200341" - "0a491b3a00002004417f6a210320004110492106200041047621002006450d000b" - "02402004418101490d002004418001419887c08000108580808000000b20014101" - "41a887c0800041022005418101200441016a6b10868080800021000c010b024020" - "04418101490d002004418001419887c08000108580808000000b2001410141a887" - "c0800041022005418101200441016a6b10868080800021000b20024180016a2480" - "8080800020000b2200200128021441c284c08000410e200128021828020c118080" - "80800080808080000b6001017f23808080800041306b2200248080808000200041" - "0136020c200041e484c08000360208200042013702142000418980808000ad4220" - "862000412f6aad843703202000200041206a360210200041086a41e8c1c0800010" - "a480808000000b7902017f017e23808080800041306b2203248080808000200320" - "00360200200320013602042003410236020c200341f08ac0800036020820034202" - "3702142003418180808000ad4220862204200341046aad84370328200320042003" - "ad843703202003200341206a360210200341086a200210a480808000000b6a0101" - "7f23808080800041306b22032480808080002003200136020c2003200036020820" - "034101360214200341f0bac080003602102003420137021c2003418680808000ad" - "422086200341086aad843703282003200341286a360218200341106a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441809b" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41809bc080006a280200410b7420024b1b22042004410272220420044102744180" - "9bc080006a280200410b7420024b1b2204200441016a2204200441027441809bc0" - "80006a280200410b7420024b1b2204200441016a2204200441027441809bc08000" - "6a280200410b7420024b1b220441027441809bc080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441809bc080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441fc9ac080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241849cc080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641b284c080006a2d" - "00003a000b20032001410476410f7141b284c080006a2d00003a000f2003200141" - "0876410f7141b284c080006a2d00003a000e20032001410c76410f7141b284c080" - "006a2d00003a000d20032001411076410f7141b284c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141b284c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b2004412141e09ac0800010aa80808000000b200541d70541" - "f09ac0800010aa80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141c48fc08000412c419c90c0800041c40141" - "e091c0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141a295c08000412841f295c080" - "0041a002419298c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641b284c080006a2d00003a001720032001410476410f71" - "41b284c080006a2d00003a001b20032001410876410f7141b284c080006a2d0000" - "3a001a20032001410c76410f7141b284c080006a2d00003a001920032001411076" - "410f7141b284c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141b284c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41b48fc0800010b680808000000b200c200441b48fc0800010ad" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41a48fc080" - "0010a080808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641808dc0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541888ec080003602302005420537023c20054186" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418a80808000ad422086200541286aad843703582005418b80808000ad42" - "2086200541246aad843703502005418180808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541c88ec080003602302005420337023c2005" - "418680808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418180808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541a88dc080003602302005420437023c2005418680" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418180808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "200641f48ec0800010b680808000000b200410a080808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b3808080" - "000d00200128021441b084c080004102200128021828020c118080808000808080" - "80000d002000280204200110b38080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111818080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111818080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11808080800080808080000d010b2004412720011181808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f7620011084808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10f9808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10f9808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410f9808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00e0dbc080001a200128020022032f01920321040240024002" - "400240024041c8031099808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10fa8080" - "80001a20052003200b41186c6a200841186c10fa80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "fa80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810fa80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41a0a4c0800010ad80808000000b41e8a3c0800041284190a4c0800010a68080" - "8000000b2008410c41b0a4c0800010ad80808000000b41e8a3c0800041284190a4" - "c0800010a680808000000b900801017f23808080800041f0006b22022480808080" - "0020002802002100200241003602482002428080808010370240200241033a006c" - "2002412036025c2002410036026820024198a5c080003602642002410036025420" - "02410036024c2002200241c0006a36026002400240024002400240024002400240" - "024002400240024002400240024002400240024002400240024002400240024002" - "400240024020002802000e191718000102030405060708090a0b0c0d0e0f101112" - "13141516170b200241c0006a41d9a6c0800041181091808080000d190c180b2002" - "41c0006a41f1a6c08000411b1091808080000d180c170b200241c0006a418ca7c0" - "8000411a1091808080000d170c160b200241c0006a41a6a7c08000411910918080" - "80000d160c150b200241c0006a41bfa7c08000410c1091808080000d150c140b20" - "0241c0006a41cba7c0800041131091808080000d140c130b200241c0006a41dea7" - "c0800041131091808080000d130c120b200241c0006a41f1a7c08000410e109180" - "8080000d120c110b200241c0006a41ffa7c08000410e1091808080000d110c100b" - "200241c0006a418da8c08000410c1091808080000d100c0f0b200241c0006a4199" - "a8c08000410e1091808080000d0f0c0e0b200241c0006a41a7a8c08000410e1091" - "808080000d0e0c0d0b200241c0006a41b5a8c0800041131091808080000d0d0c0c" - "0b200241c0006a41c8a8c08000411a1091808080000d0c0c0b0b200241c0006a41" - "e2a8c08000413e1091808080000d0b0c0a0b200241c0006a41a0a9c08000411410" - "91808080000d0a0c090b200241c0006a41b4a9c0800041341091808080000d090c" - "080b200241c0006a41e8a9c08000412c1091808080000d080c070b200241c0006a" - "4194aac0800041241091808080000d070c060b200241c0006a41b8aac08000410e" - "1091808080000d060c050b200241c0006a41c6aac0800041131091808080000d05" - "0c040b200241c0006a41d9aac08000411c1091808080000d040c030b200241c000" - "6a41f5aac0800041181091808080000d030c020b200241c0006a20002802042000" - "280208109180808000450d010c020b200041046a200241cc006a10c3808080000d" - "010b200241306a41086a200241c0006a41086a2802003602002002200229024037" - "0330200241818080800036022c20024181808080003602242002418c8080800036" - "021c20024104360204200241a8abc080003602002002420337020c200220004110" - "6a36022820022000410c6a3602202002200241306a3602182002200241186a3602" - "0820012802142001280218200210b2808080002100024020022802302201450d00" - "200228023420011082808080000b200241f0006a24808080800020000f0b41c0a5" - "c080004137200241186a41b0a5c0800041c4a6c08000109f80808000000be50301" - "017f23808080800041c0006b220224808080800002400240024002400240024020" - "002d00000e0400010203000b2002200028020436020441002d00e0dbc080001a41" - "141099808080002200450d04200041106a410028009cc5c0800036000020004108" - "6a4100290094c5c080003700002000410029008cc5c08000370000200241143602" - "102002200036020c200241143602082002410336022c200241bcc1c08000360228" - "200242023702342002418d80808000ad422086200241046aad843703202002418e" - "80808000ad422086200241086aad843703182002200241186a3602302001280214" - "2001280218200241286a10b280808000210020022802082201450d03200228020c" - "20011082808080000c030b20002d000121002002410136022c200241f0bac08000" - "360228200242013702342002418680808000ad422086200241186aad8437030820" - "022000410274220041e0c5c080006a28020036021c200220004184c7c080006a28" - "02003602182002200241086a36023020012802142001280218200241286a10b280" - "80800021000c020b20012000280204220028020020002802041093808080002100" - "0c010b200028020422002802002001200028020428021011818080800080808080" - "0021000b200241c0006a24808080800020000f0b000bd507010d7f238080808000" - "41106b220224808080800020002802082103200028020421044101210502402001" - "2802142206412220012802182207280210220811818080800080808080000d0002" - "40024020030d0041002103410021000c010b410021094100210a2004210b200321" - "0c024002400340200b200c6a210d4100210002400340200b20006a220e2d000022" - "0141817f6a41ff017141a101490d0120014122460d01200141dc00460d01200c20" - "0041016a2200470d000b200a200c6a210a0c030b02400240200e2c00002201417f" - "4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71210b2001" - "411f71210c02402001415f4b0d00200c410674200b722101200e41026a210b0c01" - "0b200b410674200e2d0002413f7172210b0240200141704f0d00200b200c410c74" - "722101200e41036a210b0c010b200b410674200e2d0003413f7172200c41127441" - "8080f00071722101200e41046a210b0b2000200a6a2100200241046a2001418180" - "0410b8808080000240024020022d0004418001460d0020022d000f20022d000e6b" - "41ff01714101460d0020002009490d0302402009450d000240200920034f0d0020" - "0420096a2c000041bf7f4a0d010c050b20092003470d040b02402000450d000240" - "200020034f0d00200420006a2c000041bf7f4c0d050c010b20002003470d040b20" - "06200420096a200020096b200728020c220e11808080800080808080000d010240" - "024020022d0004418001470d002006200228020820081181808080008080808000" - "450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b200e1180" - "8080800080808080000d020b0240024020014180014f0d004101210e0c010b0240" - "20014180104f0d004102210e0c010b41034104200141808004491b210e0b200e20" - "006a21090b0240024020014180014f0d00410121010c010b024020014180104f0d" - "00410221010c010b41034104200141808004491b21010b200120006a210a200d20" - "0b6b220c0d010c030b0b410121050c030b2004200320092000419089c0800010ba" - "80808000000b02402009200a4b0d004100210002402009450d000240200920034f" - "0d0020092100200420096a2c000041bf7f4c0d020c010b2003210020092003470d" - "010b0240200a0d00410021030c020b0240200a20034f0d00200021092004200a6a" - "2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b2004200320" - "09200a41a089c0800010ba80808000000b2006200420006a200320006b20072802" - "0c11808080800080808080000d0020064122200811818080800080808080002105" - "0b200241106a24808080800020050b870102017c017e0240024002402001280200" - "0e03000102000b20004202370308200020012b0308220239031020002002bd42ff" - "ffffffffffffffff00834280808080808080f8ff00534101743a00000f0b200042" - "00370308200041023a0000200020012903083703100f0b200041023a0000200020" - "01290308220337031020002003423f883703080be411020b7f027e238080808000" - "41c0016b2204248080808000024002400240024002400240024002400240024002" - "400240024020012802002205450d00200228020821062002280204210720012802" - "042108024003402005418c026a210920052f019203220a410c6c210b417f210c02" - "40024003400240200b0d00200a210c0c020b2009280208210d2009280204210e20" - "0c41016a210c200b41746a210b2009410c6a2109417f2007200e2006200d200620" - "0d491b10f780808000220e2006200d6b200e1b220d410047200d4100481b220d41" - "01460d000b200d41ff0171450d010b2008450d022008417f6a21082005200c4102" - "746a4198036a28020021050c010b0b20022802002209450d0c2007200910828080" - "80000c0c0b2002290204220fa721092002280200220b418080808078470d032009" - "21050c010b2002290204220fa721052002280200220d418080808078470d010b20" - "01210c0c090b41002d00e0dbc080001a4198031099808080002209450d02200941" - "013b01920320094100360288022009200f422088a7ad4220862005ad8437039002" - "2009200d36028c0220014280808080103702042001200936020020092003290300" - "370300200941086a200341086a290300370300200941106a200341106a29030037" - "03000c010b200f422088a7ad4220862009ad84210f024002400240024002402005" - "2f0192032209410b490d00200441086a21084104210d200c4105490d03200c210d" - "200c417b6a0e020302010b2005418c026a220e200c410c6c6a210d02400240200c" - "41016a220620094d0d00200d200f370204200d200b3602000c010b200e2006410c" - "6c6a200d2009200c6b220e410c6c10f9808080001a200d200f370204200d200b36" - "02002005200641186c6a2005200c41186c6a200e41186c10f9808080001a0b2005" - "200c41186c6a220d41106a200341106a290300370300200d200329030037030020" - "0d41086a200341086a2903003703002005200941016a3b0192030c030b200c4179" - "6a210c200441f8006a21084106210d0c010b4100210c200441f8006a2108410521" - "0d0b41002d00e0dbc080001a4198031099808080002209450d02200941003b0192" - "0320094100360288022009200d417f7320052f01920322076a22063b0192032004" - "4188016a41086a2005200d41186c6a220e41086a29030037030020044188016a41" - "106a200e41106a2903003703002004200e290300370388012006410c4f0d032007" - "200d41016a220e6b2006470d042005418c026a2202200d410c6c6a220729020421" - "10200728020021072009418c026a2002200e410c6c6a2006410c6c10fa80808000" - "1a20092005200e41186c6a200641186c10fa8080800021062005200d3b01920320" - "0441dc006a410c6a20044190016a290300370200200441f0006a20044198016a29" - "030037020020042004290388013702602004200536020820042006360278200828" - "0200220d418c026a200c410c6c6a210602400240200d2f019203220e200c4b0d00" - "2006200f3702042006200b3602000c010b2006410c6a2006200e200c6b2208410c" - "6c10f9808080001a2006200f3702042006200b360200200d200c41186c6a220b41" - "186a200b200841186c10f9808080001a0b200d200c41186c6a220b41106a200341" - "106a290300370300200b2003290300370300200b41086a200341086a2903003703" - "00200d200e41016a3b0192032007418080808078460d00200441c4006a200441dc" - "006a41086a290200370200200441cc006a200441dc006a41106a29020037020020" - "0441306a41246a200441dc006a41186a2802003602002004201037023420042007" - "3602302004200429025c37023c024002400240200528028802220b0d004100210c" - "0c010b200441306a4104722108200441b8016a210220044188016a410472210720" - "0441b0016a2103200441c0006a210e4100210c4100210603402006200c470d0820" - "052f019003210d200b2f019203410b490d02200641016a21060240024002400240" - "024002400240200d4105490d00200d417b6a0e020203010b200441043602800120" - "04200636027c2004200b3602782003210b0c040b20044106360280012004200636" - "027c2004200b360278200d41796a210d0c020b2004410536028001200420063602" - "7c2004200b36027820044188016a200441f8006a10c18080800020042802b00141" - "05200441306a200e200910c080808000200428028801210d200441086a20074124" - "10fa808080001a0c030b20044105360280012004200636027c2004200b36027841" - "00210d0b2002210b0b20044188016a200441f8006a10c180808000200b28020020" - "0d200441306a200e200910c080808000200428028801210d200441086a20074124" - "10fa808080001a0b20042802bc01210c20042802b801210920042802b401210620" - "042802b0012105200d418080808078460d032004200d3602302008200441086a41" - "2410fa808080001a200528028802220b0d000b0b2001280200220b450d0741002d" - "00e0dbc080001a2001280204210641c803109980808000220d450d03200d200b36" - "029803200d41003b019203200d410036028802200b41003b019003200b200d3602" - "88022001200641016a3602042001200d3602002006200c470d08200d2004290330" - "37028c02200d41013b019203200d2004290340370300200d200936029c03200d41" - "94026a200441306a41086a280200360200200d41086a200441c8006a2903003703" - "00200d41106a200441d0006a2903003703002009200d36028802200941013b0190" - "030c010b200b200d200441306a200e200910c0808080000b200120012802084101" - "6a3602080b200041063a00000c070b000b2006410b41a0a4c0800010ad80808000" - "000b41e8a3c0800041284190a4c0800010a680808000000b41c0a4c08000413541" - "f8a4c0800010a680808000000b41bca2c0800010a080808000000b41a7a3c08000" - "413041d8a3c0800010a680808000000b20002005200c41186c6a22092903003703" - "00200041106a200941106a220d290300370300200041086a200941086a220b2903" - "0037030020092003290300370300200b200341086a290300370300200d20034110" - "6a2903003703000b200441c0016a2480808080000be60301057f02400240024002" - "400240024020022003490d00410121044100210520034101480d04200120036a21" - "060240200341034b0d000340200620014d0d062006417f6a22062d0000410a470d" - "000c050b0b024041808284082006417c6a2800002207418a94a8d000736b200772" - "41808182847871418081828478460d000340200620014d0d062006417f6a22062d" - "0000410a470d000c050b0b200320064103716b210720034109490d010340024002" - "4020074108480d004180828408200120076a220641786a2802002208418a94a8d0" - "00736b20087241808182847871418081828478460d010b200120076a21060c040b" - "200741786a210741808284082006417c6a2802002208418a94a8d000736b200872" - "41808182847871418081828478460d000c030b0b2003200241b8adc0800010ad80" - "808000000b200120076a21060340200620014d0d032006417f6a22062d0000410a" - "470d000c020b0b0340200620014d0d022006417f6a22062d0000410a470d000b0b" - "200620016b41016a220520024b0d010b0240200120056a20014d0d004100210620" - "0521070340200620012d0000410a466a2106200141016a21012007417f6a22070d" - "000b200641016a21040b200020043602002000200320056b3602040f0b20052002" - "41c8adc0800010ad80808000000b9b0d02097f017e23808080800041306b220324" - "808080800002400240024002400240024002400240024003400240024020012802" - "08220420012802042205460d00024002400240200420054f0d0020012802002206" - "20046a2d000022074122460d01200741dc00460d0120074120490d012006200441" - "016a22086a21094100200520086b417871220a6b210703402009210b024020070d" - "002001200a20086a360208200110c9808080002001280204210520012802082107" - "0c040b200741086a2107200b41086a2109200b290000220c42a2c48891a2c48891" - "228542fffdfbf7efdfbfff7e7c200c42e0bffffefdfbf7ef5f7c84200c42dcb8f1" - "e2c58b97aedc008542fffdfbf7efdfbfff7e7c84200c427f858342808182848890" - "a0c0807f83220c500d000b2001200b20066b200c7aa74103766a22073602080c02" - "0b2004200541d8adc0800010aa808080000c080b200421070b20072005470d0120" - "0521040b200341086a20012802002004200410c78080800041002d00e0dbc08000" - "1a200328020c210b2003280208210941141099808080002207450d052007200936" - "020c2007410436020020002007360204200041023602002007200b3602100c0a0b" - "024020072005490d002007200541e8adc0800010aa80808000000b024020012802" - "00220b20076a2d0000220941dc00460d00024020094122470d002002280208450d" - "0520072004490d072002200b20046a200720046b10ca808080004101210b200120" - "0741016a360208200341286a20012002280204200228020810cb80808000200328" - "02282207450d032000200328022c3602080c040b2001200741016a220736020820" - "0341106a200b2005200710c78080800041002d00e0dbc080001a2003280214210b" - "2003280210210941141099808080002207450d052007200936020c200741103602" - "0020002007360204200041023602002007200b3602100c0a0b024020072004490d" - "002002200b20046a200720046b10ca808080002001200741016a22093602080240" - "20092005490d00200341206a200b2005200910c78080800041002d00e0dbc08000" - "1a2003280224210b2003280220210941141099808080002207450d062007410436" - "02000c090b2001200741026a220436020802400240024002400240024002400240" - "024002400240200b20096a2d0000220741ed004a0d000240200741e1004a0d0020" - "074122460d032007412f460d04200741dc00470d02024020022802082207200228" - "0200470d002002108f808080000b2002200741016a360208200228020420076a41" - "dc003a0000410021070c0b0b2007419e7f6a0e050401010105010b200741927f6a" - "0e080500000006000708000b200341186a200b2005200410c78080800041002d00" - "e0dbc080001a200328021c210b2003280218210941141099808080002207450d0e" - "2007410c3602000c110b0240200228020822072002280200470d002002108f8080" - "80000b2002200741016a360208200228020420076a41223a0000410021070c070b" - "0240200228020822072002280200470d002002108f808080000b2002200741016a" - "360208200228020420076a412f3a0000410021070c060b02402002280208220720" - "02280200470d002002108f808080000b2002200741016a36020820022802042007" - "6a41083a0000410021070c050b0240200228020822072002280200470d00200210" - "8f808080000b2002200741016a360208200228020420076a410c3a000041002107" - "0c040b0240200228020822072002280200470d002002108f808080000b20022007" - "41016a360208200228020420076a410a3a0000410021070c030b02402002280208" - "22072002280200470d002002108f808080000b2002200741016a36020820022802" - "0420076a410d3a0000410021070c020b0240200228020822072002280200470d00" - "2002108f808080000b2002200741016a360208200228020420076a41093a000041" - "0021070c010b2001200210cc8080800021070b2007450d010c090b0b2004200741" - "98aec0800010b680808000000b4102210b200328022c21070b2000200b36020020" - "0020073602040c060b20072004490d022001200741016a360208200341286a2001" - "200b20046a200720046b10cb808080000240024020032802282207450d00200020" - "0328022c3602084100210b0c010b4102210b200328022c21070b2000200b360200" - "200020073602040c050b000b2004200741f8adc0800010b680808000000b200420" - "074188aec0800010b680808000000b2007200936020c2007200b3602100b200041" - "02360200200020073602040b200341306a2480808080000b5301047f0240200028" - "02082201200028020422024f0d00200028020021030340200320016a2d00002204" - "4122460d01200441dc00460d0120044120490d012000200141016a220136020820" - "022001470d000b0b0b4901017f02402000280200200028020822036b20024f0d00" - "200020032002109080808000200028020821030b200028020420036a2001200210" - "fa808080001a2000200320026a3602080bb10501077f23808080800041106b2204" - "24808080800002402003450d004100200341796a2205200520034b1b2106200241" - "036a417c7120026b21074100210503400240024002400240200220056a2d000022" - "08c022094100480d00200720056b4103710d01200520064f0d020340200220056a" - "2208280204200828020072418081828478710d03200541086a22052006490d000c" - "030b0b0240024002400240024002400240200841808bc080006a2d0000417e6a0e" - "03000102050b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c" - "050b200541016a220a20034f0d032002200a6a2c0000210a02400240200841e001" - "460d00200841ed01460d012009411f6a41ff0171410c490d032009417e71416e47" - "0d05200a4140480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d" - "030c020b200541016a220a20034f0d022002200a6a2c0000210a02400240024002" - "40200841907e6a0e050100000002000b2009410f6a41ff017141024b0d05200a41" - "40480d020c050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d03" - "0b200541026a220820034f0d02200220086a2c000041bf7f4a0d02200541036a22" - "0520034f0d02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b2005" - "41026a220520034f0d00200220056a2c000041bf7f4c0d010b200441086a200128" - "02002001280204200128020810c7808080004100210241002d00e0dbc080001a20" - "0428020c210520042802082108024041141099808080002203450d002003200836" - "020c2003410f360200200320053602100c060b000b200541016a21050c020b2005" - "41016a21050c010b200520034f0d000340200220056a2c00004100480d01200320" - "0541016a2205470d000c030b0b20052003490d000b0b2000200236020020002003" - "360204200441106a2480808080000be20601057f23808080800041206b22022480" - "80808000200241146a200010cd808080000240024020022f01140d000240024002" - "4002400240024020022f011622034180f803714180b803460d0020034180c8006a" - "41ffff03714180f803490d04200241146a200010ce8080800020022d00140d0620" - "022d0015210420002000280208220541016a360208200441dc00470d0320024114" - "6a200010ce8080800020022d00140d0620022d001521042000200541026a360208" - "200441f500470d02200241146a200010cd8080800020022f01140d0620022f0116" - "22044180c0006a41ffff03714180f803490d0120034180d0006a41ffff0371410a" - "7420044180c8006a41ffff0371722205418080046a210302402001280200200128" - "020822006b41034b0d00200120004104109080808000200128020821000b200120" - "0041046a360208200128020420006a2200200341127641f001723a000020004103" - "6a2004413f71418001723a000020002005410676413f71418001723a0002200020" - "03410c76413f71418001723a0001410021000c070b200220002802002000280204" - "200028020810c78080800041002d00e0dbc080001a200228020421012002280200" - "210341141099808080002200450d042000200336020c2000411436020020002001" - "3602100c060b200241086a20002802002000280204200028020810c78080800041" - "002d00e0dbc080001a200228020c21012002280208210341141099808080002200" - "450d032000200336020c20004114360200200020013602100c050b200241173602" - "142000200241146a10cf8080800021000c040b200241173602142000200241146a" - "10cf8080800021000c030b0240024002402003418001490d000240200128020020" - "0128020822046b41034b0d00200120044104109080808000200128020821040b20" - "0128020420046a210020034180104f0d0120034106764140722106410221050c02" - "0b0240200128020822002001280200470d002001108f808080000b200120004101" - "6a360208200128020420006a20033a0000410021000c040b20002003410676413f" - "71418001723a00012003410c764160722106410321050b200020063a0000200120" - "0420056a360208200020056a417f6a2003413f71418001723a0000410021000c02" - "0b000b200228021821000b200241206a24808080800020000b910301057f238080" - "80800041106b220224808080800002400240024002402001280204220320012802" - "082204490d000240200320046b41034b0d0020012003360208200241086a200128" - "02002003200310c78080800041002d00e0dbc080001a200228020c210320022802" - "08210441141099808080002201450d022001200436020c20014104360200200020" - "01360204200120033602100c030b2001200441046a220536020802402001280200" - "220620046a22012d000141017441b8aec080006a2f010020012d000041017441b8" - "b2c080006a2f010072c141087420012d000241017441b8b2c080006a2e01007220" - "012d000341017441b8aec080006a2e0100722201417f4a0d002002200620032005" - "10c78080800041002d00e0dbc080001a2002280204210320022802002104411410" - "99808080002201450d022001200436020c2001410c360200200020013602042001" - "20033602100c030b200020013b0102410021010c030b2004200341a8aec0800010" - "85808080000b000b410121010b200020013b0100200241106a2480808080000bb2" - "0101037f23808080800041106b2202248080808000024002400240200128020822" - "0320012802042204490d00200241086a20012802002004200310c7808080004100" - "2d00e0dbc080001a200228020c2103200228020821044114109980808000220145" - "0d022001200436020c200141043602002000200136020420012003360210410121" - "010c010b2000200128020020036a2d00003a0001410021010b200020013a000020" - "0241106a2480808080000f0b000b8c0101037f23808080800041106b2202248080" - "808000200241086a20002802002000280204200028020810c78080800041002d00" - "e0dbc080001a200228020c2103200228020821040240411410998080800022000d" - "00000b2000200436020c2000200129020037020020002003360210200041086a20" - "0141086a280200360200200241106a24808080800020000b1f0002402001280204" - "0e020000000b200041b8b6c08000200110b2808080000b820101017f0240024002" - "4002402003280204450d000240200328020822040d002002450d0341002d00e0db" - "c080001a0c020b20032802002004200210a78080800021030c030b2002450d0141" - "002d00e0dbc080001a0b200210998080800021030c010b200121030b2000200236" - "020820002003200120031b36020420002003453602000b9f0202047f017e238080" - "80800041206b2206248080808000024002400240200220036a220320024f0d0041" - "0021020c010b41002102200420056a417f6a410020046b71ad4108410420054101" - "461b22072001280200220841017422092003200920034b1b2203200720034b1b22" - "07ad7e220a422088a70d00200aa7220941808080807820046b4b0d010240024020" - "080d00410021020c010b2006200820056c36021c20062001280204360214200421" - "020b20062002360218200641086a20042009200641146a10d18080800002402006" - "2802080d00200628020c2102200120073602002001200236020441818080807821" - "020c010b20062802102103200628020c21020c010b0b2000200336020420002002" - "360200200641206a2480808080000b5901017f23808080800041106b2201248080" - "808000200141086a2000200028020041014108411810d280808000024020012802" - "082200418180808078460d002000200128020c109a80808000000b200141106a24" - "80808080000b4701017f23808080800041206b2200248080808000200041003602" - "182000410136020c200041d8bac0800036020820004204370210200041086a41e0" - "bac0800010a480808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d00e0dbc080001a02400240024041201099808080002201450d" - "0020014102360210200142818080801037030041002903a0dcc080002102034020" - "02427f510d024100200242017c220341002903a0dcc08000220420042002512205" - "1b3703a0dcc08000200421022005450d000b410020033703f8dfc0800020012003" - "3703084100280280e0c08000450d02200041003602182000410136020c200041e0" - "b6c0800036020820004204370210200041086a41b8b7c0800010a4808080000b00" - "0b10d480808000000b41002001360280e0c08000200041206a2480808080000b5b" - "01027f024020002802104101470d002000280214220141003a0000200028021822" - "02450d00200120021082808080000b02402000417f460d00200020002802042201" - "417f6a36020420014101470d00200041201082808080000b0b3a01017f23808080" - "800041106b2202248080808000200241c8b7c0800036020c200220003602082002" - "41086a2002410c6a200110ae80808000000b3000024020002802002d00000d0020" - "01418589c0800041051093808080000f0b2001418a89c080004104109380808000" - "0b14002001200028020420002802081093808080000b7001037f20002802042101" - "0240024020002d0000220041044b0d0020004103470d010b200128020021000240" - "200141046a28020022022802002203450d00200020031182808080008080808000" - "0b024020022802042202450d00200020021082808080000b2001410c1082808080" - "000b0bf10101027f23808080800041206b22002480808080000240024002400240" - "41002d0090dcc080000e0400000301000b410041023a0090dcc0800041002d00e0" - "dbc080001a4180081099808080002201450d01410041033a0090dcc08000410020" - "01360280dcc08000410042808080808080013703f8dbc08000410042003703e8db" - "c08000410041003a0088dcc0800041004100360284dcc08000410041003a00f4db" - "c08000410041003602f0dbc080000b200041206a2480808080000f0b000b200041" - "003602182000410136020c200041d8c5c080003602082000420437021020004108" - "6a41a8c4c0800010a480808000000bb708010a7f23808080800041206b22042480" - "808080000240024002400240024020012802100d002001417f3602102003410020" - "03200241036a417c7120026b22056b41077120032005491b22066b210720032006" - "490d0102402006450d0002400240200220036a2208417f6a22092d0000410a470d" - "002006417f6a21060c010b200220076a220a2009460d0102402008417e6a22092d" - "0000410a470d002006417e6a21060c010b200a2009460d0102402008417d6a2209" - "2d0000410a470d002006417d6a21060c010b200a2009460d0102402008417c6a22" - "092d0000410a470d002006417c6a21060c010b200a2009460d0102402008417b6a" - "22092d0000410a470d002006417b6a21060c010b200a2009460d0102402008417a" - "6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240200841" - "796a22092d0000410a470d00200641796a21060c010b200a2009460d0120064178" - "7221060b200620076a41016a21060c040b20052003200320054b1b210b41002006" - "6b21082002417c6a210c2006417f7320026a210a02400340200a21052008210620" - "072209200b4d0d01200641786a2108200541786a210a4180828408200220094178" - "6a22076a280200220d418a94a8d000736b200d724180828408200c20096a280200" - "220d418a94a8d000736b200d727141808182847871418081828478460d000b0b20" - "0920034b0d0202400340200320066a450d012006417f6a2106200520036a210920" - "05417f6a210520092d0000410a470d000b200320066a41016a21060c040b024002" - "402001411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b0240" - "200128021420066b20034b0d002000200141146a2002200310dd808080000c050b" - "200128021820066a2002200310fa808080001a200041043a00002001411c6a2006" - "20036a3602000c040b10b580808000000b2007200341c889c08000108580808000" - "000b2009200341d889c0800010ad80808000000b0240200320064f0d0020044100" - "3602182004410136020c200441a8bbc0800036020820044204370210200441086a" - "41b0bbc0800010a480808000000b02402001411c6a2802002205450d0002400240" - "200128021420056b20064d0d00200141186a28020020056a2002200610fa808080" - "001a2001411c6a200520066a22053602000c010b200441086a200141146a200220" - "0610dd80808000024020042d00084104460d00200020042903083702000c030b20" - "01411c6a28020021050b2005450d00200141003a00202001411c6a41003602000b" - "200220066a210502402001280214200320066b22064b0d002000200141146a2005" - "200610dd808080000c010b200141186a2802002005200610fa808080001a200041" - "043a00002001411c6a20063602000b2001200128021041016a360210200441206a" - "2480808080000b7101027f20012802002104024020012802082205450d00200420" - "056b20034f0d004100210520014100360208200141003a000c0b0240200420034d" - "0d00200128020420056a2002200310fa808080001a200041043a00002001200520" - "036a3602080f0b20004204370200200141003a000c0bc90103027f017e027f2380" - "8080800041106b2203248080808000200341086a20002802082802002001200210" - "dc80808000024020032d000822024104460d002000280204210420032903082105" - "0240024020002d0000220141044b0d0020014103470d010b200428020021010240" - "200441046a28020022062802002207450d00200120071182808080008080808000" - "0b024020062802042206450d00200120061082808080000b2004410c1082808080" - "000b200020053702000b200341106a24808080800020024104470b9c0303027f01" - "7e037f23808080800041106b220224808080800020024100360204024002400240" - "02402001418001490d002001418010490d012001418080044f0d0220022001413f" - "71418001723a000620022001410c7641e001723a000420022001410676413f7141" - "8001723a0005410321010c030b200220013a0004410121010c020b20022001413f" - "71418001723a00052002200141067641c001723a0004410221010c010b20022001" - "413f71418001723a00072002200141127641f001723a000420022001410676413f" - "71418001723a000620022001410c76413f71418001723a0005410421010b200241" - "086a2000280208280200200241046a200110dc80808000024020022d0008220141" - "04460d0020002802042103200229030821040240024020002d0000220541044b0d" - "0020054103470d010b200328020021050240200341046a28020022062802002207" - "450d002005200711828080800080808080000b024020062802042206450d002005" - "20061082808080000b2003410c1082808080000b200020043702000b200241106a" - "24808080800020014104470b1200200041dcb7c08000200110b2808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b0d00" - "2001410620014108766722026b7641017120024101746b413e6a21020b20004200" - "3702102000200236021c200241027441a8dcc080006a2103024041002802c4dfc0" - "800041012002742204710d0020032000360200200020033602182000200036020c" - "20002000360208410041002802c4dfc080002004723602c4dfc080000f0b024002" - "400240200328020022042802044178712001470d00200421020c010b2001410041" - "1920024101766b2002411f461b742103034020042003411d764104716a41106a22" - "052802002202450d02200341017421032002210420022802044178712001470d00" - "0b0b20022802082203200036020c20022000360208200041003602182000200236" - "020c200020033602080f0b20052000360200200020043602182000200036020c20" - "0020003602080b0b00200010e580808000000bb50101037f23808080800041106b" - "2201248080808000200028020c2102024002400240024020002802040e02000102" - "0b20020d0141012102410021030c020b20020d0020002802002202280204210320" - "0228020021020c010b20014180808080783602002001200036020c2001418f8080" - "8000200028021c22002d001c20002d001d10e680808000000b2001200336020420" - "0120023602002001419080808000200028021c22002d001c20002d001d10e68080" - "8000000b990101027f23808080800041106b22042480808080004100410028029c" - "dcc08000220541016a36029cdcc08000024020054100480d000240024041002d00" - "f0dfc080000d00410041002802ecdfc0800041016a3602ecdfc080004100280298" - "dcc08000417f4a0d010c020b200441086a20002001118380808000808080800000" - "0b410041003a00f0dfc080002002450d0010e180808000000b000b0c0020002001" - "2902003703000bf726020c7f017e2380808080004190036b220224808080800020" - "0128020c2103024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f8006a200320052005200441016a220420" - "052004491b10c78080800041002d00e0dbc080001a200228027c21082002280278" - "2101411410998080800022040d010c190b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602b002200242808080" - "8080013702a80241082109200420054f0d02200241b8016a41086a210a200241b8" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241c0006a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802442104200228024021084114" - "1099808080002206450d1d2006200836020c20064105360200200620043602100c" - "080b200241d0006a200320052005200420052004491b10c78080800041002d00e0" - "dbc080001a200228025421042002280250210841141099808080002206450d1c20" - "06200836020c20064107360200200620043602100c070b20022902ac02210e2002" - "2802a802210641042107410021090c070b200741dd00470d00200241c8006a2003" - "20052005200441016a220420052004491b10c78080800041002d00e0dbc080001a" - "200228024c21042002280248210841141099808080002206450d1a200620083602" - "0c20064115360200200620043602100c050b200241b8016a200110e88080800002" - "4020022d00b80122084106470d0020022802bc0121060c050b200241ec016a4102" - "6a2205200b41026a2d00003a0000200241d8016a41086a2203200a41086a290300" - "3703002002200b2f00003b01ec012002200a2903003703d80120022802bc012107" - "0240200c20022802a802470d00200241a8026a10d3808080000b20022802ac0222" - "09200c41186c6a220420022903d801370308200420083a0000200420022f01ec01" - "3b000120042007360204200441106a2003290300370300200441036a20052d0000" - "3a00002002200c41016a220c3602b0024100210d20012802142204200128021022" - "054f0d020c000b0b2004200136020c200441053602002000200436020420004106" - "3a0000200420083602100c160b200628020021030b200241386a20032005200520" - "0441016a220420052004491b10c78080800041002d00e0dbc080001a200228023c" - "21042002280238210841141099808080002206450d152006200836020c20064102" - "360200200620043602100b200241a8026a108c80808000024020022802a8022204" - "450d002009200441186c1082808080000b200128020c2103200128021421042001" - "280210210541062107410121090b200120012d001841016a3a0018024002402004" - "20054f0d0003400240024002400240024002400240200320046a2d00002208410c" - "4a0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c" - "060b20084120460d052008412c460d01200841dd00460d020b200241186a200320" - "052005200441016a220420052004491b10c78080800041002d00e0dbc080001a20" - "0228021c21082002280218210541141099808080002204450d1b20044116360200" - "0c070b2001200441016a2204360214200420054f0d020340200320046a2d000022" - "0c41776a220841174b0d024101200874419380800471450d022001200441016a22" - "0436021420052004470d000b200521040c020b2001200441016a3602142002200e" - "3703c001200220063602bc01200220073a00b80102402009450d00410621072002" - "41063a00800120022006360284010c160b20024180016a41106a200241b8016a41" - "106a29030037030020024180016a41086a200241b8016a41086a29030037030020" - "0220022903b801220e37038001200ea721070c150b200c41dd00470d0020024130" - "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" - "80001a200228023421082002280230210541141099808080002204450d18200441" - "153602000c040b200241286a200320052005200441016a220420052004491b10c7" - "8080800041002d00e0dbc080001a200228022c2108200228022821054114109980" - "8080002204450d17200441163602000c030b2001200441016a2204360214200520" - "04470d000b200521040b200241206a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802242108200228022021054114" - "1099808080002204450d14200441023602000b2004200536020c20042008360210" - "200220043602d0012002200e3703c001200220063602bc01200220073a00b80102" - "4020090d0041062107200241063a0080012002200436028401200241b8016a108a" - "808080000c100b41062107200241063a0080012002200636028401200410e98080" - "80000c0f0b200241106a200320052005200420052004491b10c78080800041002d" - "00e0dbc080001a200228021421082002280210210141141099808080002204450d" - "122004200136020c2004411836020020002004360204200041063a000020042008" - "3602100c110b200141003602082001200441016a360214200241b8016a20062001" - "10c88080800020022802bc0121080240024020022802b80122054102460d002002" - "2802c0012104024020050d0020024180016a2008200410ea8080800020022d0080" - "014106460d112000200229038001370300200041106a20024180016a41106a2903" - "00370300200041086a20024180016a41086a2903003703000c130b410021010240" - "20044100480d00024020040d0041012101410021050c030b41002d00e0dbc08000" - "1a20042105200410998080800022010d02410121010b20012004109a8080800000" - "0b200041063a0000200020083602040c110b20024180016a41086a220320012008" - "200410fa808080003602002002200536028401200241033a008001200220043602" - "8c01200041106a20024180016a41106a290300370300200041086a200329030037" - "030020002002290380013703000c100b2001200441016a36021420024198016a20" - "01410010eb8080800002402002290398014203510d0020024180016a2002419801" - "6a10c580808000024020022d0080014106460d0020002002290380013703002000" - "41106a20024180016a41106a290300370300200041086a20024180016a41086a29" - "03003703000c110b20022802840120011080808080002104200041063a00002000" - "20043602040c100b200020022802a001360204200041063a00000c0f0b02402007" - "41f3004a0d00200741e600460d04200741ee00470d012001200441016a36021420" - "0141d0dbc08000410310ec808080002204450d02200041063a0000200020043602" - "040c0f0b200741f400460d02200741fb00460d040b200741506a41ff0171410a49" - "0d04200241086a200320052005200441016a220420052004491b10c78080800041" - "002d00e0dbc080001a200228020c21082002280208210541141099808080002204" - "450d0e2004200536020c2004410a3602002004200836021020022004360284010c" - "0b0b200241003a0080012000200229038001370300200041086a20024180016a41" - "086a290300370300200041106a20024180016a41106a2903003703000c0c0b2001" - "200441016a3602140240200141d3dbc08000410310ec808080002204450d002000" - "41063a0000200020043602040c0c0b20024181023b018001200020022903800137" - "0300200041086a20024180016a41086a290300370300200041106a20024180016a" - "41106a2903003703000c0b0b2001200441016a3602140240200141d6dbc0800041" - "0410ec808080002204450d00200041063a0000200020043602040c0b0b20024101" - "3b0180012000200229038001370300200041086a20024180016a41086a29030037" - "0300200041106a20024180016a41106a2903003703000c0a0b200120012d001841" - "7f6a22083a0018200441016a2104200841ff0171450d0520012004360214200220" - "013602f001200241013a00f401200241f8016a200241f0016a10ed808080004100" - "210d410021064100210c024002400240024020022802f80122044180808080786a" - "0e020200010b20022802fc0121060c060b20022902fc01210e2002410036028c02" - "20024100360284022002200e3702ac02200220043602a80220024190026a200241" - "f0016a10ee8080800020022d0090024106460d03200241b8016a20024184026a20" - "0241a8026a20024190026a10c680808000024020022d00b8014106460d00200241" - "b8016a108a808080000b200241a8026a41046a2104200241b8016a41046a210802" - "400340200241ec026a200241f0016a10ed80808000024020022802ec0222054180" - "808080786a0e020204000b20022902f002210e20022802f0022103200241f8026a" - "200241f0016a10ee80808000024020022d00f8024106470d0020022802fc022106" - "2005450d07200320051082808080000c070b200820022903f80237020020084110" - "6a200241f8026a41106a290300370200200841086a200241f8026a41086a290300" - "370200200241a8026a41086a200241b8016a41086a290200370300200241a8026a" - "41106a200241b8016a41106a290200370300200241a8026a41186a200241b8016a" - "41186a280200360200200220022902b8013703a802200220053602c4022002200e" - "3e02c8022002200e4220883e02cc02200241d0026a41106a200441106a29020037" - "0300200241d0026a41086a200441086a290200370300200220042902003703d002" - "200241b8016a20024184026a200241c4026a200241d0026a10c68080800020022d" - "00b8014106460d00200241b8016a108a808080000c000b0b200228028402210620" - "02280288022109200228028c02210c0b410521070c050b20022802f00221060c02" - "0b200241a8016a2001410110eb80808000024020022903a8014203510d00200241" - "80016a200241a8016a10c580808000024020022d0080014106460d002000200229" - "038001370300200041106a20024180016a41106a290300370300200041086a2002" - "4180016a41086a2903003703000c0a0b2002280284012001108080808000210420" - "0041063a0000200020043602040c090b200020022802b001360204200041063a00" - "000c080b20022802940221062004450d00200ea720041082808080000b20024184" - "026a108b808080000b410621074101210d0b200120012d001841016a3a00182001" - "28020c21030240024020012802142204200128021022054f0d0003400240024002" - "4002400240200320046a2d00002208410c4a0d00200841776a4102490d040c010b" - "02402008411f4a0d002008410d470d010c040b20084120460d032008412c460d01" - "200841fd00460d020b200241e0006a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802642108200228026021054114" - "1099808080002204450d0b200441163602000c050b200241f0006a200320052005" - "200441016a220420052004491b10c78080800041002d00e0dbc080001a20022802" - "7421082002280270210541141099808080002204450d0a200441153602000c040b" - "2001200441016a3602140240200d450d0041062107200241063a00800120022006" - "360284010c060b200220073a008001200220022f00a8023b0081012002200c3602" - "8c01200220093602880120022006360284012002200241aa026a2d00003a008301" - "0c050b2001200441016a220436021420052004470d000b200521040b200241e800" - "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" - "80001a200228026c21082002280268210541141099808080002204450d06200441" - "033602000b2004200536020c20042008360210200220073a00b801200220022f00" - "a8023b00b901200220043602d0012002200c3602c401200220093602c001200220" - "063602bc012002200241aa026a2d00003a00bb010240200d0d0041062107200241" - "063a0080012002200436028401200241b8016a108a808080000c020b4106210720" - "0241063a0080012002200636028401200410e9808080000c010b200241d8006a20" - "0320052005200420052004491b10c78080800041002d00e0dbc080001a20022802" - "5c21082002280258210141141099808080002204450d042004200136020c200441" - "1836020020002004360204200041063a0000200420083602100c030b200741ff01" - "714106470d010b20022802840120011080808080002104200041063a0000200020" - "043602040c010b2000200229038001370300200041106a20024180016a41106a29" - "0300370300200041086a20024180016a41086a2903003703000b20024190036a24" - "80808080000f0b000b920101047f02400240024020002802000e020001020b2000" - "2802082201450d01200028020420011082808080000c010b20002d00044103470d" - "002000280208220128020021020240200128020422032802002204450d00200220" - "0411828080800080808080000b024020032802042203450d002002200310828080" - "80000b2001410c1082808080000b200041141082808080000b7901027f41002103" - "0240024020024100480d00024020020d0041002103410121040c020b41002d00e0" - "dbc080001a20022103200210998080800022040d01410121030b20032002109a80" - "808000000b20042001200210fa8080800021012000200236020c20002001360208" - "20002003360204200041033a00000b950502067f017e23808080800041306b2203" - "248080808000200128020c21040240024002400240024002402001280214220520" - "0128021022064f0d002001200541016a2207360214200420056a2d000022084130" - "470d020240200720064f0d00200420076a2d000041506a41ff0171410a490d020b" - "200020012002420010ef808080000c050b200341186a20042006200510c7808080" - "0041002d00e0dbc080001a200328021c2107200328021821044114109980808000" - "2201450d022001200436020c200141053602002000200136020820004203370300" - "200120073602100c040b200341086a200420062006200541026a22012006200149" - "1b10c78080800041002d00e0dbc080001a200328020c2107200328020821044114" - "1099808080002201450d012001200436020c2001410d3602002000200136020820" - "004203370300200120073602100c030b02402008414f6a41ff01714109490d0020" - "0341106a20042006200710c78080800041002d00e0dbc080001a20032802142107" - "2003280210210441141099808080002201450d012001200436020c2001410d3602" - "002000200136020820004203370300200120073602100c030b200841506aad42ff" - "01832109200720064f0d010340200420076a2d000041506a220541ff0171220841" - "0a4f0d020240024020094299b3e6cc99b3e6cc19540d0020094299b3e6cc99b3e6" - "cc19520d01200841054b0d010b2001200741016a22073602142009420a7e2005ad" - "42ff01837c210920062007470d010c030b0b200341206a20012002200910f08080" - "80000240024020032802200d00200020032b0328390308420021090c010b200020" - "03280224360208420321090b200020093703000c020b000b200020012002200910" - "ef808080000b200341306a2480808080000ba20201087f23808080800041106b22" - "032480808080002000280214220420002802102205200420054b1b210620002802" - "0c210702400240024002400340024020020d00410021040c050b20062004460d01" - "2000200441016a22083602142002417f6a2102200720046a210920012d0000210a" - "20082104200141016a2101200a20092d0000460d000b200341086a200720052008" - "10c78080800041002d00e0dbc080001a200328020c210120032802082102411410" - "99808080002204450d01200441093602000c020b200320072005200610c7808080" - "0041002d00e0dbc080001a20032802042101200328020021024114109980808000" - "2204450d00200441053602000c010b000b2004200236020c200420013602100b20" - "0341106a24808080800020040bae0201047f23808080800041106b220224808080" - "8000200241046a200110f680808000024002400240024020022d00040d00024020" - "022d00050d0020004180808080783602000c040b41002103200128020022014100" - "3602082001200128021441016a360214200241046a2001410c6a200110c8808080" - "002002280208210420022802044102460d010240200228020c22014100480d0002" - "4020010d0041012103410021050c040b41002d00e0dbc080001a20012105200110" - "998080800022030d03410121030b20032001109a80808000000b20002002280208" - "36020420004181808080783602000c020b20004181808080783602002000200436" - "02040c010b20032004200110fa8080800021042000200136020820002004360204" - "200020053602000b200241106a2480808080000bdc0201067f2380808080004110" - "6b22022480808080002001280200220328020c2104024002400240024002402003" - "2802142201200341106a28020022054f0d000340200420016a2d0000220641776a" - "220741174b0d024101200774419380800471450d022003200141016a2201360214" - "20052001470d000b200521010b200241086a200420052005200141016a22012005" - "2001491b10c78080800041002d00e0dbc080001a200228020c2107200228020821" - "0541141099808080002201450d03200141033602000c010b02402006413a470d00" - "2003200141016a3602142000200310e8808080000c020b20022004200520052001" - "41016a220120052001491b10c78080800041002d00e0dbc080001a200228020421" - "072002280200210541141099808080002201450d02200141063602000b20012005" - "36020c20002001360204200041063a0000200120073602100b200241106a248080" - "8080000f0b000b970202027f027e23808080800041106b22042480808080000240" - "02400240024002400240024002402001280214220520012802104f0d0020012802" - "0c20056a2d00002205412e460d01200541c500460d02200541e500460d020b2002" - "450d02420121060c050b2004200120022003410010f18080800020042802000d02" - "0c030b2004200120022003410010f2808080002004280200450d02200020042802" - "04360208200042033703000c040b420021060240420020037d22074200590d0042" - "022106200721030c030b2003babd428080808080808080807f8421030c020b2000" - "2004280204360208200042033703000c020b20042903082103420021060b200020" - "03370308200020063703000b200441106a2480808080000bbd0101057f41002104" - "0240024020012802102205200128021422064d0d00200641016a2107200520066b" - "2108200128020c20066a21054100210403400240200520046a2d0000220641506a" - "41ff0171410a490d002006412e460d030240200641c500460d00200641e500470d" - "030b2000200120022003200410f2808080000f0b2001200720046a360214200820" - "0441016a2204470d000b200821040b2000200120022003200410f3808080000f0b" - "2000200120022003200410f1808080000bfa0301097f23808080800041106b2205" - "24808080800020012001280214220641016a220736021402400240024020072001" - "28021022084f0d00200720086b2109200128020c210a4100210602400240034002" - "40200a20076a2d0000220b41506a220c41ff0171220d410a490d00024020060d00" - "2005200a20082008200741016a220720082007491b10c78080800041002d00e0db" - "c080001a200528020421062005280200210c41141099808080002207450d072007" - "200c36020c2007410d360200200020073602042000410136020020072006360210" - "0c060b200620046a2107200b41207241e500470d032000200120022003200710f2" - "808080000c050b024020034298b3e6cc99b3e6cc19580d0020034299b3e6cc99b3" - "e6cc19520d02200d41054b0d020b2001200741016a22073602142006417f6a2106" - "2003420a7e200cad42ff01837c210320072008470d000b200920046a21070c010b" - "2000200120022003200620046a10f4808080000c020b2000200120022003200710" - "f3808080000c010b200541086a200128020c20082008200641026a220720082007" - "491b10c78080800041002d00e0dbc080001a200528020c21062005280208210c41" - "141099808080002207450d012007200c36020c2007410536020020002007360204" - "20004101360200200720063602100b200541106a2480808080000f0b000bb80401" - "077f23808080800041106b22052480808080004101210620012001280214220741" - "016a220836021402402008200128021022094f0d00410121060240024020012802" - "0c20086a2d000041556a0e03010200020b410021060b2001200741026a22083602" - "140b200128020c210a0240024002400240024002400240200820094f0d00200120" - "0841016a2207360214200a20086a2d000041506a41ff01712208410a4f0d010240" - "200720094f0d000340200a20076a2d000041506a41ff0171220b410a4f0d012001" - "200741016a22073602140240200841cb99b3e6004c0d00200841cc99b3e600470d" - "07200b41074b0d070b2008410a6c200b6a210820092007470d000b0b20060d0220" - "0420086b2207411f75418080808078732007200841004a2007200448731b21070c" - "030b200541086a200a2009200810c78080800041002d00e0dbc080001a20052802" - "0c21012005280208210841141099808080002207450d042007200836020c200741" - "053602002000200736020420004101360200200720013602100c050b2005200a20" - "09200710c78080800041002d00e0dbc080001a2005280204210120052802002108" - "41141099808080002207450d032007200836020c2007410d360200200020073602" - "0420004101360200200720013602100c040b200420086a2207411f754180808080" - "7873200720084100482007200448731b21070b2000200120022003200710f38080" - "80000c020b200020012002200350200610f5808080000c010b000b200541106a24" - "80808080000b9f0304017f017c017f017c23808080800041106b22052480808080" - "002003ba2106024002400240024002400240024020042004411f7522077320076b" - "220741b502490d0003402006440000000000000000610d062004417f4a0d022006" - "44a0c8eb85f3cce17fa32106200441b4026a22042004411f7522077320076b2207" - "41b4024b0d000b0b200741037441a8c8c080006a2b030021082004417f4a0d0120" - "062008a321060c040b2005200128020c2001280210200128021410c78080800041" - "002d00e0dbc080001a200528020421072005280200210141141099808080002204" - "450d022004200136020c2004410e36020020002004360204200420073602100c01" - "0b20062008a222069944000000000000f07f620d02200541086a200128020c2001" - "280210200128021410c78080800041002d00e0dbc080001a200528020c21072005" - "280208210141141099808080002204450d012004200136020c2004410e36020020" - "002004360204200420073602100b410121040c020b000b2000200620069a20021b" - "390308410021040b20002004360200200541106a2480808080000b7f01047f0240" - "024020012802142205200128021022064f0d00200128020c210702400340200720" - "056a2d0000220841506a41ff017141094b0d012001200541016a22053602142006" - "2005470d000c020b0b200841207241e500460d010b2000200120022003200410f3" - "808080000f0b2000200120022003200410f2808080000b840201027f2380808080" - "0041106b220524808080800002400240024002402004450d002003450d010b2001" - "2802142204200128021022034f0d01200128020c21060340200620046a2d000041" - "506a41ff0171410a4f0d022001200441016a220436021420032004470d000c020b" - "0b200541086a200128020c2001280210200128021410c78080800041002d00e0db" - "c080001a200528020c210120052802082103024041141099808080002204450d00" - "2004200336020c2004410e3602002000200436020420042001360210410121040c" - "020b000b200044000000000000000044000000000000008020021b390308410021" - "040b20002004360200200541106a2480808080000bb40701077f23808080800041" - "306b22022480808080002001280200220328020c21040240024002400240200328" - "02142205200341106a28020022064f0d000340200420056a2d0000220741776a22" - "0841174b0d024101200874419380800471450d022003200541016a220536021420" - "062005470d000b200621050b41012108200241286a200420062006200541016a22" - "0520062005491b10c78080800041002d00e0dbc080001a200228022c2106200228" - "0228210341141099808080002205450d022005200336020c200541033602002000" - "2005360204200520063602100c010b0240200741fd00470d004100210820004100" - "3a00010c010b02400240024020012d00040d00200541016a21052007412c470d01" - "200320053602140240200520064f0d00034002400240024002400240200420056a" - "2d00002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e0304" - "0102000b2008410d460d03200841fd00460d020b41012108200241086a20042006" - "2006200541016a220520062005491b10c78080800041002d00e0dbc080001a2002" - "28020c21062002280208210341141099808080002205450d092005200336020c20" - "05411136020020002005360204200520063602100c080b200041013a0001410021" - "080c070b41012108200241186a200420062006200541016a220520062005491b10" - "c78080800041002d00e0dbc080001a200228021c21062002280218210341141099" - "808080002205450d072005200336020c2005411536020020002005360204200520" - "063602100c060b2003200541016a220536021420062005470d000b200621050b41" - "012108200241106a200420062006200541016a220520062005491b10c780808000" - "41002d00e0dbc080001a2002280214210620022802102103411410998080800022" - "05450d042005200336020c2005410536020020002005360204200520063602100c" - "030b41002108200141003a0004024020074122460d002002200420062006200541" - "016a220520062005491b10c78080800041002d00e0dbc080001a20022802042108" - "2002280200210641141099808080002205450d042005200636020c200541113602" - "0020002005360204200520083602100c020b200041013a00010c020b200241206a" - "200420062006200520062005491b10c78080800041002d00e0dbc080001a200228" - "022421082002280220210641141099808080002205450d022005200636020c2005" - "410836020020002005360204200520083602100b410121080b200020083a000020" - "0241306a2480808080000f0b000b4a01037f4100210302402002450d0002400340" - "20002d0000220420012d00002205470d01200041016a2100200141016a21012002" - "417f6a2202450d020c000b0b200420056b21030b20030bac0501087f0240024002" - "400240200020016b20024f0d00200120026a2103200020026a2104024020024110" - "4f0d00200021050c030b2004417c7121054100200441037122066b210702402006" - "450d00200120026a417f6a210803402004417f6a220420082d00003a0000200841" - "7f6a210820052004490d000b0b2005200220066b2209417c7122066b2104024020" - "0320076a2207410371450d0020064101480d022007410374220841187121022007" - "417c71220a417c6a2101410020086b4118712103200a280200210803402005417c" - "6a2205200820037420012802002208200276723602002001417c6a210120042005" - "490d000c030b0b20064101480d01200920016a417c6a210103402005417c6a2205" - "20012802003602002001417c6a210120042005490d000c020b0b02400240200241" - "104f0d00200021040c010b2000410020006b41037122036a210502402003450d00" - "20002104200121080340200420082d00003a0000200841016a2108200441016a22" - "042005490d000b0b2005200220036b2209417c7122076a21040240024020012003" - "6a2206410371450d0020074101480d012006410374220841187121022006417c71" - "220a41046a2101410020086b4118712103200a2802002108034020052008200276" - "2001280200220820037472360200200141046a2101200541046a22052004490d00" - "0c020b0b20074101480d0020062101034020052001280200360200200141046a21" - "01200541046a22052004490d000b0b20094103712102200620076a21010b200245" - "0d02200420026a21050340200420012d00003a0000200141016a2101200441016a" - "22042005490d000c030b0b20094103712201450d012007410020066b6a21032004" - "20016b21050b2003417f6a210103402004417f6a220420012d00003a0000200141" - "7f6a210120052004490d000b0b20000b0e0020002001200210f8808080000bc102" - "01087f02400240200241104f0d00200021030c010b2000410020006b4103712204" - "6a210502402004450d0020002103200121060340200320062d00003a0000200641" - "016a2106200341016a22032005490d000b0b2005200220046b2207417c7122086a" - "210302400240200120046a2209410371450d0020084101480d0120094103742206" - "41187121022009417c71220a41046a2101410020066b4118712104200a28020021" - "060340200520062002762001280200220620047472360200200141046a21012005" - "41046a22052003490d000c020b0b20084101480d00200921010340200520012802" - "00360200200141046a2101200541046a22052003490d000b0b2007410371210220" - "0920086a21010b02402002450d00200320026a21050340200320012d00003a0000" - "200141016a2101200341016a22032005490d000b0b20000b0be45b0100418080c0" - "000bda5b110000000c000000040000001200000013000000140000000000000000" - "00000001000000150000000000000001000000010000001600000063616c6c6564" - "2060526573756c743a3a756e77726170282960206f6e20616e2060457272602076" - "616c75650017000000040000000400000018000000456d707479496e76616c6964" - "4469676974506f734f766572666c6f774e65674f766572666c6f775a65726f5061" - "727365496e744572726f726b696e647372632f6c69622e72730000b00010000a00" - "0000200000004b000000b00010000a000000210000004b0000004163636f756e74" - "00b00010000a0000002200000033000000b00010000a0000002300000033000000" - "44617461b00010000a0000002500000030000000b00010000a0000002600000024" - "000000b00010000a00000027000000350000007465737420676f6f64203d202c20" - "636f756e746572203d200a000000380110000c000000440110000c000000500110" - "0001000000746573742064617461202c20706f696e746572203d202c20706f696e" - "7465725f7533325f6c656e203d202c206c656e203d2000006c0110000a00000076" - "0110000c0000008201100014000000960110000800000050011000010000000500" - "00000c0000000b0000000b00000004000000740010007900100085001000900010" - "009b0010006361706163697479206f766572666c6f77000000f001100011000000" - "616c6c6f632f7372632f7261775f7665632e72730c021000140000001800000005" - "0000002e2e30313233343536373839616263646566426f72726f774d7574457272" - "6f72616c726561647920626f72726f7765643a200000500210001200000063616c" - "6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65" - "602076616c7565696e646578206f7574206f6620626f756e64733a20746865206c" - "656e20697320206275742074686520696e64657820697320000000970210002000" - "0000b7021000120000003d3d617373657274696f6e20606c656674202072696768" - "7460206661696c65640a20206c6566743a200a2072696768743a200000de021000" - "10000000ee02100017000000050310000900000020726967687460206661696c65" - "643a200a20206c6566743a20000000de0210001000000028031000100000003803" - "100009000000050310000900000001000000000000000b21100002000000202020" - "20207b20207b0a2c0a7d207d636f72652f7372632f666d742f6e756d2e72730000" - "830310001300000066000000170000003078303030313032303330343035303630" - "373038303931303131313231333134313531363137313831393230323132323233" - "323432353236323732383239333033313332333333343335333633373338333934" - "303431343234333434343534363437343834393530353135323533353435353536" - "353735383539363036313632363336343635363636373638363937303731373237" - "333734373537363737373837393830383138323833383438353836383738383839" - "3930393139323933393439353936393739383939636f72652f7372632f666d742f" - "6d6f642e727366616c736574727565000072041000130000009b09000026000000" - "7204100013000000a40900001a000000636f72652f7372632f736c6963652f6d65" - "6d6368722e7273b004100018000000830000001e000000b0041000180000009f00" + "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" + "80006a2102024002404100280298a2c08000220341012001410376742201710d00" + "41002003200172360298a2c08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" + "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" + "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" + "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" + "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" + "4701017f23808080800041206b2200248080808000200041003602182000410136" + "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" + "80808000000b5601017f23808080800041206b2202248080808000200241106a20" + "0041106a290200370300200241086a200041086a290200370300200241013b011c" + "2002200136021820022000290200370300200210ac80808000000b110020003502" + "00410120011086808080000b5d01027f23808080800041206b2201248080808000" + "20002802182102200141106a200041106a290200370300200141086a200041086a" + "2902003703002001200036021c2001200236021820012000290200370300200110" + "d180808000000b490002402002418080c400460d00200020022001280210118180" + "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" + "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" + "808080800020022000360200200220013602042002410236020c200241f887c080" + "00360208200242023702142002418380808000ad4220862203200241046aad8437" + "0328200220032002ad843703202002200241206a360210200241086a419487c080" + "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" + "0022040d002003410171450d010b02402003410171450d00200120026a21050240" + "0240200028020c22060d0041002107200121080c010b4100210741002109200121" + "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" + "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" + "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" + "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" + "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" + "20031b21022003200120031b21010b024020040d00200028021420012002200028" + "021828020c11808080800080808080000f0b2000280204210a024020024110490d" + "0020022001200141036a417c7122076b22096a220b410371210441002106410021" + "03024020012007460d004100210302402009417c4b0d0041002103410021050340" + "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" + "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" + "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" + "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" + "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" + "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" + "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002004200d41f007716a210941002108200421030340200328" + "020c2207417f7341077620074106767241818284087120032802082207417f7341" + "077620074106767241818284087120032802042207417f73410776200741067672" + "41818284087120032802002207417f734107762007410676724181828408712008" + "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" + "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" + "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" + "03410676724181828408712103200c4101460d0220082802042207417f73410776" + "20074106767241818284087120036a2103200c4102460d0220082802082208417f" + "7341077620084106767241818284087120036a21030c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" + "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" + "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" + "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" + "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" + "0d000c030b0b200028021420012002200028021828020c11808080800080808080" + "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" + "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" + "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a210320002802102109200028021821082000280214" + "210703402003417f6a2203450d0220072009200828021011818080800080808080" + "00450d000b41010f0b200028021420012002200028021828020c11808080800080" + "808080000f0b0240200720012002200828020c1180808080008080808000450d00" + "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" + "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" + "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" + "36020c20032000360208200341b08dc08000360214200320013602102003410236" + "021c200341b183c08000360218024020022802000d002003410336025c200341e4" + "83c08000360258200342033702642003418180808000ad4220862204200341106a" + "ad8437034820032004200341086aad843703402003418280808000ad4220862003" + "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" + "808000000b200341206a41106a200241106a290200370300200341206a41086a20" + "0241086a290200370300200320022902003703202003410436025c2003419884c0" + "8000360258200342043702642003418180808000ad4220862204200341106aad84" + "37035020032004200341086aad843703482003418980808000ad42208620034120" + "6aad843703402003418280808000ad422086200341186aad843703382003200341" + "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" + "01200028020428020c11818080800080808080000b140020012000280200200028" + "020410af808080000b14002001280214200128021820001091808080000b220020" + "01280214418883c08000410e200128021828020c11808080800080808080000b60" + "01017f23808080800041306b22002480808080002000410136020c200041a883c0" + "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" + "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" + "057f017e23808080800041c0006b220524808080800041012106024020002d0004" + "0d0020002d0005210702402000280200220828021c22094104710d004101210620" + "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" + "28021828020c11808080800080808080000d012008280214200120022008280218" + "28020c11808080800080808080000d01200828021441ef97c08000410220082802" + "1828020c11808080800080808080000d0120032008200411818080800080808080" + "0021060c010b41012106024020074101710d00200828021441e984c08000410320" + "0828021828020c11808080800080808080000d01200828021c21090b4101210620" + "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" + "6a360214200520082902083702242008290200210a200520093602382005200828" + "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" + "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" + "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" + "84c080004102200528023428020c118080808000808080800021060b200041013a" + "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" + "6a2103200028020421042000280200210520002802082106410021074100210841" + "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" + "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" + "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" + "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" + "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" + "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" + "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" + "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" + "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" + "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" + "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" + "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" + "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" + "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" + "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" + "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" + "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" + "21070b20070b6001027f2000280204210220002802002103024020002802082200" + "2d0000450d00200341e084c080004104200228020c118080808000808080800045" + "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" + "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" + "41306b22032480808080002003200136020c200320003602082003410136021420" + "0341d490c080003602102003420137021c2003418280808000ad42208620034108" + "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" + "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" + "808080000b830201087f2380808080004180016b22022480808080002001280204" + "21032001280200210420002802002100200128021c220521060240200541047145" + "0d002005410872210620040d0020014281808080a0013702000b20012006410472" + "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" + "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" + "09450d000b02402007418101490d002007418001418885c08000108b8080800000" + "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" + "01200536021c200120033602042001200436020020024180016a24808080800020" + "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" + "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" + "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" + "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" + "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" + "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" + "006b22012480808080002001410636020c2001419498c08000360208024041002d" + "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" + "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" + "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" + "2003450d02200320032802002204417f6a3602002003290308210220044101470d" + "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" + "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" + "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" + "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" + "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" + "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" + "021041042103200141043a00182001200141106a360220200141186a41c08dc080" + "002000109180808000210020012d001821040240024020000d0042002102411720" + "0441ff0171764101710d01200128021c220328020021000240200341046a280200" + "22042802002205450d002000200511828080800080808080000b02402004280204" + "2204450d00200020041087808080000b2003410c108780808000410421030c010b" + "200441ff01714104460d032001290318220642807e8321022006a721030b200128" + "021022002000280208417f6a2204360208024020040d00200041003a000c200042" + "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" + "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" + "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" + "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" + "97c08000360228200142023702342001418c80808000ad422086200141106aad84" + "3703202001418280808000ad422086200141086aad843703182001200141186a36" + "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" + "6b22022480808080002002200036020c20024102360214200241a88bc080003602" + "102002420137021c2002418b8080800036022c2002200241286a36021820022002" + "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" + "808080000b200241306a2480808080000b4701017f23808080800041206b220024" + "8080808000200041003602182000410136020c200041bc90c08000360208200042" + "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" + "808080800041206b220024808080800041002d00b89ec080001a02400240024041" + "20109b808080002201450d00200141023602102001428180808010370300410029" + "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" + "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" + "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" + "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" + "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" + "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" + "41003a000020002802182202450d00200120021087808080000b02402000417f46" + "0d00200020002802042201417f6a36020420014101470d00200041201087808080" + "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" + "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" + "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" + "c08000410410af808080000be50301017f23808080800041c0006b220224808080" + "800002400240024002400240024020002d00000e0400010203000b200220002802" + "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" + "002800809bc08000360000200041086a41002900f89ac080003700002000410029" + "00f09ac08000370000200241143602102002200036020c20024114360208200241" + "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" + "86200241046aad843703202002418e80808000ad422086200241086aad84370318" + "2002200241186a36023020012802142001280218200241286a1091808080002100" + "20022802082201450d03200228020c20011087808080000c030b20002d00012100" + "2002410136022c200241d490c08000360228200242013702342002418280808000" + "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" + "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" + "02142001280218200241286a10918080800021000c020b20012000280204220028" + "0200200028020410af8080800021000c010b200028020422002802002001200028" + "0204280210118180808000808080800021000b200241c0006a2480808080002000" + "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" + "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" + "000240200141046a28020022022802002203450d00200020031182808080008080" + "8080000b024020022802042202450d00200020021087808080000b2001410c1087" + "808080000b0bf10101027f23808080800041206b22002480808080000240024002" + "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" + "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" + "410020013602d89ec08000410042808080808080013703d09ec080004100420037" + "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" + "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" + "200041003602182000410136020c200041bc9bc080003602082000420437021020" + "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" + "042480808080000240024002400240024020012802100d002001417f3602102003" + "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" + "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" + "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" + "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" + "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" + "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" + "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" + "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" + "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" + "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" + "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" + "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" + "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" + "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" + "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" + "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" + "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" + "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" + "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" + "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" + "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" + "2004410136020c2004418c91c0800036020820044204370210200441086a419491" + "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" + "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" + "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" + "80808000024020042d00084104460d00200020042903083702000c030b2001411c" + "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" + "066a210502402001280214200320066b22064b0d002000200141146a2005200610" + "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" + "002001411c6a20063602000b2001200128021041016a360210200441206a248080" + "8080000b7101027f20012802002104024020012802082205450d00200420056b20" + "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" + "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" + "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" + "0041106b2203248080808000200341086a20002802082802002001200210c98080" + "8000024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" + "046a28020022062802002207450d002001200711828080800080808080000b0240" + "20062802042206450d00200120061087808080000b2004410c1087808080000b20" + "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" + "23808080800041106b220224808080800020024100360204024002400240024020" + "01418001490d002001418010490d012001418080044f0d0220022001413f714180" + "01723a000620022001410c7641e001723a000420022001410676413f7141800172" + "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" + "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" + "418001723a00072002200141127641f001723a000420022001410676413f714180" + "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" + "00280208280200200241046a200110c980808000024020022d000822014104460d" + "0020002802042103200229030821040240024020002d0000220541044b0d002005" + "4103470d010b200328020021050240200341046a28020022062802002207450d00" + "2005200711828080800080808080000b024020062802042206450d002005200610" + "87808080000b2003410c1087808080000b200020043702000b200241106a248080" + "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" + "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" + "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" + "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" + "012002742204710d0020032000360200200020033602182000200036020c200020" + "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" + "200328020022042802044178712001470d00200421020c010b2001410041192002" + "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" + "002202450d02200341017421032002210420022802044178712001470d000b0b20" + "022802082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20002000" + "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" + "8080808000200028020c2102024002400240024020002802040e020001020b2002" + "0d0141012102410021030c020b20020d0020002802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c2001418f8080800020" + "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" + "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" + "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" + "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" + "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" + "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" + "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" + "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" + "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" + "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" + "0c010b2000410020006b41037122046a210502402004450d002000210320012106" + "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" + "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" + "0020084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a28020021060340200520062002762001280200220620" + "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" + "480d0020092101034020052001280200360200200141046a2101200541046a2205" + "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" + "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" + "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" + "067e22072003422088220820067e22062005200142208822097e7c22054220867c" + "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" + "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" + "00000c000000040000001200000013000000140000000000000000000000010000" + "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" + "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" + "2f6332663734633366393238616562353033663135623465396566353737386537" + "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" + "2e727300005f0010004b000000060a00000e000000000000000100000001000000" + "16000000170000001400000004000000180000004572726f72557466384572726f" + "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" + "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" + "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" + "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" + "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" + "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" + "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" + "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" + "000000da0110000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000b301100010000000fc011000100000000c02100009000000da0110" + "00090000000100000000000000ef0b100002000000000000000c00000004000000" + "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" + "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" + "000030783030303130323033303430353036303730383039313031313132313331" + "343135313631373138313932303231323232333234323532363237323832393330" + "333133323333333433353336333733383339343034313432343334343435343634" + "373438343935303531353235333534353535363537353835393630363136323633" + "363436353636363736383639373037313732373337343735373637373738373938" + "303831383238333834383538363837383838393930393139323933393439353936" + "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" + "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820e804100012000000" - "fa0410002200000072616e676520656e6420696e646578202c05100010000000fa" - "04100022000000736c69636520696e646578207374617274732061742020627574" - "20656e647320617420004c05100016000000620510000d00000001010101010101" + "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" + "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" + "031000220000000101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010000000000000000000000" + "010101000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000202020202020202020202" - "020202020202020202020202020202020202020303030303030303030303030303" - "0303040404040400000000000000000000005b2e2e2e5d626567696e203c3d2065" - "6e642028203c3d2029207768656e20736c6963696e67206060850610000e000000" - "93061000040000009706100010000000a7061000010000006279746520696e6465" - "7820206973206e6f742061206368617220626f756e646172793b20697420697320" - "696e7369646520202862797465732029206f66206000c80610000b000000d30610" - "0026000000f9061000080000000107100006000000a70610000100000020697320" - "6f7574206f6620626f756e6473206f6620600000c80610000b0000003007100016" - "000000a706100001000000636f72652f7372632f7374722f6d6f642e7273006007" - "100013000000f00000002c000000636f72652f7372632f756e69636f64652f7072" - "696e7461626c652e7273000000840710001d0000001a0000003600000084071000" - "1d0000000a0000002b000000000601010301040205070702080809020a050b020e" - "041001110212051311140115021702190d1c051d081f0124016a046b02af03b102" - "bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb" - "010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418" - "363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f6465" - "5cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f" - "5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c15" - "1d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a48" - "4a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e" - "227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06" - "240424042808340b4e43813709160a08183b45390363080930160521031b050140" - "38044b052f040a070907402027040c0936033a051a07040c07504937330d33072e" - "080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b42" - "3e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a06" - "0a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937" - "030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d8430" - "10168faa8247a1b98239072a045c06260a460a28051382b05b654b043907114005" - "0b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092" - "604709743c80f60a73087015467a140c140c570919808781470385420f1584501f" - "060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a" - "04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c04" - "0907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81" - "540c1d03090736080e040907090780cb250a840600010305050606020706080709" - "110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c02" - "1f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05fd02fe03ff" - "09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192" - "a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4ba" - "bbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d" - "11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084" - "b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e" - "5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f" - "7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74" - "7596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a5b07080f10" - "272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df0482" - "44081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a" - "500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b" - "0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582" - "b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c04" - "0103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582" - "ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be" - "22740c80d61a81100580df0bf29e033709815c1480b80880cb050a183b030a0638" - "0846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a104" - "81da26070c050580a61081f50701202a064c04808d0480be031b030f0d636f7265" - "2f7372632f756e69636f64652f756e69636f64655f646174612e7273003f0d1000" - "2000000050000000280000003f0d1000200000005c000000160000000003000083" - "042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8" - "602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a1" - "39301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a153" - "00da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a0070000700" - "2d0101010201020101480b30151001650702060202010423011e1b5b0b3a090901" - "18040109010301052b033c082a180120370101010408040103070a021d013a0101" - "010204080109010a021a010202390104020402020303011e0203010b0239010405" - "010204011402160601013a0101020104080107030a021e013b0101010c01090128" - "010301370101030503010407020b021d013a01020102010301050207020b021c02" - "390201010204080109010a021d0148010401020301010801510102070c08620102" - "090b0749021b0101010101370e01050102050b0124090166040106010202021902" - "040310040d01020206010f01000300031d021e021e02400201070801020b09012d" - "030101750222017603040209010603db0202013a010107010101010208060a0201" - "301f310430070101050128090c0220040202010338010102030101033a08020298" - "03010d0107040106010302c6400001c32100038d016020000669020004010a2002" - "50020001030104011902050197021a120d012608190b2e03300102040202270143" - "06020202020c0108012f01330101030202050201012a020801ee01020104010001" - "0010101000020001e201950500030102050428030401a502000400025003460b31" - "047b01360f290102020a033104020207013d03240501083e010c0234090a040201" - "5f0302010102060102019d010308150239020101010116010e070305c308020301" - "011701510102060101020101020102eb010204060201021b025508020101026a01" - "01010206010165030204010500090102f5010a0201010401900402020401200a28" - "0602040801090602032e0d010200070106010152160207010201027a0603010102" - "0107010148020301010100020b023405050101010001060f00053b0700013f0451" - "010002002e0217000101030405080802071e0494030037043208010e011605010f" - "000701110207010201056401a00700013d04000400076d07006080f0002f727573" - "74632f633266373463336639323861656235303366313562346539656635373738" - "653737663330353862382f6c6962726172792f616c6c6f632f7372632f636f6c6c" - "656374696f6e732f62747265652f6d61702f656e7472792e727300db1010006000" - "000071010000360000002f72757374632f63326637346333663932386165623530" - "3366313562346539656635373738653737663330353862382f6c6962726172792f" - "616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e" - "7273617373657274696f6e206661696c65643a20656467652e686569676874203d" - "3d2073656c662e686569676874202d2031004c1110005b000000af020000090000" - "00617373657274696f6e206661696c65643a207372632e6c656e2829203d3d2064" - "73742e6c656e28294c1110005b0000002f070000050000004c1110005b000000af" - "040000230000004c1110005b000000ef04000024000000617373657274696f6e20" - "6661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e" - "686569676874202d20310000004c1110005b000000f003000009000000c8151000" - "5f0000005802000030000000110000000c00000004000000120000001300000014" - "000000000000000000000001000000150000006120446973706c617920696d706c" - "656d656e746174696f6e2072657475726e656420616e206572726f7220756e6578" - "7065637465646c792f72757374632f633266373463336639323861656235303366" - "313562346539656635373738653737663330353862382f6c6962726172792f616c" - "6c6f632f7372632f737472696e672e72730000f71210004b000000060a00000e00" - "00004572726f72454f46207768696c652070617273696e672061206c697374454f" - "46207768696c652070617273696e6720616e206f626a656374454f46207768696c" - "652070617273696e67206120737472696e67454f46207768696c65207061727369" - "6e6720612076616c7565657870656374656420603a60657870656374656420602c" - "60206f7220605d60657870656374656420602c60206f7220607d60657870656374" - "6564206964656e7465787065637465642076616c75656578706563746564206022" - "60696e76616c696420657363617065696e76616c6964206e756d6265726e756d62" - "6572206f7574206f662072616e6765696e76616c696420756e69636f646520636f" - "646520706f696e74636f6e74726f6c2063686172616374657220285c7530303030" - "2d5c75303031462920666f756e64207768696c652070617273696e672061207374" - "72696e676b6579206d757374206265206120737472696e67696e76616c69642076" - "616c75653a206578706563746564206b657920746f2062652061206e756d626572" - "20696e2071756f746573666c6f6174206b6579206d7573742062652066696e6974" - "652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c656164696e67" - "20737572726f6761746520696e2068657820657363617065747261696c696e6720" - "636f6d6d61747261696c696e672063686172616374657273756e65787065637465" - "6420656e64206f662068657820657363617065726563757273696f6e206c696d69" - "742065786365656465644572726f72282c206c696e653a202c20636f6c756d6e3a" - "200000008d1510000600000093151000080000009b1510000a000000b820100001" - "0000002f72757374632f6332663734633366393238616562353033663135623465" - "39656635373738653737663330353862382f6c6962726172792f616c6c6f632f73" - "72632f636f6c6c656374696f6e732f62747265652f6e617669676174652e727300" - "c81510005f000000c600000027000000c81510005f000000160200002f000000c8" - "1510005f000000a1000000240000002f686f6d652f7077616e672f2e636172676f" - "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631" - "376432326262613135303031662f73657264655f6a736f6e2d312e302e3133352f" - "7372632f726561642e727300581610005f000000a001000045000000581610005f" - "000000a50100003d000000581610005f000000ad0100001a000000581610005f00" - "0000fa01000013000000581610005f000000030200003e000000581610005f0000" - "00ff01000033000000581610005f000000090200003a000000581610005f000000" - "6802000019000000ffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffff0000010002000300040005000600070008000900ffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffff0000100020003000400050" - "006000700080009000ffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000f000" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffff110000000c00000004000000120000001300000014000000" - "7265656e7472616e7420696e69740000501b10000e0000002f72757374632f6332" - "663734633366393238616562353033663135623465396566353737386537376633" - "30353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63652e" - "7273000000681b10004d0000002301000042000000000000000000000004000000" - "04000000190000001a0000000c000000040000001b0000001c0000001d0000002f" - "727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c6d61" - "6c6c6f632e7273617373657274696f6e206661696c65643a207073697a65203e3d" - "2073697a65202b206d696e5f6f7665726865616400f41b100029000000a8040000" - "09000000617373657274696f6e206661696c65643a207073697a65203c3d207369" - "7a65202b206d61785f6f766572686561640000f41b100029000000ae0400000d00" - "0000757365206f66207374643a3a7468726561643a3a63757272656e7428292069" - "73206e6f7420706f737369626c6520616674657220746865207468726561642773" - "206c6f63616c206461746120686173206265656e2064657374726f796564737464" - "2f7372632f7468726561642f6d6f642e727300fa1c100015000000f10200001300" - "00006661696c656420746f2067656e657261746520756e69717565207468726561" - "642049443a2062697473706163652065786861757374656400201d100037000000" - "fa1c100015000000c40400000d00000001000000000000007374642f7372632f69" - "6f2f62756666657265642f6c696e657772697465727368696d2e72736d6964203e" - "206c656e00009d1d100009000000781d1000250000000f01000029000000656e74" - "697479206e6f7420666f756e647065726d697373696f6e2064656e696564636f6e" - "6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574686f" - "737420756e726561636861626c656e6574776f726b20756e726561636861626c65" - "636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e65637465646164" - "647265737320696e2075736561646472657373206e6f7420617661696c61626c65" - "6e6574776f726b20646f776e62726f6b656e2070697065656e7469747920616c72" - "65616479206578697374736f7065726174696f6e20776f756c6420626c6f636b6e" - "6f742061206469726563746f727969732061206469726563746f72796469726563" - "746f7279206e6f7420656d707479726561642d6f6e6c792066696c657379737465" - "6d206f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e2073796d6c" - "696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e646c" - "65696e76616c696420696e70757420706172616d65746572696e76616c69642064" - "61746174696d6564206f75747772697465207a65726f6e6f2073746f7261676520" - "73706163657365656b206f6e20756e7365656b61626c652066696c6566696c6573" - "797374656d2071756f746120657863656564656466696c6520746f6f206c617267" - "657265736f75726365206275737965786563757461626c652066696c6520627573" - "79646561646c6f636b63726f73732d646576696365206c696e6b206f722072656e" - "616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e616d65" - "617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e2069" - "6e746572727570746564756e737570706f72746564756e65787065637465642065" - "6e64206f662066696c656f7574206f66206d656d6f72796f74686572206572726f" - "72756e63617465676f72697a6564206572726f7220286f73206572726f72202900" - "00000100000000000000ad2010000b000000b8201000010000007374642f737263" - "2f696f2f737464696f2e727300d4201000130000002c030000140000006661696c" - "6564207072696e74696e6720746f203a20000000f8201000130000000b21100002" - "000000d4201000130000005d040000090000007374646f75747374642f7372632f" - "696f2f6d6f642e72736120666f726d617474696e6720747261697420696d706c65" - "6d656e746174696f6e2072657475726e656420616e206572726f72207768656e20" - "74686520756e6465726c79696e672073747265616d20646964206e6f7400000047" - "211000560000003621100011000000280700001500000063616e6e6f7420726563" - "7572736976656c792061637175697265206d75746578b821100020000000737464" - "2f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e7273" - "e02110002400000014000000090000007374642f7372632f73796e632f6f6e6365" - "2e72731422100014000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465787374642f7372632f73" - "796e632f7265656e7472616e745f6c6f636b2e72735e2210001e00000022010000" - "2d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d6520" - "696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f726d" - "6564207265637572736976656c79a0221000380000001000000011000000120000" - "00100000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e00000013000000260000003800000019" - "000000170000000c000000090000000a0000001000000017000000190000000e00" - "00000d00000014000000080000001b0000000e0000001000000016000000150000" - "000b000000160000000d0000000b00000013000000c01d1000d01d1000e11d1000" - "f31d1000031e1000131e1000261e1000381e1000451e1000531e1000681e100074" - "1e10007f1e1000941e1000a91e1000b81e1000c61e1000d91e1000ff1e1000371f" - "1000501f1000671f1000731f10007c1f1000861f1000961f1000ad1f1000c61f10" - "00d41f1000e11f1000f51f1000fd1f10001820100026201000362010004c201000" - "612010006c201000822010008f2010009a201000000000000000f03f0000000000" - "00244000000000000059400000000000408f40000000000088c34000000000006a" - "f8400000000080842e4100000000d01263410000000084d797410000000065cdcd" - "41000000205fa00242000000e876483742000000a2941a6d42000040e59c30a242" - "0000901ec4bcd64200003426f56b0c430080e03779c3414300a0d8855734764300" - "c84e676dc1ab43003d9160e458e143408cb5781daf154450efe2d6e41a4b4492d5" - "4d06cff08044f64ae1c7022db544b49dd9794378ea449102282c2a8b2045350332" - "b7f4ad54450284fee471d9894581121f2fe727c04521d7e6fae031f445ea8ca039" - "593e294624b00888ef8d5f46176e05b5b5b893469cc94622e3a6c846037cd8ea9b" - "d0fe46824dc77261423347e32079cff91268471b695743b8179e47b1a1162ad3ce" - "d2471d4a9cf487820748a55cc3f129633d48e7191a37fa5d724861a0e0c478f5a6" - "4879c818f6d6b2dc484c7dcf59c6ef11499e5c43f0b76b4649c63354eca5067c49" - "5ca0b4b32784b14973c8a1a031e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0" - "fddd76d261854a307d951447baba4a3e6edd6c6cb4f04acec9148887e1244b41fc" - "196ae9195a4ba93d50e23150904b134de45a3e64c44b57609df14d7df94b6db804" - "6ea1dc2f4c44f3c2e4e4e9634c15b0f31d5ee4984c1b9c70a5751dcf4c91616687" - "6972034df5f93fe9034f384d72f88fe3c4626e4d47fb390ebbfda24d197ac8d129" - "bdd74d9f983a4674ac0d4e649fe4abc88b424e3dc7ddd6ba2e774e0c39958c69fa" - "ac4ea743ddf7811ce24e9194d475a2a3164fb5b949138b4c4c4f11140eecd6af81" - "4f169911a7cc1bb64f5bffd5d0bfa2eb4f99bf85e2b74521507f2f27db25975550" - "5ffbf051effc8a501b9d369315dec050624404f89a15f5507b5505b6015b2a516d" - "55c311e1786051c82a3456199794517a35c1abdfbcc9516cc158cb0b160052c7f1" - "2ebe8e1b345239aeba6d72226952c75929090f6b9f521dd8b965e9a2d352244e28" - "bfa38b0853ad61f2ae8cae3e530c7d57ed172d73534f5cade85df8a75363b3d862" - "75f6dd531e70c75d09ba1254254c39b58b6847542e9f87a2ae427d547dc39425ad" - "49b2545cf4f96e18dce6547371b88a1e931c55e846b316f3db5155a21860dcef52" - "8655ca1e78d3abe7bb553f132b64cb70f1550ed8353dfecc2556124e83cc3d405b" - "56cb10d29f26089156fe94c647304ac5563d3ab859bc9cfa56662413b8f5a13057" - "80ed172673ca6457e0e89def0ffd99578cb1c2f5293ed057ef5d3373b44d04586b" - "35009021613958c54200f469b96f58bb298038e2d3a3582a34a0c6dac8d8583541" - "487811fb0e59c1282debea5c4359f172f8a525347859ad8f760f2f41ae59cc19aa" - "69bde8e2593fa014c4eca2175a4fc819f5a78b4d5a321d30f94877825a7e247c37" - "1b15b75a9e2d5b0562daec5a82fc58437d08225ba33b2f949c8a565b8c0a3bb943" - "2d8c5b97e6c4534a9cc15b3d20b6e85c03f65b4da8e32234842b5c3049ce95a032" - "615c7cdb41bb487f955c5b5212ea1adfca5c79734bd270cb005d5750de064dfe34" - "5d6de49548e03d6a5dc4ae5d2dac66a05d751ab5385780d45d1261e2066da0095e" - "ab7c4d244404405ed6db602d5505745ecc12b978aa06a95e7f57e7165548df5eaf" - "96502e358d135f5bbce4798270485f72eb5d18a38c7e5f27b33aefe517b35ff15f" - "096bdfdde75fedb7cb4557d51d60f4529f8b56a55260b127872eac4e87609df128" - "3a5722bd60029759847635f260c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd" - "35c89161d65c8f2c433ac6610c34b3f7d3c8fb618700d07a845d3162a9008499e5" - "b46562d400e5ff1e229b628420ef5f53f5d062a5e8ea37a8320563cfa2e545527f" - "3a63c185af6b938f706332679b4678b3a463fe40425856e0d9639f6829f7352c10" - "64c6c2f3744337446478b330521445796456e0bc665996af64360c36e0f7bde364" - "438f43d875ad18651473544ed3d84e65ecc7f41084478365e8f931156519b86561" - "787e5abe1fee653d0b8ff8d6d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0" - "bbeedf62c266389d6aea97fbf666864405e57dba2c67d44a23af8ef46167891dec" - "5ab2719667eb24a7f11e0ecc6713770857d3880168d794ca2c08eb35680d3afd37" - "ca656b684844fe629e1fa1685ad5bdfb8567d568b14aad7a67c10a69af4eacace0" - "b840695a62d7d718e77469f13acd0ddf20aa69d644a0688b54e0690c56c842ae69" - "146a8f6b7ad31984496a7306594820e57f6a08a4372d34efb36a0a8d853801ebe8" - "6a4cf0a686c1251f6b305628f49877536bbb6b32317f55886baa067ffdde6abe6b" - "2a646f5ecb02f36b353d0b367ec3276c820c8ec35db45d6cd1c7389aba90926cc6" - "f9c640e934c76c37b8f8902302fd6c23739b3a5621326deb4f42c9aba9666de6e3" - "92bb16549c6d70ce3b358eb4d16d0cc28ac2b121066e8f722d331eaa3b6e9967fc" - "df524a716e7f81fb97e79ca56edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a" - "3a1b456f948306b508627a6f3d122471457db06fcc166dcd969ce46f7f5cc880bc" - "c31970cf397dd0551a507043889c44eb20847054aac3152629b970e994349b6f73" - "ef7011dd00c125a82371561441312f9258716b5991fdbab68e71e3d77ade3432c3" - "71dc8d1916c2fef77153f19f9b72fe2d72d4f643a107bf627289f49489c96e9772" - "ab31faeb7b4acd720b5f7c738d4e0273cd765bd030e2367381547204bd9a6c73d0" - "74c722b6e0a173045279abe358d67386a657961cef0b7414c8f6dd71754174187a" - "7455ced275749e98d1ea8147ab7463ffc232b10ce1743cbf737fdd4f15750baf50" - "dfd4a34a75676d920b65a68075c008774efecfb475f1ca14e2fd03ea75d6fe4cad" - "7e4220768c3ea0581e5354762f4ec8eee5678976bb617a6adfc1bf76157d8ca22b" - "d9f3765a9c2f8b76cf28777083fb2d54035f772632bd9c14629377b07eecc3993a" - "c8775c9ee7344049fe77f9c21021c8ed3278b8f354293aa96778a530aab388939d" - "78675e4a70357cd27801f65ccc421b07798233747f13e23c7931a0a82f4c0d7279" - "3dc8923b9f90a6794d7a770ac734dc7970ac8a66fca0117a8c572d803b09467a6f" - "ad38608a8b7b7a656c237c3637b17a7f472c1b0485e57a5e59f72145e61a7bdb97" - "3a35ebcf507bd23d8902e603857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a" - "9ece85247cf687184642a7597cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8" - "560df97cf8f19066ac502f7d3b971ac06b92637d0a3d21b00677987d4c8c295cc8" - "94ce7db0f79939fd1c037e9c7500883ce4377e039300aa4bdd6d7ee25b404a4faa" - "a27eda72d01ce354d77e908f04e41b2a0d7fbad9826e513a427f299023cae5c876" - "7f3374ac3c1f7bac7fa0c8eb85f3cce17f756c6c727565616c736500c04a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01884a7b003d5f5a4e313073657264" - "655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e31" - "3768386631666565323432343761346639634501435f5a4e313073657264655f6a" - "736f6e3264653231446573657269616c697a6572244c5424522447542435657272" - "6f723137683438663764306565626231623836343145020e5f5f727573745f6465" - "616c6c6f63035b5f5a4e34636f726533666d74336e756d34395f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e44656275672475323024666f72247532" - "302475382447542433666d74313768346234323333323664643863616231354504" - "305f5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "3532316661366566366130363732614505445f5a4e34636f726535736c69636535" - "696e6465783236736c6963655f73746172745f696e6465785f6c656e5f6661696c" - "313768663931613361666538376231643434334506385f5a4e34636f726533666d" - "7439466f726d617474657231327061645f696e74656772616c3137686334656130" - "376130626331333536633445075c5f5a4e34636f726533666d74336e756d35305f" - "244c5424696d706c2475323024636f72652e2e666d742e2e446562756724753230" - "24666f7224753230247533322447542433666d7431376835353339386231363535" - "30643532376545084c5f5a4e34636f726533707472343264726f705f696e5f706c" - "616365244c5424616c6c6f632e2e737472696e672e2e537472696e672447542431" - "37683738323934613239653363373833306445094f5f5a4e34636f726533707472" - "343564726f705f696e5f706c616365244c542473657264655f6a736f6e2e2e6572" - "726f722e2e4572726f722447542431376866383763386436646339616234626335" - "450a4f5f5a4e34636f726533707472343564726f705f696e5f706c616365244c54" - "2473657264655f6a736f6e2e2e76616c75652e2e56616c75652447542431376835" - "333262653330333764613162376564450b81015f5a4e39395f244c5424616c6c6f" - "632e2e636f6c6c656374696f6e732e2e62747265652e2e6d61702e2e4254726565" - "4d6170244c54244b24432456244324412447542424753230246173247532302463" - "6f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031376835" - "346633306630323133646334313362450c645f5a4e37305f244c5424616c6c6f63" - "2e2e7665632e2e566563244c542454244324412447542424753230246173247532" - "3024636f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031" - "376864313538343863353832316334666665450d525f5a4e35335f244c5424636f" - "72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376866376165323835356232343964" - "626335450e5f5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "000000020202020202020202020202020202020202020202020202020202020202" + "030303030303030303030303030303030404040404000000000000000000000000" + "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" + "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" + "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" + "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" + "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" + "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" + "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" + "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" + "000000690000001600000042616c616e636500b8051000360000007e0000001600" + "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" + "633266373463336639323861656235303366313562346539656635373738653737" + "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" + "652e72730000004c0610004d000000230100004200000000000000000000000400" + "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" + "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" + "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" + "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" + "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" + "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" + "206973206e6f7420706f737369626c652061667465722074686520746872656164" + "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" + "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" + "130000006661696c656420746f2067656e657261746520756e6971756520746872" + "6561642049443a2062697473706163652065786861757374656400040810003700" + "0000de07100015000000c40400000d00000001000000000000007374642f737263" + "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e000081081000090000005c081000250000000f0100002900000065" + "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" + "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" + "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" + "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" + "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" + "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" + "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" + "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" + "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" + "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" + "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" + "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" + "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" + "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" + "7267657265736f75726365206275737965786563757461626c652066696c652062" + "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" + "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" + "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" + "20696e746572727570746564756e737570706f72746564756e6578706563746564" + "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" + "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" + "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" + "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" + "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" + "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" + "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" + "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" + "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" + "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" + "65637572736976656c792061637175697265206d757465789c0c10002000000073" + "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" + "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" + "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" + "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" + "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" + "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" + "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" + "726d6564207265637572736976656c79840d100038000000100000001100000012" + "000000100000001000000013000000120000000d0000000e000000150000000c00" + "00000b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a000000100000001700000019000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600000015" + "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" + "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" + "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" + "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" + "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" + "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" + "000b000000040000004305100048051000540510005f0510006a05100000c62e04" + "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" + "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" + "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" + "6c6962313067657454784669656c64313768623836623962643665383439353163" + "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" + "43757272656e744c6564676572456e7472794669656c6431376861346138303037" + "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" + "6c696231396765744c6564676572456e7472794669656c64313768633661326634" + "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" + "5f6c69623139676574506172656e744c656467657254696d653137683731643366" + "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" + "696e745f6e756d626572313768343432633966366462343461613636374506305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" + "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" + "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" + "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" + "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" + "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376833326438343961303132376564636461450b445f" + "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" + "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" + "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" + "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" + "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683562646335303561663532336432393945" + "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" + "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" + "7a652447542433666d7431376836336361623039386234313233343130450f465f" + "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" + "63745f6669656c64325f66696e6973683137683135666166363733326663303964" + "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" + "313768396461663134643536353865323530364511265f5a4e34636f726533666d" + "743577726974653137683933353534653462653731663263376145124c5f5a4e34" + "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67244754243137683230373631353664386431" + "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" + "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" + "7224475424313768323066303937633266353863396661374514525f5a4e35335f" + "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" + "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" + "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" + "577269746524475424313077726974655f63686172313768323134333931636238" + "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" + "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" + "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" + "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" + "6573657276655f616e645f68616e646c6531376862356335336362636666396436" + "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "475424313077726974655f63686172313768323134333931636238656231353263" - "36450f435f5a4e35616c6c6f63377261775f7665633139526177566563244c5424" - "5424432441244754243867726f775f6f6e65313768363666383634616630346265" - "6432623245105a5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c5424412447542437726573657276653231646f5f72657365727665" - "5f616e645f68616e646c653137683766656665376563326164336435616245115d" - "5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475" - "32302461732475323024636f72652e2e666d742e2e577269746524475424397772" - "6974655f737472313768353939643965353738393436646439384512595f5a4e36" - "305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532302461" - "732475323024636f72652e2e666d742e2e446973706c61792447542433666d7431" - "37686365343232366161316637323663316345132e5f5a4e34636f726533666d74" - "39466f726d61747465723370616431376834373639616533383933373463633531" - "45145d5f5a4e36355f244c542473657264655f6a736f6e2e2e76616c75652e2e56" - "616c7565247532302461732475323024636f72652e2e636d702e2e506172746961" - "6c4571244754243265713137683162323138393234373831393663383045158b01" - "5f5a4e3130385f244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e6274" - "7265652e2e6d61702e2e49746572244c54244b2443245624475424247532302461" - "732475323024636f72652e2e697465722e2e7472616974732e2e6974657261746f" - "722e2e4974657261746f7224475424346e65787431376835363664323036316535" - "6139376461644516615f5a4e36385f244c5424636f72652e2e6e756d2e2e657272" - "6f722e2e5061727365496e744572726f72247532302461732475323024636f7265" - "2e2e666d742e2e44656275672447542433666d7431376863383736363338616561" - "6230633031664517675f5a4e36385f244c5424636f72652e2e666d742e2e627569" - "6c646572732e2e50616441646170746572247532302461732475323024636f7265" - "2e2e666d742e2e5772697465244754243977726974655f73747231376838313862" - "343965376536396132366664451808616c6c6f6361746519435f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542436" - "6d616c6c6f6331376865363539333961346338393763633135451a335f5a4e3561" - "6c6c6f63377261775f766563313268616e646c655f6572726f7231376839376237" - "646264306637326464373838451b0a6465616c6c6f636174651c11636f6d706172" - "655f6163636f756e7449441d325f5a4e313073657264655f6a736f6e3264653130" - "66726f6d5f736c69636531376831316365303837373634633961376230451e5c5f" - "5a4e35355f244c542473747224753230246173247532302473657264655f6a736f" - "6e2e2e76616c75652e2e696e6465782e2e496e646578244754243130696e646578" - "5f696e746f31376864333238633634636161396431376163451f325f5a4e34636f" - "726536726573756c743133756e777261705f6661696c6564313768663839396364" - "303037373637303035314520325f5a4e34636f7265366f7074696f6e3133756e77" - "7261705f6661696c6564313768333535313964653938613737363134664521625f" - "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" - "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" - "7533322447542433666d743137686266336530323238343833653337356145222b" - "5f5a4e3373746432696f35737464696f365f7072696e7431376838316334373231" - "3636303436663066634523385f5a4e35616c6c6f63377261775f76656331376361" - "7061636974795f6f766572666c6f77313768343939643438326139656435373135" - "614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d7431" - "3768363534306363623264356664633361624525415f5a4e38646c6d616c6c6f63" - "38646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243466726565" - "3137683339383334616161616533653839343645262c5f5a4e34636f7265397061" - "6e69636b696e673570616e69633137683034656562393137646439336332323945" - "270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c696e6b" - "5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447" - "54243133646973706f73655f6368756e6b31376836653063636364343538363537" - "343633452a3a5f5a4e34636f72653970616e69636b696e67313870616e69635f62" - "6f756e64735f636865636b31376833643662386161346338303439363632452b11" - "727573745f626567696e5f756e77696e642c465f5a4e34636f726533666d743946" - "6f726d617474657231327061645f696e74656772616c313277726974655f707265" - "66697831376861396134333238306236303036643132452d425f5a4e34636f7265" - "35736c69636535696e6465783234736c6963655f656e645f696e6465785f6c656e" - "5f6661696c31376830383862353665323939626561616166452e3b5f5a4e34636f" - "72653970616e69636b696e6731396173736572745f6661696c65645f696e6e6572" - "31376836663765333235376438346135303432452f475f5a4e34325f244c542424" - "52462454247532302461732475323024636f72652e2e666d742e2e446562756724" - "47542433666d74313768336136626161316262343761643230344530495f5a4e34" - "345f244c54242452462454247532302461732475323024636f72652e2e666d742e" - "2e446973706c61792447542433666d743137683766663464306238363039633234" - "37324531585f5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e" - "7473247532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768363861336538653530396361666336344532265f5a4e34" - "636f726533666d7435777269746531376839333535346534626537316632633761" - "45335f5f5a4e34636f726533666d74336e756d35305f244c5424696d706c247532" - "3024636f72652e2e666d742e2e44656275672475323024666f7224753230247533" - "322447542433666d7431376835353339386231363535306435323765452e323534" - "5c5f5a4e36335f244c5424636f72652e2e63656c6c2e2e426f72726f774d757445" - "72726f72247532302461732475323024636f72652e2e666d742e2e446562756724" - "47542433666d74313768313564336433343334626464636363384535395f5a4e34" - "636f72653463656c6c323270616e69635f616c72656164795f626f72726f776564" - "313768333134623532613162633436626665344536405f5a4e34636f726535736c" - "69636535696e6465783232736c6963655f696e6465785f6f726465725f6661696c" - "313768353862336536383666653333373030654537325f5a4e34636f7265366f70" - "74696f6e31336578706563745f6661696c65643137686630386139396532643733" - "33366336614538535f5a4e34636f72653463686172376d6574686f647332325f24" - "4c5424696d706c2475323024636861722447542431366573636170655f64656275" - "675f657874313768656366613566303431373437393039384539345f5a4e34636f" - "726537756e69636f6465397072696e7461626c6535636865636b31376836646136" - "346638306663313630633761453a325f5a4e34636f7265337374723136736c6963" - "655f6572726f725f6661696c31376862303364323439386438646362363433453b" - "355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c5f72" - "7431376832616462643139306563313832373933453c645f5a4e37315f244c5424" - "636f72652e2e6f70732e2e72616e67652e2e52616e6765244c5424496478244754" - "24247532302461732475323024636f72652e2e666d742e2e446562756724475424" - "33666d7431376836636632383632303536616535653233453d465f5a4e34315f24" - "4c542463686172247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376865613566643964626339343936626665453e625f" - "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" - "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" - "6933322447542433666d7431376863656439306337613633396330316464453fce" - "015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f64" - "653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e672443244b24" - "432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e" - "6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c2447542432" - "316465616c6c6f636174655f616e645f617363656e643137683538396137326639" - "343233626663656245409a025f5a4e35616c6c6f633131636f6c6c656374696f6e" - "73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e2e63" - "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f646552656624" - "4c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" - "652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e2e63" - "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e" - "496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e45646765244754243130" - "696e736572745f6669743137686338613063663533396566663031313145419202" - "5f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f6465" - "32313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e" - "62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e636f" - "6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4d" - "75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e" - "62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c24475424" - "244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" - "652e2e6d61726b65722e2e4b56244754243573706c697431376864303961343862" - "37613831363331616145425a5f5a4e36315f244c542473657264655f6a736f6e2e" - "2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e666d" - "742e2e44656275672447542433666d743137683430323537643666343265323962" - "37344543595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e4572" - "726f72247532302461732475323024636f72652e2e666d742e2e446973706c6179" - "2447542433666d74313768393032373163376232613663653833394544575f5a4e" - "35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475323024" - "61732475323024636f72652e2e666d742e2e44656275672447542433666d743137" - "686236373265623139396333356431383645453a5f5a4e313073657264655f6a73" - "6f6e32646531325061727365724e756d6265723576697369743137683836623839" - "36383136626131306137654546565f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565336d6170323542547265654d6170244c54244b2443245624" - "4324412447542436696e7365727431376834643164623464613838343264346665" - "4547455f5a4e313073657264655f6a736f6e347265616439536c69636552656164" - "3137706f736974696f6e5f6f665f696e6465783137683236623431383938353234" - "38333239364548695f5a4e37305f244c542473657264655f6a736f6e2e2e726561" - "642e2e536c6963655265616424753230246173247532302473657264655f6a736f" - "6e2e2e726561642e2e52656164244754243970617273655f737472313768616265" - "386335353563386263643335354549475f5a4e313073657264655f6a736f6e3472" - "65616439536c696365526561643139736b69705f746f5f6573636170655f736c6f" - "7731376834373836633665323234666132336632454a465f5a4e35616c6c6f6333" - "7665633136566563244c54245424432441244754243137657874656e645f66726f" - "6d5f736c69636531376864626131346637346638653232366463454b2f5f5a4e31" - "3073657264655f6a736f6e34726561643661735f73747231376866636436626234" - "313731373865366635454c3e5f5a4e313073657264655f6a736f6e347265616432" - "3070617273655f756e69636f64655f657363617065313768393634306663636162" - "64303034613064454d725f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e526561642447542431376465636f64655f6865785f65" - "736361706531376834376265353936383535663830346461454e355f5a4e313073" - "657264655f6a736f6e347265616431317065656b5f6f725f656f66313768373363" - "62313436306531616339386135454f2e5f5a4e313073657264655f6a736f6e3472" - "656164356572726f72313768656635353237643333336339633236664550305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376861333165" - "6164363637646336373865304551325f5a4e35616c6c6f63377261775f76656331" - "3166696e6973685f67726f77313768353338353962613338396237316433354552" - "4b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e6572244c" - "54244124475424313467726f775f616d6f7274697a656431376839386333363466" - "6334356633643132344553435f5a4e35616c6c6f63377261775f76656331395261" - "77566563244c54245424432441244754243867726f775f6f6e6531376866373333" - "3137633566643665626336364554395f5a4e337374643674687265616438546872" - "6561644964336e6577396578686175737465643137683333366266376131343838" - "30343463384555425f5a4e34636f72653463656c6c346f6e636531374f6e636543" - "656c6c244c54245424475424387472795f696e6974313768636536336266323238" - "3531393165373145563e5f5a4e35616c6c6f633473796e633136417263244c5424" - "5424432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394557355f5a4e34636f72653970616e69636b696e6731336173736572" - "745f6661696c6564313768323332363266326333633738623661624558475f5a4e" - "34325f244c54242452462454247532302461732475323024636f72652e2e666d74" - "2e2e44656275672447542433666d74313768653138373433383865303762666532" - "3545595d5f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53747269" - "6e67247532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d7431376863653432323661613166373236633163452e3238335a7a" - "5f5a4e34636f726533707472383864726f705f696e5f706c616365244c54247374" - "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" - "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447542424" - "47542431376831363664633631616230333334633165455b495f5a4e3373746434" - "73796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424" - "3130696e697469616c697a6531376837663563353038646139653162303962455c" - "605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e5374646f7574" - "4c6f636b2475323024617324753230247374642e2e696f2e2e5772697465244754" - "243977726974655f616c6c31376832346238323631303436316432353666455d55" - "5f5a4e3373746432696f3862756666657265643962756677726974657231384275" - "66577269746572244c54245724475424313477726974655f616c6c5f636f6c6431" - "376835383462646262616562306662316262455e735f5a4e38305f244c54247374" - "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" - "4c54245424475424247532302461732475323024636f72652e2e666d742e2e5772" - "697465244754243977726974655f73747231376837666163663562633065666364" - "383038455f325f5a4e34636f726533666d74355772697465313077726974655f63" - "686172313768663062336265316563313964653565374560305f5a4e34636f7265" - "33666d743557726974653977726974655f666d7431376866383830386630646630" - "65343531336445610a727573745f70616e696362375f5a4e34636f72653570616e" - "6963313250616e69635061796c6f61643661735f73747231376836313439663134" - "3264396132653032654563505f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c542441244754243138696e736572745f6c61726765" - "5f6368756e6b313768656665383531613237353832646137624564455f5a4e3373" - "746433737973396261636b747261636532365f5f727573745f656e645f73686f72" - "745f6261636b747261636531376834646333646534376432323032316239456558" - "5f5a4e337374643970616e69636b696e673139626567696e5f70616e69635f6861" - "6e646c657232385f24753762242475376224636c6f737572652475376424247537" - "64243137686531376133393737663839633131373845663b5f5a4e337374643970" - "616e69636b696e673230727573745f70616e69635f776974685f686f6f6b313768" - "37373665373963396636353931626535456783015f5a4e39395f244c5424737464" - "2e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e646c65722e" - "2e5374617469635374725061796c6f6164247532302461732475323024636f7265" - "2e2e70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638456888015f5a4e313073657264655f" - "6a736f6e3576616c756532646537375f244c5424696d706c247532302473657264" - "652e2e64652e2e446573657269616c697a652475323024666f7224753230247365" - "7264655f6a736f6e2e2e76616c75652e2e56616c75652447542431316465736572" - "69616c697a65313768333165353137383163383336383735394569535f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "39616234626335452e3331316a3c5f5a4e3573657264653264653756697369746f" - "72313876697369745f626f72726f7765645f737472313768343564373131633837" - "31363863326636456b4f5f5a4e313073657264655f6a736f6e3264653231446573" - "657269616c697a6572244c54245224475424313670617273655f616e795f6e756d" - "62657231376839316435333034653561396363663531456c4a5f5a4e3130736572" - "64655f6a736f6e3264653231446573657269616c697a6572244c54245224475424" - "313170617273655f6964656e743137683663353964643731393635353139313045" - "6d735f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d61704163" - "63657373244c5424522447542424753230246173247532302473657264652e2e64" - "652e2e4d61704163636573732447542431336e6578745f6b65795f736565643137" - "6865363235636133323138363233653036456e755f5a4e37355f244c5424736572" - "64655f6a736f6e2e2e64652e2e4d6170416363657373244c542452244754242475" - "3230246173247532302473657264652e2e64652e2e4d6170416363657373244754" - "2431356e6578745f76616c75655f73656564313768656338353637376538303165" - "39393133456f4b5f5a4e313073657264655f6a736f6e3264653231446573657269" - "616c697a6572244c54245224475424313270617273655f6e756d62657231376837" - "3833613431613462393130646432304570515f5a4e313073657264655f6a736f6e" - "3264653231446573657269616c697a6572244c5424522447542431387061727365" - "5f6c6f6e675f696e74656765723137686438313037386634613331633262653245" - "714c5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a65" - "72244c54245224475424313370617273655f646563696d616c3137683661306333" - "363832326663336530306145724d5f5a4e313073657264655f6a736f6e32646532" - "31446573657269616c697a6572244c54245224475424313470617273655f657870" - "6f6e656e743137683336646437646264323365346134656245734d5f5a4e313073" - "657264655f6a736f6e3264653231446573657269616c697a6572244c5424522447" - "542431346636345f66726f6d5f7061727473313768633863316239626161613836" - "666637334574555f5a4e313073657264655f6a736f6e3264653231446573657269" - "616c697a6572244c54245224475424323270617273655f646563696d616c5f6f76" - "6572666c6f77313768336130306563656466383630313864334575565f5a4e3130" - "73657264655f6a736f6e3264653231446573657269616c697a6572244c54245224" - "475424323370617273655f6578706f6e656e745f6f766572666c6f773137683034" - "3762396637333562616463666138457681015f5a4e37355f244c54247365726465" - "5f6a736f6e2e2e64652e2e4d6170416363657373244c5424522447542424753230" - "246173247532302473657264652e2e64652e2e4d61704163636573732447542431" - "336e6578745f6b65795f7365656431326861735f6e6578745f6b65793137683564" - "61326634303536653538313464394577066d656d636d7078365f5a4e3137636f6d" - "70696c65725f6275696c74696e73336d656d376d656d6d6f766531376863383366" - "3931363866353238616565364579076d656d6d6f76657a066d656d637079071201" - "000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100550970" - "726f64756365727302086c616e6775616765010452757374000c70726f63657373" - "65642d62790105727573746325312e38332e302d6e696768746c79202863326637" - "346333663920323032342d30392d30392900490f7461726765745f666561747572" - "6573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b" - "0f7265666572656e63652d74797065732b087369676e2d657874"; + "4754243977726974655f7374723137683539396439653537383934366464393845" + "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" + "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" + "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" + "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" + "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" + "6563313268616e646c655f6572726f723137683937623764626430663732646437" + "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" + "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683132313861313631643933363438653945" + "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" + "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768613636623539636339336533383537344520615f" + "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" + "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768633837363633386165616230633031664521475f" + "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376839393432316563653462383633" + "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" + "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" + "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" + "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" + "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" + "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" + "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" + "653970616e69636b696e673570616e696331376830346565623931376464393363" + "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" + "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" + "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" + "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" + "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" + "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" + "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" + "6b696e673970616e69635f666d7431376836353430636362326435666463336162" + "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" + "753230247533322447542433666d74313768626633653032323834383365333735" + "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" + "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" + "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" + "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" + "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" + "4e34636f726533666d7439466f726d617474657233706164313768343736396165" + "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" + "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" + "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" + "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" + "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" + "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" + "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" + "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" + "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" + "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" + "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" + "72656164795f626f72726f77656431376833313462353261316263343662666534" + "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" + "72756374356669656c64313768333531353864666637643465616633354537675f" + "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" + "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" + "7465244754243977726974655f7374723137683831386234396537653639613236" + "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" + "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" + "742e2e577269746524475424313077726974655f63686172313768393437396266" + "363162306130356661314539305f5a4e34636f726533666d743557726974653977" + "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" + "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" + "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" + "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" + "706c61792475323024666f7224753230246933322447542433666d743137686365" + "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" + "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376834366435353230663839333131346633453d0861" + "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" + "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" + "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" + "73746564313768333336626637613134383830343463384541425f5a4e34636f72" + "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" + "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" + "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" + "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" + "653970616e69636b696e6731336173736572745f6661696c656431376832333236" + "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768653138373433383865303762666532354545595f5a4e36305f244c542473" + "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" + "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" + "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" + "2e2e446973706c61792447542433666d7431376863653432323661613166373236" + "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" + "242447542424475424313768313636646336316162303333346331654548495f5a" + "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" + "2454244754243130696e697469616c697a65313768376635633530386461396531" + "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" + "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" + "697465244754243977726974655f616c6c31376832346238323631303436316432" + "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" + "65723138427566577269746572244c54245724475424313477726974655f616c6c" + "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c54245424475424247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376837666163663562" + "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" + "726974655f6368617231376866306233626531656331396465356537454d305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376866383830" + "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" + "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" + "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" + "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" + "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" + "645f73686f72745f6261636b747261636531376834646333646534376432323032" + "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" + "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" + "37642424753764243137686531376133393737663839633131373845533b5f5a4e" + "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" + "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" + "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" + "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" + "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" + "735f737472313768656233663732326432323465343266384555066d656d636d70" + "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" + "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d627901057275737463" + "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" + "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" + "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" + "797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - std::string escrow_tx_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; - - std::vector escrow_tx_json_data( - escrow_tx_json_str.begin(), escrow_tx_json_str.end()); - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", - "Data" : "02" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasmP4( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - { - auto reValue = re.value(); - // std::cout << reValue.first << " " << - // reValue.second - // << std::endl; - BEAST_EXPECT(!reValue.first); - BEAST_EXPECT(reValue.second == "1"); - } - } - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", - "Data" : "1" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasmP4( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - { - auto reValue = re.value(); - // std::cout << reValue.first << " " << - // reValue.second - // << std::endl; - BEAST_EXPECT(reValue.first); - BEAST_EXPECT(reValue.second == "0"); - } - } - } - - void - testEscrowWasmP5() - { - testcase("escrow wasm P5 test"); - auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + // let sender = get_tx_account_id(); + // let owner = get_current_escrow_account_id(); + // let dest = get_current_escrow_destination(); + // let dest_balance = get_account_balance(dest); + // let escrow_data = get_current_escrow_data(); + // let ed_str = String::from_utf8(escrow_data).unwrap(); + // let threshold_balance = ed_str.parse::().unwrap(); + // let pl_time = host_lib::getParentLedgerTime(); + // let e_time = get_current_escrow_finish_after(); + // sender == owner && dest_balance <= threshold_balance && + // pl_time >= e_time using namespace test::jtx; - struct TestLedgerDataProvider : public LedgerDataProvider + struct TestHostFunctions : public HostFunctions { Env* env; + Bytes accountID; + Bytes data; + int clock_drift = 0; public: - TestLedgerDataProvider(Env* env) : env(env) + explicit TestHostFunctions(Env* env, int cd = 0) + : env(env), clock_drift(cd) { + std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + accountID = Bytes{s.begin(), s.end()}; + std::string t = "10000"; + data = Bytes{t.begin(), t.end()}; } int32_t - get_ledger_sqn() override + getLedgerSqn() override { return (int32_t)env->current()->seq(); } + + int32_t + getParentLedgerTime() override + { + return env->current() + ->parentCloseTime() + .time_since_epoch() + .count() + + clock_drift; + } + + std::optional + getTxField(std::string const& fname) override + { + return accountID; + } + + std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) override + { + return data; + } + + std::optional + getCurrentLedgerEntryField(std::string const& fname) override + { + if (fname == "Destination" || fname == "Account") + return accountID; + else if (fname == "Data") + return data; + else if (fname == "FinishAfter") + { + auto t = env->current() + ->parentCloseTime() + .time_since_epoch() + .count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return std::nullopt; + } }; + Env env{*this}; - TestLedgerDataProvider ledgerDataProvider(&env); - std::string funcName("ready"); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - - env.close(); - env.close(); - env.close(); - env.close(); - - re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - - void - testEscrowWasmP6() - { - testcase("escrow wasm P6 test"); - auto wasmHex = - "0061736d010000000109026000017f60017f0002150108686f73745f6c69620863" - "6f6e7374496e74000003030201010405017001010105030100100619037f014180" - "80c0000b7f00418080c0000b7f00418080c0000b073e05066d656d6f7279020007" - "6c6f6f70696e6700010c6c6f6f70696e675f686f737400020a5f5f646174615f65" - "6e6403010b5f5f686561705f6261736503020a1a0202000b150003401080808080" - "001a2000417f6a22000d000b0b0077046e616d65000e0d7761736d5f6c69622e77" - "61736d014c0300325f5a4e387761736d5f6c696238686f73745f6c696238636f6e" - "7374496e74313768643939653133366665323437376662344501076c6f6f70696e" - "67020c6c6f6f70696e675f686f7374071201000f5f5f737461636b5f706f696e74" - "657200550970726f64756365727302086c616e6775616765010452757374000c70" - "726f6365737365642d62790105727573746325312e38332e302d6e696768746c79" - "202863326637346333663920323032342d30392d30392900490f7461726765745f" - "6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c" - "6f62616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); { - std::string funcName("looping"); - auto re = runEscrowWasm(wasm, funcName, 1000, 500); + TestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re.value().result); - std::cout << re.value().cost << std::endl; + std::cout << "good case result " << re.value().result + << " cost: " << re.value().cost << std::endl; } } - { - std::string funcName("looping_host"); - auto re = runEscrowWasm(wasm, funcName, 1000, 50); - BEAST_EXPECT(!re.has_value()); + + env.close(); + env.close(); + env.close(); + env.close(); + + { // fail because current time < escrow_finish_after time + TestHostFunctions nfs(&env); + nfs.clock_drift = -1; + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(!re.value().result); + std::cout << "bad case (current time < escrow_finish_after " + "time) result " + << re.value().result << " cost: " << re.value().cost + << std::endl; + } + } + + { // fail because trying to access nonexistent field + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + { + } + std::optional + getTxField(std::string const& fname) override + { + return std::nullopt; + } + }; + BadTestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (access nonexistent field) result " + << re.error() << std::endl; + } + + { // fail because trying to allocate more than MAX_PAGES memory + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + { + } + std::optional + getTxField(std::string const& fname) override + { + return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); + } + }; + BadTestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (more than MAX_PAGES) result " << re.error() + << std::endl; + } + + { // fail because recursion too deep + auto wasmHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(&env); + std::string funcName("recursive"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (deep recursion) result " << re.error() + << std::endl; } } @@ -4734,15 +2153,9 @@ struct Wasm_test : public beast::unit_test::suite run() override { using namespace test::jtx; - testWasmtimeLib(); - testEscrowWasmP0(); testBadWasm(); - testEscrowWasmP1(); - testEscrowWasmP2P3(); - testEscrowWasmP4(); - testEscrowWasmP5(); - testEscrowWasmP6(); + testEscrowWasmDN1(); } }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp new file mode 100644 index 0000000000..9ecbe22f31 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include "xrpld/app/misc/WasmHostFuncImpl.h" + +#include "xrpl/protocol/digest.h" + +namespace ripple { + +int32_t +WasmHostFunctionsImpl::getLedgerSqn() +{ + return ctx.view().seq(); +} + +int32_t +WasmHostFunctionsImpl::getParentLedgerTime() +{ + return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try +} + +// TODO remove json code after deciding encoding scheme + +std::optional +WasmHostFunctionsImpl::getTxField(const std::string& fname) +{ + auto js = ctx.tx.getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +std::optional +WasmHostFunctionsImpl::getLedgerEntryField( + int32_t type, + Bytes const& kdata, + const std::string& fname) +{ + auto kl = [&]() -> std::optional { + if (type == ltACCOUNT_ROOT) + { + std::string s(kdata.begin(), kdata.end()); + auto const account = parseBase58(s); + if (account) + { + return keylet::account(account.value()); + } + } + return std::nullopt; + }(); + + if (!kl || !ctx.view().exists(kl.value())) + return std::nullopt; + + auto js = ctx.view().read(kl.value())->getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +std::optional +WasmHostFunctionsImpl::getCurrentLedgerEntryField(const std::string& fname) +{ + if (!ctx.view().exists(leKey)) + return std::nullopt; + + auto js = ctx.view().read(leKey)->getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +bool +WasmHostFunctionsImpl::updateData(const Bytes& data) +{ + if (!ctx.view().exists(leKey)) + return false; + auto sle = ctx.view().peek(leKey); + sle->setFieldVL(sfData, data); + ctx.view().update(sle); + return true; +} + +Hash +WasmHostFunctionsImpl::computeSha512HalfHash(const Bytes& data) +{ + auto const hash = sha512Half(data); + return uint256::fromVoid(hash.data()); +} +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h new file mode 100644 index 0000000000..a311073d7b --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED +#define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED + +#include +#include + +#include "xrpl/basics/base_uint.h" +#include "xrpld/app/misc/WasmVM.h" +#include "xrpld/app/tx/detail/ApplyContext.h" +#include + +namespace ripple { +class WasmHostFunctionsImpl : public HostFunctions +{ +public: + WasmHostFunctionsImpl(ApplyContext& ctx, Keylet leKey) + : ctx(ctx), leKey(leKey) + { + } + + int32_t + getLedgerSqn() override; + + int32_t + getParentLedgerTime() override; + + std::optional + getTxField(std::string const& fname) override; + + std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) override; + + std::optional + getCurrentLedgerEntryField(std::string const& fname) override; + + bool + updateData(Bytes const& data) override; + + Hash + computeSha512HalfHash(Bytes const& data) override; + +private: + ApplyContext& ctx; + Keylet leKey; +}; + +} // namespace ripple +#endif // RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index d94135646b..22ac65479f 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -19,496 +19,275 @@ #include -// WasmVM::WasmVM(beast::Journal j) -// : j_(j) -//{ -// } +#include "xrpl/protocol/AccountID.h" +#include "xrpl/protocol/LedgerFormats.h" namespace ripple { -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t input) + +WasmEdge_Result +getLedgerSqn( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; - WasmEdge_Value Returns[1]; - WasmEdge_String FuncName = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( - VMCxt, - wasmCode.data(), - wasmCode.size(), - FuncName, - Params, - 1, - Returns, - 1); - - bool ok = WasmEdge_ResultOK(Res); - bool re = false; - if (ok) - { - auto result = WasmEdge_ValueGetI32(Returns[0]); - // printf("Get the result: %d\n", result); - if (result != 0) - re = true; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); - } - - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); + out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); + return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID) +WasmEdge_Result +getParentLedgerTime( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) { - auto dataLen = (int32_t)accountID.size(); - // printf("accountID size: %d\n", dataLen); - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + out[0] = + WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); + return WasmEdge_Result_Success; +} - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - WasmEdge_Result allocRes = WasmEdge_VMRunWasmFromBuffer( - VMCxt, - wasmCode.data(), - wasmCode.size(), - allocFunc, - allocParams, - 1, - allocReturns, - 1); - - bool ok = WasmEdge_ResultOK(allocRes); - bool re = false; - if (ok) +Expected +getParameterData( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) +{ + auto fnameOffset = (uint32_t)WasmEdge_ValueGetI32(in[index]); + auto fnameLen = (uint32_t)WasmEdge_ValueGetI32(in[index + 1]); + Bytes fname(fnameLen, char{0}); + WasmEdge_MemoryInstanceContext* mem = + WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + WasmEdge_Result Res = WasmEdge_MemoryInstanceGetData( + mem, (uint8_t*)(fname.data()), fnameOffset, fnameLen); + if (WasmEdge_ResultOK(Res)) { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("Alloc pointer: %d\n", pointer); + return fname; + } + else + { + return Unexpected(Res); + } +} - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, accountID.data(), pointer, dataLen); +Expected +getFieldName( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) +{ + auto dataRes = getParameterData(fm, in, index); + if (dataRes) + { + return std::string(dataRes.value().begin(), dataRes->end()); + } + else + { + return Unexpected(dataRes.error()); + } +} - ok = WasmEdge_ResultOK(setRes); - if (ok) +Expected +setData(const WasmEdge_CallingFrameContext* fm, Bytes const& data) +{ + auto alloc = [fm](int32_t dataLen) -> int32_t { + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + auto mod = WasmEdge_CallingFrameGetModuleInstance(fm); + WasmEdge_FunctionInstanceContext* func = + WasmEdge_ModuleInstanceFindFunction(mod, allocFunc); + WasmEdge_Value allocParams[1] = { + WasmEdge_ValueGenI32(dataLen)}; // 4 for prepend the data size + WasmEdge_Value allocReturns[1]; + auto executor = WasmEdge_CallingFrameGetExecutor(fm); + auto res = WasmEdge_ExecutorInvoke( + executor, func, allocParams, 1, allocReturns, 1); + if (WasmEdge_ResultOK(res)) { - // printf("Set data ok\n"); - - WasmEdge_Value params[2] = { - WasmEdge_ValueGenI32(pointer), WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = - WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 2, returns, 1); - - ok = WasmEdge_ResultOK(funcRes); - if (ok) - { - // printf("func ok\n"); - re = (WasmEdge_ValueGetI32(returns[0]) == 1); - } - else - { - printf( - "Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } + return WasmEdge_ValueGetI32(allocReturns[0]); } else { - printf( - "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); + return 0; } - } - else - { - printf( - "Alloc error message: %s\n", WasmEdge_ResultGetMessage(allocRes)); - } - - WasmEdge_VMDelete(VMCxt); - // TODO free everything - // WasmEdge_StringDelete(FuncName); - if (ok) - { - // printf("runEscrowWasm ok, result %d\n", re); - return re; - } - else - return Unexpected(tecFAILED_PROCESSING); -} - -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data) -{ - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { - auto dataLen = (int32_t)data.size(); - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - - WasmEdge_Result allocRes = WasmEdge_VMExecute( - VMCxt, allocFunc, allocParams, 1, allocReturns, 1); - - if (WasmEdge_ResultOK(allocRes)) - { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("alloc ptr %d, len %d\n", pointer, dataLen); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, data.data(), pointer, dataLen); - if (WasmEdge_ResultOK(setRes)) - { - return pointer; - } - } - - return 0; }; - auto tx_ptr = wasmAlloc(escrow_tx_json_data); - auto lo_ptr = wasmAlloc(escrow_lo_json_data); - if (tx_ptr == 0 || lo_ptr == 0) + auto dataLen = (int32_t)data.size(); + auto dataPtr = alloc(dataLen); + auto retPtr = alloc(8); + if (dataPtr && retPtr) { - printf("data error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto txLen = (int32_t)escrow_tx_json_data.size(); - auto loLen = (int32_t)escrow_lo_json_data.size(); - - WasmEdge_Value params[4] = { - WasmEdge_ValueGenI32(tx_ptr), - WasmEdge_ValueGenI32(txLen), - WasmEdge_ValueGenI32(lo_ptr), - WasmEdge_ValueGenI32(loLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); - - if (WasmEdge_ResultOK(funcRes)) - { - // printf("func ok\n"); - return WasmEdge_ValueGetI32(returns[0]) == 1; - } - else - { - printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - return Unexpected(tecFAILED_PROCESSING); - } -} - -Expected, TER> -runEscrowWasmP4( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data) -{ - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { - auto dataLen = (int32_t)data.size(); - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - - WasmEdge_Result allocRes = WasmEdge_VMExecute( - VMCxt, allocFunc, allocParams, 1, allocReturns, 1); - - if (WasmEdge_ResultOK(allocRes)) + auto mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + auto res = + WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); + if (WasmEdge_ResultOK(res)) { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("alloc ptr %d, len %d\n", pointer, dataLen); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, data.data(), pointer, dataLen); - if (WasmEdge_ResultOK(setRes)) + unsigned char intBuf[8]; // little-endian + for (size_t i = 0; i < 4; ++i) { - return pointer; + intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; + } + for (size_t i = 0; i < 4; ++i) + { + intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; + } + + res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); + if (WasmEdge_ResultOK(res)) + { + return WasmEdge_ValueGenI32(retPtr); } } - - return 0; - }; - - auto tx_ptr = wasmAlloc(escrow_tx_json_data); - auto lo_ptr = wasmAlloc(escrow_lo_json_data); - if (tx_ptr == 0 || lo_ptr == 0) - { - printf("data error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto txLen = (int32_t)escrow_tx_json_data.size(); - auto loLen = (int32_t)escrow_lo_json_data.size(); - - WasmEdge_Value params[4] = { - WasmEdge_ValueGenI32(tx_ptr), - WasmEdge_ValueGenI32(txLen), - WasmEdge_ValueGenI32(lo_ptr), - WasmEdge_ValueGenI32(loLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); - - if (WasmEdge_ResultOK(funcRes)) - { - auto pointer = WasmEdge_ValueGetI32(returns[0]); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - uint8_t buff[9]; - WasmEdge_Result getRes = - WasmEdge_MemoryInstanceGetData(mi, buff, pointer, 9); - if (!WasmEdge_ResultOK(getRes)) - { - printf( - "re mem get message: %s\n", WasmEdge_ResultGetMessage(getRes)); - return Unexpected(tecFAILED_PROCESSING); - } - auto flag = buff[0]; - - auto leToInt32 = [](const uint8_t* d) -> uint32_t { - uint32_t r = 0; - for (int i = 0; i < 4; ++i) - { - r |= static_cast(d[i]) << (i * 8); - // printf("leToInt32 %d\n", r); - } - return r; - }; - auto ret_pointer = - leToInt32(reinterpret_cast(&buff[1])); - auto ret_len = leToInt32(reinterpret_cast(&buff[5])); - // printf("re flag %d, ptr %d, len %d\n", flag, ret_pointer, - // ret_len); - - std::vector buff2(ret_len); - getRes = WasmEdge_MemoryInstanceGetData( - mi, buff2.data(), ret_pointer, ret_len); - if (!WasmEdge_ResultOK(getRes)) - { - printf( - "re 2 mem get message: %s\n", - WasmEdge_ResultGetMessage(getRes)); - return Unexpected(tecFAILED_PROCESSING); - } - - std::string newData(buff2.begin(), buff2.end()); - - // free - WasmEdge_String freeFunc = WasmEdge_StringCreateByCString("deallocate"); - WasmEdge_Value freeParams[2] = { - WasmEdge_ValueGenI32(ret_pointer), WasmEdge_ValueGenI32(ret_len)}; - WasmEdge_Value freeReturns[0]; - WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); - // free pointer too, with len = 9 too - freeParams[0] = WasmEdge_ValueGenI32(pointer); - freeParams[1] = WasmEdge_ValueGenI32(9); - WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); - - return std::pair(flag == 1, newData); - } - else - { - printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - return Unexpected(tecFAILED_PROCESSING); } + return Unexpected(WasmEdge_Result_Fail); } WasmEdge_Result -get_ledger_sqn( +getTxField( void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value* In, - WasmEdge_Value* Out) + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - Out[0] = - WasmEdge_ValueGenI32(((LedgerDataProvider*)data)->get_ledger_sqn()); + auto fname = getFieldName(fm, in, 0); + if (!fname) + return fname.error(); + + auto fieldData = ((HostFunctions*)data)->getTxField(fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - LedgerDataProvider* ledgerDataProvider) -{ - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - { // register host function - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate( - HostFType, get_ledger_sqn, ledgerDataProvider, 0); - WasmEdge_FunctionTypeDelete(HostFType); - - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); - - WasmEdge_String HostFuncName = - WasmEdge_StringCreateByCString("get_ledger_sqn"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); - - WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); - if (!WasmEdge_ResultOK(regRe)) - { - printf("host func reg error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - } - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Value funcReturns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); - - bool ok = WasmEdge_ResultOK(funcRes); - bool re = false; - if (ok) - { - auto result = WasmEdge_ValueGetI32(funcReturns[0]); - if (result != 0) - re = true; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } - - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(func); - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); -} - WasmEdge_Result -constInt( +getLedgerEntryField( void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value* In, - WasmEdge_Value* Out) + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - Out[0] = WasmEdge_ValueGenI32(5); + auto type = WasmEdge_ValueGetI32(in[0]); + auto lkData = getParameterData(fm, in, 1); + if (!lkData) + return lkData.error(); + + auto fname = getFieldName(fm, in, 3); + if (!fname) + return fname.error(); + + auto fieldData = + ((HostFunctions*)data) + ->getLedgerEntryField(type, lkData.value(), fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); return WasmEdge_Result_Success; } -Expected +WasmEdge_Result +getCurrentLedgerEntryField( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getFieldName(fm, in, 0); + if (!fname) + return fname.error(); + + auto fieldData = + ((HostFunctions*)data)->getCurrentLedgerEntryField(fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +updateData( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getParameterData(fm, in, 0); + if (!fname) + return fname.error(); + + if (((HostFunctions*)data)->updateData(fname.value())) + return WasmEdge_Result_Success; + else + return WasmEdge_Result_Fail; +} + +WasmEdge_Result +computeSha512HalfHash( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getParameterData(fm, in, 0); + if (!fname) + return fname.error(); + + auto hres = ((HostFunctions*)data)->computeSha512HalfHash(fname.value()); + Bytes digest{hres.begin(), hres.end()}; + auto pointer = setData(fm, digest); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32(32); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +print( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto f = getParameterData(fm, in, 0); + if (!f) + return f.error(); + std::string s(f.value().begin(), f.value().end()); + std::cout << s << std::endl; + return WasmEdge_Result_Success; +} + +Expected runEscrowWasm( std::vector const& wasmCode, std::string const& funcName, - int32_t gasLimit, - int32_t input) + HostFunctions* hfs, + uint64_t gasLimit) { + // WasmEdge_LogOff(); + // TODO deletes + // create VM and set cost limit WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); + WasmEdge_ConfigureSetMaxMemoryPage(conf, MAX_PAGES); WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); WasmEdge_StatisticsContext* StatCxt = @@ -516,36 +295,168 @@ runEscrowWasm( WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); { // register host function - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate(HostFType, constInt, nullptr, 100); - WasmEdge_FunctionTypeDelete(HostFType); + // module + WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* hostMod = + WasmEdge_ModuleInstanceCreate(libName); + WasmEdge_StringDelete(libName); - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); + // getLedgerSqn + { + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getLedgerSqn, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); - WasmEdge_String HostFuncName = - WasmEdge_StringCreateByCString("constInt"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getLedgerSqn"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + // WasmEdge_FunctionInstanceDelete(hostFunc); + } + // getParentLedgerTime + { + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getParentLedgerTime, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getParentLedgerTime"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + // WasmEdge_FunctionInstanceDelete(hostFunc); + } + + // getTxField + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getTxField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getTxField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // getLedgerEntryField + { + WasmEdge_ValType inputList[5] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 5, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getLedgerEntryField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getLedgerEntryField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // getCurrentLedgerEntryField + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getCurrentLedgerEntryField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getCurrentLedgerEntryField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // updateData + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, updateData, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("updateData"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // computeSha512HalfHash + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, computeSha512HalfHash, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("computeSha512HalfHash"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // print + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate(hostFuncType, print, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = WasmEdge_StringCreateByCString("print"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + WasmEdge_VMRegisterModuleFromImport(VMCxt, hostMod); if (!WasmEdge_ResultOK(regRe)) { printf("host func reg error\n"); return Unexpected(tecFAILED_PROCESSING); } } + WasmEdge_Result loadRes = WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); if (!WasmEdge_ResultOK(loadRes)) { - printf("load error\n"); + printf("load error, %p, %d\n", wasmCode.data(), wasmCode.size()); return Unexpected(tecFAILED_PROCESSING); } WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); @@ -560,20 +471,23 @@ runEscrowWasm( printf("instantiate error\n"); return Unexpected(tecFAILED_PROCESSING); } - + WasmEdge_Value funcReturns[1]; WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, Params, 1, NULL, 0); + WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); bool ok = WasmEdge_ResultOK(funcRes); - EscrowResultP6 re; + EscrowResult re; if (ok) { auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); re.cost = WasmEdge_StatisticsGetTotalCost(sc); // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount - re.result = true; + auto result = WasmEdge_ValueGetI32(funcReturns[0]); + if (result != 0) + re.result = true; + else + re.result = false; } else { @@ -588,5 +502,4 @@ runEscrowWasm( else return Unexpected(tecFAILED_PROCESSING); } - } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 37988a97e3..d1e14e4246 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -20,78 +20,81 @@ #define RIPPLE_APP_MISC_WASMVM_H_INLCUDED #include -// #include #include +#include "xrpl/basics/base_uint.h" #include namespace ripple { +const uint32_t MAX_PAGES = 128; // 8MB = 64KB*128 -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t input); +typedef std::vector Bytes; +typedef ripple::uint256 Hash; -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID); +template +struct WasmResult +{ + T result; + uint64_t cost; +}; +typedef WasmResult EscrowResult; -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data); - -Expected, TER> -runEscrowWasmP4( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data); - -struct LedgerDataProvider +struct HostFunctions { virtual int32_t - get_ledger_sqn() + getLedgerSqn() { return 1; } - virtual ~LedgerDataProvider() = default; + virtual int32_t + getParentLedgerTime() + { + return 1; + } + + virtual std::optional + getTxField(std::string const& fname) + { + return Bytes{}; + } + + virtual std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) + { + return Bytes{}; + } + + virtual std::optional + getCurrentLedgerEntryField(std::string const& fname) + { + return Bytes{}; + } + + virtual bool + updateData(Bytes const& data) + { + return true; + } + + virtual Hash + computeSha512HalfHash(Bytes const& data) + { + return Hash{}; + } + + virtual ~HostFunctions() = default; }; -Expected +Expected runEscrowWasm( std::vector const& wasmCode, std::string const& funcName, - LedgerDataProvider* ledgerDataProvider); - -struct EscrowResultP6 -{ - bool result; - int32_t cost; -}; - -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t gasLimit, - int32_t input); + HostFunctions* hfs, + uint64_t gasLimit); } // namespace ripple #endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED - -// class WasmVM final -//{ -// public: -// explicit WasmVM(beast::Journal j); -// ~WasmVM() = default; -// -// private: -// beast::Journal j_; -// }; \ No newline at end of file diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 165a6df5f4..89eace193a 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -434,22 +435,6 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } -struct EscrowLedgerDataProvider : public LedgerDataProvider -{ - ApplyView& view_; - -public: - EscrowLedgerDataProvider(ApplyView& view) : view_(view) - { - } - - int32_t - get_ledger_sqn() override - { - return (int32_t)view_.seq(); - } -}; - TER EscrowFinish::doApply() { @@ -601,14 +586,15 @@ EscrowFinish::doApply() std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); - EscrowLedgerDataProvider ledgerDataProvider(ctx_.view()); + WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, 100000); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { - auto reValue = re.value(); - JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue); + auto reValue = re.value().result; + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) + << ", cost: " << re.value().cost; if (!reValue) { // ctx_.view().update(slep); From 177cdaf550c56f1e8a819ac84efbde68c6a5cfb1 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Mar 2025 10:55:33 -0400 Subject: [PATCH 04/15] Connect votable gas limit into VM (#5360) * [WIP] add gas limit * [WIP] host function escrow tests * finish test * uncomment out tests --- src/test/app/Escrow_test.cpp | 1190 +++++++++++++++++++++++ src/test/jtx/TestHelpers.h | 26 + src/xrpld/app/misc/AMMUtils.h | 6 +- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 4 +- src/xrpld/app/misc/WasmVM.h | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 3 +- 6 files changed, 1224 insertions(+), 7 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 0ac8bba8a0..6c0e32179e 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2022,6 +2022,1195 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testAllHostFunctions() + { + testcase("Test all host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: figure out how to make this a fixture in a separate file + auto wasmHex = + "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" + "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" + "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" + "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" + "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" + "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" + "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" + "745f6c696213676574506172656e744c656467657254696d650005035453020603" + "070101080901010a01000202010102080008000b0c030101010104050802030303" + "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" + "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" + "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" + "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" + "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" + "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" + "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" + "14200142808080801037020c200141033a00382001412036022820014100360234" + "2001418080c08000360230200141003602202001410036021820012001410c6a36" + "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" + "808080000d00200128020c21002001280210220220012802141080808080000240" + "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" + "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" + "027f017e037f23808080800041306b220324808080800041272104024002402000" + "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" + "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" + "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" + "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" + "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" + "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" + "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" + "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" + "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" + "41096a20046a412720046b108c808080002104200341306a24808080800020040b" + "6c01027f024002402000417c6a2802002202417871220341044108200241037122" + "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" + "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" + "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" + "2005200136020c2005200036020820052003360214200520023602102005410236" + "021c200541b884c08000360218200542023702242005418180808000ad42208620" + "0541106aad843703382005418280808000ad422086200541086aad843703302005" + "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" + "0041c0006b220224808080800002400240200028020022032d00000d0020012802" + "14419582c080004104200128021828020c118080808000808080800021000c010b" + "4101210020012802142204419982c0800041042001280218220528020c22061180" + "8080800080808080000d00200341016a210302400240200128021c22074104710d" + "0041012100200441f184c080004101200611808080800080808080000d02200320" + "01108a80808000450d010c020b200441f284c08000410220061180808080008080" + "8080000d0141012100200241013a001b200220053602102002200436020c200220" + "07360238200241c884c08000360234200220012d00203a003c2002200128021036" + "022c200220012902083702242002200129020037021c20022002411b6a36021420" + "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" + "80004102200228023428020c11808080800080808080000d010b2001280214419c" + "97c080004101200128021828020c118080808000808080800021000b200241c000" + "6a24808080800020000be90201057f2380808080004180016b2202248080808000" + "0240024002400240200128021c22034110710d0020034120710d01200031000041" + "01200110868080800021000c030b20002d0000210041ff00210303402002200322" + "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" + "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" + "0041ff00210303402002200322046a22052000410f712203413072200341376a20" + "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" + "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" + "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" + "02402004418101490d002004418001418885c08000108b80808000000b20014101" + "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" + "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" + "20032000360200200320013602042003410236020c200341d887c0800036020820" + "0342023702142003418380808000ad4220862204200341046aad84370328200320" + "042003ad843703202003200341206a360210200341086a200210aa80808000000b" + "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" + "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" + "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" + "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" + "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" + "2802000d000240200028021422012000280218220920082002200310ad80808000" + "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" + "0240024002402000280204220120064b0d00200028021422012000280218220920" + "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" + "2000413036021020002d0020210b4101210c200041013a00202000280214220920" + "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" + "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" + "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" + "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" + "1180808080008080808000210c0c010b200120066b210702400240024020002d00" + "2022010e0402000100020b20072101410021070c010b2007410176210120074101" + "6a41017621070b200141016a210120002802102106200028021821092000280214" + "210a024003402001417f6a2201450d01200a200620092802101181808080008080" + "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" + "200a20042005200928020c11808080800080808080000d00410021010340024020" + "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" + "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" + "0041106b220224808080800020022000280200220041046a36020c200141e181c0" + "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" + "418580808000108f808080002100200241106a24808080800020000be70201057f" + "2380808080004180016b22022480808080000240024002400240200128021c2203" + "4110710d0020034120710d0120003502004101200110868080800021000c030b20" + "00280200210041ff00210303402002200322046a22052000410f71220341307220" + "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" + "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" + "004110492106200041047621002006450d000b02402004418101490d0020044180" + "01418885c08000108b80808000000b20014101419885c080004102200541810120" + "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" + "85c08000108b80808000000b20014101419885c080004102200541810120044101" + "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" + "8080800041106b220b248080808000200028021420012002200028021828020c11" + "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" + "200b41086a200320042005200610b680808000200720082009200a10b680808000" + "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" + "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" + "0028021828020c118080808000808080800021000c010b200028021441ee84c080" + "004101200028021828020c118080808000808080800021000b200b41106a248080" + "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" + "23808080800041306b2203248080808000200341033a002c2003412036021c4100" + "210420034100360228200320013602242003200036022020034100360214200341" + "0036020c02400240024002400240200228021022050d00200228020c2200450d01" + "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" + "280200210003400240200041046a2802002207450d002003280220200028020020" + "07200328022428020c11808080800080808080000d040b20012802002003410c6a" + "200128020411818080800080808080000d03200141086a2101200041086a210020" + "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" + "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" + "40200041046a2802002201450d0020032802202000280200200120032802242802" + "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" + "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" + "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" + "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" + "0b0b200320073602102003200b36020c200141046a280200210702400240024020" + "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" + "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a200128020411818080800080808080000d02" + "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" + "280220200228020020044103746a22012802002001280204200328022428020c11" + "80808080008080808000450d010b410121010c010b410021010b200341306a2480" + "8080800020010b1e01017f024020002802002201450d0020002802042001108780" + "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" + "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" + "808080000be30201027f23808080800041106b2202248080808000024002400240" + "02402001418001490d002002410036020c2001418010490d010240200141808004" + "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" + "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" + "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" + "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" + "032000280200470d0020001096808080000b2000200341016a3602082000280204" + "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" + "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" + "20032001109780808000200028020821030b200028020420036a2002410c6a2001" + "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "01109c80808000024020012802082200418180808078460d002000200128020c10" + "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" + "03248080808000200341086a200020012002109c80808000024020032802082202" + "418180808078460d002002200328020c109d80808000000b200341106a24808080" + "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" + "109780808000200028020821030b200028020420036a2001200210d6808080001a" + "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" + "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" + "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" + "200136020820002002410120021b36020420002002453602000b800601057f0240" + "024002402000417c6a22032802002204417871220541044108200441037122061b" + "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" + "712002410b491b210102400240024020060d002001418002490d01200520014104" + "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" + "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" + "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" + "01490d042006200410a780808000200520016b22024110490d0120032001200328" + "020041017172410272360200200720016a22012002410372360204200720056a22" + "0520052802044101723602042001200210a88080800020000f0b200520016b2202" + "410f4d0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210a88080800020000f0b200320" + "05200328020041017172410272360200200720056a220220022802044101723602" + "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" + "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" + "020441017236020441002102410021010c010b2003200120044101717241027236" + "0200200720016a22012002410172360204200720056a2205200236020020052005" + "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" + "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" + "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" + "2201200220012002491b10d6808080002102200010a580808000200221000b2000" + "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" + "0010a680808000000b20032001200441017172410272360200200720016a220220" + "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" + "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" + "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" + "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" + "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" + "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" + "00411920044101766b2004411f461b742107410021060340024020052205280204" + "41787122082002490d00200820026b220820014f0d00200821012005210620080d" + "004100210120052106200521000c040b200528021422082000200820052007411d" + "764104716a41106a2802002205471b200020081b2100200741017421072005450d" + "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" + "491b22024103762201762200410371450d00024002402000417f7341017120016a" + "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" + "2206460d002006200136020c200120063602080c010b41002005417e2007777136" + "0298a2c080000b20022000410372360204200220006a2200200028020441017236" + "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" + "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" + "020441787120026b21012006210503400240200628021022000d00200628021422" + "000d0020052802182104024002400240200528020c22002005470d002005411441" + "10200528021422001b6a28020022060d01410021000c020b200528020822062000" + "36020c200020063602080c010b200541146a200541106a20001b21070340200721" + "082006220041146a200041106a200028021422061b210720004114411020061b6a" + "28020022060d000b200841003602000b2004450d040240200528021c4102744180" + "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" + "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" + "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" + "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" + "0020017441022001742200410020006b727168220841037422014190a0c080006a" + "220620014198a0c080006a28020022002802082207460d002007200636020c2006" + "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" + "360204200020026a2207200120026b2206410172360204200020016a2006360200" + "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" + "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" + "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" + "0120023602082005200236020c2002200136020c200220053602080b4100200736" + "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" + "20052802102206450d0020002006360210200620003602180b2005280214220645" + "0d0020002006360214200620003602180b02400240024020014110490d00200520" + "02410372360204200520026a22022001410172360204200220016a200136020041" + "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" + "c080002100024002404100280298a2c08000220841012007410376742207710d00" + "41002008200772360298a2c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200520012002" + "6a2200410372360204200520006a220020002802044101723602040c010b410020" + "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" + "720d004100210641022004742200410020006b722003712200450d032000684102" + "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" + "71220520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b2106200120082007" + "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" + "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" + "002006470d00200641144110200628021422001b6a28020022050d01410021000c" + "020b20062802082205200036020c200020053602080c010b200641146a20064110" + "6a20001b21070340200721082005220041146a200041106a200028021422051b21" + "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" + "40200628021c41027441809fc080006a22052802002006460d0020044110411420" + "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" + "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" + "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" + "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" + "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" + "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" + "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" + "a0c080002100034020002802002206200028020422076a2005460d022000280208" + "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" + "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" + "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" + "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" + "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" + "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" + "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" + "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" + "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" + "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" + "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" + "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" + "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" + "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" + "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" + "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" + "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" + "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" + "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" + "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" + "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" + "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" + "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" + "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" + "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" + "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" + "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" + "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" + "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" + "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" + "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" + "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" + "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" + "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" + "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" + "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" + "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" + "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" + "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" + "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" + "360204410041808080013602b8a2c080002001200641606a41787141786a220020" + "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" + "290288a0c080003702002007200937020841002008360284a0c080004100200536" + "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" + "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" + "0720072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010d0808080000c080b200041f8017141" + "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" + "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" + "0620013602082000200136020c2001200636020c200120003602080c070b200020" + "053602002000200028020420086a360204200520024103723602042007410f6a41" + "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" + "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" + "417871220610a780808000200620026a2102200120066a220128020421060b2001" + "2006417e7136020420002002410172360204200020026a20023602000240200241" + "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" + "024002404100280298a2c08000220641012002410376742202710d004100200620" + "0272360298a2c08000200121020c010b200128020821020b200120003602082002" + "200036020c2000200136020c200020023602080c050b4100200020026b22013602" + "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" + "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" + "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" + "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" + "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" + "800020052006410172360204200120006a2006360200200120024103723602040b" + "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" + "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" + "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" + "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" + "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" + "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" + "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" + "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" + "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" + "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" + "4020062802102205450d0020002005360210200520003602180b20062802142205" + "450d0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a20013602000240" + "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" + "6a2102024002404100280298a2c08000220541012001410376742201710d004100" + "2005200172360298a2c08000200221010c010b200228020821010b200220003602" + "082001200036020c2000200236020c200020013602080c010b2006200120026a22" + "00410372360204200620006a220020002802044101723602040b200641086a0be9" + "0101037f23808080800041206b2204248080808000024002400240200220036a22" + "0320024f0d00410021020c010b4100210220012802002205410174220620032006" + "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" + "0c010b2004200536021c20042001280204360214410121020b2004200236021820" + "0441086a2003200441146a109980808000024020042802080d00200428020c2102" + "200120033602002001200236020441818080807821020c010b2004280210210120" + "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" + "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" + "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" + "0041052000418680808000419082c0800041052002410c6a418780808000108f80" + "8080002100200241106a24808080800020000be00301097f23808080800041c000" + "6b2202248080808000200028020821032000280204210441012105200128021441" + "b083c080004101200128021828020c118080808000808080800021000240200345" + "0d0041002106034020062107410121062000410171210841012100024020080d00" + "02400240200128021c22084104710d002007410171450d01410121002001280214" + "41e784c080004102200128021828020c1180808080008080808000450d010c020b" + "200128021821092001280214210a024020074101710d0041012100200a41888bc0" + "80004101200928020c11808080800080808080000d020b200241013a001b200220" + "093602102002200a36020c20022008360238200241c884c0800036023420022001" + "2d00203a003c2002200128021036022c2002200129020837022420022001290200" + "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" + "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" + "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" + "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" + "4101200128021828020c118080808000808080800021050b200241c0006a248080" + "80800020050b4a01017f23808080800041106b2202248080808000200220003602" + "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" + "00200241106a24808080800020000b3d00200128021420002802002d0000410274" + "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" + "808080800080808080000be70101017f23808080800041106b2205248080808000" + "20002802142001410d200028021828020c11808080800080808080002101200541" + "003a000d200520013a000c20052000360208200541086a200241042003200410b6" + "80808000210320052d000d220120052d000c2204722100024020014101470d0020" + "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" + "004102200028021828020c118080808000808080800021000c010b200028021441" + "ee84c080004101200028021828020c118080808000808080800021000b20054110" + "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" + "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" + "02400240024002400240024002404107109b808080002201450d00200141036a41" + "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" + "800022022800042103200228000021042002410810878080800020014107108780" + "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" + "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" + "002202280004210520022800002106200241081087808080002001410710878080" + "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" + "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" + "2202280004210720022800002108200241081087808080002001410b1087808080" + "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" + "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" + "108380808000220928000421022009280000210a20094108108780808000200041" + "186a200a200210a48080800002400240024020002d00184101460d002000290320" + "210b02402002450d00200a20021087808080000b20014107108780808000410021" + "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" + "0000200141041082808080002202280000210c2002280004210a20024108108780" + "80800020014104108780808000024002400240200a4100480d000240200a0d0041" + "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" + "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" + "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" + "026b210f4100210103400240024002400240200220016a2d00002209c022104100" + "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" + "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" + "808080202111428080808010211202400240024002400240024002400240024002" + "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" + "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" + "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" + "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" + "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" + "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" + "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" + "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" + "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" + "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" + "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" + "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" + "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" + "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" + "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" + "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" + "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" + "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" + "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" + "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" + "41186a20142011a710a48080800020002d00184101460d01200029032021124100" + "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" + "201641076a41002800878cc08000360000201641002900808cc080003700002016" + "410b10828080800022012800002117200128000421132001410810878080800002" + "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" + "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" + "09201741016a210220134109490d024100210103402009450d0a20022d00004150" + "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" + "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" + "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" + "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" + "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" + "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" + "20090d040b410021010c050b201321092017210220134108490d020b4100210103" + "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" + "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" + "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" + "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" + "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" + "0b1087808080002004200310808080800020062005108080808000200820071080" + "80808000200c200a10808080800020004100360214200042808080801037020c20" + "0041033a003820004120360228200041003602342000418080c080003602302000" + "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" + "1086808080000d00200028020c2102200028021022092000280214108080808000" + "02402002450d00200920021087808080000b201510858080800020011085808080" + "0041002102024020032005470d0020042006200310d58080800045200b20125871" + "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" + "00200c200a1087808080000b02402007450d00200820071087808080000b024020" + "05450d00200620051087808080000b02402003450d00200420031087808080000b" + "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" + "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" + "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" + "80800041106b220324808080800002400240024002400240024002400240024002" + "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" + "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" + "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" + "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" + "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" + "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" + "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" + "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" + "0121010c010b20002005370308410021010b200020013a0000200341106a248080" + "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" + "030240024020024101710d002002410271450d012001280200220220006a210002" + "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" + "410020003602a0a2c0800020032003280204417e71360204200120004101723602" + "04200320003602000f0b2001200210a7808080000b024002400240024002400240" + "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" + "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" + "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" + "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" + "20003602000b2000418002490d022001200010d080808000410021014100410028" + "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" + "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" + "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" + "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" + "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" + "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" + "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b200128020821010c" + "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" + "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" + "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" + "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" + "0320013602082000200136020c2001200336020c200120003602080f0b02404100" + "280288a0c080002201450d00410021020340200241016a2102200128020822010d" + "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" + "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" + "02410036021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110aa80808000000b820301047f200028020c" + "21020240024002402001418002490d002000280218210302400240024020022000" + "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" + "002802082201200236020c200220013602080c010b200041146a200041106a2002" + "1b21040340200421052001220241146a200241106a200228021422011b21042002" + "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" + "28021c41027441809fc080006a22012802002000460d0020034110411420032802" + "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" + "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" + "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" + "102201450d0020022001360210200120023602180b20002802142201450d002002" + "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" + "28020422034101710d002003410271450d012000280200220320016a2101024020" + "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" + "20013602a0a2c0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a7808080000b02400240024002402002280204" + "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" + "0d0320022003417871220310a7808080002000200320016a220141017236020420" + "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" + "000f0b20022003417e7136020420002001410172360204200020016a2001360200" + "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" + "80006a2102024002404100280298a2c08000220341012001410376742201710d00" + "41002003200172360298a2c08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" + "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" + "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" + "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" + "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" + "4701017f23808080800041206b2200248080808000200041003602182000410136" + "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" + "80808000000b5601017f23808080800041206b2202248080808000200241106a20" + "0041106a290200370300200241086a200041086a290200370300200241013b011c" + "2002200136021820022000290200370300200210ac80808000000b110020003502" + "00410120011086808080000b5d01027f23808080800041206b2201248080808000" + "20002802182102200141106a200041106a290200370300200141086a200041086a" + "2902003703002001200036021c2001200236021820012000290200370300200110" + "d180808000000b490002402002418080c400460d00200020022001280210118180" + "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" + "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" + "808080800020022000360200200220013602042002410236020c200241f887c080" + "00360208200242023702142002418380808000ad4220862203200241046aad8437" + "0328200220032002ad843703202002200241206a360210200241086a419487c080" + "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" + "0022040d002003410171450d010b02402003410171450d00200120026a21050240" + "0240200028020c22060d0041002107200121080c010b4100210741002109200121" + "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" + "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" + "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" + "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" + "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" + "20031b21022003200120031b21010b024020040d00200028021420012002200028" + "021828020c11808080800080808080000f0b2000280204210a024020024110490d" + "0020022001200141036a417c7122076b22096a220b410371210441002106410021" + "03024020012007460d004100210302402009417c4b0d0041002103410021050340" + "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" + "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" + "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" + "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" + "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" + "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" + "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002004200d41f007716a210941002108200421030340200328" + "020c2207417f7341077620074106767241818284087120032802082207417f7341" + "077620074106767241818284087120032802042207417f73410776200741067672" + "41818284087120032802002207417f734107762007410676724181828408712008" + "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" + "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" + "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" + "03410676724181828408712103200c4101460d0220082802042207417f73410776" + "20074106767241818284087120036a2103200c4102460d0220082802082208417f" + "7341077620084106767241818284087120036a21030c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" + "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" + "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" + "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" + "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" + "0d000c030b0b200028021420012002200028021828020c11808080800080808080" + "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" + "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" + "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a210320002802102109200028021821082000280214" + "210703402003417f6a2203450d0220072009200828021011818080800080808080" + "00450d000b41010f0b200028021420012002200028021828020c11808080800080" + "808080000f0b0240200720012002200828020c1180808080008080808000450d00" + "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" + "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" + "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" + "36020c20032000360208200341b08dc08000360214200320013602102003410236" + "021c200341b183c08000360218024020022802000d002003410336025c200341e4" + "83c08000360258200342033702642003418180808000ad4220862204200341106a" + "ad8437034820032004200341086aad843703402003418280808000ad4220862003" + "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" + "808000000b200341206a41106a200241106a290200370300200341206a41086a20" + "0241086a290200370300200320022902003703202003410436025c2003419884c0" + "8000360258200342043702642003418180808000ad4220862204200341106aad84" + "37035020032004200341086aad843703482003418980808000ad42208620034120" + "6aad843703402003418280808000ad422086200341186aad843703382003200341" + "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" + "01200028020428020c11818080800080808080000b140020012000280200200028" + "020410af808080000b14002001280214200128021820001091808080000b220020" + "01280214418883c08000410e200128021828020c11808080800080808080000b60" + "01017f23808080800041306b22002480808080002000410136020c200041a883c0" + "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" + "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" + "057f017e23808080800041c0006b220524808080800041012106024020002d0004" + "0d0020002d0005210702402000280200220828021c22094104710d004101210620" + "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" + "28021828020c11808080800080808080000d012008280214200120022008280218" + "28020c11808080800080808080000d01200828021441ef97c08000410220082802" + "1828020c11808080800080808080000d0120032008200411818080800080808080" + "0021060c010b41012106024020074101710d00200828021441e984c08000410320" + "0828021828020c11808080800080808080000d01200828021c21090b4101210620" + "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" + "6a360214200520082902083702242008290200210a200520093602382005200828" + "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" + "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" + "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" + "84c080004102200528023428020c118080808000808080800021060b200041013a" + "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" + "6a2103200028020421042000280200210520002802082106410021074100210841" + "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" + "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" + "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" + "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" + "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" + "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" + "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" + "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" + "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" + "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" + "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" + "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" + "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" + "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" + "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" + "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" + "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" + "21070b20070b6001027f2000280204210220002802002103024020002802082200" + "2d0000450d00200341e084c080004104200228020c118080808000808080800045" + "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" + "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" + "41306b22032480808080002003200136020c200320003602082003410136021420" + "0341d490c080003602102003420137021c2003418280808000ad42208620034108" + "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" + "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" + "808080000b830201087f2380808080004180016b22022480808080002001280204" + "21032001280200210420002802002100200128021c220521060240200541047145" + "0d002005410872210620040d0020014281808080a0013702000b20012006410472" + "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" + "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" + "09450d000b02402007418101490d002007418001418885c08000108b8080800000" + "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" + "01200536021c200120033602042001200436020020024180016a24808080800020" + "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" + "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" + "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" + "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" + "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" + "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" + "006b22012480808080002001410636020c2001419498c08000360208024041002d" + "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" + "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" + "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" + "2003450d02200320032802002204417f6a3602002003290308210220044101470d" + "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" + "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" + "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" + "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" + "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" + "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" + "021041042103200141043a00182001200141106a360220200141186a41c08dc080" + "002000109180808000210020012d001821040240024020000d0042002102411720" + "0441ff0171764101710d01200128021c220328020021000240200341046a280200" + "22042802002205450d002000200511828080800080808080000b02402004280204" + "2204450d00200020041087808080000b2003410c108780808000410421030c010b" + "200441ff01714104460d032001290318220642807e8321022006a721030b200128" + "021022002000280208417f6a2204360208024020040d00200041003a000c200042" + "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" + "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" + "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" + "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" + "97c08000360228200142023702342001418c80808000ad422086200141106aad84" + "3703202001418280808000ad422086200141086aad843703182001200141186a36" + "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" + "6b22022480808080002002200036020c20024102360214200241a88bc080003602" + "102002420137021c2002418b8080800036022c2002200241286a36021820022002" + "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" + "808080000b200241306a2480808080000b4701017f23808080800041206b220024" + "8080808000200041003602182000410136020c200041bc90c08000360208200042" + "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" + "808080800041206b220024808080800041002d00b89ec080001a02400240024041" + "20109b808080002201450d00200141023602102001428180808010370300410029" + "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" + "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" + "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" + "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" + "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" + "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" + "41003a000020002802182202450d00200120021087808080000b02402000417f46" + "0d00200020002802042201417f6a36020420014101470d00200041201087808080" + "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" + "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" + "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" + "c08000410410af808080000be50301017f23808080800041c0006b220224808080" + "800002400240024002400240024020002d00000e0400010203000b200220002802" + "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" + "002800809bc08000360000200041086a41002900f89ac080003700002000410029" + "00f09ac08000370000200241143602102002200036020c20024114360208200241" + "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" + "86200241046aad843703202002418e80808000ad422086200241086aad84370318" + "2002200241186a36023020012802142001280218200241286a1091808080002100" + "20022802082201450d03200228020c20011087808080000c030b20002d00012100" + "2002410136022c200241d490c08000360228200242013702342002418280808000" + "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" + "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" + "02142001280218200241286a10918080800021000c020b20012000280204220028" + "0200200028020410af8080800021000c010b200028020422002802002001200028" + "0204280210118180808000808080800021000b200241c0006a2480808080002000" + "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" + "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" + "000240200141046a28020022022802002203450d00200020031182808080008080" + "8080000b024020022802042202450d00200020021087808080000b2001410c1087" + "808080000b0bf10101027f23808080800041206b22002480808080000240024002" + "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" + "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" + "410020013602d89ec08000410042808080808080013703d09ec080004100420037" + "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" + "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" + "200041003602182000410136020c200041bc9bc080003602082000420437021020" + "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" + "042480808080000240024002400240024020012802100d002001417f3602102003" + "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" + "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" + "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" + "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" + "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" + "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" + "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" + "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" + "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" + "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" + "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" + "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" + "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" + "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" + "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" + "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" + "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" + "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" + "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" + "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" + "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" + "2004410136020c2004418c91c0800036020820044204370210200441086a419491" + "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" + "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" + "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" + "80808000024020042d00084104460d00200020042903083702000c030b2001411c" + "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" + "066a210502402001280214200320066b22064b0d002000200141146a2005200610" + "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" + "002001411c6a20063602000b2001200128021041016a360210200441206a248080" + "8080000b7101027f20012802002104024020012802082205450d00200420056b20" + "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" + "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" + "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" + "0041106b2203248080808000200341086a20002802082802002001200210c98080" + "8000024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" + "046a28020022062802002207450d002001200711828080800080808080000b0240" + "20062802042206450d00200120061087808080000b2004410c1087808080000b20" + "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" + "23808080800041106b220224808080800020024100360204024002400240024020" + "01418001490d002001418010490d012001418080044f0d0220022001413f714180" + "01723a000620022001410c7641e001723a000420022001410676413f7141800172" + "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" + "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" + "418001723a00072002200141127641f001723a000420022001410676413f714180" + "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" + "00280208280200200241046a200110c980808000024020022d000822014104460d" + "0020002802042103200229030821040240024020002d0000220541044b0d002005" + "4103470d010b200328020021050240200341046a28020022062802002207450d00" + "2005200711828080800080808080000b024020062802042206450d002005200610" + "87808080000b2003410c1087808080000b200020043702000b200241106a248080" + "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" + "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" + "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" + "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" + "012002742204710d0020032000360200200020033602182000200036020c200020" + "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" + "200328020022042802044178712001470d00200421020c010b2001410041192002" + "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" + "002202450d02200341017421032002210420022802044178712001470d000b0b20" + "022802082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20002000" + "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" + "8080808000200028020c2102024002400240024020002802040e020001020b2002" + "0d0141012102410021030c020b20020d0020002802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c2001418f8080800020" + "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" + "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" + "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" + "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" + "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" + "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" + "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" + "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" + "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" + "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" + "0c010b2000410020006b41037122046a210502402004450d002000210320012106" + "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" + "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" + "0020084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a28020021060340200520062002762001280200220620" + "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" + "480d0020092101034020052001280200360200200141046a2101200541046a2205" + "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" + "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" + "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" + "067e22072003422088220820067e22062005200142208822097e7c22054220867c" + "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" + "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" + "00000c000000040000001200000013000000140000000000000000000000010000" + "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" + "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" + "2f6332663734633366393238616562353033663135623465396566353737386537" + "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" + "2e727300005f0010004b000000060a00000e000000000000000100000001000000" + "16000000170000001400000004000000180000004572726f72557466384572726f" + "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" + "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" + "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" + "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" + "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" + "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" + "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" + "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" + "000000da0110000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000b301100010000000fc011000100000000c02100009000000da0110" + "00090000000100000000000000ef0b100002000000000000000c00000004000000" + "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" + "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" + "000030783030303130323033303430353036303730383039313031313132313331" + "343135313631373138313932303231323232333234323532363237323832393330" + "333133323333333433353336333733383339343034313432343334343435343634" + "373438343935303531353235333534353535363537353835393630363136323633" + "363436353636363736383639373037313732373337343735373637373738373938" + "303831383238333834383538363837383838393930393139323933393439353936" + "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" + "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" + "00000900000072616e676520737461727420696e64657820206f7574206f662072" + "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" + "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" + "031000220000000101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000020202020202020202020202020202020202020202020202020202020202" + "030303030303030303030303030303030404040404000000000000000000000000" + "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" + "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" + "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" + "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" + "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" + "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" + "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" + "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" + "000000690000001600000042616c616e636500b8051000360000007e0000001600" + "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" + "633266373463336639323861656235303366313562346539656635373738653737" + "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" + "652e72730000004c0610004d000000230100004200000000000000000000000400" + "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" + "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" + "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" + "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" + "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" + "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" + "206973206e6f7420706f737369626c652061667465722074686520746872656164" + "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" + "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" + "130000006661696c656420746f2067656e657261746520756e6971756520746872" + "6561642049443a2062697473706163652065786861757374656400040810003700" + "0000de07100015000000c40400000d00000001000000000000007374642f737263" + "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e000081081000090000005c081000250000000f0100002900000065" + "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" + "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" + "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" + "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" + "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" + "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" + "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" + "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" + "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" + "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" + "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" + "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" + "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" + "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" + "7267657265736f75726365206275737965786563757461626c652066696c652062" + "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" + "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" + "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" + "20696e746572727570746564756e737570706f72746564756e6578706563746564" + "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" + "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" + "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" + "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" + "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" + "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" + "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" + "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" + "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" + "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" + "65637572736976656c792061637175697265206d757465789c0c10002000000073" + "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" + "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" + "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" + "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" + "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" + "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" + "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" + "726d6564207265637572736976656c79840d100038000000100000001100000012" + "000000100000001000000013000000120000000d0000000e000000150000000c00" + "00000b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a000000100000001700000019000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600000015" + "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" + "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" + "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" + "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" + "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" + "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" + "000b000000040000004305100048051000540510005f0510006a05100000c62e04" + "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" + "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" + "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" + "6c6962313067657454784669656c64313768623836623962643665383439353163" + "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" + "43757272656e744c6564676572456e7472794669656c6431376861346138303037" + "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" + "6c696231396765744c6564676572456e7472794669656c64313768633661326634" + "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" + "5f6c69623139676574506172656e744c656467657254696d653137683731643366" + "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" + "696e745f6e756d626572313768343432633966366462343461613636374506305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" + "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" + "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" + "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" + "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" + "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376833326438343961303132376564636461450b445f" + "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" + "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" + "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" + "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" + "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683562646335303561663532336432393945" + "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" + "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" + "7a652447542433666d7431376836336361623039386234313233343130450f465f" + "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" + "63745f6669656c64325f66696e6973683137683135666166363733326663303964" + "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" + "313768396461663134643536353865323530364511265f5a4e34636f726533666d" + "743577726974653137683933353534653462653731663263376145124c5f5a4e34" + "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67244754243137683230373631353664386431" + "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" + "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" + "7224475424313768323066303937633266353863396661374514525f5a4e35335f" + "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" + "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" + "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" + "577269746524475424313077726974655f63686172313768323134333931636238" + "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" + "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" + "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" + "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" + "6573657276655f616e645f68616e646c6531376862356335336362636666396436" + "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" + "4754243977726974655f7374723137683539396439653537383934366464393845" + "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" + "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" + "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" + "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" + "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" + "6563313268616e646c655f6572726f723137683937623764626430663732646437" + "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" + "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683132313861313631643933363438653945" + "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" + "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768613636623539636339336533383537344520615f" + "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" + "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768633837363633386165616230633031664521475f" + "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376839393432316563653462383633" + "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" + "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" + "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" + "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" + "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" + "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" + "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" + "653970616e69636b696e673570616e696331376830346565623931376464393363" + "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" + "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" + "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" + "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" + "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" + "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" + "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" + "6b696e673970616e69635f666d7431376836353430636362326435666463336162" + "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" + "753230247533322447542433666d74313768626633653032323834383365333735" + "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" + "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" + "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" + "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" + "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" + "4e34636f726533666d7439466f726d617474657233706164313768343736396165" + "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" + "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" + "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" + "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" + "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" + "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" + "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" + "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" + "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" + "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" + "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" + "72656164795f626f72726f77656431376833313462353261316263343662666534" + "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" + "72756374356669656c64313768333531353864666637643465616633354537675f" + "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" + "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" + "7465244754243977726974655f7374723137683831386234396537653639613236" + "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" + "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" + "742e2e577269746524475424313077726974655f63686172313768393437396266" + "363162306130356661314539305f5a4e34636f726533666d743557726974653977" + "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" + "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" + "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" + "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" + "706c61792475323024666f7224753230246933322447542433666d743137686365" + "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" + "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376834366435353230663839333131346633453d0861" + "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" + "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" + "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" + "73746564313768333336626637613134383830343463384541425f5a4e34636f72" + "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" + "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" + "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" + "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" + "653970616e69636b696e6731336173736572745f6661696c656431376832333236" + "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768653138373433383865303762666532354545595f5a4e36305f244c542473" + "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" + "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" + "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" + "2e2e446973706c61792447542433666d7431376863653432323661613166373236" + "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" + "242447542424475424313768313636646336316162303333346331654548495f5a" + "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" + "2454244754243130696e697469616c697a65313768376635633530386461396531" + "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" + "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" + "697465244754243977726974655f616c6c31376832346238323631303436316432" + "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" + "65723138427566577269746572244c54245724475424313477726974655f616c6c" + "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c54245424475424247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376837666163663562" + "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" + "726974655f6368617231376866306233626531656331396465356537454d305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376866383830" + "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" + "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" + "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" + "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" + "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" + "645f73686f72745f6261636b747261636531376834646333646534376432323032" + "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" + "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" + "37642424753764243137686531376133393737663839633131373845533b5f5a4e" + "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" + "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" + "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" + "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" + "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" + "735f737472313768656233663732326432323465343266384555066d656d636d70" + "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" + "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d627901057275737463" + "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" + "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" + "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" + "797065732b087369676e2d657874"; + // let sender = get_tx_account_id(); + // let owner = get_current_escrow_account_id(); + // let dest = get_current_escrow_destination(); + // let dest_balance = get_account_balance(dest); + // let escrow_data = get_current_escrow_data(); + // let ed_str = String::from_utf8(escrow_data).unwrap(); + // let threshold_balance = ed_str.parse::().unwrap(); + // let pl_time = host_lib::getParentLedgerTime(); + // let e_time = get_current_escrow_finish_after(); + // sender == owner && dest_balance <= threshold_balance && + // pl_time >= e_time + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + // basic FinishFunction situation + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 11s), + cancel_time(env.now() + 100s), + data("1000000000"), // 1000 XRP in drops + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // FinishAfter time hasn't passed + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecNO_PERMISSION)); + env.close(); + + // tx sender not escrow creator (alice) + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + + // destination balance is too high + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + + env.close(); + + // reduce the destination balance + env(pay(carol, alice, XRP(4500))); + env.close(); + + // tx sender not escrow creator (alice) + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + + env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + } + void run() override { @@ -2039,6 +3228,7 @@ struct Escrow_test : public beast::unit_test::suite testCredentials(); testFinishFunctionPreflight(); testFinishFunction(); + testAllHostFunctions(); } }; diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 16bb966317..8a5e30a001 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -372,6 +372,32 @@ public: } }; +struct data +{ +private: + std::string value_; + +public: + explicit data(std::string func) : value_(func) + { + } + + explicit data(Slice const& func) : value_(strHex(func)) + { + } + + template + explicit data(std::array const& f) : data(makeSlice(f)) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfData.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/xrpld/app/misc/AMMUtils.h b/src/xrpld/app/misc/AMMUtils.h index ebc2834109..b2c0007dc7 100644 --- a/src/xrpld/app/misc/AMMUtils.h +++ b/src/xrpld/app/misc/AMMUtils.h @@ -17,8 +17,8 @@ */ //============================================================================== -#ifndef RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED -#define RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED +#ifndef RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED +#define RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED #include @@ -127,4 +127,4 @@ isOnlyLiquidityProvider( } // namespace ripple -#endif // RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED +#endif // RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 9ecbe22f31..fe1b02a53b 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include "xrpld/app/misc/WasmHostFuncImpl.h" +#include -#include "xrpl/protocol/digest.h" +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index d1e14e4246..796c1ee6bb 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2023 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 89eace193a..055fbc1499 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -588,7 +588,8 @@ EscrowFinish::doApply() WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, 100000); + std::uint32_t gasLimit = ctx_.app.config().FEES.extension_compute_limit; + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, gasLimit); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From f37d52d8e95ab2c819f230007b5c476f911be39f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 24 Apr 2025 08:47:13 -0400 Subject: [PATCH 05/15] Set up fees for WASM processing (#5393) * set up fields * throw error if allowance is too high * votable gas price * fix comments * hook everything together * make test less flaky (hopefully) * fix other tests * fix some tests * fix tests * clean up * add more tests * uncomment other tests * respond to comments * fix build * respond to comments --- cfg/rippled-example.cfg | 11 +- include/xrpl/protocol/Fees.h | 3 + include/xrpl/protocol/TER.h | 2 + .../xrpl/protocol/detail/ledger_entries.macro | 1 + include/xrpl/protocol/detail/sfields.macro | 2 + .../xrpl/protocol/detail/transactions.macro | 6 +- include/xrpl/protocol/jss.h | 1 + src/libxrpl/protocol/STValidation.cpp | 1 + src/libxrpl/protocol/TER.cpp | 2 + src/test/app/Escrow_test.cpp | 211 ++++++++++++++++-- src/test/app/FeeVote_test.cpp | 17 +- src/test/app/PseudoTx_test.cpp | 1 + src/test/jtx/TestHelpers.h | 17 ++ src/test/jtx/impl/envconfig.cpp | 3 + src/xrpld/app/ledger/Ledger.cpp | 11 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 9 +- src/xrpld/app/misc/NetworkOPs.cpp | 7 + src/xrpld/app/tx/detail/Change.cpp | 7 +- src/xrpld/app/tx/detail/Escrow.cpp | 72 +++++- src/xrpld/core/Config.h | 3 + src/xrpld/core/detail/Config.cpp | 2 + 21 files changed, 342 insertions(+), 47 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 7affa212ab..6da6841052 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1271,8 +1271,17 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_compute_limit = 2000000 # 2 million gas +# extension_size_limit = 2000000 # 2 mb # +# gas_price = +# +# The gas price is the conversion between WASM gas and its price in drops. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# gas_price = 2000000 # 2 drops per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index a89bd4e486..1a1ecacb36 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -24,6 +24,8 @@ namespace ripple { +constexpr std::uint32_t MICRO_DROPS_PER_DROP{1'000'000}; + /** Reflects the fee settings for a particular ledger. The fees are always the same for any transactions applied @@ -37,6 +39,7 @@ struct Fees std::uint32_t extensionComputeLimit{ 0}; // Extension compute limit (instructions) std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) + std::uint32_t gasPrice{0}; // price of WASM gas (micro-drops) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 4f544963f0..caf05daf76 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -185,6 +185,8 @@ enum TEFcodes : TERUnderlyingType { tefNO_TICKET, tefNFTOKEN_IS_NOT_TRANSFERABLE, tefINVALID_LEDGER_FIX_TYPE, + tefNO_WASM, + tefWASM_FIELD_NOT_INCLUDED, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 2d4a3453ea..08849f0fa6 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -319,6 +319,7 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ // New fields {sfExtensionComputeLimit, soeOPTIONAL}, {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 42a706c4de..65a4bfcbc1 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -114,6 +114,8 @@ TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 52) TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 53) +TYPED_SFIELD(sfGasPrice, UINT32, 54) +TYPED_SFIELD(sfComputationAllowance, UINT32, 55) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index 19c31d439b..f9d70ea6db 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -59,6 +59,7 @@ TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, ({ {sfFulfillment, soeOPTIONAL}, {sfCondition, soeOPTIONAL}, {sfCredentialIDs, soeOPTIONAL}, + {sfComputationAllowance, soeOPTIONAL}, })) @@ -490,8 +491,9 @@ TRANSACTION(ttFEE, 101, SetFee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, - {sfExtensionComputeLimit, soeOPTIONAL}, - {sfExtensionSizeLimit, soeOPTIONAL}, + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index fa34cf800b..96aefb0788 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -267,6 +267,7 @@ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info JSS(extension_compute); // out: NetworkOps JSS(extension_size); // out: NetworkOps +JSS(gas_price); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 948a47f0ac..3a9d16445e 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -81,6 +81,7 @@ STValidation::validationFormat() // featureSmartEscrow {sfExtensionComputeLimit, soeOPTIONAL}, {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, }; // clang-format on diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 3766f33c54..6a2387035b 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -147,6 +147,8 @@ transResults() MAKE_ERROR(tefNO_TICKET, "Ticket is not in ledger."), MAKE_ERROR(tefNFTOKEN_IS_NOT_TRANSFERABLE, "The specified NFToken is not transferable."), MAKE_ERROR(tefINVALID_LEDGER_FIX_TYPE, "The LedgerFixType field has an invalid value."), + MAKE_ERROR(tefNO_WASM, "There is no WASM code to run, but a WASM-specific field was included."), + MAKE_ERROR(tefWASM_FIELD_NOT_INCLUDED, "WASM code requires a field to be included that was not included."), MAKE_ERROR(telLOCAL_ERROR, "Local failure."), MAKE_ERROR(telBAD_DOMAIN, "Domain too long."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6c0e32179e..6b25da6363 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1659,7 +1659,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishFunctionPreflight() + testCreateFinishFunctionPreflight() { testcase("Test preflight checks involving FinishFunction"); @@ -1703,12 +1703,37 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } - Env env(*this); + { + // FinishFunction > max length + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + })); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow(alice, carol, XRP(500)); + + // 11-byte string + std::string longWasmHex = "00112233445566778899AA"; + env(escrowCreate, + finish_function(longWasmHex), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + })); XRPAmount const txnFees = env.current()->fees().base + 1000; // create escrow env.fund(XRP(5000), alice, carol); - auto escrowCreate = escrow(alice, carol, XRP(1000)); + auto escrowCreate = escrow(alice, carol, XRP(500)); // Success situations { @@ -1794,23 +1819,132 @@ struct Escrow_test : public beast::unit_test::suite ter(temMALFORMED)); env.close(); } - // { - // // FinishFunction > max length - // std::string longWasmHex = "00"; - // // TODO: fix to use the config setting - // // TODO: make this test more efficient - // // uncomment when that's done - // for (int i = 0; i < 4294967295; i++) - // { - // longWasmHex += "11"; - // } - // env(escrowCreate, - // finish_function(longWasmHex), - // cancel_time(env.now() + 100s), - // fee(txnFees), - // ter(temMALFORMED)); - // env.close(); + } + + void + testFinishWasmFailures() + { + testcase("EscrowFinish Smart Escrow failures"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5} // } + static auto wasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; + + { + // featureSmartEscrow disabled + Env env(*this, supported_amendments() - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + env(finish(carol, alice, 1), + fee(txnFees), + comp_allowance(110), + ter(temDISABLED)); + env.close(); + } + + { + // ComputationAllowance > max compute limit + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + })); + env.fund(XRP(5000), alice, carol); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + auto const allowance = 1'001; + env(finish(carol, alice, 1), + fee(env.current()->fees().base + allowance), + comp_allowance(allowance), + ter(temBAD_LIMIT)); + } + + Env env(*this); + + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + XRPAmount const txnFees = env.current()->fees().base + 1000; + env.fund(XRP(5000), alice, carol); + + // create escrow + auto const seq = env.seq(alice); + env(escrow(alice, carol, XRP(500)), + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + { + // no ComputationAllowance field + env(finish(carol, alice, seq), ter(tefWASM_FIELD_NOT_INCLUDED)); + } + + { + // not enough fees + // This function takes 110 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 109; + env(finish(carol, alice, seq), + fee(finishFee), + comp_allowance(110), + ter(telINSUF_FEE_P)); + } + + { + // not enough gas + // This function takes 110 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 108; + env(finish(carol, alice, seq), + fee(finishFee), + comp_allowance(108), + ter(tecFAILED_PROCESSING)); + } + + { + // ComputationAllowance field included w/no FinishFunction on + // escrow + auto const seq2 = env.seq(alice); + env(escrow(alice, carol, XRP(500)), + finish_time(env.now() + 10s), + cancel_time(env.now() + 100s)); + env.close(); + + auto const allowance = 100; + env(finish(carol, alice, seq2), + fee(env.current()->fees().base + allowance), + comp_allowance(allowance), + ter(tefNO_WASM)); + } } void @@ -1865,22 +1999,30 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(carol, XRP(5000))); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); - env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(alice, alice, seq), + fee(txnFees), + comp_allowance(110), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -1910,29 +2052,34 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(finish(carol, alice, seq), condition(cb1), fulfillment(fb1), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // no fulfillment provided, function succeeds env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb2), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb1), + comp_allowance(110), fee(txnFees), ter(tesSUCCESS)); env.close(); @@ -1965,16 +2112,19 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 1), ter(tesSUCCESS)); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2004,17 +2154,22 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // finish time has passed, function succeeds, tx succeeds - env(finish(carol, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(carol, alice, seq), + comp_allowance(110), + fee(txnFees), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -3175,19 +3330,24 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); + auto const allowance = 40'000; + // FinishAfter time hasn't passed env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // tx sender not escrow creator (alice) env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); // destination balance is too high env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); @@ -3199,11 +3359,15 @@ struct Escrow_test : public beast::unit_test::suite // tx sender not escrow creator (alice) env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); - env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(alice, alice, seq), + comp_allowance(allowance), + fee(txnFees), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -3226,7 +3390,8 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(); testEscrowWithTickets(); testCredentials(); - testFinishFunctionPreflight(); + testCreateFinishFunctionPreflight(); + testFinishWasmFailures(); testFinishFunction(); testAllHostFunctions(); } diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 73bb539a22..8e333b27ea 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -43,6 +43,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; @@ -51,13 +52,15 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = 1234567", "owner_reserve = 1234", "extension_compute_limit = 100", - "extension_size_limit = 200"}); + "extension_size_limit = 200", + " gas_price = 300"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); BEAST_EXPECT(setup.extension_compute_limit == 100); BEAST_EXPECT(setup.extension_size_limit == 200); + BEAST_EXPECT(setup.gas_price == 300); } { Section config; @@ -66,7 +69,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = yada", "owner_reserve = foo", "extension_compute_limit = bar", - "extension_size_limit = baz"}); + "extension_size_limit = baz", + "gas_price = qux"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -78,6 +82,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; @@ -86,7 +91,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = -1234567", "owner_reserve = -1234", "extension_compute_limit = -100", - "extension_size_limit = -200"}); + "extension_size_limit = -200", + "gas_price = -300"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -99,6 +105,7 @@ class FeeVote_test : public beast::unit_test::suite static_cast(-100)); BEAST_EXPECT( setup.extension_size_limit == static_cast(-200)); + BEAST_EXPECT(setup.gas_price == static_cast(-300)); } { const auto big64 = std::to_string( @@ -111,7 +118,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = " + big64, "owner_reserve = " + big64, "extension_compute_limit = " + big64, - "extension_size_limit = " + big64}); + "extension_size_limit = " + big64, + "gas_price = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -123,6 +131,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 1101f56c69..0ba7b0e5ba 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -54,6 +54,7 @@ struct PseudoTx_test : public beast::unit_test::suite { obj[sfExtensionComputeLimit] = 0; obj[sfExtensionSizeLimit] = 0; + obj[sfGasPrice] = 0; } })); diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 8a5e30a001..b77b00b00c 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -398,6 +398,23 @@ public: } }; +struct comp_allowance +{ +private: + std::uint32_t value_; + +public: + explicit comp_allowance(std::uint32_t const& value) : value_(value) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfComputationAllowance.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index b94c79ccb8..ab0969c6cb 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -33,11 +33,14 @@ setupConfigForUnitTests(Config& cfg) using namespace jtx; // Default fees to old values, so tests don't have to worry about changes in // Config.h + // NOTE: For new `FEES` fields, you need to wait for the first flag ledger + // to close for the values to be activated. cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); cfg.FEES.extension_compute_limit = 4294967295; cfg.FEES.extension_size_limit = 4294967295; + cfg.FEES.gas_price = 1000000; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index d3c59fbeb6..d9a0dce151 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -228,6 +228,7 @@ Ledger::Ledger( sle->at(sfExtensionComputeLimit) = config.FEES.extension_compute_limit; sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + sle->at(sfGasPrice) = config.FEES.gas_price; } rawInsert(sle); } @@ -659,6 +660,7 @@ Ledger::setup() auto const extensionComputeLimit = sle->at(~sfExtensionComputeLimit); auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + auto const gasPrice = sle->at(~sfGasPrice); auto assign = [](std::uint32_t& dest, std::optional const& src) { @@ -669,7 +671,9 @@ Ledger::setup() }; assign(fees_.extensionComputeLimit, extensionComputeLimit); assign(fees_.extensionSizeLimit, extensionSizeLimit); - extensionFees = extensionComputeLimit || extensionSizeLimit; + assign(fees_.gasPrice, gasPrice); + extensionFees = + extensionComputeLimit || extensionSizeLimit || gasPrice; } if (oldFees && newFees) // Should be all of one or the other, but not both @@ -701,7 +705,8 @@ Ledger::defaultFees(Config const& config) { assert( fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && - fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0); + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0 && + fees_.gasPrice == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) @@ -710,6 +715,8 @@ Ledger::defaultFees(Config const& config) fees_.extensionComputeLimit = config.FEES.extension_compute_limit; if (fees_.extensionSizeLimit == 0) fees_.extensionSizeLimit = config.FEES.extension_size_limit; + if (fees_.gasPrice == 0) + fees_.gasPrice = config.FEES.gas_price; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index e312ab042f..6c6e2f0865 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -216,6 +216,7 @@ FeeVoteImpl::doValidation( target_.extension_size_limit, "extension size limit", sfExtensionSizeLimit); + vote(lastFees.gasPrice, target_.gas_price, "gas price", sfGasPrice); } } @@ -247,6 +248,9 @@ FeeVoteImpl::doVoting( lastClosedLedger->fees().extensionSizeLimit, target_.extension_size_limit); + detail::VotableValue gasPriceVote( + lastClosedLedger->fees().gasPrice, target_.gas_price); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { @@ -332,6 +336,7 @@ FeeVoteImpl::doVoting( continue; doVote(val, extensionComputeVote, sfExtensionComputeLimit); doVote(val, extensionSizeVote, sfExtensionSizeLimit); + doVote(val, gasPriceVote, sfGasPrice); } } @@ -344,12 +349,13 @@ FeeVoteImpl::doVoting( auto const incReserve = incReserveVote.getVotes(); auto const extensionCompute = extensionComputeVote.getVotes(); auto const extensionSize = extensionSizeVote.getVotes(); + auto const gasPrice = gasPriceVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position if (baseFee.second || baseReserve.second || incReserve.second || - extensionCompute.second || extensionSize.second) + extensionCompute.second || extensionSize.second || gasPrice.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -381,6 +387,7 @@ FeeVoteImpl::doVoting( { obj[sfExtensionComputeLimit] = extensionCompute.first; obj[sfExtensionSizeLimit] = extensionSize.first; + obj[sfGasPrice] = gasPrice.first; } }); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index b721c80bfd..049a47bc23 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2295,6 +2295,9 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) extensionSizeLimit) jvObj[jss::extension_size] = *extensionSizeLimit; + if (auto const gasPrice = ~val->at(~sfGasPrice); gasPrice) + jvObj[jss::gas_price] = *gasPrice; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2758,6 +2761,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); @@ -2773,6 +2777,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; } if (auto const closeOffset = app_.timeKeeper().closeOffset(); @@ -2965,6 +2970,7 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().extensionComputeLimit; jvObj[jss::extension_size] = lpAccepted->fees().extensionSizeLimit; + jvObj[jss::gas_price] = lpAccepted->fees().gasPrice; } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -4007,6 +4013,7 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + jvResult[jss::gas_price] = lpClosed->fees().gasPrice; } } diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index e40e61ff94..7d84e003fb 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -133,13 +133,15 @@ Change::preclaim(PreclaimContext const& ctx) if (ctx.view.rules().enabled(featureSmartEscrow)) { if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || - !ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + !ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + !ctx.tx.isFieldPresent(sfGasPrice)) return temMALFORMED; } else { if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || - ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + ctx.tx.isFieldPresent(sfGasPrice)) return temDISABLED; } return tesSUCCESS; @@ -393,6 +395,7 @@ Change::applyFee() { set(feeObject, ctx_.tx, sfExtensionComputeLimit); set(feeObject, ctx_.tx, sfExtensionSizeLimit); + set(feeObject, ctx_.tx, sfGasPrice); } view().update(feeObject); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 055fbc1499..ab91274326 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -34,6 +34,8 @@ #include #include +#include + // During an EscrowFinish, the transaction must specify both // a condition and a fulfillment. We track whether that // fulfillment matches and validates the condition. @@ -361,6 +363,13 @@ EscrowFinish::preflight(PreflightContext const& ctx) !ctx.rules.enabled(featureCredentials)) return temDISABLED; + if (ctx.tx.isFieldPresent(sfComputationAllowance) && + !ctx.rules.enabled(featureSmartEscrow)) + { + JLOG(ctx.j.debug()) << "SmartEscrow not enabled"; + return temDISABLED; + } + if (auto const ret = preflight1(ctx); !isTesSuccess(ret)) return ret; @@ -402,6 +411,16 @@ EscrowFinish::preflight(PreflightContext const& ctx) } } + if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) + { + if (*allowance > ctx.app.config().FEES.extension_compute_limit) + { + JLOG(ctx.j.debug()) + << "ComputationAllowance too large: " << *allowance; + return temBAD_LIMIT; + } + } + if (auto const err = credentials::checkFields(ctx); !isTesSuccess(err)) return err; @@ -417,8 +436,10 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } - // TODO: make this fee increase based on the extra compute run - + if (auto const allowance = tx[~sfComputationAllowance]; allowance) + { + extraFee += (*allowance) * view.fees().gasPrice / MICRO_DROPS_PER_DROP; + } return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -428,6 +449,34 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) if (!ctx.view.rules().enabled(featureCredentials)) return Transactor::preclaim(ctx); + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + // this check is done in doApply before this amendment is enabled + auto const k = keylet::escrow(ctx.tx[sfOwner], ctx.tx[sfOfferSequence]); + auto const slep = ctx.view.read(k); + if (!slep) + return tecNO_TARGET; + + if (slep->isFieldPresent(sfFinishFunction)) + { + if (!ctx.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(ctx.j.debug()) + << "FinishFunction requires ComputationAllowance"; + return tefWASM_FIELD_NOT_INCLUDED; + } + } + else + { + if (ctx.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(ctx.j.debug()) << "FinishFunction not present, " + "ComputationAllowance present"; + return tefNO_WASM; + } + } + } + if (auto const err = credentials::valid(ctx, ctx.tx[sfAccount]); !isTesSuccess(err)) return err; @@ -441,7 +490,8 @@ EscrowFinish::doApply() auto const k = keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); auto const slep = ctx_.view().peek(k); if (!slep) - return tecNO_TARGET; + return ctx_.view().rules().enabled(featureSmartEscrow) ? tecINTERNAL + : tecNO_TARGET; // Order of processing the release conditions (in order of performance): // FinishAfter/CancelAfter @@ -579,17 +629,15 @@ EscrowFinish::doApply() std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("ready"); - auto const escrowTx = - ctx_.tx.getJson(JsonOptions::none).toStyledString(); - auto const escrowObj = - slep->getJson(JsonOptions::none).toStyledString(); - std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); - std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); - WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - std::uint32_t gasLimit = ctx_.app.config().FEES.extension_compute_limit; - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, gasLimit); + if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) + { + // already checked above, this check is just in case + return tecINTERNAL; + } + std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 8e29ecdcf4..4b297c8610 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -79,6 +79,9 @@ struct FeeSetup /** The WASM size limit for Feature Extensions. */ std::uint32_t extension_size_limit{4294967295}; + /** The price of 1 WASM gas, in micro-drops. */ + std::uint32_t gas_price{1000000}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index fb4a4aab21..97d6d5fd9d 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1108,6 +1108,8 @@ setup_FeeVote(Section const& section) setup.extension_compute_limit = temp; if (set(temp, "extension_size_limit", section)) setup.extension_size_limit = temp; + if (set(temp, "gas_price", section)) + setup.gas_price = temp; } return setup; } From f8b2fe4dd5f24f6b91b727147e21017bc43f66d3 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 28 Apr 2025 17:43:15 -0400 Subject: [PATCH 06/15] fix imports --- src/xrpld/rpc/handlers/PayChanClaim.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xrpld/rpc/handlers/PayChanClaim.cpp b/src/xrpld/rpc/handlers/PayChanClaim.cpp index 084f41db85..b62f5e54e5 100644 --- a/src/xrpld/rpc/handlers/PayChanClaim.cpp +++ b/src/xrpld/rpc/handlers/PayChanClaim.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include #include From f03b5883bd87440bdc4d2996d8e3bcc5a84e8dad Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 12:39:12 -0400 Subject: [PATCH 07/15] More host functions (#5411) * getNFT * escrow keylet * account keylet * credential keylet * oracle keylet * hook everything in * fix stuff --- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 115 +++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 19 ++ src/xrpld/app/misc/WasmVM.cpp | 241 ++++++++++++++++++++++++ src/xrpld/app/misc/WasmVM.h | 33 ++++ 4 files changed, 408 insertions(+) diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index fe1b02a53b..0383b15662 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include #include @@ -98,6 +99,33 @@ WasmHostFunctionsImpl::getCurrentLedgerEntryField(const std::string& fname) return std::nullopt; } +std::optional +WasmHostFunctionsImpl::getNFT( + const std::string& account, + const std::string& nftId) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + uint256 nftHash; + if (!nftHash.parseHex(nftId)) + { + return std::nullopt; + } + + auto jv = nft::findToken(ctx.view(), accountId.value(), nftHash); + if (!jv) + { + return std::nullopt; + } + + Slice const s = (*jv)[sfURI]; + return Bytes{s.begin(), s.end()}; +} + bool WasmHostFunctionsImpl::updateData(const Bytes& data) { @@ -115,4 +143,91 @@ WasmHostFunctionsImpl::computeSha512HalfHash(const Bytes& data) auto const hash = sha512Half(data); return uint256::fromVoid(hash.data()); } + +std::optional +WasmHostFunctionsImpl::accountKeylet(const std::string& account) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::account(*accountId).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::credentialKeylet( + const std::string& subject, + const std::string& issuer, + const std::string& credentialType) +{ + auto const subjectId = parseBase58(subject); + if (!subjectId || subjectId->isZero()) + { + return std::nullopt; + } + + auto const issuerId = parseBase58(issuer); + if (!issuerId || issuerId->isZero()) + { + return std::nullopt; + } + + auto keylet = + keylet::credential(*subjectId, *issuerId, makeSlice(credentialType)) + .key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::escrowKeylet( + const std::string& account, + const std::uint32_t& seq) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::escrow(*accountId, seq).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::oracleKeylet( + const std::string& account, + const std::uint32_t& documentId) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::oracle(*accountId, documentId).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a311073d7b..aa42f79ff6 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -54,12 +54,31 @@ public: std::optional getCurrentLedgerEntryField(std::string const& fname) override; + std::optional + getNFT(std::string const& account, std::string const& nftId) override; + bool updateData(Bytes const& data) override; Hash computeSha512HalfHash(Bytes const& data) override; + std::optional + accountKeylet(std::string const& account) override; + + std::optional + credentialKeylet( + std::string const& subject, + std::string const& issuer, + std::string const& credentialType) override; + + std::optional + escrowKeylet(std::string const& account, std::uint32_t const& seq) override; + + std::optional + oracleKeylet(std::string const& account, std::uint32_t const& documentId) + override; + private: ApplyContext& ctx; Keylet leKey; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 22ac65479f..1764734db3 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -220,6 +220,148 @@ getCurrentLedgerEntryField( return WasmEdge_Result_Success; } +WasmEdge_Result +getNFT( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto nftId = getFieldName(fm, in, 2); + if (!nftId) + return nftId.error(); + + auto nftURI = + ((HostFunctions*)data)->getNFT(account.value(), nftId.value()); + if (!nftURI) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, nftURI.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +accountKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto keylet = ((HostFunctions*)data)->accountKeylet(account.value()); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +credentialKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto subject = getFieldName(fm, in, 0); + if (!subject) + return subject.error(); + + auto issuer = getFieldName(fm, in, 2); + if (!issuer) + return issuer.error(); + + auto credentialType = getFieldName(fm, in, 4); + if (!credentialType) + return credentialType.error(); + + auto keylet = + ((HostFunctions*)data) + ->credentialKeylet( + subject.value(), issuer.value(), credentialType.value()); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +escrowKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto sequence = WasmEdge_ValueGetI32(in[2]); + + auto keylet = + ((HostFunctions*)data)->escrowKeylet(account.value(), sequence); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +oracleKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto documentId = WasmEdge_ValueGetI32(in[2]); + + auto keylet = + ((HostFunctions*)data)->escrowKeylet(account.value(), documentId); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + WasmEdge_Result updateData( void* data, @@ -393,6 +535,25 @@ runEscrowWasm( WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); // WasmEdge_StringDelete(fName); } + // getNFT + { + WasmEdge_ValType inputList[4] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate(hostFuncType, getNFT, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = WasmEdge_StringCreateByCString("getNFT"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } // updateData { WasmEdge_ValType inputList[2] = { @@ -428,6 +589,86 @@ runEscrowWasm( WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); // WasmEdge_StringDelete(fName); } + // accountKeylet + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, accountKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("accountKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // credentialKeylet + { + WasmEdge_ValType inputList[6] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 6, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, credentialKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + WasmEdge_String fName = + WasmEdge_StringCreateByCString("credentialKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // escrowKeylet + { + WasmEdge_ValType inputList[3] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, escrowKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("escrowKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // oracleKeylet + { + WasmEdge_ValType inputList[3] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, oracleKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("oracleKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } // print { WasmEdge_ValType inputList[2] = { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 796c1ee6bb..b0839dc76d 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -74,6 +74,12 @@ struct HostFunctions return Bytes{}; } + virtual std::optional + getNFT(std::string const& account, std::string const& nftId) + { + return Bytes{}; + } + virtual bool updateData(Bytes const& data) { @@ -86,6 +92,33 @@ struct HostFunctions return Hash{}; } + virtual std::optional + accountKeylet(std::string const& account) + { + return Bytes{}; + } + + virtual std::optional + credentialKeylet( + std::string const& subject, + std::string const& issuer, + std::string const& credentialType) + { + return Bytes{}; + } + + virtual std::optional + escrowKeylet(std::string const& account, std::uint32_t const& seq) + { + return Bytes{}; + } + + virtual std::optional + oracleKeylet(std::string const& account, std::uint32_t const& docId) + { + return Bytes{}; + } + virtual ~HostFunctions() = default; }; From 4670b373c10f2e093ff8670557af882e535d6a3f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 14:10:27 -0400 Subject: [PATCH 08/15] try to fix tests --- src/test/app/Escrow_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 81f1f9724e..da62a590c1 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1756,7 +1756,7 @@ struct Escrow_test : public beast::unit_test::suite cfg->START_UP = Config::FRESH; return cfg; })); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -2064,7 +2064,7 @@ struct Escrow_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto escrowCreate = escrow(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = env.current()->fees().base * 10 + 1000; env(escrowCreate, finish_function(wasmHex), condition(cb1), From 9c0204906c4c82b3a1a4f201fa375abc6abc50d2 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 15:25:00 -0400 Subject: [PATCH 09/15] fix reference fee tests --- src/test/app/Escrow_test.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index da62a590c1..52a077615f 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1977,7 +1977,7 @@ struct Escrow_test : public beast::unit_test::suite void testFinishFunction() { - testcase("PoC escrow function"); + testcase("Example escrow function"); using namespace jtx; using namespace std::chrono; @@ -2059,24 +2059,27 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + Condition Env env(*this); - // create escrow env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto const seq = env.seq(alice); + // create escrow auto escrowCreate = escrow(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + 1000; + XRPAmount const createFee = env.current()->fees().base + 1000; env(escrowCreate, finish_function(wasmHex), condition(cb1), cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); + XRPAmount const txnFees = + env.current()->fees().base * 34 + 1000; + // no fulfillment provided, function fails env(finish(carol, alice, seq), comp_allowance(110), From bb9bc764bcc2990b534554a596c0f69d338dd402 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 1 May 2025 18:02:06 -0400 Subject: [PATCH 10/15] Switch to WAMR (#5416) * Switch to WAMR --- .github/actions/dependencies/action.yml | 1 + .github/workflows/nix.yml | 1 + BUILD.md | 11 + CMakeLists.txt | 2 +- cmake/RippledCore.cmake | 2 +- conanfile.py | 2 +- external/wamr/conandata.yml | 6 + external/wamr/conanfile.py | 90 +++ external/wamr/patches/ripp_metering.patch | 417 +++++++++++ src/test/app/Escrow_test.cpp | 7 +- src/test/app/Wasm_test.cpp | 154 ++-- src/xrpld/app/misc/WamrVM.cpp | 754 +++++++++++++++++++ src/xrpld/app/misc/WamrVM.h | 264 +++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 8 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 392 ++++++++++ src/xrpld/app/misc/WasmHostFuncWrapper.h | 113 +++ src/xrpld/app/misc/WasmVM.cpp | 810 +++------------------ src/xrpld/app/misc/WasmVM.h | 249 ++++++- 18 files changed, 2454 insertions(+), 829 deletions(-) create mode 100644 external/wamr/conandata.yml create mode 100644 external/wamr/conanfile.py create mode 100644 external/wamr/patches/ripp_metering.patch create mode 100644 src/xrpld/app/misc/WamrVM.cpp create mode 100644 src/xrpld/app/misc/WamrVM.h create mode 100644 src/xrpld/app/misc/WasmHostFuncWrapper.cpp create mode 100644 src/xrpld/app/misc/WasmHostFuncWrapper.h diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index afce1557d3..c251daa936 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -17,6 +17,7 @@ runs: conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ + conan export -k external/wamr wamr/2.2.0@ - name: add Ripple Conan remote shell: bash run: | diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index d9a67a63e9..2ea9b32544 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -351,6 +351,7 @@ jobs: conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default conan export external/snappy snappy/1.1.10@ conan export external/soci soci/4.0.3@ + conan export -k external/wamr wamr/2.2.0@ - name: build dependencies run: | diff --git a/BUILD.md b/BUILD.md index fd985dce81..d348f2d670 100644 --- a/BUILD.md +++ b/BUILD.md @@ -204,6 +204,17 @@ It fixes some source files to add missing `#include`s. conan export --version 2.0.8 external/nudb ``` +Export our [Conan recipe for WAMR](./external/wamr). +It add metering and expose some internal structures. + + + ``` + # Conan 1.x + conan export external/wamr wamr/2.2.0@ + # Conan 2.x + conan export --version 2.2.0 external/wamr + ``` + ### Build and Test 1. Create a build directory and move into it. diff --git a/CMakeLists.txt b/CMakeLists.txt index 28cfd2322a..702cb41a0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) -find_package(wasmedge REQUIRED) +find_package(wamr REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index d4ff75434e..ec56323926 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,7 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> - wasmedge::wasmedge + wamr::wamr ) include(add_module) diff --git a/conanfile.py b/conanfile.py index d49f45903e..a0b1602daa 100644 --- a/conanfile.py +++ b/conanfile.py @@ -33,7 +33,7 @@ class Xrpl(ConanFile): 'soci/4.0.3', 'xxhash/0.8.2', 'zlib/1.3.1', - 'wasmedge/0.14.1', + 'wamr/2.2.0', ] tool_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml new file mode 100644 index 0000000000..6c49946eca --- /dev/null +++ b/external/wamr/conandata.yml @@ -0,0 +1,6 @@ +patches: + 2.2.0: + - patch_description: add metering to iwasm interpreter + patch_file: patches/ripp_metering.patch + patch_type: conan + diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py new file mode 100644 index 0000000000..d54bb6f98f --- /dev/null +++ b/external/wamr/conanfile.py @@ -0,0 +1,90 @@ +from conans import ConanFile, tools +from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, copy +import os +import json + +required_conan_version = ">=1.55.0" + +class WamrConan(ConanFile): + name = "wamr" + version = "2.2.0" + license = "Apache License v2.0" + url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" + description = "Webassembly micro runtime" + package_type = "library" + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + generators = "CMakeToolchain", "CMakeDeps" + #requires = [("llvm/20.1.1@")] + + def export_sources(self): + export_conandata_patches(self) + pass + + + #def build_requirements(self): + # self.tool_requires("llvm/20.1.1") + + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + + + def layout(self): + cmake_layout(self, src_folder="src") + + + def source(self): + git = tools.Git() + git.clone("https://github.com/bytecodealliance/wasm-micro-runtime.git", "c883fafead005e87ad3122b05409886f507c1cb0",shallow=True) + #get(self, **self.conan_data["sources"][self.version], strip_root=True) + + + def generate(self): + tc = CMakeToolchain(self) + + tc.variables["WAMR_BUILD_INTERP"] = 1 + tc.variables["WAMR_BUILD_FAST_INTERP"] = 1 + tc.variables["WAMR_BUILD_INSTRUCTION_METERING"] = 1 + tc.variables["WAMR_BUILD_AOT"] = 0 + tc.variables["WAMR_BUILD_JIT"] = 0 + tc.variables["WAMR_BUILD_FAST_JIT"] = 0 + tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 + tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 + #tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 + #ll_dep = self.dependencies["llvm"] + #self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") + #tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.generate() + + # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder + deps = CMakeDeps(self) + deps.generate() + + + def build(self): + apply_conandata_patches(self) + cmake = CMake(self) + cmake.verbose = True + cmake.configure() + cmake.build() + #self.run(f'echo {self.source_folder}') + # Explicit way: + # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) + # self.run("cmake --build . %s" % cmake.build_config) + + + def package(self): + cmake = CMake(self) + cmake.verbose = True + cmake.install() + + + def package_info(self): + self.cpp_info.libs = ["iwasm"] + self.cpp_info.names["cmake_find_package"] = "wamr" + self.cpp_info.names["cmake_find_package_multi"] = "wamr" + diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch new file mode 100644 index 0000000000..7cc3544b68 --- /dev/null +++ b/external/wamr/patches/ripp_metering.patch @@ -0,0 +1,417 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 551991f8..5f48a0b8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,7 +1,7 @@ + # Copyright (C) 2019 Intel Corporation. All rights reserved. + # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +-cmake_minimum_required (VERSION 3.14) ++cmake_minimum_required (VERSION 3.20) + + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + +diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake +index 1cb50235..bd103022 100644 +--- a/build-scripts/config_common.cmake ++++ b/build-scripts/config_common.cmake +@@ -669,6 +669,10 @@ if (WAMR_BUILD_AOT_VALIDATOR EQUAL 1) + message (" AOT validator enabled") + add_definitions (-DWASM_ENABLE_AOT_VALIDATOR=1) + endif () ++if (WAMR_BUILD_INSTRUCTION_METERING EQUAL 1) ++ message (" Instruction metering enabled") ++ add_definitions (-DWASM_ENABLE_INSTRUCTION_METERING=1) ++endif () + + ######################################## + # Show Phase4 Wasm proposals status. +diff --git a/core/config.h b/core/config.h +index cb1189c9..a4e1499e 100644 +--- a/core/config.h ++++ b/core/config.h +@@ -716,4 +716,8 @@ unless used elsewhere */ + #define WASM_ENABLE_AOT_VALIDATOR 0 + #endif + ++#ifndef WASM_ENABLE_INSTRUCTION_METERING ++#define WASM_ENABLE_INSTRUCTION_METERING 0 ++#endif ++ + #endif /* end of _CONFIG_H_ */ +diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c +index 269ec577..bc6fd01b 100644 +--- a/core/iwasm/common/wasm_c_api.c ++++ b/core/iwasm/common/wasm_c_api.c +@@ -5389,3 +5389,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, + return -1.0; + #endif + } ++ ++wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*instance) ++{ ++ return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); ++} +diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c +index e33fd9f3..d1ff9c41 100644 +--- a/core/iwasm/common/wasm_exec_env.c ++++ b/core/iwasm/common/wasm_exec_env.c +@@ -85,6 +85,12 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, + wasm_runtime_dump_exec_env_mem_consumption(exec_env); + #endif + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ exec_env->instructions_to_execute = -1; ++ for(int i = 0; i < 256; ++i) ++ exec_env->instructions_schedule[i] = 1; ++#endif ++ + return exec_env; + + #ifdef OS_ENABLE_HW_BOUND_CHECK +diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h +index ce0c1fa7..2713a092 100644 +--- a/core/iwasm/common/wasm_exec_env.h ++++ b/core/iwasm/common/wasm_exec_env.h +@@ -87,6 +87,12 @@ typedef struct WASMExecEnv { + uint8 *bottom; + } wasm_stack; + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ /* instructions to execute */ ++ int64 instructions_to_execute; ++ int64 instructions_schedule[256]; ++#endif ++ + #if WASM_ENABLE_FAST_JIT != 0 + /** + * Cache for +diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c +index d33c0272..900fb536 100644 +--- a/core/iwasm/common/wasm_runtime_common.c ++++ b/core/iwasm/common/wasm_runtime_common.c +@@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() + } + #endif + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ ++void ++wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, ++ int64 instructions_to_execute) ++{ ++ exec_env->instructions_to_execute = instructions_to_execute; ++} ++ ++int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) ++{ ++ return exec_env->instructions_to_execute; ++} ++ ++void ++wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, ++ int64 const *instructions_schedule) ++{ ++ for(int i = 0; i < 256; ++i) ++ exec_env->instructions_schedule[i] = instructions_schedule[i]; ++} ++ ++#endif ++ + WASMFuncType * + wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, + uint32 module_type) +@@ -7803,7 +7828,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; + boundary = boundary + page_size * guard_page_count; + #endif +- if ((uint8 *)&boundary < boundary) { ++ if (((uint8 *)&boundary < boundary) && ((uint8 *)&boundary > exec_env->native_stack_boundary)){ + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), + "native stack overflow"); + return false; +diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h +index 8ac032bf..5ca5d489 100644 +--- a/core/iwasm/common/wasm_runtime_common.h ++++ b/core/iwasm/common/wasm_runtime_common.h +@@ -791,9 +791,25 @@ WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, + uint8 *native_stack_boundary); + +-#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ + /* See wasm_export.h for description */ + WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, ++ int64 instructions_to_execute); ++WASM_RUNTIME_API_EXTERN int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, ++ int64 const *instructions_schedule); ++ ++#endif ++ ++#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 ++/* See wasm_export.h for description */ ++WASM_RUNTIME_API_EXTERN ++void + wasm_runtime_set_bounds_checks(WASMModuleInstanceCommon *module_inst, + bool enable); + +diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h +index 241a0eec..82e048c0 100644 +--- a/core/iwasm/include/wasm_c_api.h ++++ b/core/iwasm/include/wasm_c_api.h +@@ -701,6 +701,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); + // func_name. If the function is not found, return 0. + WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); + ++struct WASMExecEnv; ++typedef struct WASMExecEnv *wasm_exec_env_t; ++ ++WASM_API_EXTERN wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*); ++ + /////////////////////////////////////////////////////////////////////////////// + // Convenience + +diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h +index b73a0364..f7e20b24 100644 +--- a/core/iwasm/include/wasm_export.h ++++ b/core/iwasm/include/wasm_export.h +@@ -1821,6 +1821,27 @@ WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, + uint8_t *native_stack_boundary); + ++/** ++ * Set the instruction count limit to the execution environment. ++ * By default the instruction count limit is -1, which means no limit. ++ * However, if the instruction count limit is set to a positive value, ++ * the execution will be terminated when the instruction count reaches ++ * the limit. ++ * ++ * @param exec_env the execution environment ++ * @param instruction_count the instruction count limit ++ */ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, ++ int64_t instruction_count); ++ ++WASM_RUNTIME_API_EXTERN int64_t ++wasm_runtime_get_instruction_count_limit(wasm_exec_env_t exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, ++ int64_t const *instructions_schedule); ++ + /** + * Dump runtime memory consumption, including: + * Exec env memory consumption +diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c +index 41ac4c72..1aa1fe1c 100644 +--- a/core/iwasm/interpreter/wasm_interp_classic.c ++++ b/core/iwasm/interpreter/wasm_interp_classic.c +@@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, + } \ + os_mutex_unlock(&exec_env->wait_lock); \ + } \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *handle_table[*frame_ip++]; \ + } while (0) + #else +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ FETCH_OPCODE_AND_DISPATCH() + #endif + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ +@@ -1542,9 +1545,12 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, + } \ + os_mutex_unlock(&exec_env->wait_lock); \ + } \ ++ CHECK_INSTRUCTION_LIMIT(); \ + continue; + #else +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue; + #endif + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ +@@ -1562,6 +1568,18 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #endif + } + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute == 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ else if (instructions_to_execute > 0) \ ++ instructions_to_execute--; ++#else ++#define CHECK_INSTRUCTION_LIMIT() (void)0 ++#endif ++ + static void + wasm_interp_call_func_bytecode(WASMModuleInstance *module, + WASMExecEnv *exec_env, +@@ -1605,6 +1623,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint32 local_idx, local_offset, global_idx; + uint8 local_type, *global_addr; + uint32 cache_index, type_index, param_cell_num, cell_num; ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ int64 instructions_to_execute = -1; ++ if(exec_env) ++ instructions_to_execute = exec_env->instructions_to_execute; ++#endif ++ + #if WASM_ENABLE_EXCE_HANDLING != 0 + int32_t exception_tag_index; + #endif +@@ -6859,6 +6884,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + if (!prev_frame->ip) { + /* Called from native. */ + return; +@@ -6899,6 +6929,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + #endif + SYNC_ALL_TO_FRAME(); ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c +index f33ad60e..a7078fe8 100644 +--- a/core/iwasm/interpreter/wasm_interp_fast.c ++++ b/core/iwasm/interpreter/wasm_interp_fast.c +@@ -105,6 +105,20 @@ typedef float64 CellType_F64; + goto unaligned_atomic; \ + } while (0) + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) \ ++ { \ ++ instructions_to_execute -= instructions_schedule[opc]; \ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } ++#else ++#define CHECK_INSTRUCTION_LIMIT() (void)0 ++#endif ++ + static inline uint32 + rotl32(uint32 n, uint32 c) + { +@@ -1439,8 +1453,10 @@ wasm_interp_dump_op_count() + #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 + #define FETCH_OPCODE_AND_DISPATCH() \ + do { \ ++ const uint64 opc = *frame_ip; \ + const void *p_label_addr = *(void **)frame_ip; \ + frame_ip += sizeof(void *); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1450,8 +1466,10 @@ wasm_interp_dump_op_count() + const void *p_label_addr; \ + bh_assert(((uintptr_t)frame_ip & 1) == 0); \ + /* int32 relative offset was emitted in 64-bit target */ \ ++ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ + p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1460,8 +1478,10 @@ wasm_interp_dump_op_count() + const void *p_label_addr; \ + bh_assert(((uintptr_t)frame_ip & 1) == 0); \ + /* uint32 label address was emitted in 32-bit target */ \ ++ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ + p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #endif +@@ -1538,6 +1558,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint8 *maddr = NULL; + uint32 local_idx, local_offset, global_idx; + uint8 opcode = 0, local_type, *global_addr; ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ int64 instructions_to_execute = -1; ++ int64 const *instructions_schedule = NULL; ++ if(exec_env) ++ { ++ instructions_to_execute = exec_env->instructions_to_execute; ++ instructions_schedule = exec_env->instructions_schedule; ++ } ++#endif ++ + #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ + || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 + #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 +@@ -7761,6 +7792,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + if (!prev_frame->ip) + /* Called from native. */ + return; +@@ -7789,6 +7825,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + + got_exception: + SYNC_ALL_TO_FRAME(); ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/doc/build_wamr.md b/doc/build_wamr.md +index 6425450b..94dd9628 100644 +--- a/doc/build_wamr.md ++++ b/doc/build_wamr.md +@@ -327,6 +327,10 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared + - **WAMR_BUILD_SHRUNK_MEMORY**=1/0, default to enable if not set + > Note: When enabled, this feature will reduce memory usage by decreasing the size of the linear memory, particularly when the `memory.grow` opcode is not used and memory usage is somewhat predictable. + ++## **Instruction metering** ++- **WAMR_BUILD_INSTRUCTION_METERING**=1/0, default to disable if not set ++> Note: Enabling this feature allows limiting the number of instructions a wasm module instance can execute. Use the `wasm_runtime_set_instruction_count_limit(...)` API before calling `wasm_runtime_call_*(...)` APIs to enforce this limit. ++ + ## **Combination of configurations:** + + We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6b25da6363..75467fc7c8 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -19,6 +19,7 @@ #include +#include #include #include @@ -1921,12 +1922,12 @@ struct Escrow_test : public beast::unit_test::suite { // not enough gas - // This function takes 110 gas + // This function takes 4 gas // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 108; + auto const finishFee = env.current()->fees().base + 4; env(finish(carol, alice, seq), fee(finishFee), - comp_allowance(108), + comp_allowance(2), ter(tecFAILED_PROCESSING)); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index ce8d836269..a46d71a569 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -21,105 +21,21 @@ #include -#include - -#include +#include namespace ripple { namespace test { /* Host function body definition. */ -WasmEdge_Result -Add(void* Data, - const WasmEdge_CallingFrameContext* CallFrameCxt, - const WasmEdge_Value* In, - WasmEdge_Value* Out) +using Add_proto = int32_t(int32_t, int32_t); +wasm_trap_t* +Add(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) { - int32_t Val1 = WasmEdge_ValueGetI32(In[0]); - int32_t Val2 = WasmEdge_ValueGetI32(In[1]); + int32_t Val1 = params->data[0].of.i32; + int32_t Val2 = params->data[1].of.i32; // printf("Host function \"Add\": %d + %d\n", Val1, Val2); - Out[0] = WasmEdge_ValueGenI32(Val1 + Val2); - return WasmEdge_Result_Success; -} - -void -invokeAdd() -{ - /* Create the VM context. */ - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - // clang-format off - /* The WASM module buffer. */ - uint8_t WASM[] = {/* WASM header */ - 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, - /* Type section */ - 0x01, 0x07, 0x01, - /* function type {i32, i32} -> {i32} */ - 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, - /* Import section */ - 0x02, 0x13, 0x01, - /* module name: "extern" */ - 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, - /* extern name: "func-add" */ - 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, - /* import desc: func 0 */ - 0x00, 0x00, - /* Function section */ - 0x03, 0x02, 0x01, 0x00, - /* Export section */ - 0x07, 0x0A, 0x01, - /* export name: "addTwo" */ - 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, - /* export desc: func 0 */ - 0x00, 0x01, - /* Code section */ - 0x0A, 0x0A, 0x01, - /* code body */ - 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; - // clang-format on - - /* Create the module instance. */ - WasmEdge_String ExportName = WasmEdge_StringCreateByCString("extern"); - WasmEdge_ModuleInstanceContext* HostModCxt = - WasmEdge_ModuleInstanceCreate(ExportName); - WasmEdge_ValType ParamList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(ParamList, 2, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate(HostFType, Add, NULL, 0); - WasmEdge_FunctionTypeDelete(HostFType); - WasmEdge_String HostFuncName = WasmEdge_StringCreateByCString("func-add"); - WasmEdge_ModuleInstanceAddFunction(HostModCxt, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); - - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostModCxt); - - /* The parameters and returns arrays. */ - WasmEdge_Value Params[2] = { - WasmEdge_ValueGenI32(1234), WasmEdge_ValueGenI32(5678)}; - WasmEdge_Value Returns[1]; - /* Function name. */ - WasmEdge_String FuncName = WasmEdge_StringCreateByCString("addTwo"); - /* Run the WASM function from buffer. */ - WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( - VMCxt, WASM, sizeof(WASM), FuncName, Params, 2, Returns, 1); - - if (WasmEdge_ResultOK(Res)) - { - // printf("invokeAdd get the result: %d\n", - // WasmEdge_ValueGetI32(Returns[0])); - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); - } - - /* Resources deallocations. */ - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - WasmEdge_ModuleInstanceDelete(HostModCxt); + results->data[0] = WASM_I32_VAL(Val1 + Val2); + return nullptr; } struct Wasm_test : public beast::unit_test::suite @@ -128,8 +44,46 @@ struct Wasm_test : public beast::unit_test::suite testWasmtimeLib() { testcase("wasmtime lib test"); - invokeAdd(); - BEAST_EXPECT(true); + // clang-format off + /* The WASM module buffer. */ + wbytes const wasm = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + auto& vm = WasmEngine::instance(); + + std::vector imports; + WasmImpFunc( + imports, "func-add", reinterpret_cast(&Add)); + + auto res = vm.run(wasm, "addTwo", imports, wasmParams(1234, 5678)); + + // if (res) printf("invokeAdd get the result: %d\n", res.value()); + + BEAST_EXPECT(res.has_value() && res.value() == 6912); } void @@ -1412,9 +1366,9 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(&env); std::string funcName("ready"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); - BEAST_EXPECT(re.error()); - std::cout << "bad case (more than MAX_PAGES) result " << re.error() - << std::endl; + if (BEAST_EXPECT(!re)) + std::cout << "bad case (more than MAX_PAGES) result " + << re.error() << std::endl; } { // fail because recursion too deep @@ -2143,9 +2097,9 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions nfs(&env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); - BEAST_EXPECT(re.error()); - std::cout << "bad case (deep recursion) result " << re.error() - << std::endl; + if (BEAST_EXPECT(re.error())) + std::cout << "bad case (deep recursion) result " << re.error() + << std::endl; } } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp new file mode 100644 index 0000000000..a92d8e463e --- /dev/null +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -0,0 +1,754 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +namespace ripple { + +////////////////////////////////////////////////////////////////////////////////////////// + +namespace { + +static void +print_wasm_error(const char* message, wasm_trap_t* trap) +{ + fprintf(stderr, "WAMR error: %s\n", message); + wasm_byte_vec_t error_message; + + if (trap) + { + wasm_trap_message(trap, &error_message); + wasm_trap_delete(trap); + fprintf( + stderr, + "WAMR trap: %.*s\n", + (int)error_message.size, + error_message.data); + wasm_byte_vec_delete(&error_message); + } +} + +} // namespace + +InstancePtr +InstanceWrapper::init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports) +{ + wasm_trap_t* trap = nullptr; + InstantiationArgs inst_args{ + 128 * 1024, + 256 * 1024, + static_cast(maxPages > 0 ? maxPages : 0)}; + + InstancePtr mi = InstancePtr( + wasm_instance_new_with_args_ex(s, m, &imports, &trap, &inst_args), + &wasm_instance_delete); + + if (!mi || trap) + { + print_wasm_error("can't create instance", trap); + throw std::runtime_error("WAMR: can't create instance"); + } + wasm_instance_exports(mi.get(), expt); + return mi; +} + +InstanceWrapper::InstanceWrapper() + : exports{0, nullptr, 0, 0, nullptr} + , mod_inst(nullptr, &wasm_instance_delete) +{ +} + +InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) + : exports{0, nullptr, 0, 0, nullptr} + , mod_inst(nullptr, &wasm_instance_delete) +{ + *this = std::move(o); +} + +InstanceWrapper& +InstanceWrapper::operator=(InstanceWrapper&& o) +{ + if (this == &o) + return *this; + + if (exports.size) + wasm_extern_vec_delete(&exports); + exports = o.exports; + o.exports = {0, nullptr, 0, 0, nullptr}; + + mod_inst = std::move(o.mod_inst); + + return *this; +} + +InstanceWrapper::InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t const& imports) + : exports WASM_EMPTY_VEC, mod_inst(init(s, m, maxPages, &exports, imports)) +{ +} + +InstanceWrapper::~InstanceWrapper() +{ + if (exports.size) + wasm_extern_vec_delete(&exports); +} + +InstanceWrapper::operator bool() const +{ + return static_cast(mod_inst); +} + +wasm_func_t* +InstanceWrapper::getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const +{ + wasm_func_t* f = nullptr; + + if (!export_types.size) + throw std::runtime_error("WAMR: no export"); + if (export_types.size != exports.size) + throw std::runtime_error("WAMR: invalid export"); + + for (unsigned i = 0; i < export_types.size; ++i) + { + auto const* exp_type(export_types.data[i]); + + wasm_name_t const* name = wasm_exporttype_name(exp_type); + const wasm_externtype_t* exn_type = wasm_exporttype_type(exp_type); + if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC) + { + if (funcName == std::string_view(name->data, name->size - 1)) + { + auto* exn(exports.data[i]); + if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) + throw std::runtime_error("WAMR: invalid export"); + + f = wasm_extern_as_func(exn); + break; + } + } + } + + if (!f) + throw std::runtime_error( + "WAMR: can't find function " + std::string(funcName)); + + return f; +} + +wmem +InstanceWrapper::getMem() const +{ + wasm_memory_t* mem = nullptr; + for (unsigned i = 0; i < exports.size; ++i) + { + auto* e(exports.data[i]); + if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) + { + mem = wasm_extern_as_memory(e); + break; + } + } + + if (!mem) + throw std::runtime_error("WAMR: no memory exported"); + + return { + reinterpret_cast(wasm_memory_data(mem)), + wasm_memory_data_size(mem)}; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ModulePtr +ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) +{ + wasm_byte_vec_t const code{ + wasmBin.size(), + (char*)(wasmBin.data()), + wasmBin.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + return m; +} + +ModuleWrapper::ModuleWrapper() + : module(nullptr, &wasm_module_delete) + , export_types{0, nullptr, 0, 0, nullptr} +{ +} + +ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) + : module(nullptr, &wasm_module_delete) + , export_types{0, nullptr, 0, 0, nullptr} +{ + *this = std::move(o); +} + +ModuleWrapper& +ModuleWrapper::operator=(ModuleWrapper&& o) +{ + if (this == &o) + return *this; + + module = std::move(o.module); + mod_inst = std::move(o.mod_inst); + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); + export_types = o.export_types; + o.export_types = {0, nullptr, 0, 0, nullptr}; + exec_env = o.exec_env; + o.exec_env = nullptr; + return *this; +} + +ModuleWrapper::ModuleWrapper( + wasm_store_t* s, + wbytes const& wasmBin, + bool instantiate, + int32_t maxPages, + std::vector const& imports) + : module(init(s, wasmBin)), export_types{0, nullptr, 0, 0, nullptr} +{ + if (!module) + throw std::runtime_error("WAMR: can't create module"); + + wasm_module_exports(module.get(), &export_types); + if (instantiate) + { + auto wimports = buildImports(s, imports); + addInstance(s, maxPages, wimports); + } +} + +ModuleWrapper::~ModuleWrapper() +{ + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); +} + +ModuleWrapper::operator bool() const +{ + return mod_inst; +} + +void +ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + auto const paramSize = imp.params.size(); + + if (paramSize) + { + wasm_valtype_vec_new(&v, paramSize, nullptr); + v.num_elems = paramSize; + } + else + v = WASM_EMPTY_VEC; + for (unsigned i = 0; i < paramSize; ++i) + { + auto const vt = imp.params[i]; + switch (vt) + { + case WT_I32: + v.data[i] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[i] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[i] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[i] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("Invalid import type"); + } + } +} + +void +ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + if (imp.result) + { + wasm_valtype_vec_new(&v, 1, nullptr); + v.num_elems = 1; + switch (*imp.result) + { + case WT_I32: + v.data[0] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[0] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[0] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[0] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("Invalid return type"); + } + } + else + v = WASM_EMPTY_VEC; +} + +wasm_extern_vec_t +ModuleWrapper::buildImports( + wasm_store_t* s, + std::vector const& imports) +{ + wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; + wasm_module_imports(module.get(), &importTypes); + std:: + unique_ptr + itDeleter(&importTypes, &wasm_importtype_vec_delete); + + wasm_extern_vec_t wimports = WASM_EMPTY_VEC; + if (!importTypes.num_elems) + return wimports; + + wasm_extern_vec_new(&wimports, importTypes.size, nullptr); + wimports.num_elems = importTypes.num_elems; + + for (unsigned i = 0; i < importTypes.num_elems; ++i) + { + wasm_importtype_t const* importtype = importTypes.data[i]; + if (wasm_importtype_is_linked(importtype)) + { + // create a placeholder + wimports.data[i] = wasm_extern_new_empty( + s, wasm_externtype_kind(wasm_importtype_type(importtype))); + continue; + } + + // wasm_name_t const* mn = wasm_importtype_module(importtype); + // auto modName = std::string_view(mn->data, mn->num_elems - 1); + wasm_name_t const* fn = wasm_importtype_name(importtype); + auto fieldName = std::string_view(fn->data, fn->num_elems - 1); + + // for multi-module support + // if ((W_ENV != modName) && (W_HOST_LIB != modName)) + // continue; + + for (auto const& imp : imports) + { + if (imp.name != fieldName) + continue; + + wasm_valtype_vec_t params, results; + makeImpReturn(results, imp); + makeImpParams(params, imp); + + using ftype_ptr = std:: + unique_ptr; + ftype_ptr ftype( + wasm_functype_new(¶ms, &results), &wasm_functype_delete); + wasm_func_t* func = wasm_func_new_with_env( + s, + ftype.get(), + reinterpret_cast(imp.wrap), + imp.udata, + nullptr); + + wimports.data[i] = wasm_func_as_extern(func); + break; + } + } + + return wimports; +} + +wasm_func_t* +ModuleWrapper::getFunc(std::string_view funcName) const +{ + return mod_inst.getFunc(funcName, export_types); +} + +wmem +ModuleWrapper::getMem() const +{ + return mod_inst.getMem(); +} + +int +ModuleWrapper::addInstance( + wasm_store_t* s, + int32_t maxPages, + wasm_extern_vec_t const& imports) +{ + mod_inst = {s, module.get(), maxPages, imports}; + exec_env = wasm_instance_exec_env(mod_inst.mod_inst.get()); + + return 0; +} + +// int +// my_module_t::delInstance(int i) +// { +// if (i >= mod_inst.size()) +// return -1; +// if (!mod_inst[i]) +// mod_inst[i] = my_mod_inst_t(); +// return i; +// } + +std::int64_t +ModuleWrapper::setGas(std::int64_t gas) +{ + if (exec_env) + { + wasm_runtime_set_instruction_count_limit(exec_env, gas); + return gas; + } + return 0; +} + +std::int64_t +ModuleWrapper::getGas() +{ + return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// void +// WamrEngine::clearModules() +// { +// modules.clear(); +// store.reset(); // to free the memory before creating new store +// store = {wasm_store_new(engine.get()), &wasm_store_delete}; +// } + +WamrEngine::WamrEngine() + : engine(wasm_engine_new(), &wasm_engine_delete) + , store(nullptr, &wasm_store_delete) +{ + wasm_runtime_set_default_running_mode(Mode_Interp); + wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); + // wasm_runtime_set_log_level(WASM_LOG_LEVEL_VERBOSE); +} + +int +WamrEngine::addModule( + wbytes const& wasmCode, + bool instantiate, + std::vector const& imports) +{ + module.reset(); + store.reset(); // to free the memory before creating new store + store = {wasm_store_new(engine.get()), &wasm_store_delete}; + module = std::make_unique( + store.get(), wasmCode, instantiate, defMaxPages, imports); + setGas(defGas); + return module ? 0 : -1; +} + +int +WamrEngine::addInstance() +{ + return module->addInstance(store.get(), defMaxPages); +} + +wasm_func_t* +WamrEngine::getFunc(std::string_view funcName) +{ + return module->getFunc(funcName); +} + +std::vector +WamrEngine::convertParams(std::vector const& params) +{ + std::vector v; + v.reserve(params.size()); + for (auto const& p : params) + { + switch (p.type) + { + case WT_I32: + v.push_back(WASM_I32_VAL(p.of.i32)); + break; + case WT_I64: + v.push_back(WASM_I64_VAL(p.of.i64)); + break; + case WT_F32: + v.push_back(WASM_F32_VAL(p.of.f32)); + break; + case WT_F64: + v.push_back(WASM_F64_VAL(p.of.f64)); + break; + default: + break; + } + } + + return v; +} + +void +WamrEngine::add_param(std::vector& in, int32_t p) +{ + in.emplace_back(); + auto& el(in.back()); + memset(&el, 0, sizeof(el)); + el = WASM_I32_VAL(p); // WASM_I32; +} + +void +WamrEngine::add_param(std::vector& in, int64_t p) +{ + in.emplace_back(); + auto& el(in.back()); + el = WASM_I64_VAL(p); +} + +template +WamrResult +WamrEngine::call(std::string_view func, Types... args) +{ + // Lookup our export function + auto* f = getFunc(func); + return call(f, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(wasm_func_t* func, Types... args) +{ + std::vector in; + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(wasm_func_t* func, std::vector& in) +{ + // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; + WamrResult ret(NR); + // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // + // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } + + wasm_val_vec_t const inv = in.empty() + ? wasm_val_vec_t WASM_EMPTY_VEC + : wasm_val_vec_t{ + in.size(), + in.data(), + in.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + trap = wasm_func_call(func, &inv, &ret.r); + if (trap) + print_wasm_error("failed to call func", trap); + + // assert(results[0].kind == WASM_I32); + // if (NR) printf("Result P5: %d\n", ret[0].of.i32); + + return ret; +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + std::int32_t p, + Types... args) +{ + add_param(in, p); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + + std::vector& in, + std::int64_t p, + Types... args) +{ + add_param(in, p); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types... args) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + + if (trap || (res.r.data[0].kind != WASM_I32)) + return {}; + auto const ptr = res.r.data[0].of.i32; + if (!ptr) + throw std::runtime_error( + "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); + + auto mem = getMem(); + memcpy(mem.p + ptr, d, sz); + + add_param(in, ptr); + add_param(in, static_cast(sz)); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + wbytes const& p, + Types... args) +{ + return call(func, in, p.data(), p.size(), std::forward(args)...); +} + +Expected +WamrEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + try + { + return runHlp(wasmCode, funcName, imports, params); + } + catch (std::exception const&) + { + } + catch (...) + { + } + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +WamrEngine::runHlp( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + // Create and instantiate the module. + if (!wasmCode.empty()) + { + int const m = addModule(wasmCode, true, imports); + if (m < 0) + return Unexpected(tecFAILED_PROCESSING); + } + + if (!module) + return Unexpected(tecFAILED_PROCESSING); + + // Call main + auto* f = getFunc(!funcName.empty() ? funcName : "_start"); + auto p = convertParams(params); + auto res = call<1>(f, p); + if (!res.r.size || trap) + return Unexpected(tecFAILED_PROCESSING); + + assert(res.r.data[0].kind == WASM_I32); + // printf("Result: %d\n", results[0].of.i32); + // return res.r.data[0].of.i32 != 0; + return res.r.data[0].of.i32; +} + +std::int64_t +WamrEngine::initGas(std::int64_t def) +{ + defGas = def; + return def; +} + +std::int32_t +WamrEngine::initMaxPages(std::int32_t def) +{ + defMaxPages = def; + return def; +} + +std::int64_t +WamrEngine::setGas(std::int64_t gas) +{ + if (module) + { + module->setGas(gas); + return gas; + } + return 0; +} + +std::int64_t +WamrEngine::getGas() +{ + return module ? module->getGas() : 0; +} + +wmem +WamrEngine::getMem() const +{ + return module ? module->getMem() : wmem(); +} + +int32_t +WamrEngine::allocate(int32_t sz) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + if (trap || (res.r.data[0].kind != WASM_I32)) + return {}; + auto const ptr = res.r.data[0].of.i32; + if (!ptr) + throw std::runtime_error( + "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); + return ptr; +} + +wasm_trap_t* +WamrEngine::newTrap(std::string_view txt) +{ + wasm_message_t msg = WASM_EMPTY_VEC; + + if (!txt.empty()) + wasm_name_new(&msg, txt.size(), txt.data()); + + return wasm_trap_new(store.get(), &msg); +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h new file mode 100644 index 0000000000..113fcf8886 --- /dev/null +++ b/src/xrpld/app/misc/WamrVM.h @@ -0,0 +1,264 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include + +namespace ripple { + +// clang-format off + +struct WamrResult +{ + wasm_val_vec_t r; + WamrResult(unsigned N = 0):r{0, nullptr, 0, 0, nullptr} {if (N) wasm_val_vec_new_uninitialized(&r, N);} + ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } + WamrResult(WamrResult const &) = delete; + WamrResult& operator=(WamrResult const &) = delete; + + WamrResult(WamrResult &&o) {*this = std::move(o);} + WamrResult& operator=(WamrResult &&o){r = o.r; o.r = {0, nullptr, 0, 0, nullptr}; return *this;} + //operator wasm_val_vec_t &() {return r;} +}; + +using ModulePtr = std::unique_ptr; +using InstancePtr = std::unique_ptr; + +// clang-format on + +struct InstanceWrapper +{ + wasm_extern_vec_t exports; + InstancePtr mod_inst; + +private: + static InstancePtr + init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + +public: + InstanceWrapper(); + + InstanceWrapper(InstanceWrapper&& o); + + InstanceWrapper& + operator=(InstanceWrapper&& o); + + InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + ~InstanceWrapper(); + + operator bool() const; + + wasm_func_t* + getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const; + + wmem + getMem() const; +}; + +struct ModuleWrapper +{ + ModulePtr module; + wasm_exec_env_t exec_env = nullptr; + InstanceWrapper mod_inst; + wasm_exporttype_vec_t export_types; + +private: + static ModulePtr + init(wasm_store_t* s, wbytes const& wasmBin); + +public: + ModuleWrapper(); + ModuleWrapper(ModuleWrapper&& o); + ModuleWrapper& + operator=(ModuleWrapper&& o); + ModuleWrapper( + wasm_store_t* s, + wbytes const& wasmBin, + bool instantiate, + int32_t maxPages, + std::vector const& imports = {}); + ~ModuleWrapper(); + + operator bool() const; + + wasm_func_t* + getFunc(std::string_view funcName) const; + wmem + getMem() const; + + int + addInstance( + wasm_store_t* s, + int32_t maxPages, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + std::int64_t + setGas(std::int64_t gas); + + std::int64_t + getGas(); + +private: + static void + makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + static void + makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + wasm_extern_vec_t + buildImports(wasm_store_t* s, std::vector const& imports); +}; + +class WamrEngine +{ + std::unique_ptr engine; + std::unique_ptr store; + std::unique_ptr module; + wasm_trap_t* trap = nullptr; + std::int64_t defGas = -1; + std::int32_t defMaxPages = -1; + +public: + WamrEngine(); + ~WamrEngine() = default; + + Expected + run(wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params); + + std::int64_t + initGas(std::int64_t def); + + std::int64_t + setGas(std::int64_t gas); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + getGas(); + + // Host functions helper functionality + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + wasm_trap_t* + newTrap(std::string_view msg); + +private: + Expected + runHlp( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params); + + int + addModule( + wbytes const& wasmCode, + bool instantiate, + std::vector const& imports); + void + clearModules(); + int + addInstance(); + int32_t + runFunc(std::string_view const funcName, int32_t p); + + int32_t + makeModule( + wbytes const& wasmCode, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + wasm_func_t* + getFunc(std::string_view funcName); + + std::vector + convertParams(std::vector const& params); + + void + add_param(std::vector& in, int32_t p); + void + add_param(std::vector& in, int64_t p); + + template + inline WamrResult + call(std::string_view func, Types... args); + + template + inline WamrResult + call(wasm_func_t* func, Types... args); + + template + inline WamrResult + call(wasm_func_t* f, std::vector& in); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + std::int32_t p, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + std::int64_t p, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + wbytes const& p, + Types... args); +}; + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index aa42f79ff6..e1943244e7 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -19,14 +19,12 @@ #ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED #define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED +#include +#include + #include #include -#include "xrpl/basics/base_uint.h" -#include "xrpld/app/misc/WasmVM.h" -#include "xrpld/app/tx/detail/ApplyContext.h" -#include - namespace ripple { class WasmHostFunctionsImpl : public HostFunctions { diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp new file mode 100644 index 0000000000..d893a93889 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -0,0 +1,392 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include + +namespace ripple { + +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + int32_t const sqn = hf->getLedgerSqn(); + results->data[0] = WASM_I32_VAL(sqn); + + return nullptr; +} + +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + int32_t const ltime = hf->getParentLedgerTime(); + results->data[0] = WASM_I32_VAL(ltime); + return nullptr; +} + +static Expected +getParameterData(wasm_val_vec_t const* params, size_t index) +{ + auto& vm = WasmEngine::instance(); + auto fnameOffset = params->data[index].of.i32; + auto fnameLen = params->data[index + 1].of.i32; + auto mem = vm.getMem(); + if (!mem.s) + return Unexpected("No memory exported"); + + if (mem.s <= fnameOffset + fnameLen) + return Unexpected("Memory access failed"); + Bytes fname(mem.p + fnameOffset, mem.p + fnameOffset + fnameLen); + return fname; +} + +static Expected +getFieldName(wasm_val_vec_t const* params, size_t index) +{ + auto const dataRes = getParameterData(params, index); + if (dataRes) + { + return std::string(dataRes->begin(), dataRes->end()); + } + else + { + auto& vm = WasmEngine::instance(); + return Unexpected( + reinterpret_cast(vm.newTrap(dataRes.error()))); + } +} + +static Expected +setData(Bytes const& data) +{ + auto& vm = WasmEngine::instance(); + auto mem = vm.getMem(); + if (!mem.s) + return Unexpected("No memory exported"); + + int32_t const dataLen = static_cast(data.size()); + int32_t const dataPtr = vm.allocate(dataLen); + if (!dataPtr) + return Unexpected("Allocation error"); + memcpy(mem.p + dataPtr, data.data(), dataLen); + + auto retPtr = vm.allocate(8); + if (!retPtr) + return Unexpected("Allocation error"); + int32_t* retData = reinterpret_cast(mem.p + retPtr); + retData[0] = dataPtr; + retData[1] = dataLen; + + return retPtr; +} + +wasm_trap_t* +getTxField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getFieldName(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = hf->getTxField(fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap("Field not found")); + + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + int32_t const type = params->data[0].of.i32; + auto lkData = getParameterData(params, 1); + if (!lkData) + return reinterpret_cast(vm.newTrap()); + + auto fname = getFieldName(params, 3); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = + hf->getLedgerEntryField(type, lkData.value(), fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap()); + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getCurrentLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getFieldName(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = hf->getCurrentLedgerEntryField(fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getNFT_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto nftId = getFieldName(params, 2); + if (!nftId) + return reinterpret_cast(vm.newTrap()); + + auto nftURI = hf->getNFT(account.value(), nftId.value()); + if (!nftURI) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(nftURI.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +accountKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto keylet = hf->accountKeylet(account.value()); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +credentialKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto subject = getFieldName(params, 0); + if (!subject) + return reinterpret_cast(vm.newTrap()); + + auto issuer = getFieldName(params, 2); + if (!issuer) + return reinterpret_cast(vm.newTrap()); + + auto credentialType = getFieldName(params, 4); + if (!credentialType) + return reinterpret_cast(vm.newTrap()); + + auto keylet = hf->credentialKeylet( + subject.value(), issuer.value(), credentialType.value()); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +escrowKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + int32_t const sequence = params->data[2].of.i32; + + auto keylet = hf->escrowKeylet(account.value(), sequence); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +oracleKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto documentId = params->data[2].of.i32; + + auto keylet = hf->escrowKeylet(account.value(), documentId); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +updateData_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getParameterData(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + if (!hf->updateData(fname.value())) + return reinterpret_cast(vm.newTrap()); + + return nullptr; +} + +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getParameterData(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto hres = hf->computeSha512HalfHash(fname.value()); + Bytes digest{hres.begin(), hres.end()}; + auto pointer = setData(digest); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32(32); + return nullptr; +} + +wasm_trap_t* +print_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + // auto* hf = reinterpret_cast(env); + + auto f = getParameterData(params, 0); + if (!f) + return reinterpret_cast(vm.newTrap()); + std::string s(f->begin(), f->end()); + if (s.size() < 4096) + std::cout << s << std::endl; + return nullptr; +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h new file mode 100644 index 0000000000..c3f5bb11a9 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +namespace ripple { + +using getLedgerSqn_proto = int32_t(); +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getParentLedgerTime_proto = int32_t(); +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxField_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +getTxField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getLedgerEntryField_proto = + uint32_t*(int32_t, uint8_t const*, int32_t, char const*, int32_t); +wasm_trap_t* +getLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getCurrentLedgerEntryField_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +getCurrentLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getNFT_proto = uint32_t*(char const*, int32_t, char const*, int32_t); +wasm_trap_t* +getNFT_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results); + +using accountKeylet_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +accountKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using credentialKeylet_proto = + uint32_t*(char const*, int32_t, char const*, int32_t, char const*, int32_t); +wasm_trap_t* +credentialKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using escrowKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +wasm_trap_t* +escrowKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using oracleKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +wasm_trap_t* +oracleKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using updateData_proto = void(uint8_t const*, int32_t); +wasm_trap_t* +updateData_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using computeSha512HalfHash_proto = uint32_t*(uint8_t const*, int32_t); +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using print_proto = void(char const*, int32_t); +wasm_trap_t* +print_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results); + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 1764734db3..d786cae7fb 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -17,730 +17,118 @@ */ //============================================================================== -#include +#include +#include -#include "xrpl/protocol/AccountID.h" -#include "xrpl/protocol/LedgerFormats.h" +#include +#include + +#include namespace ripple { -WasmEdge_Result -getLedgerSqn( - void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value*, - WasmEdge_Value* out) -{ - out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getParentLedgerTime( - void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value*, - WasmEdge_Value* out) -{ - out[0] = - WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); - return WasmEdge_Result_Success; -} - -Expected -getParameterData( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) -{ - auto fnameOffset = (uint32_t)WasmEdge_ValueGetI32(in[index]); - auto fnameLen = (uint32_t)WasmEdge_ValueGetI32(in[index + 1]); - Bytes fname(fnameLen, char{0}); - WasmEdge_MemoryInstanceContext* mem = - WasmEdge_CallingFrameGetMemoryInstance(fm, 0); - WasmEdge_Result Res = WasmEdge_MemoryInstanceGetData( - mem, (uint8_t*)(fname.data()), fnameOffset, fnameLen); - if (WasmEdge_ResultOK(Res)) - { - return fname; - } - else - { - return Unexpected(Res); - } -} - -Expected -getFieldName( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) -{ - auto dataRes = getParameterData(fm, in, index); - if (dataRes) - { - return std::string(dataRes.value().begin(), dataRes->end()); - } - else - { - return Unexpected(dataRes.error()); - } -} - -Expected -setData(const WasmEdge_CallingFrameContext* fm, Bytes const& data) -{ - auto alloc = [fm](int32_t dataLen) -> int32_t { - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - auto mod = WasmEdge_CallingFrameGetModuleInstance(fm); - WasmEdge_FunctionInstanceContext* func = - WasmEdge_ModuleInstanceFindFunction(mod, allocFunc); - WasmEdge_Value allocParams[1] = { - WasmEdge_ValueGenI32(dataLen)}; // 4 for prepend the data size - WasmEdge_Value allocReturns[1]; - auto executor = WasmEdge_CallingFrameGetExecutor(fm); - auto res = WasmEdge_ExecutorInvoke( - executor, func, allocParams, 1, allocReturns, 1); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGetI32(allocReturns[0]); - } - else - { - return 0; - } - }; - - auto dataLen = (int32_t)data.size(); - auto dataPtr = alloc(dataLen); - auto retPtr = alloc(8); - if (dataPtr && retPtr) - { - auto mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); - auto res = - WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); - if (WasmEdge_ResultOK(res)) - { - unsigned char intBuf[8]; // little-endian - for (size_t i = 0; i < 4; ++i) - { - intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; - } - for (size_t i = 0; i < 4; ++i) - { - intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; - } - - res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGenI32(retPtr); - } - } - } - return Unexpected(WasmEdge_Result_Fail); -} - -WasmEdge_Result -getTxField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto fname = getFieldName(fm, in, 0); - if (!fname) - return fname.error(); - - auto fieldData = ((HostFunctions*)data)->getTxField(fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getLedgerEntryField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto type = WasmEdge_ValueGetI32(in[0]); - auto lkData = getParameterData(fm, in, 1); - if (!lkData) - return lkData.error(); - - auto fname = getFieldName(fm, in, 3); - if (!fname) - return fname.error(); - - auto fieldData = - ((HostFunctions*)data) - ->getLedgerEntryField(type, lkData.value(), fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getCurrentLedgerEntryField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto fname = getFieldName(fm, in, 0); - if (!fname) - return fname.error(); - - auto fieldData = - ((HostFunctions*)data)->getCurrentLedgerEntryField(fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getNFT( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto nftId = getFieldName(fm, in, 2); - if (!nftId) - return nftId.error(); - - auto nftURI = - ((HostFunctions*)data)->getNFT(account.value(), nftId.value()); - if (!nftURI) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, nftURI.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -accountKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto keylet = ((HostFunctions*)data)->accountKeylet(account.value()); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -credentialKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto subject = getFieldName(fm, in, 0); - if (!subject) - return subject.error(); - - auto issuer = getFieldName(fm, in, 2); - if (!issuer) - return issuer.error(); - - auto credentialType = getFieldName(fm, in, 4); - if (!credentialType) - return credentialType.error(); - - auto keylet = - ((HostFunctions*)data) - ->credentialKeylet( - subject.value(), issuer.value(), credentialType.value()); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -escrowKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto sequence = WasmEdge_ValueGetI32(in[2]); - - auto keylet = - ((HostFunctions*)data)->escrowKeylet(account.value(), sequence); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -oracleKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto documentId = WasmEdge_ValueGetI32(in[2]); - - auto keylet = - ((HostFunctions*)data)->escrowKeylet(account.value(), documentId); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -updateData( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto fname = getParameterData(fm, in, 0); - if (!fname) - return fname.error(); - - if (((HostFunctions*)data)->updateData(fname.value())) - return WasmEdge_Result_Success; - else - return WasmEdge_Result_Fail; -} - -WasmEdge_Result -computeSha512HalfHash( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto fname = getParameterData(fm, in, 0); - if (!fname) - return fname.error(); - - auto hres = ((HostFunctions*)data)->computeSha512HalfHash(fname.value()); - Bytes digest{hres.begin(), hres.end()}; - auto pointer = setData(fm, digest); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32(32); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -print( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto f = getParameterData(fm, in, 0); - if (!f) - return f.error(); - std::string s(f.value().begin(), f.value().end()); - std::cout << s << std::endl; - return WasmEdge_Result_Success; -} - Expected runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, + Bytes const& wasmCode, + std::string_view funcName, HostFunctions* hfs, uint64_t gasLimit) { - // WasmEdge_LogOff(); - // TODO deletes // create VM and set cost limit - WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); - WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); - WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); - WasmEdge_ConfigureSetMaxMemoryPage(conf, MAX_PAGES); + auto& vm = WasmEngine::instance(); + vm.initGas(gasLimit); + vm.initMaxPages(MAX_PAGES); - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); - WasmEdge_StatisticsContext* StatCxt = - WasmEdge_VMGetStatisticsContext(VMCxt); - WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); + std::vector imports; - { // register host function - // module - WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* hostMod = - WasmEdge_ModuleInstanceCreate(libName); - WasmEdge_StringDelete(libName); + WASM_IMPORT_FUNC(imports, getLedgerSqn, hfs) + WASM_IMPORT_FUNC(imports, getParentLedgerTime, hfs) + WASM_IMPORT_FUNC(imports, getTxField, hfs) + WASM_IMPORT_FUNC(imports, getLedgerEntryField, hfs) + WASM_IMPORT_FUNC(imports, getCurrentLedgerEntryField, hfs) + WASM_IMPORT_FUNC(imports, getNFT, hfs) + WASM_IMPORT_FUNC(imports, accountKeylet, hfs) + WASM_IMPORT_FUNC(imports, credentialKeylet, hfs) + WASM_IMPORT_FUNC(imports, escrowKeylet, hfs) + WASM_IMPORT_FUNC(imports, oracleKeylet, hfs) + WASM_IMPORT_FUNC(imports, updateData, hfs) + WASM_IMPORT_FUNC(imports, computeSha512HalfHash, hfs) + WASM_IMPORT_FUNC(imports, print, hfs) - // getLedgerSqn - { - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getLedgerSqn, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); + std::int64_t const sgas = gasLimit; // vm.getGas(); + auto ret = vm.run(wasmCode, funcName, imports); + if (!ret.has_value()) + return Unexpected(ret.error()); + std::int64_t const egas = vm.getGas(); + std::uint64_t const spent = static_cast(sgas - egas); - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getLedgerSqn"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - // WasmEdge_FunctionInstanceDelete(hostFunc); - } - - // getParentLedgerTime - { - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getParentLedgerTime, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getParentLedgerTime"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - // WasmEdge_FunctionInstanceDelete(hostFunc); - } - - // getTxField - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getTxField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getTxField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getLedgerEntryField - { - WasmEdge_ValType inputList[5] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 5, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getLedgerEntryField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getLedgerEntryField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getCurrentLedgerEntryField - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getCurrentLedgerEntryField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getCurrentLedgerEntryField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getNFT - { - WasmEdge_ValType inputList[4] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate(hostFuncType, getNFT, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = WasmEdge_StringCreateByCString("getNFT"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // updateData - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, updateData, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("updateData"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // computeSha512HalfHash - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, computeSha512HalfHash, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("computeSha512HalfHash"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // accountKeylet - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, accountKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("accountKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // credentialKeylet - { - WasmEdge_ValType inputList[6] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 6, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, credentialKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - WasmEdge_String fName = - WasmEdge_StringCreateByCString("credentialKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // escrowKeylet - { - WasmEdge_ValType inputList[3] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, escrowKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("escrowKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // oracleKeylet - { - WasmEdge_ValType inputList[3] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, oracleKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("oracleKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // print - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate(hostFuncType, print, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = WasmEdge_StringCreateByCString("print"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, hostMod); - if (!WasmEdge_ResultOK(regRe)) - { - printf("host func reg error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - } - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error, %p, %d\n", wasmCode.data(), wasmCode.size()); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Value funcReturns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); - - bool ok = WasmEdge_ResultOK(funcRes); - EscrowResult re; - if (ok) - { - auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); - re.cost = WasmEdge_StatisticsGetTotalCost(sc); - // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount - auto result = WasmEdge_ValueGetI32(funcReturns[0]); - if (result != 0) - re.result = true; - else - re.result = false; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } - - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(func); - // delete other obj allocated - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); + return EscrowResult{static_cast(ret.value()), spent}; } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +WasmEngine::WasmEngine() : impl(std::make_unique()) +{ +} + +WasmEngine& +WasmEngine::instance() +{ + static WasmEngine e; + return e; +} + +Expected +WasmEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + return impl->run(wasmCode, funcName, imports, params); +} + +std::int64_t +WasmEngine::initGas(std::int64_t def) +{ + return impl->initGas(def); +} + +std::int32_t +WasmEngine::initMaxPages(std::int32_t def) +{ + return impl->initMaxPages(def); +} + +// gas = 1'000'000'000LL +std::int64_t +WasmEngine::setGas(std::int64_t gas) +{ + return impl->setGas(gas); +} + +std::int64_t +WasmEngine::getGas() +{ + return impl->getGas(); +} + +wmem +WasmEngine::getMem() const +{ + return impl->getMem(); +} + +int32_t +WasmEngine::allocate(int32_t size) +{ + return impl->allocate(size); +} + +void* +WasmEngine::newTrap(std::string_view msg) +{ + return impl->newTrap(msg); +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b0839dc76d..b383bba37d 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -16,16 +16,43 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#ifndef RIPPLE_APP_MISC_WASMVM_H_INLCUDED -#define RIPPLE_APP_MISC_WASMVM_H_INLCUDED +#pragma once #include +#include +#include #include -#include "xrpl/basics/base_uint.h" -#include +#include +#include +#include +#include + +// #include + +#include + +namespace bft = boost::function_types; namespace ripple { + +static const std::string_view W_ENV = "env"; +static const std::string_view W_HOST_LIB = "host_lib"; +static const std::string_view W_MEM = "memory"; +static const std::string_view W_STORE = "store"; +static const std::string_view W_LOAD = "load"; +static const std::string_view W_SIZE = "size"; +static const std::string_view W_ALLOC = "allocate"; +static const std::string_view W_DEALLOC = "deallocate"; +static const std::string_view W_PROC_EXIT = "proc_exit"; + +using wbytes = std::vector; +struct wmem +{ + std::uint8_t* p = nullptr; + std::size_t s = 0; +}; + const uint32_t MAX_PAGES = 128; // 8MB = 64KB*128 typedef std::vector Bytes; @@ -122,12 +149,220 @@ struct HostFunctions virtual ~HostFunctions() = default; }; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64 }; + +struct WasmImportFunc +{ + std::string name; + std::optional result; + std::vector params; + void* udata = nullptr; + // wasm_func_callback_with_env_t + void* wrap = nullptr; +}; + +#define WASM_IMPORT_FUNC(v, f, ...) \ + WasmImpFunc( \ + v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__); + +template +void +WasmImpArgs(WasmImportFunc& e) +{ + if constexpr (N < C) + { + using at = typename boost::mpl::at_c::type; + if constexpr (std::is_pointer_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I64); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F64); + else + static_assert(std::is_pointer_v, "Unsupported argument type"); + + return WasmImpArgs(e); + } + return; +} + +template +void +WasmImpRet(WasmImportFunc& e) +{ + if constexpr (std::is_pointer_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I64; + else if constexpr (std::is_same_v) + e.result = WT_F32; + else if constexpr (std::is_same_v) + e.result = WT_F64; + else if constexpr (std::is_void_v) + e.result.reset(); +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ + ((defined(__clang_major__)) && (__clang_major__ >= 18)) + else + static_assert(false, "Unsupported return type"); +#endif +} + +template +void +WasmImpFuncHelper(WasmImportFunc& e) +{ + using rt = typename bft::result_type::type; + using pt = typename bft::parameter_types::type; + // typename boost::mpl::at_c::type + + WasmImpRet(e); + WasmImpArgs<0, bft::function_arity::value, pt>(e); + // WasmImpWrap(e, std::forward(f)); +} + +template +void +WasmImpFunc( + std::vector& v, + std::string_view imp_name, + void* f_wrap, + void* data = nullptr) +{ + WasmImportFunc e; + e.name = imp_name; + e.udata = data; + e.wrap = f_wrap; + WasmImpFuncHelper(e); + v.push_back(std::move(e)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct WasmParam +{ + WasmTypes type = WT_I32; + union + { + std::int32_t i32; + std::int64_t i64 = 0; + float f32; + double f64; + } of; +}; + +template +inline std::vector +wasmParams(Types... args) +{ + std::vector v; + v.reserve(sizeof...(args)); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, std::int32_t p, Types... args) +{ + v.push_back({.type = WT_I32, .of = {.i32 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, std::int64_t p, Types... args) +{ + v.push_back({.type = WT_I64, .of = {.i64 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, float p, Types... args) +{ + v.push_back({.type = WT_F32, .of = {.f32 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, double p, Types... args) +{ + v.push_back({.type = WT_F64, .of = {.f64 = p}}); + return wasmParams(v, std::forward(args)...); +} + +inline std::vector +wasmParams(std::vector& v) +{ + return v; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class WamrEngine; +class WasmEngine +{ + std::unique_ptr const impl; + + WasmEngine(); + + WasmEngine(WasmEngine const&) = delete; + WasmEngine(WasmEngine&&) = delete; + WasmEngine& + operator=(WasmEngine const&) = delete; + WasmEngine& + operator=(WasmEngine&&) = delete; + +public: + ~WasmEngine() = default; + + static WasmEngine& + instance(); + + Expected + run(wbytes const& wasmCode, + std::string_view funcName = {}, + std::vector const& imports = {}, + std::vector const& params = {}); + + std::int64_t + initGas(std::int64_t def = 1'000'000'000'000LL); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + setGas(std::int64_t gas); + + std::int64_t + getGas(); + + // for host functions usage + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + void* + newTrap(std::string_view msg = {}); +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Expected runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, + Bytes const& wasmCode, + std::string_view funcName, HostFunctions* hfs, uint64_t gasLimit); } // namespace ripple -#endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED From c533abd8b61995e00995a2ec0f1bf83c5d8b9d3d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 1 May 2025 18:41:51 -0400 Subject: [PATCH 11/15] Update size and compute cap defaults (#5417) --- cfg/rippled-example.cfg | 6 +++--- src/test/jtx/impl/envconfig.cpp | 6 +++--- src/xrpld/core/Config.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 6da6841052..bd2b044c4c 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1259,7 +1259,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_compute_limit = 2000000 # 2 million gas +# extension_compute_limit = 1000000 # 1 million gas # # extension_size_limit = # @@ -1271,7 +1271,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_size_limit = 2000000 # 2 mb +# extension_size_limit = 100000 # 100 kb # # gas_price = # @@ -1281,7 +1281,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# gas_price = 2000000 # 2 drops per gas +# gas_price = 1000000 # 1 drop per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index ab0969c6cb..79643a8bb9 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -38,9 +38,9 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); - cfg.FEES.extension_compute_limit = 4294967295; - cfg.FEES.extension_size_limit = 4294967295; - cfg.FEES.gas_price = 1000000; + cfg.FEES.extension_compute_limit = 1'000'000; + cfg.FEES.extension_size_limit = 100'000; + cfg.FEES.gas_price = 1'000'000; // 1 drop = 1,000,000 micro-drops // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 4b297c8610..c1b143b799 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -74,13 +74,13 @@ struct FeeSetup XRPAmount owner_reserve{2 * DROPS_PER_XRP}; /** The compute limit for Feature Extensions. */ - std::uint32_t extension_compute_limit{4294967295}; + std::uint32_t extension_compute_limit{1'000'000}; /** The WASM size limit for Feature Extensions. */ - std::uint32_t extension_size_limit{4294967295}; + std::uint32_t extension_size_limit{100'000}; /** The price of 1 WASM gas, in micro-drops. */ - std::uint32_t gas_price{1000000}; + std::uint32_t gas_price{1'000'000}; /* (Remember to update the example cfg files when changing any of these * values.) */ From 1e9ff88a00500621a187fa5c1ab9fa1a9ef4be98 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 8 May 2025 12:39:37 -0400 Subject: [PATCH 12/15] Fix CI build issues * Mac build fix * Windows build fix * Windows instruction counter fix --- external/wamr/patches/ripp_metering.patch | 193 ++++++++++++++-------- src/xrpld/app/misc/WamrVM.cpp | 3 +- src/xrpld/app/misc/WasmVM.cpp | 9 + 3 files changed, 134 insertions(+), 71 deletions(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 7cc3544b68..a2abf37a57 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -87,7 +87,7 @@ index ce0c1fa7..2713a092 100644 /** * Cache for diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index d33c0272..900fb536 100644 +index d33c0272..21bfdf29 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() @@ -122,15 +122,39 @@ index d33c0272..900fb536 100644 WASMFuncType * wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, uint32 module_type) -@@ -7803,7 +7828,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7792,13 +7817,14 @@ wasm_runtime_get_module_name(wasm_module_t module) + bool + wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + { ++#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 + uint8 *boundary = exec_env->native_stack_boundary; + RECORD_STACK_USAGE(exec_env, (uint8 *)&boundary); + if (boundary == NULL) { + /* the platform doesn't support os_thread_get_stack_boundary */ + return true; + } +-#if defined(OS_ENABLE_HW_BOUND_CHECK) && WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 ++#if defined(OS_ENABLE_HW_BOUND_CHECK) + uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; - #endif -- if ((uint8 *)&boundary < boundary) { -+ if (((uint8 *)&boundary < boundary) && ((uint8 *)&boundary > exec_env->native_stack_boundary)){ - wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +@@ -7808,6 +7834,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; + } ++#endif + return true; + } + +@@ -7830,7 +7857,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, + boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; + if ((uint8 *)&boundary < boundary) { + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +- "native stack overflow"); ++ "native s stack overflow"); + return false; + } + return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index 8ac032bf..5ca5d489 100644 --- a/core/iwasm/common/wasm_runtime_common.h @@ -163,10 +187,22 @@ index 8ac032bf..5ca5d489 100644 bool enable); diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h -index 241a0eec..82e048c0 100644 +index 241a0eec..9eb0dde1 100644 --- a/core/iwasm/include/wasm_c_api.h +++ b/core/iwasm/include/wasm_c_api.h -@@ -701,6 +701,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); +@@ -19,8 +19,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_API_EXTERN + #endif + #else + #define WASM_API_EXTERN +@@ -701,6 +703,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); // func_name. If the function is not found, return 0. WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); @@ -179,10 +215,22 @@ index 241a0eec..82e048c0 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b73a0364..f7e20b24 100644 +index b73a0364..3fd0949f 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h -@@ -1821,6 +1821,27 @@ WASM_RUNTIME_API_EXTERN void +@@ -20,8 +20,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_RUNTIME_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_RUNTIME_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_RUNTIME_API_EXTERN + #endif + #elif defined(__GNUC__) || defined(__clang__) + #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) +@@ -1821,6 +1823,27 @@ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, uint8_t *native_stack_boundary); @@ -211,7 +259,7 @@ index b73a0364..f7e20b24 100644 * Dump runtime memory consumption, including: * Exec env memory consumption diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 41ac4c72..1aa1fe1c 100644 +index 41ac4c72..bd8f714a 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, @@ -243,18 +291,20 @@ index 41ac4c72..1aa1fe1c 100644 #endif #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1562,6 +1568,18 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) +@@ -1562,6 +1568,20 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) #endif } +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute == 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ else if (instructions_to_execute > 0) \ -+ instructions_to_execute--; ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) \ ++ { \ ++ instructions_to_execute -= instructions_schedule[opcode];\ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } +#else +#define CHECK_INSTRUCTION_LIMIT() (void)0 +#endif @@ -262,21 +312,25 @@ index 41ac4c72..1aa1fe1c 100644 static void wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMExecEnv *exec_env, -@@ -1605,6 +1623,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1605,6 +1625,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 local_idx, local_offset, global_idx; uint8 local_type, *global_addr; uint32 cache_index, type_index, param_cell_num, cell_num; + +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + int64 instructions_to_execute = -1; ++ int64 const *instructions_schedule = NULL; + if(exec_env) ++ { + instructions_to_execute = exec_env->instructions_to_execute; ++ instructions_schedule = exec_env->instructions_schedule; ++ } +#endif + #if WASM_ENABLE_EXCE_HANDLING != 0 int32_t exception_tag_index; #endif -@@ -6859,6 +6884,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6859,6 +6890,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -288,7 +342,7 @@ index 41ac4c72..1aa1fe1c 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6899,6 +6929,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6899,6 +6935,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -302,22 +356,21 @@ index 41ac4c72..1aa1fe1c 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index f33ad60e..a7078fe8 100644 +index f33ad60e..9cbf2010 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -105,6 +105,20 @@ typedef float64 CellType_F64; +@@ -105,6 +105,19 @@ typedef float64 CellType_F64; goto unaligned_atomic; \ } while (0) +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) \ -+ { \ -+ instructions_to_execute -= instructions_schedule[opc]; \ -+ if (instructions_to_execute < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) { \ ++ instructions_to_execute -= instructions_schedule[opcode]; \ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ + } +#else +#define CHECK_INSTRUCTION_LIMIT() (void)0 @@ -326,40 +379,24 @@ index f33ad60e..a7078fe8 100644 static inline uint32 rotl32(uint32 n, uint32 c) { -@@ -1439,8 +1453,10 @@ wasm_interp_dump_op_count() - #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 - #define FETCH_OPCODE_AND_DISPATCH() \ - do { \ -+ const uint64 opc = *frame_ip; \ - const void *p_label_addr = *(void **)frame_ip; \ - frame_ip += sizeof(void *); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1450,8 +1466,10 @@ wasm_interp_dump_op_count() - const void *p_label_addr; \ - bh_assert(((uintptr_t)frame_ip & 1) == 0); \ - /* int32 relative offset was emitted in 64-bit target */ \ -+ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ - p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1460,8 +1478,10 @@ wasm_interp_dump_op_count() - const void *p_label_addr; \ - bh_assert(((uintptr_t)frame_ip & 1) == 0); \ - /* uint32 label address was emitted in 32-bit target */ \ -+ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ - p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ +@@ -1466,12 +1479,14 @@ wasm_interp_dump_op_count() } while (0) #endif -@@ -1538,6 +1558,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() CHECK_INSTRUCTION_LIMIT(); FETCH_OPCODE_AND_DISPATCH() + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ + + #define HANDLE_OP(opcode) case opcode: +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ + +@@ -1538,6 +1553,16 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 *maddr = NULL; uint32 local_idx, local_offset, global_idx; uint8 opcode = 0, local_type, *global_addr; @@ -367,8 +404,7 @@ index f33ad60e..a7078fe8 100644 +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + int64 instructions_to_execute = -1; + int64 const *instructions_schedule = NULL; -+ if(exec_env) -+ { ++ if (exec_env) { + instructions_to_execute = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; + } @@ -377,29 +413,46 @@ index f33ad60e..a7078fe8 100644 #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -@@ -7761,6 +7792,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7761,6 +7786,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) ++ if (exec_env) + exec_env->instructions_to_execute = instructions_to_execute; +#endif + if (!prev_frame->ip) /* Called from native. */ return; -@@ -7789,6 +7825,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7789,6 +7819,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) ++ if (exec_env) + exec_env->instructions_to_execute = instructions_to_execute; +#endif return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h +index ac1a95ea..e23b500e 100644 +--- a/core/shared/platform/include/platform_wasi_types.h ++++ b/core/shared/platform/include/platform_wasi_types.h +@@ -36,7 +36,11 @@ extern "C" { + #if WASM_ENABLE_UVWASI != 0 || WASM_ENABLE_LIBC_WASI == 0 + #define assert_wasi_layout(expr, message) /* nothing */ + #else +-#define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #ifndef _MSC_VER ++ #define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #else ++ #define assert_wasi_layout(expr, message) static_assert(expr, message) ++ #endif + #endif + + assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 6425450b..94dd9628 100644 --- a/doc/build_wamr.md diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index a92d8e463e..a781aadea9 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -31,10 +31,11 @@ static void print_wasm_error(const char* message, wasm_trap_t* trap) { fprintf(stderr, "WAMR error: %s\n", message); - wasm_byte_vec_t error_message; if (trap) { + wasm_byte_vec_t error_message; + wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); fprintf( diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index d786cae7fb..46267d55b5 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -57,11 +57,20 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports); + + // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + if (!ret.has_value()) + { + // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); + } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); + // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From 5b43ec7f7386ede320bea75080117f8e12187ebe Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 20 May 2025 16:12:19 -0400 Subject: [PATCH 13/15] refactor: switch function name from `ready` to `finish` (#5430) --- src/test/app/Escrow_test.cpp | 1161 +--------------- src/test/app/Wasm_test.cpp | 1839 +------------------------ src/test/app/wasm_fixtures/fixtures.h | 1569 +++++++++++++++++++++ src/xrpld/app/misc/WasmVM.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 2 +- 5 files changed, 1589 insertions(+), 2984 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixtures.h diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 94e71cfdcf..4e39ac298f 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -29,6 +30,7 @@ #include #include +#include #include namespace ripple { @@ -1699,23 +1701,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // featureSmartEscrow disabled @@ -1862,23 +1851,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // featureSmartEscrow disabled @@ -1988,23 +1964,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // basic FinishFunction situation @@ -2217,1113 +2180,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: figure out how to make this a fixture in a separate file - auto wasmHex = - "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" - "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" - "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" - "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" - "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" - "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" - "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" - "745f6c696213676574506172656e744c656467657254696d650005035453020603" - "070101080901010a01000202010102080008000b0c030101010104050802030303" - "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" - "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" - "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" - "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" - "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" - "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" - "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" - "14200142808080801037020c200141033a00382001412036022820014100360234" - "2001418080c08000360230200141003602202001410036021820012001410c6a36" - "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" - "808080000d00200128020c21002001280210220220012802141080808080000240" - "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" - "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" - "027f017e037f23808080800041306b220324808080800041272104024002402000" - "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" - "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" - "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" - "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" - "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" - "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" - "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" - "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" - "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" - "41096a20046a412720046b108c808080002104200341306a24808080800020040b" - "6c01027f024002402000417c6a2802002202417871220341044108200241037122" - "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" - "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" - "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" - "2005200136020c2005200036020820052003360214200520023602102005410236" - "021c200541b884c08000360218200542023702242005418180808000ad42208620" - "0541106aad843703382005418280808000ad422086200541086aad843703302005" - "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" - "0041c0006b220224808080800002400240200028020022032d00000d0020012802" - "14419582c080004104200128021828020c118080808000808080800021000c010b" - "4101210020012802142204419982c0800041042001280218220528020c22061180" - "8080800080808080000d00200341016a210302400240200128021c22074104710d" - "0041012100200441f184c080004101200611808080800080808080000d02200320" - "01108a80808000450d010c020b200441f284c08000410220061180808080008080" - "8080000d0141012100200241013a001b200220053602102002200436020c200220" - "07360238200241c884c08000360234200220012d00203a003c2002200128021036" - "022c200220012902083702242002200129020037021c20022002411b6a36021420" - "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" - "80004102200228023428020c11808080800080808080000d010b2001280214419c" - "97c080004101200128021828020c118080808000808080800021000b200241c000" - "6a24808080800020000be90201057f2380808080004180016b2202248080808000" - "0240024002400240200128021c22034110710d0020034120710d01200031000041" - "01200110868080800021000c030b20002d0000210041ff00210303402002200322" - "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" - "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" - "0041ff00210303402002200322046a22052000410f712203413072200341376a20" - "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" - "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" - "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" - "02402004418101490d002004418001418885c08000108b80808000000b20014101" - "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" - "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" - "20032000360200200320013602042003410236020c200341d887c0800036020820" - "0342023702142003418380808000ad4220862204200341046aad84370328200320" - "042003ad843703202003200341206a360210200341086a200210aa80808000000b" - "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" - "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" - "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" - "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" - "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" - "2802000d000240200028021422012000280218220920082002200310ad80808000" - "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" - "0240024002402000280204220120064b0d00200028021422012000280218220920" - "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" - "2000413036021020002d0020210b4101210c200041013a00202000280214220920" - "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" - "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" - "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" - "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" - "1180808080008080808000210c0c010b200120066b210702400240024020002d00" - "2022010e0402000100020b20072101410021070c010b2007410176210120074101" - "6a41017621070b200141016a210120002802102106200028021821092000280214" - "210a024003402001417f6a2201450d01200a200620092802101181808080008080" - "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" - "200a20042005200928020c11808080800080808080000d00410021010340024020" - "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" - "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" - "0041106b220224808080800020022000280200220041046a36020c200141e181c0" - "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" - "418580808000108f808080002100200241106a24808080800020000be70201057f" - "2380808080004180016b22022480808080000240024002400240200128021c2203" - "4110710d0020034120710d0120003502004101200110868080800021000c030b20" - "00280200210041ff00210303402002200322046a22052000410f71220341307220" - "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" - "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" - "004110492106200041047621002006450d000b02402004418101490d0020044180" - "01418885c08000108b80808000000b20014101419885c080004102200541810120" - "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" - "85c08000108b80808000000b20014101419885c080004102200541810120044101" - "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" - "8080800041106b220b248080808000200028021420012002200028021828020c11" - "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" - "200b41086a200320042005200610b680808000200720082009200a10b680808000" - "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" - "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" - "0028021828020c118080808000808080800021000c010b200028021441ee84c080" - "004101200028021828020c118080808000808080800021000b200b41106a248080" - "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" - "23808080800041306b2203248080808000200341033a002c2003412036021c4100" - "210420034100360228200320013602242003200036022020034100360214200341" - "0036020c02400240024002400240200228021022050d00200228020c2200450d01" - "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" - "280200210003400240200041046a2802002207450d002003280220200028020020" - "07200328022428020c11808080800080808080000d040b20012802002003410c6a" - "200128020411818080800080808080000d03200141086a2101200041086a210020" - "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" - "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" - "40200041046a2802002201450d0020032802202000280200200120032802242802" - "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" - "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" - "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" - "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" - "0b0b200320073602102003200b36020c200141046a280200210702400240024020" - "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" - "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a200128020411818080800080808080000d02" - "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" - "280220200228020020044103746a22012802002001280204200328022428020c11" - "80808080008080808000450d010b410121010c010b410021010b200341306a2480" - "8080800020010b1e01017f024020002802002201450d0020002802042001108780" - "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" - "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" - "808080000be30201027f23808080800041106b2202248080808000024002400240" - "02402001418001490d002002410036020c2001418010490d010240200141808004" - "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" - "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" - "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" - "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" - "032000280200470d0020001096808080000b2000200341016a3602082000280204" - "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" - "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" - "20032001109780808000200028020821030b200028020420036a2002410c6a2001" - "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "01109c80808000024020012802082200418180808078460d002000200128020c10" - "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" - "03248080808000200341086a200020012002109c80808000024020032802082202" - "418180808078460d002002200328020c109d80808000000b200341106a24808080" - "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109780808000200028020821030b200028020420036a2001200210d6808080001a" - "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" - "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" - "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" - "200136020820002002410120021b36020420002002453602000b800601057f0240" - "024002402000417c6a22032802002204417871220541044108200441037122061b" - "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" - "712002410b491b210102400240024020060d002001418002490d01200520014104" - "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" - "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" - "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" - "01490d042006200410a780808000200520016b22024110490d0120032001200328" - "020041017172410272360200200720016a22012002410372360204200720056a22" - "0520052802044101723602042001200210a88080800020000f0b200520016b2202" - "410f4d0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210a88080800020000f0b200320" - "05200328020041017172410272360200200720056a220220022802044101723602" - "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" - "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" - "020441017236020441002102410021010c010b2003200120044101717241027236" - "0200200720016a22012002410172360204200720056a2205200236020020052005" - "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" - "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" - "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" - "2201200220012002491b10d6808080002102200010a580808000200221000b2000" - "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" - "0010a680808000000b20032001200441017172410272360200200720016a220220" - "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" - "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" - "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" - "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" - "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" - "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" - "00411920044101766b2004411f461b742107410021060340024020052205280204" - "41787122082002490d00200820026b220820014f0d00200821012005210620080d" - "004100210120052106200521000c040b200528021422082000200820052007411d" - "764104716a41106a2802002205471b200020081b2100200741017421072005450d" - "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" - "491b22024103762201762200410371450d00024002402000417f7341017120016a" - "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" - "2206460d002006200136020c200120063602080c010b41002005417e2007777136" - "0298a2c080000b20022000410372360204200220006a2200200028020441017236" - "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" - "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" - "020441787120026b21012006210503400240200628021022000d00200628021422" - "000d0020052802182104024002400240200528020c22002005470d002005411441" - "10200528021422001b6a28020022060d01410021000c020b200528020822062000" - "36020c200020063602080c010b200541146a200541106a20001b21070340200721" - "082006220041146a200041106a200028021422061b210720004114411020061b6a" - "28020022060d000b200841003602000b2004450d040240200528021c4102744180" - "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" - "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" - "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" - "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" - "0020017441022001742200410020006b727168220841037422014190a0c080006a" - "220620014198a0c080006a28020022002802082207460d002007200636020c2006" - "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" - "360204200020026a2207200120026b2206410172360204200020016a2006360200" - "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" - "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" - "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" - "0120023602082005200236020c2002200136020c200220053602080b4100200736" - "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" - "20052802102206450d0020002006360210200620003602180b2005280214220645" - "0d0020002006360214200620003602180b02400240024020014110490d00200520" - "02410372360204200520026a22022001410172360204200220016a200136020041" - "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" - "c080002100024002404100280298a2c08000220841012007410376742207710d00" - "41002008200772360298a2c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200520012002" - "6a2200410372360204200520006a220020002802044101723602040c010b410020" - "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" - "720d004100210641022004742200410020006b722003712200450d032000684102" - "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" - "71220520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b2106200120082007" - "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" - "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" - "002006470d00200641144110200628021422001b6a28020022050d01410021000c" - "020b20062802082205200036020c200020053602080c010b200641146a20064110" - "6a20001b21070340200721082005220041146a200041106a200028021422051b21" - "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" - "40200628021c41027441809fc080006a22052802002006460d0020044110411420" - "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" - "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" - "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" - "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" - "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" - "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" - "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" - "a0c080002100034020002802002206200028020422076a2005460d022000280208" - "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" - "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" - "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" - "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" - "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" - "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" - "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" - "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" - "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" - "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" - "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" - "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" - "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" - "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" - "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" - "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" - "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" - "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" - "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" - "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" - "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" - "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" - "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" - "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" - "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" - "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" - "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" - "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" - "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" - "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" - "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" - "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" - "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" - "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" - "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" - "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" - "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" - "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" - "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" - "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" - "360204410041808080013602b8a2c080002001200641606a41787141786a220020" - "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" - "290288a0c080003702002007200937020841002008360284a0c080004100200536" - "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" - "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" - "0720072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010d0808080000c080b200041f8017141" - "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" - "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" - "0620013602082000200136020c2001200636020c200120003602080c070b200020" - "053602002000200028020420086a360204200520024103723602042007410f6a41" - "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" - "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" - "417871220610a780808000200620026a2102200120066a220128020421060b2001" - "2006417e7136020420002002410172360204200020026a20023602000240200241" - "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" - "024002404100280298a2c08000220641012002410376742202710d004100200620" - "0272360298a2c08000200121020c010b200128020821020b200120003602082002" - "200036020c2000200136020c200020023602080c050b4100200020026b22013602" - "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" - "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" - "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" - "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" - "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" - "800020052006410172360204200120006a2006360200200120024103723602040b" - "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" - "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" - "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" - "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" - "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" - "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" - "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" - "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" - "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" - "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" - "4020062802102205450d0020002005360210200520003602180b20062802142205" - "450d0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a20013602000240" - "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" - "6a2102024002404100280298a2c08000220541012001410376742201710d004100" - "2005200172360298a2c08000200221010c010b200228020821010b200220003602" - "082001200036020c2000200236020c200020013602080c010b2006200120026a22" - "00410372360204200620006a220020002802044101723602040b200641086a0be9" - "0101037f23808080800041206b2204248080808000024002400240200220036a22" - "0320024f0d00410021020c010b4100210220012802002205410174220620032006" - "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" - "0c010b2004200536021c20042001280204360214410121020b2004200236021820" - "0441086a2003200441146a109980808000024020042802080d00200428020c2102" - "200120033602002001200236020441818080807821020c010b2004280210210120" - "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" - "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" - "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" - "0041052000418680808000419082c0800041052002410c6a418780808000108f80" - "8080002100200241106a24808080800020000be00301097f23808080800041c000" - "6b2202248080808000200028020821032000280204210441012105200128021441" - "b083c080004101200128021828020c118080808000808080800021000240200345" - "0d0041002106034020062107410121062000410171210841012100024020080d00" - "02400240200128021c22084104710d002007410171450d01410121002001280214" - "41e784c080004102200128021828020c1180808080008080808000450d010c020b" - "200128021821092001280214210a024020074101710d0041012100200a41888bc0" - "80004101200928020c11808080800080808080000d020b200241013a001b200220" - "093602102002200a36020c20022008360238200241c884c0800036023420022001" - "2d00203a003c2002200128021036022c2002200129020837022420022001290200" - "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" - "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" - "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" - "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" - "4101200128021828020c118080808000808080800021050b200241c0006a248080" - "80800020050b4a01017f23808080800041106b2202248080808000200220003602" - "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" - "00200241106a24808080800020000b3d00200128021420002802002d0000410274" - "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" - "808080800080808080000be70101017f23808080800041106b2205248080808000" - "20002802142001410d200028021828020c11808080800080808080002101200541" - "003a000d200520013a000c20052000360208200541086a200241042003200410b6" - "80808000210320052d000d220120052d000c2204722100024020014101470d0020" - "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" - "004102200028021828020c118080808000808080800021000c010b200028021441" - "ee84c080004101200028021828020c118080808000808080800021000b20054110" - "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" - "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" - "02400240024002400240024002404107109b808080002201450d00200141036a41" - "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" - "800022022800042103200228000021042002410810878080800020014107108780" - "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" - "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" - "002202280004210520022800002106200241081087808080002001410710878080" - "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" - "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" - "2202280004210720022800002108200241081087808080002001410b1087808080" - "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" - "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" - "108380808000220928000421022009280000210a20094108108780808000200041" - "186a200a200210a48080800002400240024020002d00184101460d002000290320" - "210b02402002450d00200a20021087808080000b20014107108780808000410021" - "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" - "0000200141041082808080002202280000210c2002280004210a20024108108780" - "80800020014104108780808000024002400240200a4100480d000240200a0d0041" - "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" - "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" - "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" - "026b210f4100210103400240024002400240200220016a2d00002209c022104100" - "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" - "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" - "808080202111428080808010211202400240024002400240024002400240024002" - "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" - "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" - "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" - "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" - "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" - "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" - "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" - "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" - "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" - "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" - "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" - "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" - "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" - "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" - "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" - "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" - "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" - "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" - "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" - "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" - "41186a20142011a710a48080800020002d00184101460d01200029032021124100" - "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" - "201641076a41002800878cc08000360000201641002900808cc080003700002016" - "410b10828080800022012800002117200128000421132001410810878080800002" - "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" - "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" - "09201741016a210220134109490d024100210103402009450d0a20022d00004150" - "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" - "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" - "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" - "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" - "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" - "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" - "20090d040b410021010c050b201321092017210220134108490d020b4100210103" - "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" - "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" - "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" - "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" - "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" - "0b1087808080002004200310808080800020062005108080808000200820071080" - "80808000200c200a10808080800020004100360214200042808080801037020c20" - "0041033a003820004120360228200041003602342000418080c080003602302000" - "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" - "1086808080000d00200028020c2102200028021022092000280214108080808000" - "02402002450d00200920021087808080000b201510858080800020011085808080" - "0041002102024020032005470d0020042006200310d58080800045200b20125871" - "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" - "00200c200a1087808080000b02402007450d00200820071087808080000b024020" - "05450d00200620051087808080000b02402003450d00200420031087808080000b" - "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" - "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" - "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" - "80800041106b220324808080800002400240024002400240024002400240024002" - "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" - "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" - "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" - "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" - "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" - "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" - "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" - "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" - "0121010c010b20002005370308410021010b200020013a0000200341106a248080" - "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" - "030240024020024101710d002002410271450d012001280200220220006a210002" - "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" - "410020003602a0a2c0800020032003280204417e71360204200120004101723602" - "04200320003602000f0b2001200210a7808080000b024002400240024002400240" - "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" - "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" - "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" - "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" - "20003602000b2000418002490d022001200010d080808000410021014100410028" - "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" - "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" - "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" - "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" - "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" - "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" - "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b200128020821010c" - "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" - "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" - "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" - "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" - "0320013602082000200136020c2001200336020c200120003602080f0b02404100" - "280288a0c080002201450d00410021020340200241016a2102200128020822010d" - "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" - "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" - "02410036021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110aa80808000000b820301047f200028020c" - "21020240024002402001418002490d002000280218210302400240024020022000" - "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" - "002802082201200236020c200220013602080c010b200041146a200041106a2002" - "1b21040340200421052001220241146a200241106a200228021422011b21042002" - "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441809fc080006a22012802002000460d0020034110411420032802" - "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" - "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" - "102201450d0020022001360210200120023602180b20002802142201450d002002" - "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" - "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" - "20013602a0a2c0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a7808080000b02400240024002402002280204" - "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" - "0d0320022003417871220310a7808080002000200320016a220141017236020420" - "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" - "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" - "80006a2102024002404100280298a2c08000220341012001410376742201710d00" - "41002003200172360298a2c08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" - "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" - "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" - "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" - "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" - "4701017f23808080800041206b2200248080808000200041003602182000410136" - "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" - "80808000000b5601017f23808080800041206b2202248080808000200241106a20" - "0041106a290200370300200241086a200041086a290200370300200241013b011c" - "2002200136021820022000290200370300200210ac80808000000b110020003502" - "00410120011086808080000b5d01027f23808080800041206b2201248080808000" - "20002802182102200141106a200041106a290200370300200141086a200041086a" - "2902003703002001200036021c2001200236021820012000290200370300200110" - "d180808000000b490002402002418080c400460d00200020022001280210118180" - "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" - "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" - "808080800020022000360200200220013602042002410236020c200241f887c080" - "00360208200242023702142002418380808000ad4220862203200241046aad8437" - "0328200220032002ad843703202002200241206a360210200241086a419487c080" - "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" - "0022040d002003410171450d010b02402003410171450d00200120026a21050240" - "0240200028020c22060d0041002107200121080c010b4100210741002109200121" - "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" - "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" - "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" - "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" - "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" - "20031b21022003200120031b21010b024020040d00200028021420012002200028" - "021828020c11808080800080808080000f0b2000280204210a024020024110490d" - "0020022001200141036a417c7122076b22096a220b410371210441002106410021" - "03024020012007460d004100210302402009417c4b0d0041002103410021050340" - "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" - "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" - "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" - "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" - "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" - "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" - "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002004200d41f007716a210941002108200421030340200328" - "020c2207417f7341077620074106767241818284087120032802082207417f7341" - "077620074106767241818284087120032802042207417f73410776200741067672" - "41818284087120032802002207417f734107762007410676724181828408712008" - "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" - "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" - "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" - "03410676724181828408712103200c4101460d0220082802042207417f73410776" - "20074106767241818284087120036a2103200c4102460d0220082802082208417f" - "7341077620084106767241818284087120036a21030c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" - "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" - "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" - "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" - "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" - "0d000c030b0b200028021420012002200028021828020c11808080800080808080" - "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" - "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" - "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a210320002802102109200028021821082000280214" - "210703402003417f6a2203450d0220072009200828021011818080800080808080" - "00450d000b41010f0b200028021420012002200028021828020c11808080800080" - "808080000f0b0240200720012002200828020c1180808080008080808000450d00" - "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" - "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" - "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" - "36020c20032000360208200341b08dc08000360214200320013602102003410236" - "021c200341b183c08000360218024020022802000d002003410336025c200341e4" - "83c08000360258200342033702642003418180808000ad4220862204200341106a" - "ad8437034820032004200341086aad843703402003418280808000ad4220862003" - "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" - "808000000b200341206a41106a200241106a290200370300200341206a41086a20" - "0241086a290200370300200320022902003703202003410436025c2003419884c0" - "8000360258200342043702642003418180808000ad4220862204200341106aad84" - "37035020032004200341086aad843703482003418980808000ad42208620034120" - "6aad843703402003418280808000ad422086200341186aad843703382003200341" - "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" - "01200028020428020c11818080800080808080000b140020012000280200200028" - "020410af808080000b14002001280214200128021820001091808080000b220020" - "01280214418883c08000410e200128021828020c11808080800080808080000b60" - "01017f23808080800041306b22002480808080002000410136020c200041a883c0" - "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" - "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" - "057f017e23808080800041c0006b220524808080800041012106024020002d0004" - "0d0020002d0005210702402000280200220828021c22094104710d004101210620" - "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" - "28021828020c11808080800080808080000d012008280214200120022008280218" - "28020c11808080800080808080000d01200828021441ef97c08000410220082802" - "1828020c11808080800080808080000d0120032008200411818080800080808080" - "0021060c010b41012106024020074101710d00200828021441e984c08000410320" - "0828021828020c11808080800080808080000d01200828021c21090b4101210620" - "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" - "6a360214200520082902083702242008290200210a200520093602382005200828" - "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" - "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" - "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" - "84c080004102200528023428020c118080808000808080800021060b200041013a" - "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" - "6a2103200028020421042000280200210520002802082106410021074100210841" - "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" - "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" - "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" - "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" - "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" - "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" - "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" - "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" - "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" - "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" - "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" - "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" - "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" - "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" - "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" - "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" - "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" - "21070b20070b6001027f2000280204210220002802002103024020002802082200" - "2d0000450d00200341e084c080004104200228020c118080808000808080800045" - "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" - "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" - "41306b22032480808080002003200136020c200320003602082003410136021420" - "0341d490c080003602102003420137021c2003418280808000ad42208620034108" - "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" - "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" - "808080000b830201087f2380808080004180016b22022480808080002001280204" - "21032001280200210420002802002100200128021c220521060240200541047145" - "0d002005410872210620040d0020014281808080a0013702000b20012006410472" - "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" - "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" - "09450d000b02402007418101490d002007418001418885c08000108b8080800000" - "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" - "01200536021c200120033602042001200436020020024180016a24808080800020" - "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" - "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" - "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" - "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" - "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" - "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" - "006b22012480808080002001410636020c2001419498c08000360208024041002d" - "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" - "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" - "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" - "2003450d02200320032802002204417f6a3602002003290308210220044101470d" - "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" - "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" - "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" - "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" - "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" - "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" - "021041042103200141043a00182001200141106a360220200141186a41c08dc080" - "002000109180808000210020012d001821040240024020000d0042002102411720" - "0441ff0171764101710d01200128021c220328020021000240200341046a280200" - "22042802002205450d002000200511828080800080808080000b02402004280204" - "2204450d00200020041087808080000b2003410c108780808000410421030c010b" - "200441ff01714104460d032001290318220642807e8321022006a721030b200128" - "021022002000280208417f6a2204360208024020040d00200041003a000c200042" - "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" - "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" - "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" - "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" - "97c08000360228200142023702342001418c80808000ad422086200141106aad84" - "3703202001418280808000ad422086200141086aad843703182001200141186a36" - "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" - "6b22022480808080002002200036020c20024102360214200241a88bc080003602" - "102002420137021c2002418b8080800036022c2002200241286a36021820022002" - "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" - "808080000b200241306a2480808080000b4701017f23808080800041206b220024" - "8080808000200041003602182000410136020c200041bc90c08000360208200042" - "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" - "808080800041206b220024808080800041002d00b89ec080001a02400240024041" - "20109b808080002201450d00200141023602102001428180808010370300410029" - "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" - "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" - "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" - "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" - "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" - "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" - "41003a000020002802182202450d00200120021087808080000b02402000417f46" - "0d00200020002802042201417f6a36020420014101470d00200041201087808080" - "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" - "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" - "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" - "c08000410410af808080000be50301017f23808080800041c0006b220224808080" - "800002400240024002400240024020002d00000e0400010203000b200220002802" - "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" - "002800809bc08000360000200041086a41002900f89ac080003700002000410029" - "00f09ac08000370000200241143602102002200036020c20024114360208200241" - "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" - "86200241046aad843703202002418e80808000ad422086200241086aad84370318" - "2002200241186a36023020012802142001280218200241286a1091808080002100" - "20022802082201450d03200228020c20011087808080000c030b20002d00012100" - "2002410136022c200241d490c08000360228200242013702342002418280808000" - "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" - "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" - "02142001280218200241286a10918080800021000c020b20012000280204220028" - "0200200028020410af8080800021000c010b200028020422002802002001200028" - "0204280210118180808000808080800021000b200241c0006a2480808080002000" - "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" - "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" - "000240200141046a28020022022802002203450d00200020031182808080008080" - "8080000b024020022802042202450d00200020021087808080000b2001410c1087" - "808080000b0bf10101027f23808080800041206b22002480808080000240024002" - "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" - "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" - "410020013602d89ec08000410042808080808080013703d09ec080004100420037" - "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" - "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" - "200041003602182000410136020c200041bc9bc080003602082000420437021020" - "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" - "042480808080000240024002400240024020012802100d002001417f3602102003" - "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" - "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" - "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" - "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" - "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" - "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" - "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" - "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" - "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" - "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" - "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" - "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" - "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" - "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" - "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" - "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" - "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" - "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" - "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" - "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" - "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" - "2004410136020c2004418c91c0800036020820044204370210200441086a419491" - "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" - "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" - "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" - "80808000024020042d00084104460d00200020042903083702000c030b2001411c" - "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" - "066a210502402001280214200320066b22064b0d002000200141146a2005200610" - "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" - "002001411c6a20063602000b2001200128021041016a360210200441206a248080" - "8080000b7101027f20012802002104024020012802082205450d00200420056b20" - "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" - "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" - "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" - "0041106b2203248080808000200341086a20002802082802002001200210c98080" - "8000024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" - "046a28020022062802002207450d002001200711828080800080808080000b0240" - "20062802042206450d00200120061087808080000b2004410c1087808080000b20" - "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" - "23808080800041106b220224808080800020024100360204024002400240024020" - "01418001490d002001418010490d012001418080044f0d0220022001413f714180" - "01723a000620022001410c7641e001723a000420022001410676413f7141800172" - "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" - "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" - "418001723a00072002200141127641f001723a000420022001410676413f714180" - "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" - "00280208280200200241046a200110c980808000024020022d000822014104460d" - "0020002802042103200229030821040240024020002d0000220541044b0d002005" - "4103470d010b200328020021050240200341046a28020022062802002207450d00" - "2005200711828080800080808080000b024020062802042206450d002005200610" - "87808080000b2003410c1087808080000b200020043702000b200241106a248080" - "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" - "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" - "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" - "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" - "012002742204710d0020032000360200200020033602182000200036020c200020" - "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" - "200328020022042802044178712001470d00200421020c010b2001410041192002" - "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" - "002202450d02200341017421032002210420022802044178712001470d000b0b20" - "022802082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20002000" - "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" - "8080808000200028020c2102024002400240024020002802040e020001020b2002" - "0d0141012102410021030c020b20020d0020002802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c2001418f8080800020" - "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" - "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" - "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" - "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" - "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" - "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" - "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" - "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" - "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" - "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" - "0c010b2000410020006b41037122046a210502402004450d002000210320012106" - "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" - "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" - "0020084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a28020021060340200520062002762001280200220620" - "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" - "480d0020092101034020052001280200360200200141046a2101200541046a2205" - "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" - "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" - "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" - "067e22072003422088220820067e22062005200142208822097e7c22054220867c" - "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" - "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" - "00000c000000040000001200000013000000140000000000000000000000010000" - "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" - "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" - "2f6332663734633366393238616562353033663135623465396566353737386537" - "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" - "2e727300005f0010004b000000060a00000e000000000000000100000001000000" - "16000000170000001400000004000000180000004572726f72557466384572726f" - "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" - "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" - "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" - "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" - "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" - "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" - "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" - "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" - "000000da0110000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000b301100010000000fc011000100000000c02100009000000da0110" - "00090000000100000000000000ef0b100002000000000000000c00000004000000" - "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" - "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" - "000030783030303130323033303430353036303730383039313031313132313331" - "343135313631373138313932303231323232333234323532363237323832393330" - "333133323333333433353336333733383339343034313432343334343435343634" - "373438343935303531353235333534353535363537353835393630363136323633" - "363436353636363736383639373037313732373337343735373637373738373938" - "303831383238333834383538363837383838393930393139323933393439353936" - "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" - "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" - "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" - "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" - "031000220000000101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000020202020202020202020202020202020202020202020202020202020202" - "030303030303030303030303030303030404040404000000000000000000000000" - "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" - "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" - "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" - "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" - "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" - "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" - "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" - "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" - "000000690000001600000042616c616e636500b8051000360000007e0000001600" - "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" - "633266373463336639323861656235303366313562346539656635373738653737" - "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" - "652e72730000004c0610004d000000230100004200000000000000000000000400" - "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" - "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" - "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" - "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" - "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" - "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" - "206973206e6f7420706f737369626c652061667465722074686520746872656164" - "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" - "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" - "130000006661696c656420746f2067656e657261746520756e6971756520746872" - "6561642049443a2062697473706163652065786861757374656400040810003700" - "0000de07100015000000c40400000d00000001000000000000007374642f737263" - "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e000081081000090000005c081000250000000f0100002900000065" - "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" - "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" - "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" - "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" - "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" - "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" - "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" - "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" - "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" - "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" - "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" - "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" - "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" - "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" - "7267657265736f75726365206275737965786563757461626c652066696c652062" - "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" - "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" - "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" - "20696e746572727570746564756e737570706f72746564756e6578706563746564" - "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" - "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" - "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" - "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" - "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" - "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" - "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" - "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" - "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" - "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" - "65637572736976656c792061637175697265206d757465789c0c10002000000073" - "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" - "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" - "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" - "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" - "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" - "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" - "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" - "726d6564207265637572736976656c79840d100038000000100000001100000012" - "000000100000001000000013000000120000000d0000000e000000150000000c00" - "00000b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a000000100000001700000019000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600000015" - "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" - "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" - "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" - "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" - "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" - "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" - "000b000000040000004305100048051000540510005f0510006a05100000c62e04" - "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" - "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" - "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" - "6c6962313067657454784669656c64313768623836623962643665383439353163" - "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" - "43757272656e744c6564676572456e7472794669656c6431376861346138303037" - "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" - "6c696231396765744c6564676572456e7472794669656c64313768633661326634" - "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" - "5f6c69623139676574506172656e744c656467657254696d653137683731643366" - "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" - "696e745f6e756d626572313768343432633966366462343461613636374506305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" - "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" - "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" - "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" - "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" - "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376833326438343961303132376564636461450b445f" - "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" - "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" - "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" - "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" - "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683562646335303561663532336432393945" - "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" - "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" - "7a652447542433666d7431376836336361623039386234313233343130450f465f" - "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" - "63745f6669656c64325f66696e6973683137683135666166363733326663303964" - "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" - "313768396461663134643536353865323530364511265f5a4e34636f726533666d" - "743577726974653137683933353534653462653731663263376145124c5f5a4e34" - "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67244754243137683230373631353664386431" - "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" - "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" - "7224475424313768323066303937633266353863396661374514525f5a4e35335f" - "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" - "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" - "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" - "577269746524475424313077726974655f63686172313768323134333931636238" - "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" - "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" - "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" - "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" - "6573657276655f616e645f68616e646c6531376862356335336362636666396436" - "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" - "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "4754243977726974655f7374723137683539396439653537383934366464393845" - "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" - "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" - "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" - "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" - "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" - "6563313268616e646c655f6572726f723137683937623764626430663732646437" - "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" - "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683132313861313631643933363438653945" - "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" - "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768613636623539636339336533383537344520615f" - "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" - "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768633837363633386165616230633031664521475f" - "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376839393432316563653462383633" - "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" - "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" - "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" - "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" - "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" - "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" - "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" - "653970616e69636b696e673570616e696331376830346565623931376464393363" - "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" - "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" - "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" - "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" - "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" - "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" - "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" - "6b696e673970616e69635f666d7431376836353430636362326435666463336162" - "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" - "753230247533322447542433666d74313768626633653032323834383365333735" - "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" - "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" - "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" - "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" - "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" - "4e34636f726533666d7439466f726d617474657233706164313768343736396165" - "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" - "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" - "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" - "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" - "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" - "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" - "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" - "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" - "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" - "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" - "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" - "72656164795f626f72726f77656431376833313462353261316263343662666534" - "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" - "72756374356669656c64313768333531353864666637643465616633354537675f" - "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" - "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" - "7465244754243977726974655f7374723137683831386234396537653639613236" - "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" - "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" - "742e2e577269746524475424313077726974655f63686172313768393437396266" - "363162306130356661314539305f5a4e34636f726533666d743557726974653977" - "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" - "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" - "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" - "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" - "706c61792475323024666f7224753230246933322447542433666d743137686365" - "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" - "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376834366435353230663839333131346633453d0861" - "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" - "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" - "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" - "73746564313768333336626637613134383830343463384541425f5a4e34636f72" - "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" - "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" - "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" - "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" - "653970616e69636b696e6731336173736572745f6661696c656431376832333236" - "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768653138373433383865303762666532354545595f5a4e36305f244c542473" - "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" - "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" - "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" - "2e2e446973706c61792447542433666d7431376863653432323661613166373236" - "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" - "242447542424475424313768313636646336316162303333346331654548495f5a" - "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" - "2454244754243130696e697469616c697a65313768376635633530386461396531" - "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" - "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" - "697465244754243977726974655f616c6c31376832346238323631303436316432" - "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" - "65723138427566577269746572244c54245724475424313477726974655f616c6c" - "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c54245424475424247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376837666163663562" - "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" - "726974655f6368617231376866306233626531656331396465356537454d305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376866383830" - "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" - "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" - "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" - "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" - "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" - "645f73686f72745f6261636b747261636531376834646333646534376432323032" - "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" - "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" - "37642424753764243137686531376133393737663839633131373845533b5f5a4e" - "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" - "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" - "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" - "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" - "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" - "735f737472313768656233663732326432323465343266384555066d656d636d70" - "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" - "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d627901057275737463" - "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" - "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" - "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" - "797065732b087369676e2d657874"; + static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); // let dest = get_current_escrow_destination(); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index a46d71a569..5c9c0afc9c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -17,12 +17,15 @@ */ //============================================================================== +#include #include #include #include +#include + namespace ripple { namespace test { @@ -104,1113 +107,7 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN1() { testcase("escrow wasm devnet 1 test"); - auto wasmHex = - "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" - "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" - "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" - "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" - "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" - "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" - "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" - "745f6c696213676574506172656e744c656467657254696d650005035453020603" - "070101080901010a01000202010102080008000b0c030101010104050802030303" - "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" - "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" - "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" - "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" - "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" - "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" - "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" - "14200142808080801037020c200141033a00382001412036022820014100360234" - "2001418080c08000360230200141003602202001410036021820012001410c6a36" - "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" - "808080000d00200128020c21002001280210220220012802141080808080000240" - "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" - "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" - "027f017e037f23808080800041306b220324808080800041272104024002402000" - "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" - "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" - "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" - "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" - "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" - "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" - "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" - "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" - "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" - "41096a20046a412720046b108c808080002104200341306a24808080800020040b" - "6c01027f024002402000417c6a2802002202417871220341044108200241037122" - "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" - "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" - "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" - "2005200136020c2005200036020820052003360214200520023602102005410236" - "021c200541b884c08000360218200542023702242005418180808000ad42208620" - "0541106aad843703382005418280808000ad422086200541086aad843703302005" - "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" - "0041c0006b220224808080800002400240200028020022032d00000d0020012802" - "14419582c080004104200128021828020c118080808000808080800021000c010b" - "4101210020012802142204419982c0800041042001280218220528020c22061180" - "8080800080808080000d00200341016a210302400240200128021c22074104710d" - "0041012100200441f184c080004101200611808080800080808080000d02200320" - "01108a80808000450d010c020b200441f284c08000410220061180808080008080" - "8080000d0141012100200241013a001b200220053602102002200436020c200220" - "07360238200241c884c08000360234200220012d00203a003c2002200128021036" - "022c200220012902083702242002200129020037021c20022002411b6a36021420" - "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" - "80004102200228023428020c11808080800080808080000d010b2001280214419c" - "97c080004101200128021828020c118080808000808080800021000b200241c000" - "6a24808080800020000be90201057f2380808080004180016b2202248080808000" - "0240024002400240200128021c22034110710d0020034120710d01200031000041" - "01200110868080800021000c030b20002d0000210041ff00210303402002200322" - "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" - "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" - "0041ff00210303402002200322046a22052000410f712203413072200341376a20" - "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" - "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" - "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" - "02402004418101490d002004418001418885c08000108b80808000000b20014101" - "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" - "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" - "20032000360200200320013602042003410236020c200341d887c0800036020820" - "0342023702142003418380808000ad4220862204200341046aad84370328200320" - "042003ad843703202003200341206a360210200341086a200210aa80808000000b" - "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" - "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" - "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" - "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" - "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" - "2802000d000240200028021422012000280218220920082002200310ad80808000" - "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" - "0240024002402000280204220120064b0d00200028021422012000280218220920" - "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" - "2000413036021020002d0020210b4101210c200041013a00202000280214220920" - "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" - "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" - "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" - "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" - "1180808080008080808000210c0c010b200120066b210702400240024020002d00" - "2022010e0402000100020b20072101410021070c010b2007410176210120074101" - "6a41017621070b200141016a210120002802102106200028021821092000280214" - "210a024003402001417f6a2201450d01200a200620092802101181808080008080" - "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" - "200a20042005200928020c11808080800080808080000d00410021010340024020" - "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" - "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" - "0041106b220224808080800020022000280200220041046a36020c200141e181c0" - "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" - "418580808000108f808080002100200241106a24808080800020000be70201057f" - "2380808080004180016b22022480808080000240024002400240200128021c2203" - "4110710d0020034120710d0120003502004101200110868080800021000c030b20" - "00280200210041ff00210303402002200322046a22052000410f71220341307220" - "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" - "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" - "004110492106200041047621002006450d000b02402004418101490d0020044180" - "01418885c08000108b80808000000b20014101419885c080004102200541810120" - "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" - "85c08000108b80808000000b20014101419885c080004102200541810120044101" - "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" - "8080800041106b220b248080808000200028021420012002200028021828020c11" - "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" - "200b41086a200320042005200610b680808000200720082009200a10b680808000" - "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" - "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" - "0028021828020c118080808000808080800021000c010b200028021441ee84c080" - "004101200028021828020c118080808000808080800021000b200b41106a248080" - "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" - "23808080800041306b2203248080808000200341033a002c2003412036021c4100" - "210420034100360228200320013602242003200036022020034100360214200341" - "0036020c02400240024002400240200228021022050d00200228020c2200450d01" - "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" - "280200210003400240200041046a2802002207450d002003280220200028020020" - "07200328022428020c11808080800080808080000d040b20012802002003410c6a" - "200128020411818080800080808080000d03200141086a2101200041086a210020" - "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" - "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" - "40200041046a2802002201450d0020032802202000280200200120032802242802" - "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" - "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" - "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" - "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" - "0b0b200320073602102003200b36020c200141046a280200210702400240024020" - "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" - "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a200128020411818080800080808080000d02" - "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" - "280220200228020020044103746a22012802002001280204200328022428020c11" - "80808080008080808000450d010b410121010c010b410021010b200341306a2480" - "8080800020010b1e01017f024020002802002201450d0020002802042001108780" - "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" - "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" - "808080000be30201027f23808080800041106b2202248080808000024002400240" - "02402001418001490d002002410036020c2001418010490d010240200141808004" - "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" - "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" - "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" - "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" - "032000280200470d0020001096808080000b2000200341016a3602082000280204" - "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" - "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" - "20032001109780808000200028020821030b200028020420036a2002410c6a2001" - "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "01109c80808000024020012802082200418180808078460d002000200128020c10" - "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" - "03248080808000200341086a200020012002109c80808000024020032802082202" - "418180808078460d002002200328020c109d80808000000b200341106a24808080" - "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109780808000200028020821030b200028020420036a2001200210d6808080001a" - "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" - "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" - "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" - "200136020820002002410120021b36020420002002453602000b800601057f0240" - "024002402000417c6a22032802002204417871220541044108200441037122061b" - "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" - "712002410b491b210102400240024020060d002001418002490d01200520014104" - "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" - "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" - "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" - "01490d042006200410a780808000200520016b22024110490d0120032001200328" - "020041017172410272360200200720016a22012002410372360204200720056a22" - "0520052802044101723602042001200210a88080800020000f0b200520016b2202" - "410f4d0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210a88080800020000f0b200320" - "05200328020041017172410272360200200720056a220220022802044101723602" - "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" - "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" - "020441017236020441002102410021010c010b2003200120044101717241027236" - "0200200720016a22012002410172360204200720056a2205200236020020052005" - "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" - "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" - "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" - "2201200220012002491b10d6808080002102200010a580808000200221000b2000" - "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" - "0010a680808000000b20032001200441017172410272360200200720016a220220" - "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" - "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" - "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" - "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" - "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" - "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" - "00411920044101766b2004411f461b742107410021060340024020052205280204" - "41787122082002490d00200820026b220820014f0d00200821012005210620080d" - "004100210120052106200521000c040b200528021422082000200820052007411d" - "764104716a41106a2802002205471b200020081b2100200741017421072005450d" - "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" - "491b22024103762201762200410371450d00024002402000417f7341017120016a" - "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" - "2206460d002006200136020c200120063602080c010b41002005417e2007777136" - "0298a2c080000b20022000410372360204200220006a2200200028020441017236" - "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" - "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" - "020441787120026b21012006210503400240200628021022000d00200628021422" - "000d0020052802182104024002400240200528020c22002005470d002005411441" - "10200528021422001b6a28020022060d01410021000c020b200528020822062000" - "36020c200020063602080c010b200541146a200541106a20001b21070340200721" - "082006220041146a200041106a200028021422061b210720004114411020061b6a" - "28020022060d000b200841003602000b2004450d040240200528021c4102744180" - "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" - "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" - "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" - "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" - "0020017441022001742200410020006b727168220841037422014190a0c080006a" - "220620014198a0c080006a28020022002802082207460d002007200636020c2006" - "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" - "360204200020026a2207200120026b2206410172360204200020016a2006360200" - "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" - "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" - "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" - "0120023602082005200236020c2002200136020c200220053602080b4100200736" - "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" - "20052802102206450d0020002006360210200620003602180b2005280214220645" - "0d0020002006360214200620003602180b02400240024020014110490d00200520" - "02410372360204200520026a22022001410172360204200220016a200136020041" - "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" - "c080002100024002404100280298a2c08000220841012007410376742207710d00" - "41002008200772360298a2c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200520012002" - "6a2200410372360204200520006a220020002802044101723602040c010b410020" - "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" - "720d004100210641022004742200410020006b722003712200450d032000684102" - "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" - "71220520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b2106200120082007" - "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" - "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" - "002006470d00200641144110200628021422001b6a28020022050d01410021000c" - "020b20062802082205200036020c200020053602080c010b200641146a20064110" - "6a20001b21070340200721082005220041146a200041106a200028021422051b21" - "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" - "40200628021c41027441809fc080006a22052802002006460d0020044110411420" - "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" - "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" - "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" - "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" - "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" - "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" - "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" - "a0c080002100034020002802002206200028020422076a2005460d022000280208" - "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" - "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" - "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" - "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" - "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" - "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" - "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" - "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" - "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" - "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" - "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" - "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" - "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" - "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" - "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" - "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" - "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" - "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" - "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" - "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" - "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" - "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" - "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" - "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" - "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" - "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" - "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" - "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" - "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" - "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" - "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" - "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" - "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" - "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" - "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" - "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" - "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" - "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" - "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" - "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" - "360204410041808080013602b8a2c080002001200641606a41787141786a220020" - "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" - "290288a0c080003702002007200937020841002008360284a0c080004100200536" - "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" - "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" - "0720072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010d0808080000c080b200041f8017141" - "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" - "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" - "0620013602082000200136020c2001200636020c200120003602080c070b200020" - "053602002000200028020420086a360204200520024103723602042007410f6a41" - "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" - "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" - "417871220610a780808000200620026a2102200120066a220128020421060b2001" - "2006417e7136020420002002410172360204200020026a20023602000240200241" - "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" - "024002404100280298a2c08000220641012002410376742202710d004100200620" - "0272360298a2c08000200121020c010b200128020821020b200120003602082002" - "200036020c2000200136020c200020023602080c050b4100200020026b22013602" - "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" - "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" - "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" - "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" - "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" - "800020052006410172360204200120006a2006360200200120024103723602040b" - "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" - "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" - "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" - "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" - "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" - "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" - "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" - "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" - "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" - "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" - "4020062802102205450d0020002005360210200520003602180b20062802142205" - "450d0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a20013602000240" - "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" - "6a2102024002404100280298a2c08000220541012001410376742201710d004100" - "2005200172360298a2c08000200221010c010b200228020821010b200220003602" - "082001200036020c2000200236020c200020013602080c010b2006200120026a22" - "00410372360204200620006a220020002802044101723602040b200641086a0be9" - "0101037f23808080800041206b2204248080808000024002400240200220036a22" - "0320024f0d00410021020c010b4100210220012802002205410174220620032006" - "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" - "0c010b2004200536021c20042001280204360214410121020b2004200236021820" - "0441086a2003200441146a109980808000024020042802080d00200428020c2102" - "200120033602002001200236020441818080807821020c010b2004280210210120" - "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" - "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" - "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" - "0041052000418680808000419082c0800041052002410c6a418780808000108f80" - "8080002100200241106a24808080800020000be00301097f23808080800041c000" - "6b2202248080808000200028020821032000280204210441012105200128021441" - "b083c080004101200128021828020c118080808000808080800021000240200345" - "0d0041002106034020062107410121062000410171210841012100024020080d00" - "02400240200128021c22084104710d002007410171450d01410121002001280214" - "41e784c080004102200128021828020c1180808080008080808000450d010c020b" - "200128021821092001280214210a024020074101710d0041012100200a41888bc0" - "80004101200928020c11808080800080808080000d020b200241013a001b200220" - "093602102002200a36020c20022008360238200241c884c0800036023420022001" - "2d00203a003c2002200128021036022c2002200129020837022420022001290200" - "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" - "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" - "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" - "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" - "4101200128021828020c118080808000808080800021050b200241c0006a248080" - "80800020050b4a01017f23808080800041106b2202248080808000200220003602" - "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" - "00200241106a24808080800020000b3d00200128021420002802002d0000410274" - "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" - "808080800080808080000be70101017f23808080800041106b2205248080808000" - "20002802142001410d200028021828020c11808080800080808080002101200541" - "003a000d200520013a000c20052000360208200541086a200241042003200410b6" - "80808000210320052d000d220120052d000c2204722100024020014101470d0020" - "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" - "004102200028021828020c118080808000808080800021000c010b200028021441" - "ee84c080004101200028021828020c118080808000808080800021000b20054110" - "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" - "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" - "02400240024002400240024002404107109b808080002201450d00200141036a41" - "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" - "800022022800042103200228000021042002410810878080800020014107108780" - "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" - "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" - "002202280004210520022800002106200241081087808080002001410710878080" - "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" - "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" - "2202280004210720022800002108200241081087808080002001410b1087808080" - "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" - "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" - "108380808000220928000421022009280000210a20094108108780808000200041" - "186a200a200210a48080800002400240024020002d00184101460d002000290320" - "210b02402002450d00200a20021087808080000b20014107108780808000410021" - "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" - "0000200141041082808080002202280000210c2002280004210a20024108108780" - "80800020014104108780808000024002400240200a4100480d000240200a0d0041" - "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" - "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" - "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" - "026b210f4100210103400240024002400240200220016a2d00002209c022104100" - "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" - "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" - "808080202111428080808010211202400240024002400240024002400240024002" - "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" - "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" - "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" - "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" - "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" - "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" - "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" - "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" - "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" - "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" - "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" - "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" - "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" - "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" - "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" - "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" - "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" - "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" - "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" - "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" - "41186a20142011a710a48080800020002d00184101460d01200029032021124100" - "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" - "201641076a41002800878cc08000360000201641002900808cc080003700002016" - "410b10828080800022012800002117200128000421132001410810878080800002" - "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" - "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" - "09201741016a210220134109490d024100210103402009450d0a20022d00004150" - "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" - "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" - "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" - "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" - "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" - "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" - "20090d040b410021010c050b201321092017210220134108490d020b4100210103" - "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" - "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" - "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" - "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" - "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" - "0b1087808080002004200310808080800020062005108080808000200820071080" - "80808000200c200a10808080800020004100360214200042808080801037020c20" - "0041033a003820004120360228200041003602342000418080c080003602302000" - "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" - "1086808080000d00200028020c2102200028021022092000280214108080808000" - "02402002450d00200920021087808080000b201510858080800020011085808080" - "0041002102024020032005470d0020042006200310d58080800045200b20125871" - "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" - "00200c200a1087808080000b02402007450d00200820071087808080000b024020" - "05450d00200620051087808080000b02402003450d00200420031087808080000b" - "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" - "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" - "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" - "80800041106b220324808080800002400240024002400240024002400240024002" - "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" - "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" - "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" - "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" - "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" - "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" - "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" - "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" - "0121010c010b20002005370308410021010b200020013a0000200341106a248080" - "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" - "030240024020024101710d002002410271450d012001280200220220006a210002" - "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" - "410020003602a0a2c0800020032003280204417e71360204200120004101723602" - "04200320003602000f0b2001200210a7808080000b024002400240024002400240" - "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" - "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" - "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" - "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" - "20003602000b2000418002490d022001200010d080808000410021014100410028" - "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" - "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" - "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" - "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" - "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" - "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" - "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b200128020821010c" - "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" - "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" - "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" - "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" - "0320013602082000200136020c2001200336020c200120003602080f0b02404100" - "280288a0c080002201450d00410021020340200241016a2102200128020822010d" - "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" - "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" - "02410036021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110aa80808000000b820301047f200028020c" - "21020240024002402001418002490d002000280218210302400240024020022000" - "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" - "002802082201200236020c200220013602080c010b200041146a200041106a2002" - "1b21040340200421052001220241146a200241106a200228021422011b21042002" - "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441809fc080006a22012802002000460d0020034110411420032802" - "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" - "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" - "102201450d0020022001360210200120023602180b20002802142201450d002002" - "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" - "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" - "20013602a0a2c0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a7808080000b02400240024002402002280204" - "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" - "0d0320022003417871220310a7808080002000200320016a220141017236020420" - "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" - "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" - "80006a2102024002404100280298a2c08000220341012001410376742201710d00" - "41002003200172360298a2c08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" - "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" - "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" - "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" - "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" - "4701017f23808080800041206b2200248080808000200041003602182000410136" - "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" - "80808000000b5601017f23808080800041206b2202248080808000200241106a20" - "0041106a290200370300200241086a200041086a290200370300200241013b011c" - "2002200136021820022000290200370300200210ac80808000000b110020003502" - "00410120011086808080000b5d01027f23808080800041206b2201248080808000" - "20002802182102200141106a200041106a290200370300200141086a200041086a" - "2902003703002001200036021c2001200236021820012000290200370300200110" - "d180808000000b490002402002418080c400460d00200020022001280210118180" - "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" - "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" - "808080800020022000360200200220013602042002410236020c200241f887c080" - "00360208200242023702142002418380808000ad4220862203200241046aad8437" - "0328200220032002ad843703202002200241206a360210200241086a419487c080" - "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" - "0022040d002003410171450d010b02402003410171450d00200120026a21050240" - "0240200028020c22060d0041002107200121080c010b4100210741002109200121" - "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" - "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" - "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" - "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" - "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" - "20031b21022003200120031b21010b024020040d00200028021420012002200028" - "021828020c11808080800080808080000f0b2000280204210a024020024110490d" - "0020022001200141036a417c7122076b22096a220b410371210441002106410021" - "03024020012007460d004100210302402009417c4b0d0041002103410021050340" - "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" - "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" - "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" - "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" - "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" - "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" - "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002004200d41f007716a210941002108200421030340200328" - "020c2207417f7341077620074106767241818284087120032802082207417f7341" - "077620074106767241818284087120032802042207417f73410776200741067672" - "41818284087120032802002207417f734107762007410676724181828408712008" - "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" - "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" - "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" - "03410676724181828408712103200c4101460d0220082802042207417f73410776" - "20074106767241818284087120036a2103200c4102460d0220082802082208417f" - "7341077620084106767241818284087120036a21030c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" - "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" - "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" - "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" - "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" - "0d000c030b0b200028021420012002200028021828020c11808080800080808080" - "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" - "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" - "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a210320002802102109200028021821082000280214" - "210703402003417f6a2203450d0220072009200828021011818080800080808080" - "00450d000b41010f0b200028021420012002200028021828020c11808080800080" - "808080000f0b0240200720012002200828020c1180808080008080808000450d00" - "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" - "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" - "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" - "36020c20032000360208200341b08dc08000360214200320013602102003410236" - "021c200341b183c08000360218024020022802000d002003410336025c200341e4" - "83c08000360258200342033702642003418180808000ad4220862204200341106a" - "ad8437034820032004200341086aad843703402003418280808000ad4220862003" - "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" - "808000000b200341206a41106a200241106a290200370300200341206a41086a20" - "0241086a290200370300200320022902003703202003410436025c2003419884c0" - "8000360258200342043702642003418180808000ad4220862204200341106aad84" - "37035020032004200341086aad843703482003418980808000ad42208620034120" - "6aad843703402003418280808000ad422086200341186aad843703382003200341" - "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" - "01200028020428020c11818080800080808080000b140020012000280200200028" - "020410af808080000b14002001280214200128021820001091808080000b220020" - "01280214418883c08000410e200128021828020c11808080800080808080000b60" - "01017f23808080800041306b22002480808080002000410136020c200041a883c0" - "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" - "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" - "057f017e23808080800041c0006b220524808080800041012106024020002d0004" - "0d0020002d0005210702402000280200220828021c22094104710d004101210620" - "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" - "28021828020c11808080800080808080000d012008280214200120022008280218" - "28020c11808080800080808080000d01200828021441ef97c08000410220082802" - "1828020c11808080800080808080000d0120032008200411818080800080808080" - "0021060c010b41012106024020074101710d00200828021441e984c08000410320" - "0828021828020c11808080800080808080000d01200828021c21090b4101210620" - "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" - "6a360214200520082902083702242008290200210a200520093602382005200828" - "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" - "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" - "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" - "84c080004102200528023428020c118080808000808080800021060b200041013a" - "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" - "6a2103200028020421042000280200210520002802082106410021074100210841" - "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" - "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" - "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" - "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" - "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" - "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" - "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" - "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" - "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" - "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" - "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" - "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" - "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" - "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" - "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" - "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" - "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" - "21070b20070b6001027f2000280204210220002802002103024020002802082200" - "2d0000450d00200341e084c080004104200228020c118080808000808080800045" - "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" - "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" - "41306b22032480808080002003200136020c200320003602082003410136021420" - "0341d490c080003602102003420137021c2003418280808000ad42208620034108" - "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" - "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" - "808080000b830201087f2380808080004180016b22022480808080002001280204" - "21032001280200210420002802002100200128021c220521060240200541047145" - "0d002005410872210620040d0020014281808080a0013702000b20012006410472" - "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" - "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" - "09450d000b02402007418101490d002007418001418885c08000108b8080800000" - "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" - "01200536021c200120033602042001200436020020024180016a24808080800020" - "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" - "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" - "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" - "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" - "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" - "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" - "006b22012480808080002001410636020c2001419498c08000360208024041002d" - "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" - "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" - "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" - "2003450d02200320032802002204417f6a3602002003290308210220044101470d" - "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" - "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" - "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" - "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" - "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" - "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" - "021041042103200141043a00182001200141106a360220200141186a41c08dc080" - "002000109180808000210020012d001821040240024020000d0042002102411720" - "0441ff0171764101710d01200128021c220328020021000240200341046a280200" - "22042802002205450d002000200511828080800080808080000b02402004280204" - "2204450d00200020041087808080000b2003410c108780808000410421030c010b" - "200441ff01714104460d032001290318220642807e8321022006a721030b200128" - "021022002000280208417f6a2204360208024020040d00200041003a000c200042" - "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" - "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" - "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" - "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" - "97c08000360228200142023702342001418c80808000ad422086200141106aad84" - "3703202001418280808000ad422086200141086aad843703182001200141186a36" - "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" - "6b22022480808080002002200036020c20024102360214200241a88bc080003602" - "102002420137021c2002418b8080800036022c2002200241286a36021820022002" - "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" - "808080000b200241306a2480808080000b4701017f23808080800041206b220024" - "8080808000200041003602182000410136020c200041bc90c08000360208200042" - "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" - "808080800041206b220024808080800041002d00b89ec080001a02400240024041" - "20109b808080002201450d00200141023602102001428180808010370300410029" - "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" - "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" - "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" - "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" - "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" - "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" - "41003a000020002802182202450d00200120021087808080000b02402000417f46" - "0d00200020002802042201417f6a36020420014101470d00200041201087808080" - "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" - "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" - "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" - "c08000410410af808080000be50301017f23808080800041c0006b220224808080" - "800002400240024002400240024020002d00000e0400010203000b200220002802" - "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" - "002800809bc08000360000200041086a41002900f89ac080003700002000410029" - "00f09ac08000370000200241143602102002200036020c20024114360208200241" - "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" - "86200241046aad843703202002418e80808000ad422086200241086aad84370318" - "2002200241186a36023020012802142001280218200241286a1091808080002100" - "20022802082201450d03200228020c20011087808080000c030b20002d00012100" - "2002410136022c200241d490c08000360228200242013702342002418280808000" - "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" - "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" - "02142001280218200241286a10918080800021000c020b20012000280204220028" - "0200200028020410af8080800021000c010b200028020422002802002001200028" - "0204280210118180808000808080800021000b200241c0006a2480808080002000" - "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" - "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" - "000240200141046a28020022022802002203450d00200020031182808080008080" - "8080000b024020022802042202450d00200020021087808080000b2001410c1087" - "808080000b0bf10101027f23808080800041206b22002480808080000240024002" - "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" - "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" - "410020013602d89ec08000410042808080808080013703d09ec080004100420037" - "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" - "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" - "200041003602182000410136020c200041bc9bc080003602082000420437021020" - "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" - "042480808080000240024002400240024020012802100d002001417f3602102003" - "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" - "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" - "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" - "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" - "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" - "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" - "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" - "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" - "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" - "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" - "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" - "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" - "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" - "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" - "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" - "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" - "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" - "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" - "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" - "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" - "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" - "2004410136020c2004418c91c0800036020820044204370210200441086a419491" - "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" - "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" - "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" - "80808000024020042d00084104460d00200020042903083702000c030b2001411c" - "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" - "066a210502402001280214200320066b22064b0d002000200141146a2005200610" - "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" - "002001411c6a20063602000b2001200128021041016a360210200441206a248080" - "8080000b7101027f20012802002104024020012802082205450d00200420056b20" - "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" - "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" - "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" - "0041106b2203248080808000200341086a20002802082802002001200210c98080" - "8000024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" - "046a28020022062802002207450d002001200711828080800080808080000b0240" - "20062802042206450d00200120061087808080000b2004410c1087808080000b20" - "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" - "23808080800041106b220224808080800020024100360204024002400240024020" - "01418001490d002001418010490d012001418080044f0d0220022001413f714180" - "01723a000620022001410c7641e001723a000420022001410676413f7141800172" - "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" - "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" - "418001723a00072002200141127641f001723a000420022001410676413f714180" - "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" - "00280208280200200241046a200110c980808000024020022d000822014104460d" - "0020002802042103200229030821040240024020002d0000220541044b0d002005" - "4103470d010b200328020021050240200341046a28020022062802002207450d00" - "2005200711828080800080808080000b024020062802042206450d002005200610" - "87808080000b2003410c1087808080000b200020043702000b200241106a248080" - "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" - "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" - "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" - "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" - "012002742204710d0020032000360200200020033602182000200036020c200020" - "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" - "200328020022042802044178712001470d00200421020c010b2001410041192002" - "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" - "002202450d02200341017421032002210420022802044178712001470d000b0b20" - "022802082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20002000" - "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" - "8080808000200028020c2102024002400240024020002802040e020001020b2002" - "0d0141012102410021030c020b20020d0020002802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c2001418f8080800020" - "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" - "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" - "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" - "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" - "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" - "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" - "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" - "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" - "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" - "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" - "0c010b2000410020006b41037122046a210502402004450d002000210320012106" - "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" - "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" - "0020084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a28020021060340200520062002762001280200220620" - "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" - "480d0020092101034020052001280200360200200141046a2101200541046a2205" - "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" - "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" - "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" - "067e22072003422088220820067e22062005200142208822097e7c22054220867c" - "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" - "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" - "00000c000000040000001200000013000000140000000000000000000000010000" - "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" - "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" - "2f6332663734633366393238616562353033663135623465396566353737386537" - "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" - "2e727300005f0010004b000000060a00000e000000000000000100000001000000" - "16000000170000001400000004000000180000004572726f72557466384572726f" - "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" - "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" - "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" - "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" - "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" - "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" - "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" - "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" - "000000da0110000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000b301100010000000fc011000100000000c02100009000000da0110" - "00090000000100000000000000ef0b100002000000000000000c00000004000000" - "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" - "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" - "000030783030303130323033303430353036303730383039313031313132313331" - "343135313631373138313932303231323232333234323532363237323832393330" - "333133323333333433353336333733383339343034313432343334343435343634" - "373438343935303531353235333534353535363537353835393630363136323633" - "363436353636363736383639373037313732373337343735373637373738373938" - "303831383238333834383538363837383838393930393139323933393439353936" - "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" - "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" - "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" - "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" - "031000220000000101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000020202020202020202020202020202020202020202020202020202020202" - "030303030303030303030303030303030404040404000000000000000000000000" - "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" - "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" - "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" - "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" - "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" - "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" - "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" - "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" - "000000690000001600000042616c616e636500b8051000360000007e0000001600" - "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" - "633266373463336639323861656235303366313562346539656635373738653737" - "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" - "652e72730000004c0610004d000000230100004200000000000000000000000400" - "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" - "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" - "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" - "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" - "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" - "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" - "206973206e6f7420706f737369626c652061667465722074686520746872656164" - "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" - "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" - "130000006661696c656420746f2067656e657261746520756e6971756520746872" - "6561642049443a2062697473706163652065786861757374656400040810003700" - "0000de07100015000000c40400000d00000001000000000000007374642f737263" - "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e000081081000090000005c081000250000000f0100002900000065" - "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" - "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" - "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" - "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" - "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" - "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" - "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" - "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" - "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" - "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" - "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" - "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" - "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" - "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" - "7267657265736f75726365206275737965786563757461626c652066696c652062" - "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" - "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" - "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" - "20696e746572727570746564756e737570706f72746564756e6578706563746564" - "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" - "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" - "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" - "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" - "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" - "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" - "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" - "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" - "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" - "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" - "65637572736976656c792061637175697265206d757465789c0c10002000000073" - "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" - "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" - "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" - "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" - "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" - "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" - "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" - "726d6564207265637572736976656c79840d100038000000100000001100000012" - "000000100000001000000013000000120000000d0000000e000000150000000c00" - "00000b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a000000100000001700000019000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600000015" - "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" - "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" - "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" - "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" - "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" - "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" - "000b000000040000004305100048051000540510005f0510006a05100000c62e04" - "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" - "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" - "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" - "6c6962313067657454784669656c64313768623836623962643665383439353163" - "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" - "43757272656e744c6564676572456e7472794669656c6431376861346138303037" - "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" - "6c696231396765744c6564676572456e7472794669656c64313768633661326634" - "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" - "5f6c69623139676574506172656e744c656467657254696d653137683731643366" - "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" - "696e745f6e756d626572313768343432633966366462343461613636374506305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" - "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" - "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" - "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" - "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" - "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376833326438343961303132376564636461450b445f" - "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" - "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" - "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" - "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" - "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683562646335303561663532336432393945" - "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" - "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" - "7a652447542433666d7431376836336361623039386234313233343130450f465f" - "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" - "63745f6669656c64325f66696e6973683137683135666166363733326663303964" - "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" - "313768396461663134643536353865323530364511265f5a4e34636f726533666d" - "743577726974653137683933353534653462653731663263376145124c5f5a4e34" - "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67244754243137683230373631353664386431" - "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" - "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" - "7224475424313768323066303937633266353863396661374514525f5a4e35335f" - "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" - "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" - "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" - "577269746524475424313077726974655f63686172313768323134333931636238" - "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" - "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" - "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" - "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" - "6573657276655f616e645f68616e646c6531376862356335336362636666396436" - "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" - "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "4754243977726974655f7374723137683539396439653537383934366464393845" - "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" - "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" - "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" - "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" - "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" - "6563313268616e646c655f6572726f723137683937623764626430663732646437" - "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" - "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683132313861313631643933363438653945" - "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" - "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768613636623539636339336533383537344520615f" - "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" - "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768633837363633386165616230633031664521475f" - "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376839393432316563653462383633" - "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" - "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" - "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" - "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" - "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" - "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" - "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" - "653970616e69636b696e673570616e696331376830346565623931376464393363" - "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" - "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" - "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" - "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" - "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" - "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" - "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" - "6b696e673970616e69635f666d7431376836353430636362326435666463336162" - "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" - "753230247533322447542433666d74313768626633653032323834383365333735" - "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" - "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" - "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" - "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" - "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" - "4e34636f726533666d7439466f726d617474657233706164313768343736396165" - "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" - "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" - "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" - "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" - "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" - "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" - "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" - "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" - "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" - "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" - "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" - "72656164795f626f72726f77656431376833313462353261316263343662666534" - "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" - "72756374356669656c64313768333531353864666637643465616633354537675f" - "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" - "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" - "7465244754243977726974655f7374723137683831386234396537653639613236" - "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" - "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" - "742e2e577269746524475424313077726974655f63686172313768393437396266" - "363162306130356661314539305f5a4e34636f726533666d743557726974653977" - "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" - "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" - "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" - "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" - "706c61792475323024666f7224753230246933322447542433666d743137686365" - "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" - "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376834366435353230663839333131346633453d0861" - "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" - "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" - "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" - "73746564313768333336626637613134383830343463384541425f5a4e34636f72" - "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" - "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" - "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" - "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" - "653970616e69636b696e6731336173736572745f6661696c656431376832333236" - "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768653138373433383865303762666532354545595f5a4e36305f244c542473" - "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" - "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" - "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" - "2e2e446973706c61792447542433666d7431376863653432323661613166373236" - "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" - "242447542424475424313768313636646336316162303333346331654548495f5a" - "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" - "2454244754243130696e697469616c697a65313768376635633530386461396531" - "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" - "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" - "697465244754243977726974655f616c6c31376832346238323631303436316432" - "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" - "65723138427566577269746572244c54245724475424313477726974655f616c6c" - "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c54245424475424247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376837666163663562" - "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" - "726974655f6368617231376866306233626531656331396465356537454d305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376866383830" - "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" - "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" - "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" - "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" - "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" - "645f73686f72745f6261636b747261636531376834646333646534376432323032" - "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" - "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" - "37642424753764243137686531376133393737663839633131373845533b5f5a4e" - "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" - "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" - "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" - "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" - "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" - "735f737472313768656233663732326432323465343266384555066d656d636d70" - "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" - "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d627901057275737463" - "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" - "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" - "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" - "797065732b087369676e2d657874"; + auto wasmHex = allHostFunctionsHex; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); @@ -1301,7 +198,7 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { @@ -1319,7 +216,7 @@ struct Wasm_test : public beast::unit_test::suite { // fail because current time < escrow_finish_after time TestHostFunctions nfs(&env); nfs.clock_drift = -1; - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { @@ -1344,7 +241,7 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); BEAST_EXPECT(re.error()); std::cout << "bad case (access nonexistent field) result " @@ -1364,7 +261,7 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(!re)) std::cout << "bad case (more than MAX_PAGES) result " @@ -1372,725 +269,7 @@ struct Wasm_test : public beast::unit_test::suite } { // fail because recursion too deep - auto wasmHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; + auto wasmHex = deepRecursionHex; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h new file mode 100644 index 0000000000..1d377676c6 --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -0,0 +1,1569 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +static auto const ledgerSqnHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" + "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" + "010700100041044a0b004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d31" + "2e38352e31202834656231363132353020323032352d30332d3135290049" + "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" + "732b0a6d756c746976616c7565"; + +static auto const allHostFunctionsHex = + "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" + "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" + "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" + "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" + "686f73745f6c69621a67657443757272656e744c6564676572456e747279" + "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" + "794669656c64000408686f73745f6c696213676574506172656e744c6564" + "67657254696d65000503363501010101090a000302010101010506020207" + "020201040001010100010400010101020701080101030800010103020202" + "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" + "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" + "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" + "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" + "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" + "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" + "0000450440200128021c41d480c0004104200128022028020c1100002100" + "0c010b41012100200128021c220341d880c0004104200128022022062802" + "0c22051100000d00200441016a2104024020012d00144104714504402003" + "418d83c000410120051100000d022004200110050d02200128021c210320" + "0128022028020c21050c010b2003418e83c000410220051100000d012002" + "41013a0017200241206a200141086a290200370300200241286a20014110" + "6a290200370300200241306a200141186a2802003602002002200636020c" + "20022003360208200241e482c00036023820022001290200370318200220" + "0241176a3602102002200241086a3602342004200241186a10050d012002" + "280234418883c0004102200228023828020c1100000d010b2003419891c0" + "004101200511000021000b200241406b240020000bff0201037f23004180" + "016b22032400027f0240200128021422024110714504402002412071450d" + "0120002d0000210241810121000340200020036a41026b2002410f712204" + "413072200441376a2004410a491b3a000020022204410476210220004101" + "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" + "41810120006b10090c020b20002d0000210241810121000340200020036a" + "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" + "22044104762102200041016b21002004410f4b0d000b20014101419183c0" + "004102200020036a41016b41810120006b10090c010b0240024002402000" + "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" + "0171410174419383c0006a2f00003b0001410021000c010b410221002002" + "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" + "410174419383c0006a2f00003b00010b2001410141014100200020036a20" + "0041037310090b20034180016a24000b4701017f230041106b2202240020" + "022000280200220041046a36020c200141a080c000410941a980c000410b" + "2000410141b480c00041092002410c6a41021008200241106a24000bff01" + "01037f23004180016b22042400027f024020012802142202411071450440" + "20024120710d01200028020041012001100a0c020b200028020021004181" + "0121020340200220046a41026b2000410f712203413072200341d7006a20" + "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" + "20014101419183c0004102200220046a41016b41810120026b10090c010b" + "2000280200210041810121020340200220046a41026b2000410f71220341" + "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" + "41047621000d000b20014101419183c0004102200220046a41016b418101" + "20026b10090b20044180016a24000bc50101017f230041106b220b240020" + "0028021c20012002200028022028020c1100002101200b41003a000d200b" + "20013a000c200b2000360208200b41086a20032004200520061020200720" + "082009200a10202101200b2d000d2202200b2d000c220372210002402003" + "4101712002410147720d00200128020022002d0014410471450440200028" + "021c418b83c0004102200028022028020c11000021000c010b200028021c" + "418a83c0004101200028022028020c11000021000b200b41106a24002000" + "4101710bef0401077f027f200145044020002802142106412d2109200541" + "016a0c010b412b418080c4002000280214220641017122011b2109200120" + "056a0b210702402006410471450440410021020c010b024020034504400c" + "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" + "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" + "280200450440200028021c22012000280220220020092002200310190440" + "41010f0b200120042005200028020c1100000f0b02400240024020072000" + "28020422084f0440200028021c2201200028022022002009200220031019" + "450d0141010f0b2006410871450d012000280210210b2000413036021020" + "002d0018210c41012101200041013a0018200028021c2206200028022022" + "0a20092002200310190d02200820076b41016a210102400340200141016b" + "2201450d0120064130200a280210110100450d000b41010f0b2006200420" + "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" + "000f0b200120042005200028020c11000021010c010b200820076b210602" + "4002400240410120002d0018220120014103461b220141016b0e02000102" + "0b20062101410021060c010b20064101762101200641016a41017621060b" + "200141016a21012000280210210820002802202107200028021c21000240" + "0340200141016b2201450d01200020082007280210110100450d000b4101" + "0f0b410121012000200720092002200310190d0020002004200520072802" + "0c1100000d004100210103402001200646044041000f0b200141016a2101" + "200020082007280210110100450d000b200141016b2006490f0b20010bbd" + "0201067f230041106b22042400410a2103024020004190ce004904402000" + "21050c010b0340200441066a20036a220641046b20004190ce006e220541" + "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" + "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" + "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" + "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" + "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" + "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" + "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" + "2203200441066a6a20004130723a00000b2002200141014100200441066a" + "20036a410a20036b1009200441106a24000b1701017f2000280200220104" + "4020002802042001100c0b0bce0601047f0240200041046b280200220422" + "02417871220341044108200241037122021b20016a4f0440200241002003" + "200141276a4b1b0d01200041086b22012004220341787122006a21020240" + "024020034101710d002003410271450d012001280200220320006a210020" + "0120036b22014190a0c00028020046044020022802044103714103470d01" + "4188a0c000200036020020022002280204417e7136020420012000410172" + "360204200220003602000c020b2001200310330b02400240024002400240" + "2002280204220341027145044020024194a0c000280200460d0220024190" + "a0c000280200460d0320022003417871220210332001200020026a220041" + "0172360204200020016a200036020020014190a0c000280200470d014188" + "a0c00020003602000c060b20022003417e71360204200120004101723602" + "04200020016a20003602000b2000418002490d0220012000103241002101" + "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" + "280200220004400340200141016a2101200028020822000d000b0b41a8a0" + "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" + "418ca0c000418ca0c00028020020006a2200360200200120004101723602" + "044190a0c00028020020014604404188a0c00041003602004190a0c00041" + "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" + "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" + "402002200128020022054f04402002200520012802046a490d040b200128" + "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" + "020020006a220036020020012000410172360204200020016a2000360200" + "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" + "012000410376742200714504404180a0c000200020037236020020020c01" + "0b20022802080b2100200220013602082000200136020c2001200236020c" + "200120003602080c010b41f09dc000280200220104400340200041016a21" + "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" + "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" + "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" + "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" + "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" + "087f230041406a2202240020002802082105200028020421034101210620" + "0128021c41cc81c0004101200128022028020c1100002100200504400340" + "20072108410121072000410171210441012100024020040d00024020012d" + "00144104714504402008410171450d01200128021c418383c00041022001" + "28022028020c110000450d010c020b20012802202104200128021c210920" + "08410171450440200941d59ac0004101200428020c1100000d020b200241" + "013a0017200241206a200141086a290200370300200241286a200141106a" + "290200370300200241306a200141186a2802003602002002200436020c20" + "022009360208200241e482c0003602382002200129020037031820022002" + "41176a3602102002200241086a3602342003200241186a10054504402002" + "280234418883c0004102200228023828020c11000021000c020b0c010b20" + "032001100521000b200341016a2103200541016b22050d000b0b20004504" + "40200128021c419083c0004101200128022028020c11000021060b200241" + "406b240020060bdb0101047f230041106b220224002002200036020c2300" + "41106b22002400200128021c41f899c000410d200128022028020c110000" + "2103200041003a000d200020033a000c20002001360208200041086a4185" + "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" + "722101024020054101712004410147720d00200328020022012d00144104" + "71450440200128021c418b83c0004102200128022028020c11000021010c" + "010b200128021c418a83c0004101200128022028020c11000021010b2000" + "41106a24002001410171200241106a24000b3300200128021c2000280200" + "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" + "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" + "c0002d00001a024002400240024002404107101222000440200041036a41" + "879bc000280000360000200041849bc000280000360000200341286a2000" + "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" + "200041036a41879bc000280000360000200041849bc00028000036000020" + "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" + "122200450d05200041076a41929bc0002800003600002000418b9bc00029" + "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" + "00001a200328024821012003280244210b410710122204450d0541002100" + "200441036a41b79bc000280000360000200441b49bc00028000036000020" + "0341d8006a41e100200b20012004410710021013200328025c2105024002" + "400240200328026022020e020700010b41012100200522012d0000412b6b" + "0e03060106010b20052d0000412b460440200241016b2100200541016a21" + "0120024112490d010c030b200521012002220041114f0d020b034020012d" + "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" + "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" + "186a2010103820012d000041306b220941094b0d02410221002003290320" + "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" + "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" + "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" + "8b06360000200341cc006a200041041001101320004104100c027f024020" + "03280254220541004e047f2003280250210c20054504404101210141000c" + "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" + "1014000b20050b21092001200c2005103721002005450d01200541076b22" + "014100200120054d1b2106200041036a417c7120006b2108410021010340" + "024002400240200020016a2d00002202c0220741004e0440200820016b41" + "03710d01200120064f0d020340200020016a220228020420022802007241" + "8081828478710d03200141086a22012006490d000b0c020b428080808080" + "20210e428080808010210f024002400240027e0240024002400240024002" + "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" + "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" + "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" + "220420054f0d06200020046a2c0000210402400240200241e00147044020" + "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" + "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" + "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" + "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" + "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" + "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" + "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" + "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" + "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" + "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" + "00210f0b2001ad200e200f8484210e200941808080807846044020002109" + "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" + "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" + "010b200120054f0d000340200020016a2c00004100480d01200520014101" + "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" + "0021050b410021000240024002400240024002400240200ea722020e0206" + "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" + "2b460440200241016b2100200541016a210120024112490d010c020b2005" + "21012002220041114f0d010b4200210e034020012d000041306b22024109" + "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" + "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" + "2d000041306b220441094b0d024102210020032903104200520d03200141" + "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" + "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" + "024002400240410b101222080440200841076a419d9bc000280000360000" + "200841969bc000290000370000200341d8006a2008410b10011013200328" + "025c2104024002400240200328026022020e020a00010b4101210720042d" + "00002201412b6b0e03090109010b20042d000021010b0240024002400240" + "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" + "20024109490d02200121020c080b200241016b2106200441016a21002002" + "4109490d044100210103402006450d0b20002d000041306b220241094b0d" + "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" + "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" + "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" + "0c0b4100210141012107034020002d000041306b220641094b0d06200041" + "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" + "010b410021010c040b4100210141012107034020002d000041306b220241" + "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" + "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" + "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" + "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" + "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" + "c0001015000b20032802582200044020042000100c0b2008410b100c4100" + "210020032802302202200328023c460440200328022c2104200328023821" + "0741002106024020022200450d00034020042d0000220220072d00002208" + "460440200441016a2104200741016a2107200041016b22000d010c020b0b" + "200220086b21060b20064521000b2009044020052009100c0b200328024c" + "22020440200c2002100c0b200328024022020440200b2002100c0b200328" + "02342202044020032802382002100c0b200328022822020440200328022c" + "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" + "0121000b200320003a0058200341d8006a419080c00041f880c000101500" + "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" + "15000b410141e899c0001014000bee2202087f017e024002400240024002" + "40024002400240200041f4014d04404180a0c00028020022024110200041" + "0b6a41f803712000410b491b220541037622007622014103710d01200541" + "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" + "00410b6a220141787121054184a0c0002802002208450d06411f21074100" + "20056b2103200041f4ffff074d04402005410620014108766722006b7641" + "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" + "45044041002100410021010c040b410021002005411920074101766b4100" + "2007411f471b742104410021010340024020022802044178712206200549" + "0d00200620056b220620034f0d0020022101200622030d00410021032001" + "21000c060b200228021422062000200620022004411d764104716a41106a" + "2802002202471b200020061b21002004410174210420020d000b0c030b02" + "402001417f7341017120006a2206410374220041f89dc0006a2203200041" + "809ec0006a280200220128020822044704402004200336020c2003200436" + "02080c010b4180a0c0002002417e200677713602000b2001200041037236" + "0204200020016a220020002802044101723602040c060b02404102200074" + "2203410020036b72200120007471682206410374220041f89dc0006a2203" + "200041809ec0006a280200220128020822044704402004200336020c2003" + "20043602080c010b4180a0c0002002417e200677713602000b2001200541" + "0372360204200120056a2206200020056b2204410172360204200020016a" + "20043602004188a0c00028020022020440200241787141f89dc0006a2100" + "4190a0c0002802002103027f4180a0c00028020022054101200241037674" + "2202714504404180a0c000200220057236020020000c010b20002802080b" + "2102200020033602082002200336020c2003200036020c20032002360208" + "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" + "41e89cc0006a280200220128020441787120056b21032001210202400340" + "02400240200128021022000d00200128021422000d002002280218210702" + "4002402002200228020c2200460440200241144110200228021422001b6a" + "28020022010d01410021000c020b20022802082201200036020c20002001" + "3602080c010b200241146a200241106a20001b2104034020042106200122" + "0041146a200041106a200028021422011b210420004114411020011b6a28" + "020022010d000b200641003602000b2007450d032002200228021c410274" + "41e89cc0006a220128020047044020074110411420072802102002461b6a" + "20003602002000450d040c020b2001200036020020000d014184a0c00041" + "84a0c000280200417e200228021c77713602000c030b2000280204417871" + "20056b22012003200120034922011b21032000200220011b210220002101" + "0c010b0b2000200736021820022802102201044020002001360210200120" + "003602180b20022802142201450d0020002001360214200120003602180b" + "02400240200341104f044020022005410372360204200220056a22062003" + "410172360204200320066a20033602004188a0c0002802002204450d0120" + "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" + "0200220541012004410376742204714504404180a0c00020042005723602" + "0020000c010b20002802080b2104200020013602082004200136020c2001" + "200036020c200120043602080c010b2002200320056a2200410372360204" + "200020026a220020002802044101723602040c010b4190a0c00020063602" + "004188a0c00020033602000b200241086a0f0b2000200172450440410021" + "0141022007742200410020006b722008712200450d0320006841027441e8" + "9cc0006a28020021000b2000450d010b0340200020012000280204417871" + "220420056b220620034922071b2108200028021022024504402000280214" + "21020b20012008200420054922001b210120032006200320071b20001b21" + "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" + "0020056b4f710d0020012802182107024002402001200128020c22004604" + "40200141144110200128021422001b6a28020022020d01410021000c020b" + "20012802082202200036020c200020023602080c010b200141146a200141" + "106a20001b21040340200421062002220041146a200041106a2000280214" + "22021b210420004114411020021b6a28020022020d000b20064100360200" + "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" + "0047044020074110411420072802102001461b6a20003602002000450d02" + "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" + "0128021c77713602000c010b200020073602182001280210220204402000" + "2002360210200220003602180b20012802142202450d0020002002360214" + "200220003602180b0240200341104f044020012005410372360204200120" + "056a22022003410172360204200220036a200336020020034180024f0440" + "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" + "280200220441012003410376742203714504404180a0c000200320047236" + "020020000c010b20002802080b2103200020023602082003200236020c20" + "02200036020c200220033602080c010b2001200320056a22004103723602" + "04200020016a220020002802044101723602040b0c010b02400240024002" + "400240024020054188a0c00028020022014b04402005418ca0c000280200" + "22004f044041002100200541af80046a220141107640002202417f462203" + "0d0720024110742202450d074198a0c000410020014180807c7120031b22" + "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" + "200020002001491b360200024002404194a0c0002802002203044041e89d" + "c0002100034020002802002201200028020422066a2002460d0220002802" + "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" + "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" + "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" + "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" + "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" + "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" + "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" + "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" + "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" + "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" + "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" + "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" + "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" + "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" + "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" + "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" + "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" + "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" + "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" + "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" + "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" + "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" + "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" + "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" + "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" + "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" + "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" + "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" + "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" + "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" + "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" + "0441286b220036020020022000410172360204200020026a412836020441" + "a0a0c00041808080013602000c080b200220034d200120034b720d002000" + "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" + "360200200220046a210141e89dc000210002400240034020012000280200" + "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" + "c0002100034002402003200028020022014f04402003200120002802046a" + "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" + "c000200441286b220036020020022000410172360204200020026a412836" + "020441a0a0c00041808080013602002003200641206b41787141086b2200" + "2000200341106a491b2201411b36020441e89dc000290200210920014110" + "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" + "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" + "02002001411c6a2100034020004107360200200041046a22002006490d00" + "0b20012003460d0720012001280204417e713602042003200120036b2200" + "4101723602042001200036020020004180024f04402003200010320c080b" + "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" + "410376742200714504404180a0c000200020027236020020010c010b2001" + "2802080b2100200120033602082000200336020c2003200136020c200320" + "003602080c070b200020023602002000200028020420046a360204200220" + "054103723602042006410f6a41787141086b2201200220056a22046b2103" + "20014194a0c000280200460d0320014190a0c000280200460d0420012802" + "04220541037141014604402001200541787122001033200020016a220128" + "02042105200020036a21030b20012005417e713602042004200341017236" + "0204200320046a200336020020034180024f04402004200310320c060b20" + "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" + "0376742203714504404180a0c000200120037236020020000c010b200028" + "02080b2103200020043602082003200436020c2004200036020c20042003" + "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" + "00280200220020056a220236020020022001410172360204200020054103" + "72360204200041086a21000c060b4190a0c0002802002100024020012005" + "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" + "2001410372360204200020016a220120012802044101723602040c010b41" + "88a0c00020023602004190a0c000200020056a2203360200200320024101" + "72360204200020016a2002360200200020054103723602040b200041086a" + "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" + "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" + "03200020016b6a41086a220136020020022001410172360204200020036a" + "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" + "00418ca0c000418ca0c00028020020036a22003602002004200041017236" + "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" + "6a220036020020042000410172360204200020046a20003602000b200241" + "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" + "20056b22013602004194a0c0004194a0c000280200220020056a22023602" + "002002200141017236020420002005410372360204200041086a0f0b2000" + "0f0b200141086a0b2701017f200020012800042202360208200020012800" + "003602042000200236020020014108100c0b3b002000450440230041206b" + "22002400200041003602182000410136020c2000419c81c0003602082000" + "4204370210200041086a20011017000b000b7e01017f230041406a220324" + "002003412b36020c200341d098c000360208200320013602142003200036" + "02102003410236021c200341d482c0003602182003420237022420032003" + "41106aad4280808080e000843703382003200341086aad4280808080f000" + "843703302003200341306a360220200341186a20021017000b4101017f23" + "0041206b2202240020024100360210200241013602042002420437020820" + "02412e36021c200220003602182002200241186a36020020022001101700" + "0bf40102027f017e230041106b22022400200241013b010c200220013602" + "0820022000360204230041106b22012400200241046a2200290200210420" + "01200036020c20012004370204230041106b22002400200141046a220128" + "0200220228020c2103024002400240024020022802040e020001020b2003" + "0d0141012102410021030c020b20030d0020022802002202280204210320" + "0228020021020c010b20004180808080783602002000200136020c200128" + "020822012d0008210220012d00091a2000410e20021026000b2000200336" + "020420002002360200200128020822012d0008210220012d00091a200041" + "0f20021026000b0d00200028020041012001100a0b380002402002418080" + "c400460d00200020022001280210110100450d0041010f0b200345044041" + "000f0b200020032004200128020c1100000b900a010a7f02400240024020" + "0028020022052000280208220372044002402003410171450d0020012002" + "6a21060240200028020c2209450440200121040c010b2001210403402004" + "22032006460d02027f200341016a20032c0000220441004e0d001a200341" + "026a20044160490d001a200341036a20044170490d001a200341046a0b22" + "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" + "20042c00001a20072002027f02402007450d00200220074d044020022007" + "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" + "031b21022003200120031b21010b2005450d032000280204210b20024110" + "4f044020022001200141036a417c7122076b22086a220a41037121094100" + "210541002103200120074704402008417c4d044041002106034020032001" + "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" + "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" + "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" + "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" + "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" + "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" + "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" + "09410371210a2009410274210741002104200641044f04402008200741f0" + "07716a210c200821030340200420032802002204417f7341077620044106" + "76724181828408716a20032802042204417f734107762004410676724181" + "828408716a20032802082204417f73410776200441067672418182840871" + "6a200328020c2204417f734107762004410676724181828408716a210420" + "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" + "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" + "200a450d000b2008200941fc01714102746a22042802002203417f734107" + "762003410676724181828408712103200a4101460d022003200428020422" + "03417f734107762003410676724181828408716a2103200a4102460d0220" + "0320042802082203417f734107762003410676724181828408716a21030c" + "020b2002450440410021050c030b20024103712104024020024104490440" + "41002105410021080c010b41002105200121032002410c71220821070340" + "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" + "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" + "200741046b22070d000b0b2004450d02200120086a21030340200520032c" + "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" + "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" + "056a21050b02402005200b490440200b20056b210602400240024020002d" + "00182203410020034103471b220341016b0e020001020b20062103410021" + "060c010b20064101762103200641016a41017621060b200341016a210320" + "00280210210820002802202104200028021c21000340200341016b220345" + "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" + "02200428020c110000044041010f0b410021030340200320064604404100" + "0f0b200341016a2103200020082004280210110100450d000b200341016b" + "2006490f0b200028021c20012002200028022028020c1100000b14002000" + "2802002001200028020428020c1101000b10002001200028020020002802" + "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" + "6b220324002003200136022c20032000360228200341033a002420034220" + "37021c200341003602142003410036020c027f0240024002402002280210" + "220a450440200228020c2200450d012002280208220120004103746a2104" + "200041016b41ffffffff017141016a210720022802002100034020004104" + "6a28020022050440200328022820002802002005200328022c28020c1100" + "000d040b20012802002003410c6a200141046a2802001101000d03200041" + "086a2100200141086a22012004470d000b0c010b20022802142200450d00" + "2000410574210b200041016b41ffffff3f7141016a210720022802082105" + "200228020021000340200041046a28020022010440200328022820002802" + "002001200328022c28020c1100000d030b20032008200a6a220141106a28" + "020036021c20032001411c6a2d00003a00242003200141186a2802003602" + "202001410c6a28020021044100210941002106024002400240200141086a" + "28020041016b0e020002010b200441037420056a220c2802000d01200c28" + "020421040b410121060b200320043602102003200636020c200141046a28" + "02002104024002400240200128020041016b0e020002010b200441037420" + "056a22062802000d01200628020421040b410121090b2003200436021820" + "0320093602142005200141146a2802004103746a22012802002003410c6a" + "200141046a2802001101000d02200041086a2100200b200841206a220847" + "0d000b0b200720022802044f0d012003280228200228020020074103746a" + "22002802002000280204200328022c28020c110000450d010b41010c010b" + "41000b200341306a24000b1900200128021c41a481c000410e2001280220" + "28020c1100000b820302047f017e230041406a2206240041012107024020" + "002d00040d0020002d00052108200028020022052d001441047145044020" + "0528021c418383c000418083c000200841017122081b4102410320081b20" + "0528022028020c1100000d01200528021c20012002200528022028020c11" + "00000d01200528021c41f391c0004102200528022028020c1100000d0120" + "032005200411010021070c010b2008410171450440200528021c418583c0" + "004103200528022028020c1100000d010b200641013a0017200641206a20" + "0541086a290200370300200641286a200541106a29020037030020064130" + "6a200541186a2802003602002006200529021c3702082005290200210920" + "0641e482c000360238200620093703182006200641176a36021020062006" + "41086a220536023420052001200210210d00200541f391c000410210210d" + "002003200641186a20041101000d002006280234418883c0004102200628" + "023828020c11000021070b200041013a0005200020073a0004200641406b" + "240020000bab04010c7f200141016b210e2000280204210a200028020021" + "0b2000280208210c0240034020050d01027f024020022003490d00034020" + "0120036a2105024002400240200220036b220741074d044020022003470d" + "01200221030c050b0240200541036a417c71220620056b22040440410021" + "000340200020056a2d0000410a460d052004200041016a2200470d000b20" + "04200741086b22004d0d010c030b200741086b21000b0340418082840820" + "062802002209418a94a8d000736b2009724180828408200641046a280200" + "2209418a94a8d000736b2009727141808182847871418081828478470d02" + "200641086a2106200441086a220420004d0d000b0c010b41002100034020" + "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" + "030b20042007460440200221030c030b200420056a2106200220046b2003" + "6b21074100210002400340200020066a2d0000410a460d01200720004101" + "6a2200470d000b200221030c030b200020046a21000b200020036a220441" + "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" + "200322040c030b200220034f0d000b0b20022008460d0241012105200821" + "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" + "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" + "200020086b2100200120086a2107200c20063a000020042108200b200720" + "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" + "042102200028020021030240200028020822002d0000450d00200341fc82" + "c0004104200228020c110000450d0041010f0b20002001410a463a000020" + "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" + "200028020022002000411f7522027320026b2000417f73411f762001100a" + "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" + "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" + "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" + "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" + "0041003a00002002450d00000b000b250020002802002d00004504402001" + "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" + "02082204452001280200220520046b20034f724504402001410036020820" + "0141003a000c410021040b20032005490440200128020420046a20022003" + "10371a200041043a00002001200320046a3602080f0b2000420437020020" + "0141003a000c0bac0301017f230041406a22022400024002400240024002" + "40024020002d000041016b0e03010203000b2002200028020436020441b1" + "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" + "0000200041086a41a495c0002900003700002000419c95c0002900003700" + "00200241143602102002200036020c200241143602082002410336022c20" + "02419c91c000360228200242023702342002200241046aad4280808080b0" + "01843703202002200241086aad4280808080c00184370318200220024118" + "6a360230200128021c2001280220200241286a101e210020022802082201" + "450d03200228020c2001100c0c030b20002d000121002002410136022c20" + "0241c88ac000360228200242013702342002200241186aad4280808080f0" + "008437030820022000410274220041f095c0006a28020036021c20022000" + "419897c0006a2802003602182002200241086a360230200128021c200128" + "0220200241286a101e21000c020b20012000280204220028020020002802" + "04101a21000c010b20002802042200280200200120002802042802101101" + "0021000b200241406b240020000f0b000b10002001200028020420002802" + "08101a0b5501037f2000280204210120002d0000220041044d2000410347" + "7145044020012802002100200141046a2802002202280200220304402000" + "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" + "c709010a7f230041206b2208240002400240024002402001280210450440" + "2001417f36021020032003200241036a417c7120026b220a6b4107714100" + "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" + "016b200220036a220541016b22062d0000410a460d001a2006200220096a" + "2207460d01200441026b200541026b22062d0000410a460d001a20062007" + "460d01200441036b200541036b22062d0000410a460d001a20062007460d" + "01200441046b200541046b22062d0000410a460d001a20062007460d0120" + "0441056b200541056b22062d0000410a460d001a20062007460d01200441" + "066b200541066b22062d0000410a460d001a20062007460d01200441076b" + "200541076b22052d0000410a460d001a20052007460d0120044178720b20" + "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" + "0241046b210d2004417f7320026a21060340024020062105200a21042009" + "2207200c4d0d00200441086b210a200541086b2106418082840820022007" + "41086b22096a280200220b418a94a8d000736b200b724180828408200720" + "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" + "8478460d010b0b20032007490d0202400340200320046a450d0120044101" + "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" + "016a21040c040b02402001411c6a2802002204450440410021040c010b20" + "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" + "00202001411c6a41003602000b2003200128021420046b4f044020002001" + "41146a2002200310280c050b200128021820046a2002200310371a200041" + "043a00002001411c6a200320046a3602000c040b230041306b2200240020" + "00410136020c200041c481c0003602082000420137021420002000412f6a" + "ad4280808080a001843703202000200041206a360210200041086a41d091" + "c0001017000b230041306b22002400200020033602042000200936020020" + "00410236020c200041d887c000360208200042023702142000200041046a" + "ad428080808080018437032820002000ad42808080808001843703202000" + "200041206a360210200041086a418485c0001017000b230041306b220024" + "0020002003360204200020073602002000410236020c200041f887c00036" + "0208200042023702142000200041046aad42808080808001843703282000" + "2000ad42808080808001843703202000200041206a360210200041086a41" + "9485c0001017000b20032004490440200841003602182008410136020c20" + "0841888bc00036020820084204370210200841086a41908bc0001017000b" + "02402001411c6a2802002205450d0002400240200128021420056b20044d" + "0440200841086a200141146a20022004102820082d00084104470d012001" + "411c6a28020021050c020b200141186a28020020056a2002200410371a20" + "01411c6a200420056a22053602000c010b200020082903083702000c020b" + "2005450d00200141003a00202001411c6a41003602000b200220046a2105" + "200320046b220220012802144f04402000200141146a2005200210280c01" + "0b200141186a2802002005200210371a200041043a00002001411c6a2002" + "3602000b2001200128021041016a360210200841206a24000b9a0102047f" + "017e230041106b22032400200341086a200028020828020020012002102c" + "20032d000822054104470440200028020421012003290308210720002d00" + "00220241044d20024103477145044020012802002102200141046a280200" + "220428020022060440200220061103000b20042802042204044020022004" + "100c0b2001410c100c0b200020073702000b200341106a24002005410447" + "0be10202057f017e230041106b2202240020024100360204027f20014180" + "014f044020014180104f04402001418080044f044020022001413f714180" + "01723a00072002200141127641f001723a000420022001410676413f7141" + "8001723a000620022001410c76413f71418001723a000541040c030b2002" + "2001413f71418001723a000620022001410c7641e001723a000420022001" + "410676413f71418001723a000541030c020b20022001413f71418001723a" + "00052002200141067641c001723a000441020c010b200220013a00044101" + "0b2101200241086a2000280208280200200241046a2001102c20022d0008" + "22054104470440200028020421012002290308210720002d000022034104" + "4d20034103477145044020012802002103200141046a2802002204280200" + "22060440200320061103000b20042802042204044020032004100c0b2001" + "410c100c0b200020073702000b200241106a240020054104470b0d002000" + "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" + "36020c2001419892c00036020841c89cc0002d0000410347044002402300" + "41206b22022400024002400240024041c89cc0002d000041026b0e020301" + "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" + "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" + "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" + "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" + "41206a24000c020b000b200241003602182002410136020c200241e895c0" + "0036020820024204370210200241086a41b094c0001017000b0b02400240" + "024041d89cc000290300220650044041e09cc00029030021050340200542" + "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" + "5122021b370300200721052002450d000b41d89cc00020063703000b0240" + "024041a09cc000290300200652044041ac9cc0002d000021034101210241" + "ac9cc00041013a0000200120033a00182003450d01200142003702342001" + "4281808080c00037022c200141c893c000360228230041106b2202240020" + "02418888c00036020c2002200141186a360208230041f0006b2200240020" + "00418c88c00036020c2000200241086a3602082000418c88c00036021420" + "002002410c6a3602102000410236021c200041cd81c00036021802402001" + "41286a22012802004504402000410336025c2000418082c0003602582000" + "42033702642000200041106aad4280808080e00084370348200020004108" + "6aad4280808080e000843703400c010b200041306a200141106a29020037" + "0300200041286a200141086a290200370300200020012902003703202000" + "410436025c200041b482c000360258200042043702642000200041106aad" + "4280808080e000843703502000200041086aad4280808080e00084370348" + "2000200041206aad42808080809001843703400b2000200041186aad4280" + "808080f000843703382000200041386a360260200041d8006a41fc93c000" + "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" + "0041306b220024002000412636020c200041c094c0003602082000410136" + "0214200041c88ac0003602102000420137021c2000200041086aad428080" + "8080f000843703282000200041286a360218200041106a418c95c0001017" + "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" + "36021041042102200141043a00182001200141106a360220200141186a41" + "9c88c0002000101e210320012d0018210002402003450440420021054117" + "2000764101710d01200128021c22002802002102200041046a2802002203" + "28020022040440200220041103000b20032802042203044020022003100c" + "0b2000410c100c410421020c010b20004104460d02200129031822074280" + "7e8321052007a721020b20012802102200200028020841016b2203360208" + "2003450440200041003a000c200042003703000b200241ff01714104470d" + "02200141406b24000f0b230041206b220024002000410036021820004101" + "36020c200041b08ac00036020820004204370210200041086a41b88ac000" + "1017000b200141003602382001410136022c2001419093c0003602282001" + "4204370230200141286a419893c0001017000b200120052002ad42ff0183" + "843703102001410236022c200141f891c000360228200142023702342001" + "200141106aad4280808080d001843703202001200141086aad4280808080" + "f000843703182001200141186a360230200141286a418892c0001017000b" + "0c00200020012902003703000bba0201047f411f21022000420037021020" + "0141ffffff074d04402001410620014108766722036b7641017120034101" + "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" + "20027422034184a0c0002802007145044020042000360200200020043602" + "182000200036020c200020003602084184a0c0004184a0c0002802002003" + "723602000f0b024002402001200428020022032802044178714604402003" + "21020c010b2001411920024101766b41002002411f471b74210503402003" + "2005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c" + "20022000360208200041003602182000200236020c200020013602080f0b" + "20042000360200200020033602182000200036020c200020003602080bf1" + "0201047f200028020c21020240024020014180024f044020002802182103" + "0240024020002002460440200041144110200028021422021b6a28020022" + "010d01410021020c020b20002802082201200236020c200220013602080c" + "010b200041146a200041106a20021b21040340200421052001220241146a" + "200241106a200228021422011b210420024114411020011b6a2802002201" + "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" + "006a220128020047044020034110411420032802102000461b6a20023602" + "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" + "280200417e200028021c77713602000c020b200028020822002002470440" + "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" + "7e200141037677713602000f0b2002200336021820002802102201044020" + "022001360210200120023602180b20002802142200450d00200220003602" + "14200020023602180b0b8f0101027f230041306b22012400024020004100" + "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" + "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" + "14200141d89ac0003602102001420137021c2001411036022c2001200141" + "286a36021820012001410c6a360228200141106a1030200128020c200141" + "306a24000bcf0101067f23004180016b2204240020012802042107200128" + "020021062000280200210020012802142205210202402005410471450d00" + "2005410872210220060d0020014281808080a0013702000b200120024104" + "7236021441810121020340200220046a41026b2000410f71220341307220" + "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" + "762100450d000b20014101419183c0004102200220046a41016b41810120" + "026b10092001200536021420012007360204200120063602002004418001" + "6a24000b6301017f230041306b220224002002200036020c200241023602" + "14200241f49ac0003602102002420137021c2002411036022c2002200241" + "286a36021820022002410c6a360228200241106a10302001044020022802" + "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" + "21030c010b02402000410020006b41037122066a220520004d0d00200021" + "032001210420060440200621070340200320042d00003a0000200441016a" + "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" + "0340200320042d00003a0000200341016a200441016a2d00003a00002003" + "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" + "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" + "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" + "003a0000200441086a2104200341086a22032005470d000b0b2005200220" + "066b2207417c7122086a21030240200120066a2204410371450440200320" + "054d0d0120042101034020052001280200360200200141046a2101200541" + "046a22052003490d000b0c010b200320054d0d0020044103742202411871" + "21062004417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220067620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20074103712102200420086a21010b" + "02402003200220036a22064f0d002002410771220404400340200320012d" + "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" + "200241016b4107490d000340200320012d00003a0000200341016a200141" + "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" + "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" + "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" + "41076a200141076a2d00003a0000200141086a2101200341086a22032006" + "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" + "420022022001422088420a7e7c22014220867c2204370300200020032004" + "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" + "c0000ba40611000000140000000400000012000000000000000100000001" + "00000013000000557466384572726f7276616c69645f75705f746f657272" + "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" + "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" + "003d0000005c0010000a0000001600000037000000636170616369747920" + "6f766572666c6f770000008800100011000000426f72726f774d75744572" + "726f72616c726561647920626f72726f7765643a20b2001000120000005b" + "3d3d617373657274696f6e20606c6566742020726967687460206661696c" + "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" + "00100017000000f60010000900000020726967687460206661696c65643a" + "200a20206c6566743a20000000cf00100010000000180110001000000028" + "01100009000000f6001000090000000100000000000000f3081000020000" + "00000000000c000000040000001400000015000000160000002020202020" + "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230" + "323132323233323432353236323732383239333033313332333333343335" + "333633373338333934303431343234333434343534363437343834393530" + "353135323533353435353536353735383539363036313632363336343635" + "363636373638363937303731373237333734373537363737373837393830" + "383138323833383438353836383738383839393039313932393339343935" + "393639373938393966616c7365747275656c6962726172792f636f72652f" + "7372632f736c6963652f6d656d6368722e72736402100020000000850000" + "001e0000006402100020000000a100000009000000010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010100" + "41e686c0000b330202020202020202020202020202020202020202020202" + "020202020202020303030303030303030303030303030304040404040041" + "a487c0000b6172616e676520737461727420696e64657820206f7574206f" + "662072616e676520666f7220736c696365206f66206c656e67746820a403" + "100012000000b60310002200000072616e676520656e6420696e64657820" + "e803100010000000b60310002200419088c0000b8f140400000004000000" + "17000000180000000c00000004000000190000001a0000001b0000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" + "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" + "61746520756e69717565207468726561642049443a206269747370616365" + "20657868617573746564f904100037000000dc0410001d000000ae040000" + "0d00000001000000000000006c6962726172792f7374642f7372632f696f" + "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e00007d05100009000000500510002d000000160100002900" + "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" + "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" + "696f6e207265736574686f737420756e726561636861626c656e6574776f" + "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" + "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" + "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c7265616479206578" + "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" + "206469726563746f727969732061206469726563746f7279646972656374" + "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c657379737465" + "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" + "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" + "2066696c652068616e646c65696e76616c696420696e7075742070617261" + "6d65746572696e76616c6964206461746174696d6564206f757477726974" + "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" + "756e7365656b61626c652066696c6571756f746120657863656564656466" + "696c6520746f6f206c617267657265736f75726365206275737965786563" + "757461626c652066696c652062757379646561646c6f636b63726f73732d" + "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" + "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" + "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" + "70746564756e737570706f72746564756e657870656374656420656e6420" + "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" + "736f74686572206572726f72756e63617465676f72697a6564206572726f" + "7220286f73206572726f72202900000001000000000000008d0810000b00" + "000098081000010000006c6962726172792f7374642f7372632f696f2f73" + "7464696f2e727300b40810001b00000032030000140000006661696c6564" + "207072696e74696e6720746f203a20000000e008100013000000f3081000" + "02000000b40810001b00000063040000090000007374646f75746c696272" + "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" + "696e6720747261697420696d706c656d656e746174696f6e207265747572" + "6e656420616e206572726f72207768656e2074686520756e6465726c7969" + "6e672073747265616d20646964206e6f7400000037091000560000001e09" + "100019000000680700001500000063616e6e6f7420726563757273697665" + "6c792061637175697265206d75746578a8091000200000006c6962726172" + "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" + "72656164732e7273d00910002c00000013000000090000006c6962726172" + "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" + "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" + "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" + "7273660a100026000000220100002d0000006f7065726174696f6e207375" + "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" + "6e206d6179206e6f7420626520706572666f726d65642072656375727369" + "76656c79b00a100038000000100000001100000012000000100000001000" + "000013000000120000000d0000000e000000150000000c0000000b000000" + "15000000150000000f0000000e0000001300000026000000380000001900" + "0000170000000c000000090000000a00000010000000170000000e000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600" + "0000150000000b000000160000000d0000000b0000000b00000013000000" + "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" + "1000250610003306100048061000540610005f0610007406100089061000" + "98061000a6061000b9061000df0610001707100030071000470710005307" + "10005c07100066071000760710008d0710009b071000a9071000b6071000" + "ca071000d2071000ed071000fb0710000b08100021081000360810004108" + "100057081000640810006f0810007a081000000000000100000001000000" + "1300000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" + "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" + "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" + "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" + "6963652e72737b0c10006d000000a1000000190000005061727365496e74" + "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" + "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" + "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" + "100009000000550d1000010000006465616c6c6f636174652000680d1000" + "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" + "46696e6973684166746572000000090d1000320000008000000016000000" + "42616c616e636500090d1000320000009b00000016000000456d70747949" + "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" + "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" + "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" + "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; + +static auto const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 46267d55b5..a61b4f73cb 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2020 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index e6ef682e49..fd90b48d70 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -615,7 +615,7 @@ EscrowFinish::doApply() // WASM execution auto const wasmStr = slep->getFieldVL(sfFinishFunction); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("ready"); + std::string funcName("finish"); WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); From aef32ead2c0cd4027d882b4238634535a7756b6c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 May 2025 10:31:02 -0400 Subject: [PATCH 14/15] better WASM logging to match rippled (#5395) * basic logging * pass in Journal * log level based on journal level * clean up * attempt at adding WAMR logging properly * improve logline * maybe_unused * fix * fix * fix segfault * add test --- external/wamr/conanfile.py | 43 ++++++----- src/test/app/Wasm_test.cpp | 103 +++++++++++++++++-------- src/xrpld/app/misc/WamrVM.cpp | 107 +++++++++++++++++++++++--- src/xrpld/app/misc/WamrVM.h | 6 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 7 ++ src/xrpld/app/misc/WasmVM.cpp | 7 +- src/xrpld/app/misc/WasmVM.h | 9 ++- 7 files changed, 213 insertions(+), 69 deletions(-) diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index d54bb6f98f..ae83e8c13c 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -1,11 +1,16 @@ from conans import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, copy -import os -import json +from conan.tools.files import ( + apply_conandata_patches, + export_conandata_patches, + # get, +) + +# import os required_conan_version = ">=1.55.0" + class WamrConan(ConanFile): name = "wamr" version = "2.2.0" @@ -17,31 +22,30 @@ class WamrConan(ConanFile): options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} generators = "CMakeToolchain", "CMakeDeps" - #requires = [("llvm/20.1.1@")] + # requires = [("llvm/20.1.1@")] def export_sources(self): export_conandata_patches(self) pass - - #def build_requirements(self): + # def build_requirements(self): # self.tool_requires("llvm/20.1.1") - def config_options(self): if self.settings.os == "Windows": del self.options.fPIC - def layout(self): cmake_layout(self, src_folder="src") - def source(self): git = tools.Git() - git.clone("https://github.com/bytecodealliance/wasm-micro-runtime.git", "c883fafead005e87ad3122b05409886f507c1cb0",shallow=True) - #get(self, **self.conan_data["sources"][self.version], strip_root=True) - + git.clone( + "https://github.com/bytecodealliance/wasm-micro-runtime.git", + "c883fafead005e87ad3122b05409886f507c1cb0", + shallow=True, + ) + # get(self, **self.conan_data["sources"][self.version], strip_root=True) def generate(self): tc = CMakeToolchain(self) @@ -54,37 +58,34 @@ class WamrConan(ConanFile): tc.variables["WAMR_BUILD_FAST_JIT"] = 0 tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 - #tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 - #ll_dep = self.dependencies["llvm"] - #self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") - #tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" + # tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 + # ll_dep = self.dependencies["llvm"] + # self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") + # tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") tc.generate() # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder deps = CMakeDeps(self) deps.generate() - def build(self): apply_conandata_patches(self) cmake = CMake(self) cmake.verbose = True cmake.configure() cmake.build() - #self.run(f'echo {self.source_folder}') + # self.run(f'echo {self.source_folder}') # Explicit way: # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) # self.run("cmake --build . %s" % cmake.build_config) - def package(self): cmake = CMake(self) cmake.verbose = True cmake.install() - def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" - diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 5c9c0afc9c..7f54a636cc 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -127,41 +127,58 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; struct TestHostFunctions : public HostFunctions { - Env* env; - Bytes accountID; - Bytes data; - int clock_drift = 0; + Env* env_; + Bytes accountID_; + Bytes data_; + int clock_drift_ = 0; + test::StreamSink sink_; + beast::Journal jlog_; public: explicit TestHostFunctions(Env* env, int cd = 0) - : env(env), clock_drift(cd) + : env_(env) + , clock_drift_(cd) + , sink_(beast::severities::kTrace) + , jlog_(sink_) { std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID = Bytes{s.begin(), s.end()}; + accountID_ = Bytes{s.begin(), s.end()}; std::string t = "10000"; - data = Bytes{t.begin(), t.end()}; + data_ = Bytes{t.begin(), t.end()}; + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; } int32_t getLedgerSqn() override { - return (int32_t)env->current()->seq(); + return (int32_t)env_->current()->seq(); } int32_t getParentLedgerTime() override { - return env->current() + return env_->current() ->parentCloseTime() .time_since_epoch() .count() + - clock_drift; + clock_drift_; } std::optional getTxField(std::string const& fname) override { - return accountID; + return accountID_; } std::optional @@ -170,19 +187,19 @@ struct Wasm_test : public beast::unit_test::suite Bytes const& kdata, std::string const& fname) override { - return data; + return data_; } std::optional getCurrentLedgerEntryField(std::string const& fname) override { if (fname == "Destination" || fname == "Account") - return accountID; + return accountID_; else if (fname == "Data") - return data; + return data_; else if (fname == "FinishAfter") { - auto t = env->current() + auto t = env_->current() ->parentCloseTime() .time_since_epoch() .count(); @@ -197,14 +214,14 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { - TestHostFunctions nfs(&env); + TestHostFunctions nfs(&env, 0); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re.value().result); - std::cout << "good case result " << re.value().result - << " cost: " << re.value().cost << std::endl; + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; } } @@ -214,17 +231,17 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(&env); - nfs.clock_drift = -1; + TestHostFunctions nfs(&env, -1); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(!re.value().result); - std::cout << "bad case (current time < escrow_finish_after " - "time) result " - << re.value().result << " cost: " << re.value().cost - << std::endl; + // std::cout << "bad case (current time < escrow_finish_after " + // "time) result " + // << re.value().result << " cost: " << + // re.value().cost + // << std::endl; } } @@ -244,8 +261,8 @@ struct Wasm_test : public beast::unit_test::suite std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); BEAST_EXPECT(re.error()); - std::cout << "bad case (access nonexistent field) result " - << re.error() << std::endl; + // std::cout << "bad case (access nonexistent field) result " + // << re.error() << std::endl; } { // fail because trying to allocate more than MAX_PAGES memory @@ -263,9 +280,9 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(&env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); - if (BEAST_EXPECT(!re)) - std::cout << "bad case (more than MAX_PAGES) result " - << re.error() << std::endl; + BEAST_EXPECT(!re); + // std::cout << "bad case (more than MAX_PAGES) result " + // << re.error() << std::endl; } { // fail because recursion too deep @@ -276,9 +293,31 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions nfs(&env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); - if (BEAST_EXPECT(re.error())) - std::cout << "bad case (deep recursion) result " << re.error() - << std::endl; + BEAST_EXPECT(re.error()); + // std::cout << "bad case (deep recursion) result " << re.error() + // << std::endl; + + auto const& sink = nfs.getSink(); + auto countSubstr = [](std::string const& str, + std::string const& substr) { + std::size_t pos = 0; + int occurrences = 0; + while ((pos = str.find(substr, pos)) != std::string::npos) + { + occurrences++; + pos += substr.length(); + } + return occurrences; + }; + + BEAST_EXPECT( + countSubstr( + sink.messages().str(), "WAMR error: failed to call func") == + 1); + BEAST_EXPECT( + countSubstr( + sink.messages().str(), + "WAMR trap: Exception: wasm operand stack overflow") == 1); } } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index a781aadea9..4ed47a2ffb 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -19,6 +19,8 @@ #include +#include + #include namespace ripple { @@ -27,10 +29,91 @@ namespace ripple { namespace { -static void -print_wasm_error(const char* message, wasm_trap_t* trap) +static log_level_t +getLogLevel(beast::severities::Severity severity) { - fprintf(stderr, "WAMR error: %s\n", message); + using namespace beast::severities; + switch (severity) + { + case kTrace: + return WASM_LOG_LEVEL_VERBOSE; + case kDebug: + return WASM_LOG_LEVEL_DEBUG; + case kInfo: + case kWarning: + return WASM_LOG_LEVEL_WARNING; + case kError: + return WASM_LOG_LEVEL_ERROR; + default: + UNREACHABLE("invalid severity"); + [[fallthrough]]; + case kFatal: + case kNone: + break; + } + + return WASM_LOG_LEVEL_FATAL; +} + +static beast::severities::Severity +getLogLevel(uint32_t severity) +{ + using namespace beast::severities; + switch (severity) + { + case WASM_LOG_LEVEL_VERBOSE: + return kTrace; + case WASM_LOG_LEVEL_DEBUG: + return kDebug; + case WASM_LOG_LEVEL_WARNING: + return kWarning; + case WASM_LOG_LEVEL_ERROR: + return kError; + default: + UNREACHABLE("invalid severity"); + [[fallthrough]]; + case WASM_LOG_LEVEL_FATAL: + break; + } + + return kFatal; +} + +// This function is called from WAMR to log messages. +extern "C" void +wamr_log_to_rippled( + uint32_t logLevel, + const char* file, + int line, + const char* fmt, + ...) +{ + beast::Journal j = debugLog(); + + // Format the variadic args + const char* safeFile = file ? file : ""; + + std::ostringstream oss; + oss << "WAMR LOG (" << safeFile << ":" << line << "): "; + + va_list args; + va_start(args, fmt); + + char formatted[1024]; + vsnprintf(formatted, sizeof(formatted), fmt, args); + formatted[sizeof(formatted) - 1] = '\0'; + + va_end(args); + + oss << formatted; + + j.stream(getLogLevel(logLevel)) << oss.str(); +} + +static void +print_wasm_error(const char* message, wasm_trap_t* trap, beast::Journal j) +{ + j.debug() << "WAMR error: " << message; if (trap) { @@ -38,11 +121,7 @@ print_wasm_error(const char* message, wasm_trap_t* trap) wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); - fprintf( - stderr, - "WAMR trap: %.*s\n", - (int)error_message.size, - error_message.data); + j.debug() << "WAMR trap: " << error_message.data; wasm_byte_vec_delete(&error_message); } } @@ -69,7 +148,10 @@ InstanceWrapper::init( if (!mi || trap) { - print_wasm_error("can't create instance", trap); + print_wasm_error( + "can't create instance", + trap, + beast::Journal(beast::Journal::getNullSink())); throw std::runtime_error("WAMR: can't create instance"); } wasm_instance_exports(mi.get(), expt); @@ -570,7 +652,7 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) nullptr}; trap = wasm_func_call(func, &inv, &ret.r); if (trap) - print_wasm_error("failed to call func", trap); + print_wasm_error("failed to call func", trap, j_); // assert(results[0].kind == WASM_I32); // if (NR) printf("Result P5: %d\n", ret[0].of.i32); @@ -645,10 +727,13 @@ WamrEngine::run( wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params) + std::vector const& params, + beast::Journal j) { try { + wasm_runtime_set_log_level(getLogLevel(j.sink().threshold())); + j_ = j; return runHlp(wasmCode, funcName, imports, params); } catch (std::exception const&) diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 113fcf8886..a5b8051cb1 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,6 +20,8 @@ #include +#include + #include #include @@ -146,6 +148,7 @@ class WamrEngine wasm_trap_t* trap = nullptr; std::int64_t defGas = -1; std::int32_t defMaxPages = -1; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); public: WamrEngine(); @@ -155,7 +158,8 @@ public: run(wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params); + std::vector const& params, + beast::Journal j); std::int64_t initGas(std::int64_t def); diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index e1943244e7..f2f70ee558 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -23,6 +23,7 @@ #include #include +#include #include namespace ripple { @@ -34,6 +35,12 @@ public: { } + beast::Journal + getJournal() override + { + return ctx.journal; + } + int32_t getLedgerSqn() override; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index a61b4f73cb..8e77bc027b 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -56,7 +56,7 @@ runEscrowWasm( WASM_IMPORT_FUNC(imports, print, hfs) std::int64_t const sgas = gasLimit; // vm.getGas(); - auto ret = vm.run(wasmCode, funcName, imports); + auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -92,9 +92,10 @@ WasmEngine::run( wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params) + std::vector const& params, + beast::Journal j) { - return impl->run(wasmCode, funcName, imports, params); + return impl->run(wasmCode, funcName, imports, params, j); } std::int64_t diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b383bba37d..25079861b9 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -68,6 +68,12 @@ typedef WasmResult EscrowResult; struct HostFunctions { + virtual beast::Journal + getJournal() + { + return beast::Journal{beast::Journal::getNullSink()}; + } + virtual int32_t getLedgerSqn() { @@ -331,7 +337,8 @@ public: run(wbytes const& wasmCode, std::string_view funcName = {}, std::vector const& imports = {}, - std::vector const& params = {}); + std::vector const& params = {}, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); std::int64_t initGas(std::int64_t def = 1'000'000'000'000LL); From 1ede0bdec443eecb0d1ee7cf429b08ca00b39299 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 May 2025 17:37:14 -0400 Subject: [PATCH 15/15] fix: fix fixtures (#5445) --- src/test/app/wasm_fixtures/fixtures.cpp | 1571 +++++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 1553 +--------------------- src/xrpld/app/misc/WasmHostFuncImpl.h | 5 +- 3 files changed, 1580 insertions(+), 1549 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixtures.cpp diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp new file mode 100644 index 0000000000..1ed246f252 --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -0,0 +1,1571 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +std::string const ledgerSqnHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" + "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" + "010700100041044a0b004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d31" + "2e38352e31202834656231363132353020323032352d30332d3135290049" + "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" + "732b0a6d756c746976616c7565"; + +std::string const allHostFunctionsHex = + "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" + "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" + "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" + "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" + "686f73745f6c69621a67657443757272656e744c6564676572456e747279" + "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" + "794669656c64000408686f73745f6c696213676574506172656e744c6564" + "67657254696d65000503363501010101090a000302010101010506020207" + "020201040001010100010400010101020701080101030800010103020202" + "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" + "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" + "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" + "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" + "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" + "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" + "0000450440200128021c41d480c0004104200128022028020c1100002100" + "0c010b41012100200128021c220341d880c0004104200128022022062802" + "0c22051100000d00200441016a2104024020012d00144104714504402003" + "418d83c000410120051100000d022004200110050d02200128021c210320" + "0128022028020c21050c010b2003418e83c000410220051100000d012002" + "41013a0017200241206a200141086a290200370300200241286a20014110" + "6a290200370300200241306a200141186a2802003602002002200636020c" + "20022003360208200241e482c00036023820022001290200370318200220" + "0241176a3602102002200241086a3602342004200241186a10050d012002" + "280234418883c0004102200228023828020c1100000d010b2003419891c0" + "004101200511000021000b200241406b240020000bff0201037f23004180" + "016b22032400027f0240200128021422024110714504402002412071450d" + "0120002d0000210241810121000340200020036a41026b2002410f712204" + "413072200441376a2004410a491b3a000020022204410476210220004101" + "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" + "41810120006b10090c020b20002d0000210241810121000340200020036a" + "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" + "22044104762102200041016b21002004410f4b0d000b20014101419183c0" + "004102200020036a41016b41810120006b10090c010b0240024002402000" + "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" + "0171410174419383c0006a2f00003b0001410021000c010b410221002002" + "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" + "410174419383c0006a2f00003b00010b2001410141014100200020036a20" + "0041037310090b20034180016a24000b4701017f230041106b2202240020" + "022000280200220041046a36020c200141a080c000410941a980c000410b" + "2000410141b480c00041092002410c6a41021008200241106a24000bff01" + "01037f23004180016b22042400027f024020012802142202411071450440" + "20024120710d01200028020041012001100a0c020b200028020021004181" + "0121020340200220046a41026b2000410f712203413072200341d7006a20" + "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" + "20014101419183c0004102200220046a41016b41810120026b10090c010b" + "2000280200210041810121020340200220046a41026b2000410f71220341" + "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" + "41047621000d000b20014101419183c0004102200220046a41016b418101" + "20026b10090b20044180016a24000bc50101017f230041106b220b240020" + "0028021c20012002200028022028020c1100002101200b41003a000d200b" + "20013a000c200b2000360208200b41086a20032004200520061020200720" + "082009200a10202101200b2d000d2202200b2d000c220372210002402003" + "4101712002410147720d00200128020022002d0014410471450440200028" + "021c418b83c0004102200028022028020c11000021000c010b200028021c" + "418a83c0004101200028022028020c11000021000b200b41106a24002000" + "4101710bef0401077f027f200145044020002802142106412d2109200541" + "016a0c010b412b418080c4002000280214220641017122011b2109200120" + "056a0b210702402006410471450440410021020c010b024020034504400c" + "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" + "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" + "280200450440200028021c22012000280220220020092002200310190440" + "41010f0b200120042005200028020c1100000f0b02400240024020072000" + "28020422084f0440200028021c2201200028022022002009200220031019" + "450d0141010f0b2006410871450d012000280210210b2000413036021020" + "002d0018210c41012101200041013a0018200028021c2206200028022022" + "0a20092002200310190d02200820076b41016a210102400340200141016b" + "2201450d0120064130200a280210110100450d000b41010f0b2006200420" + "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" + "000f0b200120042005200028020c11000021010c010b200820076b210602" + "4002400240410120002d0018220120014103461b220141016b0e02000102" + "0b20062101410021060c010b20064101762101200641016a41017621060b" + "200141016a21012000280210210820002802202107200028021c21000240" + "0340200141016b2201450d01200020082007280210110100450d000b4101" + "0f0b410121012000200720092002200310190d0020002004200520072802" + "0c1100000d004100210103402001200646044041000f0b200141016a2101" + "200020082007280210110100450d000b200141016b2006490f0b20010bbd" + "0201067f230041106b22042400410a2103024020004190ce004904402000" + "21050c010b0340200441066a20036a220641046b20004190ce006e220541" + "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" + "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" + "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" + "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" + "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" + "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" + "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" + "2203200441066a6a20004130723a00000b2002200141014100200441066a" + "20036a410a20036b1009200441106a24000b1701017f2000280200220104" + "4020002802042001100c0b0bce0601047f0240200041046b280200220422" + "02417871220341044108200241037122021b20016a4f0440200241002003" + "200141276a4b1b0d01200041086b22012004220341787122006a21020240" + "024020034101710d002003410271450d012001280200220320006a210020" + "0120036b22014190a0c00028020046044020022802044103714103470d01" + "4188a0c000200036020020022002280204417e7136020420012000410172" + "360204200220003602000c020b2001200310330b02400240024002400240" + "2002280204220341027145044020024194a0c000280200460d0220024190" + "a0c000280200460d0320022003417871220210332001200020026a220041" + "0172360204200020016a200036020020014190a0c000280200470d014188" + "a0c00020003602000c060b20022003417e71360204200120004101723602" + "04200020016a20003602000b2000418002490d0220012000103241002101" + "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" + "280200220004400340200141016a2101200028020822000d000b0b41a8a0" + "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" + "418ca0c000418ca0c00028020020006a2200360200200120004101723602" + "044190a0c00028020020014604404188a0c00041003602004190a0c00041" + "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" + "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" + "402002200128020022054f04402002200520012802046a490d040b200128" + "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" + "020020006a220036020020012000410172360204200020016a2000360200" + "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" + "012000410376742200714504404180a0c000200020037236020020020c01" + "0b20022802080b2100200220013602082000200136020c2001200236020c" + "200120003602080c010b41f09dc000280200220104400340200041016a21" + "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" + "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" + "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" + "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" + "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" + "087f230041406a2202240020002802082105200028020421034101210620" + "0128021c41cc81c0004101200128022028020c1100002100200504400340" + "20072108410121072000410171210441012100024020040d00024020012d" + "00144104714504402008410171450d01200128021c418383c00041022001" + "28022028020c110000450d010c020b20012802202104200128021c210920" + "08410171450440200941d59ac0004101200428020c1100000d020b200241" + "013a0017200241206a200141086a290200370300200241286a200141106a" + "290200370300200241306a200141186a2802003602002002200436020c20" + "022009360208200241e482c0003602382002200129020037031820022002" + "41176a3602102002200241086a3602342003200241186a10054504402002" + "280234418883c0004102200228023828020c11000021000c020b0c010b20" + "032001100521000b200341016a2103200541016b22050d000b0b20004504" + "40200128021c419083c0004101200128022028020c11000021060b200241" + "406b240020060bdb0101047f230041106b220224002002200036020c2300" + "41106b22002400200128021c41f899c000410d200128022028020c110000" + "2103200041003a000d200020033a000c20002001360208200041086a4185" + "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" + "722101024020054101712004410147720d00200328020022012d00144104" + "71450440200128021c418b83c0004102200128022028020c11000021010c" + "010b200128021c418a83c0004101200128022028020c11000021010b2000" + "41106a24002001410171200241106a24000b3300200128021c2000280200" + "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" + "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" + "c0002d00001a024002400240024002404107101222000440200041036a41" + "879bc000280000360000200041849bc000280000360000200341286a2000" + "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" + "200041036a41879bc000280000360000200041849bc00028000036000020" + "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" + "122200450d05200041076a41929bc0002800003600002000418b9bc00029" + "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" + "00001a200328024821012003280244210b410710122204450d0541002100" + "200441036a41b79bc000280000360000200441b49bc00028000036000020" + "0341d8006a41e100200b20012004410710021013200328025c2105024002" + "400240200328026022020e020700010b41012100200522012d0000412b6b" + "0e03060106010b20052d0000412b460440200241016b2100200541016a21" + "0120024112490d010c030b200521012002220041114f0d020b034020012d" + "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" + "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" + "186a2010103820012d000041306b220941094b0d02410221002003290320" + "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" + "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" + "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" + "8b06360000200341cc006a200041041001101320004104100c027f024020" + "03280254220541004e047f2003280250210c20054504404101210141000c" + "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" + "1014000b20050b21092001200c2005103721002005450d01200541076b22" + "014100200120054d1b2106200041036a417c7120006b2108410021010340" + "024002400240200020016a2d00002202c0220741004e0440200820016b41" + "03710d01200120064f0d020340200020016a220228020420022802007241" + "8081828478710d03200141086a22012006490d000b0c020b428080808080" + "20210e428080808010210f024002400240027e0240024002400240024002" + "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" + "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" + "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" + "220420054f0d06200020046a2c0000210402400240200241e00147044020" + "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" + "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" + "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" + "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" + "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" + "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" + "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" + "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" + "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" + "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" + "00210f0b2001ad200e200f8484210e200941808080807846044020002109" + "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" + "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" + "010b200120054f0d000340200020016a2c00004100480d01200520014101" + "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" + "0021050b410021000240024002400240024002400240200ea722020e0206" + "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" + "2b460440200241016b2100200541016a210120024112490d010c020b2005" + "21012002220041114f0d010b4200210e034020012d000041306b22024109" + "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" + "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" + "2d000041306b220441094b0d024102210020032903104200520d03200141" + "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" + "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" + "024002400240410b101222080440200841076a419d9bc000280000360000" + "200841969bc000290000370000200341d8006a2008410b10011013200328" + "025c2104024002400240200328026022020e020a00010b4101210720042d" + "00002201412b6b0e03090109010b20042d000021010b0240024002400240" + "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" + "20024109490d02200121020c080b200241016b2106200441016a21002002" + "4109490d044100210103402006450d0b20002d000041306b220241094b0d" + "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" + "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" + "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" + "0c0b4100210141012107034020002d000041306b220641094b0d06200041" + "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" + "010b410021010c040b4100210141012107034020002d000041306b220241" + "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" + "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" + "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" + "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" + "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" + "c0001015000b20032802582200044020042000100c0b2008410b100c4100" + "210020032802302202200328023c460440200328022c2104200328023821" + "0741002106024020022200450d00034020042d0000220220072d00002208" + "460440200441016a2104200741016a2107200041016b22000d010c020b0b" + "200220086b21060b20064521000b2009044020052009100c0b200328024c" + "22020440200c2002100c0b200328024022020440200b2002100c0b200328" + "02342202044020032802382002100c0b200328022822020440200328022c" + "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" + "0121000b200320003a0058200341d8006a419080c00041f880c000101500" + "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" + "15000b410141e899c0001014000bee2202087f017e024002400240024002" + "40024002400240200041f4014d04404180a0c00028020022024110200041" + "0b6a41f803712000410b491b220541037622007622014103710d01200541" + "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" + "00410b6a220141787121054184a0c0002802002208450d06411f21074100" + "20056b2103200041f4ffff074d04402005410620014108766722006b7641" + "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" + "45044041002100410021010c040b410021002005411920074101766b4100" + "2007411f471b742104410021010340024020022802044178712206200549" + "0d00200620056b220620034f0d0020022101200622030d00410021032001" + "21000c060b200228021422062000200620022004411d764104716a41106a" + "2802002202471b200020061b21002004410174210420020d000b0c030b02" + "402001417f7341017120006a2206410374220041f89dc0006a2203200041" + "809ec0006a280200220128020822044704402004200336020c2003200436" + "02080c010b4180a0c0002002417e200677713602000b2001200041037236" + "0204200020016a220020002802044101723602040c060b02404102200074" + "2203410020036b72200120007471682206410374220041f89dc0006a2203" + "200041809ec0006a280200220128020822044704402004200336020c2003" + "20043602080c010b4180a0c0002002417e200677713602000b2001200541" + "0372360204200120056a2206200020056b2204410172360204200020016a" + "20043602004188a0c00028020022020440200241787141f89dc0006a2100" + "4190a0c0002802002103027f4180a0c00028020022054101200241037674" + "2202714504404180a0c000200220057236020020000c010b20002802080b" + "2102200020033602082002200336020c2003200036020c20032002360208" + "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" + "41e89cc0006a280200220128020441787120056b21032001210202400340" + "02400240200128021022000d00200128021422000d002002280218210702" + "4002402002200228020c2200460440200241144110200228021422001b6a" + "28020022010d01410021000c020b20022802082201200036020c20002001" + "3602080c010b200241146a200241106a20001b2104034020042106200122" + "0041146a200041106a200028021422011b210420004114411020011b6a28" + "020022010d000b200641003602000b2007450d032002200228021c410274" + "41e89cc0006a220128020047044020074110411420072802102002461b6a" + "20003602002000450d040c020b2001200036020020000d014184a0c00041" + "84a0c000280200417e200228021c77713602000c030b2000280204417871" + "20056b22012003200120034922011b21032000200220011b210220002101" + "0c010b0b2000200736021820022802102201044020002001360210200120" + "003602180b20022802142201450d0020002001360214200120003602180b" + "02400240200341104f044020022005410372360204200220056a22062003" + "410172360204200320066a20033602004188a0c0002802002204450d0120" + "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" + "0200220541012004410376742204714504404180a0c00020042005723602" + "0020000c010b20002802080b2104200020013602082004200136020c2001" + "200036020c200120043602080c010b2002200320056a2200410372360204" + "200020026a220020002802044101723602040c010b4190a0c00020063602" + "004188a0c00020033602000b200241086a0f0b2000200172450440410021" + "0141022007742200410020006b722008712200450d0320006841027441e8" + "9cc0006a28020021000b2000450d010b0340200020012000280204417871" + "220420056b220620034922071b2108200028021022024504402000280214" + "21020b20012008200420054922001b210120032006200320071b20001b21" + "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" + "0020056b4f710d0020012802182107024002402001200128020c22004604" + "40200141144110200128021422001b6a28020022020d01410021000c020b" + "20012802082202200036020c200020023602080c010b200141146a200141" + "106a20001b21040340200421062002220041146a200041106a2000280214" + "22021b210420004114411020021b6a28020022020d000b20064100360200" + "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" + "0047044020074110411420072802102001461b6a20003602002000450d02" + "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" + "0128021c77713602000c010b200020073602182001280210220204402000" + "2002360210200220003602180b20012802142202450d0020002002360214" + "200220003602180b0240200341104f044020012005410372360204200120" + "056a22022003410172360204200220036a200336020020034180024f0440" + "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" + "280200220441012003410376742203714504404180a0c000200320047236" + "020020000c010b20002802080b2103200020023602082003200236020c20" + "02200036020c200220033602080c010b2001200320056a22004103723602" + "04200020016a220020002802044101723602040b0c010b02400240024002" + "400240024020054188a0c00028020022014b04402005418ca0c000280200" + "22004f044041002100200541af80046a220141107640002202417f462203" + "0d0720024110742202450d074198a0c000410020014180807c7120031b22" + "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" + "200020002001491b360200024002404194a0c0002802002203044041e89d" + "c0002100034020002802002201200028020422066a2002460d0220002802" + "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" + "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" + "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" + "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" + "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" + "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" + "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" + "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" + "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" + "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" + "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" + "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" + "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" + "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" + "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" + "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" + "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" + "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" + "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" + "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" + "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" + "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" + "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" + "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" + "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" + "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" + "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" + "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" + "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" + "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" + "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" + "0441286b220036020020022000410172360204200020026a412836020441" + "a0a0c00041808080013602000c080b200220034d200120034b720d002000" + "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" + "360200200220046a210141e89dc000210002400240034020012000280200" + "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" + "c0002100034002402003200028020022014f04402003200120002802046a" + "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" + "c000200441286b220036020020022000410172360204200020026a412836" + "020441a0a0c00041808080013602002003200641206b41787141086b2200" + "2000200341106a491b2201411b36020441e89dc000290200210920014110" + "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" + "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" + "02002001411c6a2100034020004107360200200041046a22002006490d00" + "0b20012003460d0720012001280204417e713602042003200120036b2200" + "4101723602042001200036020020004180024f04402003200010320c080b" + "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" + "410376742200714504404180a0c000200020027236020020010c010b2001" + "2802080b2100200120033602082000200336020c2003200136020c200320" + "003602080c070b200020023602002000200028020420046a360204200220" + "054103723602042006410f6a41787141086b2201200220056a22046b2103" + "20014194a0c000280200460d0320014190a0c000280200460d0420012802" + "04220541037141014604402001200541787122001033200020016a220128" + "02042105200020036a21030b20012005417e713602042004200341017236" + "0204200320046a200336020020034180024f04402004200310320c060b20" + "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" + "0376742203714504404180a0c000200120037236020020000c010b200028" + "02080b2103200020043602082003200436020c2004200036020c20042003" + "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" + "00280200220020056a220236020020022001410172360204200020054103" + "72360204200041086a21000c060b4190a0c0002802002100024020012005" + "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" + "2001410372360204200020016a220120012802044101723602040c010b41" + "88a0c00020023602004190a0c000200020056a2203360200200320024101" + "72360204200020016a2002360200200020054103723602040b200041086a" + "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" + "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" + "03200020016b6a41086a220136020020022001410172360204200020036a" + "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" + "00418ca0c000418ca0c00028020020036a22003602002004200041017236" + "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" + "6a220036020020042000410172360204200020046a20003602000b200241" + "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" + "20056b22013602004194a0c0004194a0c000280200220020056a22023602" + "002002200141017236020420002005410372360204200041086a0f0b2000" + "0f0b200141086a0b2701017f200020012800042202360208200020012800" + "003602042000200236020020014108100c0b3b002000450440230041206b" + "22002400200041003602182000410136020c2000419c81c0003602082000" + "4204370210200041086a20011017000b000b7e01017f230041406a220324" + "002003412b36020c200341d098c000360208200320013602142003200036" + "02102003410236021c200341d482c0003602182003420237022420032003" + "41106aad4280808080e000843703382003200341086aad4280808080f000" + "843703302003200341306a360220200341186a20021017000b4101017f23" + "0041206b2202240020024100360210200241013602042002420437020820" + "02412e36021c200220003602182002200241186a36020020022001101700" + "0bf40102027f017e230041106b22022400200241013b010c200220013602" + "0820022000360204230041106b22012400200241046a2200290200210420" + "01200036020c20012004370204230041106b22002400200141046a220128" + "0200220228020c2103024002400240024020022802040e020001020b2003" + "0d0141012102410021030c020b20030d0020022802002202280204210320" + "0228020021020c010b20004180808080783602002000200136020c200128" + "020822012d0008210220012d00091a2000410e20021026000b2000200336" + "020420002002360200200128020822012d0008210220012d00091a200041" + "0f20021026000b0d00200028020041012001100a0b380002402002418080" + "c400460d00200020022001280210110100450d0041010f0b200345044041" + "000f0b200020032004200128020c1100000b900a010a7f02400240024020" + "0028020022052000280208220372044002402003410171450d0020012002" + "6a21060240200028020c2209450440200121040c010b2001210403402004" + "22032006460d02027f200341016a20032c0000220441004e0d001a200341" + "026a20044160490d001a200341036a20044170490d001a200341046a0b22" + "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" + "20042c00001a20072002027f02402007450d00200220074d044020022007" + "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" + "031b21022003200120031b21010b2005450d032000280204210b20024110" + "4f044020022001200141036a417c7122076b22086a220a41037121094100" + "210541002103200120074704402008417c4d044041002106034020032001" + "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" + "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" + "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" + "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" + "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" + "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" + "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" + "09410371210a2009410274210741002104200641044f04402008200741f0" + "07716a210c200821030340200420032802002204417f7341077620044106" + "76724181828408716a20032802042204417f734107762004410676724181" + "828408716a20032802082204417f73410776200441067672418182840871" + "6a200328020c2204417f734107762004410676724181828408716a210420" + "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" + "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" + "200a450d000b2008200941fc01714102746a22042802002203417f734107" + "762003410676724181828408712103200a4101460d022003200428020422" + "03417f734107762003410676724181828408716a2103200a4102460d0220" + "0320042802082203417f734107762003410676724181828408716a21030c" + "020b2002450440410021050c030b20024103712104024020024104490440" + "41002105410021080c010b41002105200121032002410c71220821070340" + "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" + "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" + "200741046b22070d000b0b2004450d02200120086a21030340200520032c" + "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" + "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" + "056a21050b02402005200b490440200b20056b210602400240024020002d" + "00182203410020034103471b220341016b0e020001020b20062103410021" + "060c010b20064101762103200641016a41017621060b200341016a210320" + "00280210210820002802202104200028021c21000340200341016b220345" + "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" + "02200428020c110000044041010f0b410021030340200320064604404100" + "0f0b200341016a2103200020082004280210110100450d000b200341016b" + "2006490f0b200028021c20012002200028022028020c1100000b14002000" + "2802002001200028020428020c1101000b10002001200028020020002802" + "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" + "6b220324002003200136022c20032000360228200341033a002420034220" + "37021c200341003602142003410036020c027f0240024002402002280210" + "220a450440200228020c2200450d012002280208220120004103746a2104" + "200041016b41ffffffff017141016a210720022802002100034020004104" + "6a28020022050440200328022820002802002005200328022c28020c1100" + "000d040b20012802002003410c6a200141046a2802001101000d03200041" + "086a2100200141086a22012004470d000b0c010b20022802142200450d00" + "2000410574210b200041016b41ffffff3f7141016a210720022802082105" + "200228020021000340200041046a28020022010440200328022820002802" + "002001200328022c28020c1100000d030b20032008200a6a220141106a28" + "020036021c20032001411c6a2d00003a00242003200141186a2802003602" + "202001410c6a28020021044100210941002106024002400240200141086a" + "28020041016b0e020002010b200441037420056a220c2802000d01200c28" + "020421040b410121060b200320043602102003200636020c200141046a28" + "02002104024002400240200128020041016b0e020002010b200441037420" + "056a22062802000d01200628020421040b410121090b2003200436021820" + "0320093602142005200141146a2802004103746a22012802002003410c6a" + "200141046a2802001101000d02200041086a2100200b200841206a220847" + "0d000b0b200720022802044f0d012003280228200228020020074103746a" + "22002802002000280204200328022c28020c110000450d010b41010c010b" + "41000b200341306a24000b1900200128021c41a481c000410e2001280220" + "28020c1100000b820302047f017e230041406a2206240041012107024020" + "002d00040d0020002d00052108200028020022052d001441047145044020" + "0528021c418383c000418083c000200841017122081b4102410320081b20" + "0528022028020c1100000d01200528021c20012002200528022028020c11" + "00000d01200528021c41f391c0004102200528022028020c1100000d0120" + "032005200411010021070c010b2008410171450440200528021c418583c0" + "004103200528022028020c1100000d010b200641013a0017200641206a20" + "0541086a290200370300200641286a200541106a29020037030020064130" + "6a200541186a2802003602002006200529021c3702082005290200210920" + "0641e482c000360238200620093703182006200641176a36021020062006" + "41086a220536023420052001200210210d00200541f391c000410210210d" + "002003200641186a20041101000d002006280234418883c0004102200628" + "023828020c11000021070b200041013a0005200020073a0004200641406b" + "240020000bab04010c7f200141016b210e2000280204210a200028020021" + "0b2000280208210c0240034020050d01027f024020022003490d00034020" + "0120036a2105024002400240200220036b220741074d044020022003470d" + "01200221030c050b0240200541036a417c71220620056b22040440410021" + "000340200020056a2d0000410a460d052004200041016a2200470d000b20" + "04200741086b22004d0d010c030b200741086b21000b0340418082840820" + "062802002209418a94a8d000736b2009724180828408200641046a280200" + "2209418a94a8d000736b2009727141808182847871418081828478470d02" + "200641086a2106200441086a220420004d0d000b0c010b41002100034020" + "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" + "030b20042007460440200221030c030b200420056a2106200220046b2003" + "6b21074100210002400340200020066a2d0000410a460d01200720004101" + "6a2200470d000b200221030c030b200020046a21000b200020036a220441" + "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" + "200322040c030b200220034f0d000b0b20022008460d0241012105200821" + "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" + "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" + "200020086b2100200120086a2107200c20063a000020042108200b200720" + "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" + "042102200028020021030240200028020822002d0000450d00200341fc82" + "c0004104200228020c110000450d0041010f0b20002001410a463a000020" + "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" + "200028020022002000411f7522027320026b2000417f73411f762001100a" + "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" + "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" + "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" + "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" + "0041003a00002002450d00000b000b250020002802002d00004504402001" + "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" + "02082204452001280200220520046b20034f724504402001410036020820" + "0141003a000c410021040b20032005490440200128020420046a20022003" + "10371a200041043a00002001200320046a3602080f0b2000420437020020" + "0141003a000c0bac0301017f230041406a22022400024002400240024002" + "40024020002d000041016b0e03010203000b2002200028020436020441b1" + "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" + "0000200041086a41a495c0002900003700002000419c95c0002900003700" + "00200241143602102002200036020c200241143602082002410336022c20" + "02419c91c000360228200242023702342002200241046aad4280808080b0" + "01843703202002200241086aad4280808080c00184370318200220024118" + "6a360230200128021c2001280220200241286a101e210020022802082201" + "450d03200228020c2001100c0c030b20002d000121002002410136022c20" + "0241c88ac000360228200242013702342002200241186aad4280808080f0" + "008437030820022000410274220041f095c0006a28020036021c20022000" + "419897c0006a2802003602182002200241086a360230200128021c200128" + "0220200241286a101e21000c020b20012000280204220028020020002802" + "04101a21000c010b20002802042200280200200120002802042802101101" + "0021000b200241406b240020000f0b000b10002001200028020420002802" + "08101a0b5501037f2000280204210120002d0000220041044d2000410347" + "7145044020012802002100200141046a2802002202280200220304402000" + "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" + "c709010a7f230041206b2208240002400240024002402001280210450440" + "2001417f36021020032003200241036a417c7120026b220a6b4107714100" + "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" + "016b200220036a220541016b22062d0000410a460d001a2006200220096a" + "2207460d01200441026b200541026b22062d0000410a460d001a20062007" + "460d01200441036b200541036b22062d0000410a460d001a20062007460d" + "01200441046b200541046b22062d0000410a460d001a20062007460d0120" + "0441056b200541056b22062d0000410a460d001a20062007460d01200441" + "066b200541066b22062d0000410a460d001a20062007460d01200441076b" + "200541076b22052d0000410a460d001a20052007460d0120044178720b20" + "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" + "0241046b210d2004417f7320026a21060340024020062105200a21042009" + "2207200c4d0d00200441086b210a200541086b2106418082840820022007" + "41086b22096a280200220b418a94a8d000736b200b724180828408200720" + "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" + "8478460d010b0b20032007490d0202400340200320046a450d0120044101" + "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" + "016a21040c040b02402001411c6a2802002204450440410021040c010b20" + "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" + "00202001411c6a41003602000b2003200128021420046b4f044020002001" + "41146a2002200310280c050b200128021820046a2002200310371a200041" + "043a00002001411c6a200320046a3602000c040b230041306b2200240020" + "00410136020c200041c481c0003602082000420137021420002000412f6a" + "ad4280808080a001843703202000200041206a360210200041086a41d091" + "c0001017000b230041306b22002400200020033602042000200936020020" + "00410236020c200041d887c000360208200042023702142000200041046a" + "ad428080808080018437032820002000ad42808080808001843703202000" + "200041206a360210200041086a418485c0001017000b230041306b220024" + "0020002003360204200020073602002000410236020c200041f887c00036" + "0208200042023702142000200041046aad42808080808001843703282000" + "2000ad42808080808001843703202000200041206a360210200041086a41" + "9485c0001017000b20032004490440200841003602182008410136020c20" + "0841888bc00036020820084204370210200841086a41908bc0001017000b" + "02402001411c6a2802002205450d0002400240200128021420056b20044d" + "0440200841086a200141146a20022004102820082d00084104470d012001" + "411c6a28020021050c020b200141186a28020020056a2002200410371a20" + "01411c6a200420056a22053602000c010b200020082903083702000c020b" + "2005450d00200141003a00202001411c6a41003602000b200220046a2105" + "200320046b220220012802144f04402000200141146a2005200210280c01" + "0b200141186a2802002005200210371a200041043a00002001411c6a2002" + "3602000b2001200128021041016a360210200841206a24000b9a0102047f" + "017e230041106b22032400200341086a200028020828020020012002102c" + "20032d000822054104470440200028020421012003290308210720002d00" + "00220241044d20024103477145044020012802002102200141046a280200" + "220428020022060440200220061103000b20042802042204044020022004" + "100c0b2001410c100c0b200020073702000b200341106a24002005410447" + "0be10202057f017e230041106b2202240020024100360204027f20014180" + "014f044020014180104f04402001418080044f044020022001413f714180" + "01723a00072002200141127641f001723a000420022001410676413f7141" + "8001723a000620022001410c76413f71418001723a000541040c030b2002" + "2001413f71418001723a000620022001410c7641e001723a000420022001" + "410676413f71418001723a000541030c020b20022001413f71418001723a" + "00052002200141067641c001723a000441020c010b200220013a00044101" + "0b2101200241086a2000280208280200200241046a2001102c20022d0008" + "22054104470440200028020421012002290308210720002d000022034104" + "4d20034103477145044020012802002103200141046a2802002204280200" + "22060440200320061103000b20042802042204044020032004100c0b2001" + "410c100c0b200020073702000b200241106a240020054104470b0d002000" + "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" + "36020c2001419892c00036020841c89cc0002d0000410347044002402300" + "41206b22022400024002400240024041c89cc0002d000041026b0e020301" + "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" + "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" + "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" + "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" + "41206a24000c020b000b200241003602182002410136020c200241e895c0" + "0036020820024204370210200241086a41b094c0001017000b0b02400240" + "024041d89cc000290300220650044041e09cc00029030021050340200542" + "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" + "5122021b370300200721052002450d000b41d89cc00020063703000b0240" + "024041a09cc000290300200652044041ac9cc0002d000021034101210241" + "ac9cc00041013a0000200120033a00182003450d01200142003702342001" + "4281808080c00037022c200141c893c000360228230041106b2202240020" + "02418888c00036020c2002200141186a360208230041f0006b2200240020" + "00418c88c00036020c2000200241086a3602082000418c88c00036021420" + "002002410c6a3602102000410236021c200041cd81c00036021802402001" + "41286a22012802004504402000410336025c2000418082c0003602582000" + "42033702642000200041106aad4280808080e00084370348200020004108" + "6aad4280808080e000843703400c010b200041306a200141106a29020037" + "0300200041286a200141086a290200370300200020012902003703202000" + "410436025c200041b482c000360258200042043702642000200041106aad" + "4280808080e000843703502000200041086aad4280808080e00084370348" + "2000200041206aad42808080809001843703400b2000200041186aad4280" + "808080f000843703382000200041386a360260200041d8006a41fc93c000" + "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" + "0041306b220024002000412636020c200041c094c0003602082000410136" + "0214200041c88ac0003602102000420137021c2000200041086aad428080" + "8080f000843703282000200041286a360218200041106a418c95c0001017" + "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" + "36021041042102200141043a00182001200141106a360220200141186a41" + "9c88c0002000101e210320012d0018210002402003450440420021054117" + "2000764101710d01200128021c22002802002102200041046a2802002203" + "28020022040440200220041103000b20032802042203044020022003100c" + "0b2000410c100c410421020c010b20004104460d02200129031822074280" + "7e8321052007a721020b20012802102200200028020841016b2203360208" + "2003450440200041003a000c200042003703000b200241ff01714104470d" + "02200141406b24000f0b230041206b220024002000410036021820004101" + "36020c200041b08ac00036020820004204370210200041086a41b88ac000" + "1017000b200141003602382001410136022c2001419093c0003602282001" + "4204370230200141286a419893c0001017000b200120052002ad42ff0183" + "843703102001410236022c200141f891c000360228200142023702342001" + "200141106aad4280808080d001843703202001200141086aad4280808080" + "f000843703182001200141186a360230200141286a418892c0001017000b" + "0c00200020012902003703000bba0201047f411f21022000420037021020" + "0141ffffff074d04402001410620014108766722036b7641017120034101" + "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" + "20027422034184a0c0002802007145044020042000360200200020043602" + "182000200036020c200020003602084184a0c0004184a0c0002802002003" + "723602000f0b024002402001200428020022032802044178714604402003" + "21020c010b2001411920024101766b41002002411f471b74210503402003" + "2005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c" + "20022000360208200041003602182000200236020c200020013602080f0b" + "20042000360200200020033602182000200036020c200020003602080bf1" + "0201047f200028020c21020240024020014180024f044020002802182103" + "0240024020002002460440200041144110200028021422021b6a28020022" + "010d01410021020c020b20002802082201200236020c200220013602080c" + "010b200041146a200041106a20021b21040340200421052001220241146a" + "200241106a200228021422011b210420024114411020011b6a2802002201" + "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" + "006a220128020047044020034110411420032802102000461b6a20023602" + "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" + "280200417e200028021c77713602000c020b200028020822002002470440" + "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" + "7e200141037677713602000f0b2002200336021820002802102201044020" + "022001360210200120023602180b20002802142200450d00200220003602" + "14200020023602180b0b8f0101027f230041306b22012400024020004100" + "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" + "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" + "14200141d89ac0003602102001420137021c2001411036022c2001200141" + "286a36021820012001410c6a360228200141106a1030200128020c200141" + "306a24000bcf0101067f23004180016b2204240020012802042107200128" + "020021062000280200210020012802142205210202402005410471450d00" + "2005410872210220060d0020014281808080a0013702000b200120024104" + "7236021441810121020340200220046a41026b2000410f71220341307220" + "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" + "762100450d000b20014101419183c0004102200220046a41016b41810120" + "026b10092001200536021420012007360204200120063602002004418001" + "6a24000b6301017f230041306b220224002002200036020c200241023602" + "14200241f49ac0003602102002420137021c2002411036022c2002200241" + "286a36021820022002410c6a360228200241106a10302001044020022802" + "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" + "21030c010b02402000410020006b41037122066a220520004d0d00200021" + "032001210420060440200621070340200320042d00003a0000200441016a" + "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" + "0340200320042d00003a0000200341016a200441016a2d00003a00002003" + "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" + "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" + "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" + "003a0000200441086a2104200341086a22032005470d000b0b2005200220" + "066b2207417c7122086a21030240200120066a2204410371450440200320" + "054d0d0120042101034020052001280200360200200141046a2101200541" + "046a22052003490d000b0c010b200320054d0d0020044103742202411871" + "21062004417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220067620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20074103712102200420086a21010b" + "02402003200220036a22064f0d002002410771220404400340200320012d" + "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" + "200241016b4107490d000340200320012d00003a0000200341016a200141" + "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" + "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" + "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" + "41076a200141076a2d00003a0000200141086a2101200341086a22032006" + "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" + "420022022001422088420a7e7c22014220867c2204370300200020032004" + "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" + "c0000ba40611000000140000000400000012000000000000000100000001" + "00000013000000557466384572726f7276616c69645f75705f746f657272" + "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" + "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" + "003d0000005c0010000a0000001600000037000000636170616369747920" + "6f766572666c6f770000008800100011000000426f72726f774d75744572" + "726f72616c726561647920626f72726f7765643a20b2001000120000005b" + "3d3d617373657274696f6e20606c6566742020726967687460206661696c" + "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" + "00100017000000f60010000900000020726967687460206661696c65643a" + "200a20206c6566743a20000000cf00100010000000180110001000000028" + "01100009000000f6001000090000000100000000000000f3081000020000" + "00000000000c000000040000001400000015000000160000002020202020" + "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230" + "323132323233323432353236323732383239333033313332333333343335" + "333633373338333934303431343234333434343534363437343834393530" + "353135323533353435353536353735383539363036313632363336343635" + "363636373638363937303731373237333734373537363737373837393830" + "383138323833383438353836383738383839393039313932393339343935" + "393639373938393966616c7365747275656c6962726172792f636f72652f" + "7372632f736c6963652f6d656d6368722e72736402100020000000850000" + "001e0000006402100020000000a100000009000000010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010100" + "41e686c0000b330202020202020202020202020202020202020202020202" + "020202020202020303030303030303030303030303030304040404040041" + "a487c0000b6172616e676520737461727420696e64657820206f7574206f" + "662072616e676520666f7220736c696365206f66206c656e67746820a403" + "100012000000b60310002200000072616e676520656e6420696e64657820" + "e803100010000000b60310002200419088c0000b8f140400000004000000" + "17000000180000000c00000004000000190000001a0000001b0000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" + "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" + "61746520756e69717565207468726561642049443a206269747370616365" + "20657868617573746564f904100037000000dc0410001d000000ae040000" + "0d00000001000000000000006c6962726172792f7374642f7372632f696f" + "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e00007d05100009000000500510002d000000160100002900" + "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" + "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" + "696f6e207265736574686f737420756e726561636861626c656e6574776f" + "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" + "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" + "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c7265616479206578" + "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" + "206469726563746f727969732061206469726563746f7279646972656374" + "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c657379737465" + "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" + "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" + "2066696c652068616e646c65696e76616c696420696e7075742070617261" + "6d65746572696e76616c6964206461746174696d6564206f757477726974" + "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" + "756e7365656b61626c652066696c6571756f746120657863656564656466" + "696c6520746f6f206c617267657265736f75726365206275737965786563" + "757461626c652066696c652062757379646561646c6f636b63726f73732d" + "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" + "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" + "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" + "70746564756e737570706f72746564756e657870656374656420656e6420" + "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" + "736f74686572206572726f72756e63617465676f72697a6564206572726f" + "7220286f73206572726f72202900000001000000000000008d0810000b00" + "000098081000010000006c6962726172792f7374642f7372632f696f2f73" + "7464696f2e727300b40810001b00000032030000140000006661696c6564" + "207072696e74696e6720746f203a20000000e008100013000000f3081000" + "02000000b40810001b00000063040000090000007374646f75746c696272" + "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" + "696e6720747261697420696d706c656d656e746174696f6e207265747572" + "6e656420616e206572726f72207768656e2074686520756e6465726c7969" + "6e672073747265616d20646964206e6f7400000037091000560000001e09" + "100019000000680700001500000063616e6e6f7420726563757273697665" + "6c792061637175697265206d75746578a8091000200000006c6962726172" + "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" + "72656164732e7273d00910002c00000013000000090000006c6962726172" + "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" + "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" + "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" + "7273660a100026000000220100002d0000006f7065726174696f6e207375" + "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" + "6e206d6179206e6f7420626520706572666f726d65642072656375727369" + "76656c79b00a100038000000100000001100000012000000100000001000" + "000013000000120000000d0000000e000000150000000c0000000b000000" + "15000000150000000f0000000e0000001300000026000000380000001900" + "0000170000000c000000090000000a00000010000000170000000e000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600" + "0000150000000b000000160000000d0000000b0000000b00000013000000" + "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" + "1000250610003306100048061000540610005f0610007406100089061000" + "98061000a6061000b9061000df0610001707100030071000470710005307" + "10005c07100066071000760710008d0710009b071000a9071000b6071000" + "ca071000d2071000ed071000fb0710000b08100021081000360810004108" + "100057081000640810006f0810007a081000000000000100000001000000" + "1300000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" + "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" + "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" + "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" + "6963652e72737b0c10006d000000a1000000190000005061727365496e74" + "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" + "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" + "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" + "100009000000550d1000010000006465616c6c6f636174652000680d1000" + "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" + "46696e6973684166746572000000090d1000320000008000000016000000" + "42616c616e636500090d1000320000009b00000016000000456d70747949" + "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" + "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" + "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" + "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; + +std::string const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 1d377676c6..e7bada74a5 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -17,1553 +17,14 @@ */ //============================================================================== +#pragma once + // TODO: consider moving these to separate files (and figure out the build) -static auto const ledgerSqnHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" - "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" - "010700100041044a0b004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d31" - "2e38352e31202834656231363132353020323032352d30332d3135290049" - "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" - "732b0a6d756c746976616c7565"; +#include -static auto const allHostFunctionsHex = - "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" - "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" - "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" - "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" - "686f73745f6c69621a67657443757272656e744c6564676572456e747279" - "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" - "794669656c64000408686f73745f6c696213676574506172656e744c6564" - "67657254696d65000503363501010101090a000302010101010506020207" - "020201040001010100010400010101020701080101030800010103020202" - "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" - "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" - "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" - "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" - "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" - "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" - "0000450440200128021c41d480c0004104200128022028020c1100002100" - "0c010b41012100200128021c220341d880c0004104200128022022062802" - "0c22051100000d00200441016a2104024020012d00144104714504402003" - "418d83c000410120051100000d022004200110050d02200128021c210320" - "0128022028020c21050c010b2003418e83c000410220051100000d012002" - "41013a0017200241206a200141086a290200370300200241286a20014110" - "6a290200370300200241306a200141186a2802003602002002200636020c" - "20022003360208200241e482c00036023820022001290200370318200220" - "0241176a3602102002200241086a3602342004200241186a10050d012002" - "280234418883c0004102200228023828020c1100000d010b2003419891c0" - "004101200511000021000b200241406b240020000bff0201037f23004180" - "016b22032400027f0240200128021422024110714504402002412071450d" - "0120002d0000210241810121000340200020036a41026b2002410f712204" - "413072200441376a2004410a491b3a000020022204410476210220004101" - "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" - "41810120006b10090c020b20002d0000210241810121000340200020036a" - "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" - "22044104762102200041016b21002004410f4b0d000b20014101419183c0" - "004102200020036a41016b41810120006b10090c010b0240024002402000" - "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" - "0171410174419383c0006a2f00003b0001410021000c010b410221002002" - "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" - "410174419383c0006a2f00003b00010b2001410141014100200020036a20" - "0041037310090b20034180016a24000b4701017f230041106b2202240020" - "022000280200220041046a36020c200141a080c000410941a980c000410b" - "2000410141b480c00041092002410c6a41021008200241106a24000bff01" - "01037f23004180016b22042400027f024020012802142202411071450440" - "20024120710d01200028020041012001100a0c020b200028020021004181" - "0121020340200220046a41026b2000410f712203413072200341d7006a20" - "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" - "20014101419183c0004102200220046a41016b41810120026b10090c010b" - "2000280200210041810121020340200220046a41026b2000410f71220341" - "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" - "41047621000d000b20014101419183c0004102200220046a41016b418101" - "20026b10090b20044180016a24000bc50101017f230041106b220b240020" - "0028021c20012002200028022028020c1100002101200b41003a000d200b" - "20013a000c200b2000360208200b41086a20032004200520061020200720" - "082009200a10202101200b2d000d2202200b2d000c220372210002402003" - "4101712002410147720d00200128020022002d0014410471450440200028" - "021c418b83c0004102200028022028020c11000021000c010b200028021c" - "418a83c0004101200028022028020c11000021000b200b41106a24002000" - "4101710bef0401077f027f200145044020002802142106412d2109200541" - "016a0c010b412b418080c4002000280214220641017122011b2109200120" - "056a0b210702402006410471450440410021020c010b024020034504400c" - "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" - "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" - "280200450440200028021c22012000280220220020092002200310190440" - "41010f0b200120042005200028020c1100000f0b02400240024020072000" - "28020422084f0440200028021c2201200028022022002009200220031019" - "450d0141010f0b2006410871450d012000280210210b2000413036021020" - "002d0018210c41012101200041013a0018200028021c2206200028022022" - "0a20092002200310190d02200820076b41016a210102400340200141016b" - "2201450d0120064130200a280210110100450d000b41010f0b2006200420" - "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" - "000f0b200120042005200028020c11000021010c010b200820076b210602" - "4002400240410120002d0018220120014103461b220141016b0e02000102" - "0b20062101410021060c010b20064101762101200641016a41017621060b" - "200141016a21012000280210210820002802202107200028021c21000240" - "0340200141016b2201450d01200020082007280210110100450d000b4101" - "0f0b410121012000200720092002200310190d0020002004200520072802" - "0c1100000d004100210103402001200646044041000f0b200141016a2101" - "200020082007280210110100450d000b200141016b2006490f0b20010bbd" - "0201067f230041106b22042400410a2103024020004190ce004904402000" - "21050c010b0340200441066a20036a220641046b20004190ce006e220541" - "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" - "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" - "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" - "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" - "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" - "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" - "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" - "2203200441066a6a20004130723a00000b2002200141014100200441066a" - "20036a410a20036b1009200441106a24000b1701017f2000280200220104" - "4020002802042001100c0b0bce0601047f0240200041046b280200220422" - "02417871220341044108200241037122021b20016a4f0440200241002003" - "200141276a4b1b0d01200041086b22012004220341787122006a21020240" - "024020034101710d002003410271450d012001280200220320006a210020" - "0120036b22014190a0c00028020046044020022802044103714103470d01" - "4188a0c000200036020020022002280204417e7136020420012000410172" - "360204200220003602000c020b2001200310330b02400240024002400240" - "2002280204220341027145044020024194a0c000280200460d0220024190" - "a0c000280200460d0320022003417871220210332001200020026a220041" - "0172360204200020016a200036020020014190a0c000280200470d014188" - "a0c00020003602000c060b20022003417e71360204200120004101723602" - "04200020016a20003602000b2000418002490d0220012000103241002101" - "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" - "280200220004400340200141016a2101200028020822000d000b0b41a8a0" - "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" - "418ca0c000418ca0c00028020020006a2200360200200120004101723602" - "044190a0c00028020020014604404188a0c00041003602004190a0c00041" - "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" - "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" - "402002200128020022054f04402002200520012802046a490d040b200128" - "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" - "020020006a220036020020012000410172360204200020016a2000360200" - "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" - "012000410376742200714504404180a0c000200020037236020020020c01" - "0b20022802080b2100200220013602082000200136020c2001200236020c" - "200120003602080c010b41f09dc000280200220104400340200041016a21" - "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" - "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" - "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" - "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" - "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" - "087f230041406a2202240020002802082105200028020421034101210620" - "0128021c41cc81c0004101200128022028020c1100002100200504400340" - "20072108410121072000410171210441012100024020040d00024020012d" - "00144104714504402008410171450d01200128021c418383c00041022001" - "28022028020c110000450d010c020b20012802202104200128021c210920" - "08410171450440200941d59ac0004101200428020c1100000d020b200241" - "013a0017200241206a200141086a290200370300200241286a200141106a" - "290200370300200241306a200141186a2802003602002002200436020c20" - "022009360208200241e482c0003602382002200129020037031820022002" - "41176a3602102002200241086a3602342003200241186a10054504402002" - "280234418883c0004102200228023828020c11000021000c020b0c010b20" - "032001100521000b200341016a2103200541016b22050d000b0b20004504" - "40200128021c419083c0004101200128022028020c11000021060b200241" - "406b240020060bdb0101047f230041106b220224002002200036020c2300" - "41106b22002400200128021c41f899c000410d200128022028020c110000" - "2103200041003a000d200020033a000c20002001360208200041086a4185" - "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" - "722101024020054101712004410147720d00200328020022012d00144104" - "71450440200128021c418b83c0004102200128022028020c11000021010c" - "010b200128021c418a83c0004101200128022028020c11000021010b2000" - "41106a24002001410171200241106a24000b3300200128021c2000280200" - "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" - "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" - "c0002d00001a024002400240024002404107101222000440200041036a41" - "879bc000280000360000200041849bc000280000360000200341286a2000" - "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" - "200041036a41879bc000280000360000200041849bc00028000036000020" - "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" - "122200450d05200041076a41929bc0002800003600002000418b9bc00029" - "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" - "00001a200328024821012003280244210b410710122204450d0541002100" - "200441036a41b79bc000280000360000200441b49bc00028000036000020" - "0341d8006a41e100200b20012004410710021013200328025c2105024002" - "400240200328026022020e020700010b41012100200522012d0000412b6b" - "0e03060106010b20052d0000412b460440200241016b2100200541016a21" - "0120024112490d010c030b200521012002220041114f0d020b034020012d" - "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" - "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" - "186a2010103820012d000041306b220941094b0d02410221002003290320" - "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" - "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" - "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" - "8b06360000200341cc006a200041041001101320004104100c027f024020" - "03280254220541004e047f2003280250210c20054504404101210141000c" - "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" - "1014000b20050b21092001200c2005103721002005450d01200541076b22" - "014100200120054d1b2106200041036a417c7120006b2108410021010340" - "024002400240200020016a2d00002202c0220741004e0440200820016b41" - "03710d01200120064f0d020340200020016a220228020420022802007241" - "8081828478710d03200141086a22012006490d000b0c020b428080808080" - "20210e428080808010210f024002400240027e0240024002400240024002" - "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" - "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" - "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" - "220420054f0d06200020046a2c0000210402400240200241e00147044020" - "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" - "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" - "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" - "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" - "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" - "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" - "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" - "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" - "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" - "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" - "00210f0b2001ad200e200f8484210e200941808080807846044020002109" - "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" - "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" - "010b200120054f0d000340200020016a2c00004100480d01200520014101" - "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" - "0021050b410021000240024002400240024002400240200ea722020e0206" - "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" - "2b460440200241016b2100200541016a210120024112490d010c020b2005" - "21012002220041114f0d010b4200210e034020012d000041306b22024109" - "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" - "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" - "2d000041306b220441094b0d024102210020032903104200520d03200141" - "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" - "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" - "024002400240410b101222080440200841076a419d9bc000280000360000" - "200841969bc000290000370000200341d8006a2008410b10011013200328" - "025c2104024002400240200328026022020e020a00010b4101210720042d" - "00002201412b6b0e03090109010b20042d000021010b0240024002400240" - "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" - "20024109490d02200121020c080b200241016b2106200441016a21002002" - "4109490d044100210103402006450d0b20002d000041306b220241094b0d" - "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" - "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" - "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" - "0c0b4100210141012107034020002d000041306b220641094b0d06200041" - "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" - "010b410021010c040b4100210141012107034020002d000041306b220241" - "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" - "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" - "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" - "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" - "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" - "c0001015000b20032802582200044020042000100c0b2008410b100c4100" - "210020032802302202200328023c460440200328022c2104200328023821" - "0741002106024020022200450d00034020042d0000220220072d00002208" - "460440200441016a2104200741016a2107200041016b22000d010c020b0b" - "200220086b21060b20064521000b2009044020052009100c0b200328024c" - "22020440200c2002100c0b200328024022020440200b2002100c0b200328" - "02342202044020032802382002100c0b200328022822020440200328022c" - "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" - "0121000b200320003a0058200341d8006a419080c00041f880c000101500" - "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" - "15000b410141e899c0001014000bee2202087f017e024002400240024002" - "40024002400240200041f4014d04404180a0c00028020022024110200041" - "0b6a41f803712000410b491b220541037622007622014103710d01200541" - "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" - "00410b6a220141787121054184a0c0002802002208450d06411f21074100" - "20056b2103200041f4ffff074d04402005410620014108766722006b7641" - "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" - "45044041002100410021010c040b410021002005411920074101766b4100" - "2007411f471b742104410021010340024020022802044178712206200549" - "0d00200620056b220620034f0d0020022101200622030d00410021032001" - "21000c060b200228021422062000200620022004411d764104716a41106a" - "2802002202471b200020061b21002004410174210420020d000b0c030b02" - "402001417f7341017120006a2206410374220041f89dc0006a2203200041" - "809ec0006a280200220128020822044704402004200336020c2003200436" - "02080c010b4180a0c0002002417e200677713602000b2001200041037236" - "0204200020016a220020002802044101723602040c060b02404102200074" - "2203410020036b72200120007471682206410374220041f89dc0006a2203" - "200041809ec0006a280200220128020822044704402004200336020c2003" - "20043602080c010b4180a0c0002002417e200677713602000b2001200541" - "0372360204200120056a2206200020056b2204410172360204200020016a" - "20043602004188a0c00028020022020440200241787141f89dc0006a2100" - "4190a0c0002802002103027f4180a0c00028020022054101200241037674" - "2202714504404180a0c000200220057236020020000c010b20002802080b" - "2102200020033602082002200336020c2003200036020c20032002360208" - "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" - "41e89cc0006a280200220128020441787120056b21032001210202400340" - "02400240200128021022000d00200128021422000d002002280218210702" - "4002402002200228020c2200460440200241144110200228021422001b6a" - "28020022010d01410021000c020b20022802082201200036020c20002001" - "3602080c010b200241146a200241106a20001b2104034020042106200122" - "0041146a200041106a200028021422011b210420004114411020011b6a28" - "020022010d000b200641003602000b2007450d032002200228021c410274" - "41e89cc0006a220128020047044020074110411420072802102002461b6a" - "20003602002000450d040c020b2001200036020020000d014184a0c00041" - "84a0c000280200417e200228021c77713602000c030b2000280204417871" - "20056b22012003200120034922011b21032000200220011b210220002101" - "0c010b0b2000200736021820022802102201044020002001360210200120" - "003602180b20022802142201450d0020002001360214200120003602180b" - "02400240200341104f044020022005410372360204200220056a22062003" - "410172360204200320066a20033602004188a0c0002802002204450d0120" - "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" - "0200220541012004410376742204714504404180a0c00020042005723602" - "0020000c010b20002802080b2104200020013602082004200136020c2001" - "200036020c200120043602080c010b2002200320056a2200410372360204" - "200020026a220020002802044101723602040c010b4190a0c00020063602" - "004188a0c00020033602000b200241086a0f0b2000200172450440410021" - "0141022007742200410020006b722008712200450d0320006841027441e8" - "9cc0006a28020021000b2000450d010b0340200020012000280204417871" - "220420056b220620034922071b2108200028021022024504402000280214" - "21020b20012008200420054922001b210120032006200320071b20001b21" - "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" - "0020056b4f710d0020012802182107024002402001200128020c22004604" - "40200141144110200128021422001b6a28020022020d01410021000c020b" - "20012802082202200036020c200020023602080c010b200141146a200141" - "106a20001b21040340200421062002220041146a200041106a2000280214" - "22021b210420004114411020021b6a28020022020d000b20064100360200" - "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" - "0047044020074110411420072802102001461b6a20003602002000450d02" - "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" - "0128021c77713602000c010b200020073602182001280210220204402000" - "2002360210200220003602180b20012802142202450d0020002002360214" - "200220003602180b0240200341104f044020012005410372360204200120" - "056a22022003410172360204200220036a200336020020034180024f0440" - "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" - "280200220441012003410376742203714504404180a0c000200320047236" - "020020000c010b20002802080b2103200020023602082003200236020c20" - "02200036020c200220033602080c010b2001200320056a22004103723602" - "04200020016a220020002802044101723602040b0c010b02400240024002" - "400240024020054188a0c00028020022014b04402005418ca0c000280200" - "22004f044041002100200541af80046a220141107640002202417f462203" - "0d0720024110742202450d074198a0c000410020014180807c7120031b22" - "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" - "200020002001491b360200024002404194a0c0002802002203044041e89d" - "c0002100034020002802002201200028020422066a2002460d0220002802" - "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" - "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" - "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" - "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" - "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" - "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" - "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" - "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" - "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" - "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" - "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" - "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" - "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" - "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" - "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" - "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" - "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" - "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" - "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" - "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" - "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" - "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" - "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" - "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" - "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" - "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" - "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" - "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" - "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" - "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" - "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" - "0441286b220036020020022000410172360204200020026a412836020441" - "a0a0c00041808080013602000c080b200220034d200120034b720d002000" - "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" - "360200200220046a210141e89dc000210002400240034020012000280200" - "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" - "c0002100034002402003200028020022014f04402003200120002802046a" - "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" - "c000200441286b220036020020022000410172360204200020026a412836" - "020441a0a0c00041808080013602002003200641206b41787141086b2200" - "2000200341106a491b2201411b36020441e89dc000290200210920014110" - "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" - "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" - "02002001411c6a2100034020004107360200200041046a22002006490d00" - "0b20012003460d0720012001280204417e713602042003200120036b2200" - "4101723602042001200036020020004180024f04402003200010320c080b" - "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" - "410376742200714504404180a0c000200020027236020020010c010b2001" - "2802080b2100200120033602082000200336020c2003200136020c200320" - "003602080c070b200020023602002000200028020420046a360204200220" - "054103723602042006410f6a41787141086b2201200220056a22046b2103" - "20014194a0c000280200460d0320014190a0c000280200460d0420012802" - "04220541037141014604402001200541787122001033200020016a220128" - "02042105200020036a21030b20012005417e713602042004200341017236" - "0204200320046a200336020020034180024f04402004200310320c060b20" - "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" - "0376742203714504404180a0c000200120037236020020000c010b200028" - "02080b2103200020043602082003200436020c2004200036020c20042003" - "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" - "00280200220020056a220236020020022001410172360204200020054103" - "72360204200041086a21000c060b4190a0c0002802002100024020012005" - "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" - "2001410372360204200020016a220120012802044101723602040c010b41" - "88a0c00020023602004190a0c000200020056a2203360200200320024101" - "72360204200020016a2002360200200020054103723602040b200041086a" - "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" - "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" - "03200020016b6a41086a220136020020022001410172360204200020036a" - "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" - "00418ca0c000418ca0c00028020020036a22003602002004200041017236" - "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" - "6a220036020020042000410172360204200020046a20003602000b200241" - "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" - "20056b22013602004194a0c0004194a0c000280200220020056a22023602" - "002002200141017236020420002005410372360204200041086a0f0b2000" - "0f0b200141086a0b2701017f200020012800042202360208200020012800" - "003602042000200236020020014108100c0b3b002000450440230041206b" - "22002400200041003602182000410136020c2000419c81c0003602082000" - "4204370210200041086a20011017000b000b7e01017f230041406a220324" - "002003412b36020c200341d098c000360208200320013602142003200036" - "02102003410236021c200341d482c0003602182003420237022420032003" - "41106aad4280808080e000843703382003200341086aad4280808080f000" - "843703302003200341306a360220200341186a20021017000b4101017f23" - "0041206b2202240020024100360210200241013602042002420437020820" - "02412e36021c200220003602182002200241186a36020020022001101700" - "0bf40102027f017e230041106b22022400200241013b010c200220013602" - "0820022000360204230041106b22012400200241046a2200290200210420" - "01200036020c20012004370204230041106b22002400200141046a220128" - "0200220228020c2103024002400240024020022802040e020001020b2003" - "0d0141012102410021030c020b20030d0020022802002202280204210320" - "0228020021020c010b20004180808080783602002000200136020c200128" - "020822012d0008210220012d00091a2000410e20021026000b2000200336" - "020420002002360200200128020822012d0008210220012d00091a200041" - "0f20021026000b0d00200028020041012001100a0b380002402002418080" - "c400460d00200020022001280210110100450d0041010f0b200345044041" - "000f0b200020032004200128020c1100000b900a010a7f02400240024020" - "0028020022052000280208220372044002402003410171450d0020012002" - "6a21060240200028020c2209450440200121040c010b2001210403402004" - "22032006460d02027f200341016a20032c0000220441004e0d001a200341" - "026a20044160490d001a200341036a20044170490d001a200341046a0b22" - "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" - "20042c00001a20072002027f02402007450d00200220074d044020022007" - "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" - "031b21022003200120031b21010b2005450d032000280204210b20024110" - "4f044020022001200141036a417c7122076b22086a220a41037121094100" - "210541002103200120074704402008417c4d044041002106034020032001" - "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" - "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" - "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" - "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" - "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" - "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" - "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" - "09410371210a2009410274210741002104200641044f04402008200741f0" - "07716a210c200821030340200420032802002204417f7341077620044106" - "76724181828408716a20032802042204417f734107762004410676724181" - "828408716a20032802082204417f73410776200441067672418182840871" - "6a200328020c2204417f734107762004410676724181828408716a210420" - "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" - "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" - "200a450d000b2008200941fc01714102746a22042802002203417f734107" - "762003410676724181828408712103200a4101460d022003200428020422" - "03417f734107762003410676724181828408716a2103200a4102460d0220" - "0320042802082203417f734107762003410676724181828408716a21030c" - "020b2002450440410021050c030b20024103712104024020024104490440" - "41002105410021080c010b41002105200121032002410c71220821070340" - "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" - "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" - "200741046b22070d000b0b2004450d02200120086a21030340200520032c" - "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" - "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" - "056a21050b02402005200b490440200b20056b210602400240024020002d" - "00182203410020034103471b220341016b0e020001020b20062103410021" - "060c010b20064101762103200641016a41017621060b200341016a210320" - "00280210210820002802202104200028021c21000340200341016b220345" - "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" - "02200428020c110000044041010f0b410021030340200320064604404100" - "0f0b200341016a2103200020082004280210110100450d000b200341016b" - "2006490f0b200028021c20012002200028022028020c1100000b14002000" - "2802002001200028020428020c1101000b10002001200028020020002802" - "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" - "6b220324002003200136022c20032000360228200341033a002420034220" - "37021c200341003602142003410036020c027f0240024002402002280210" - "220a450440200228020c2200450d012002280208220120004103746a2104" - "200041016b41ffffffff017141016a210720022802002100034020004104" - "6a28020022050440200328022820002802002005200328022c28020c1100" - "000d040b20012802002003410c6a200141046a2802001101000d03200041" - "086a2100200141086a22012004470d000b0c010b20022802142200450d00" - "2000410574210b200041016b41ffffff3f7141016a210720022802082105" - "200228020021000340200041046a28020022010440200328022820002802" - "002001200328022c28020c1100000d030b20032008200a6a220141106a28" - "020036021c20032001411c6a2d00003a00242003200141186a2802003602" - "202001410c6a28020021044100210941002106024002400240200141086a" - "28020041016b0e020002010b200441037420056a220c2802000d01200c28" - "020421040b410121060b200320043602102003200636020c200141046a28" - "02002104024002400240200128020041016b0e020002010b200441037420" - "056a22062802000d01200628020421040b410121090b2003200436021820" - "0320093602142005200141146a2802004103746a22012802002003410c6a" - "200141046a2802001101000d02200041086a2100200b200841206a220847" - "0d000b0b200720022802044f0d012003280228200228020020074103746a" - "22002802002000280204200328022c28020c110000450d010b41010c010b" - "41000b200341306a24000b1900200128021c41a481c000410e2001280220" - "28020c1100000b820302047f017e230041406a2206240041012107024020" - "002d00040d0020002d00052108200028020022052d001441047145044020" - "0528021c418383c000418083c000200841017122081b4102410320081b20" - "0528022028020c1100000d01200528021c20012002200528022028020c11" - "00000d01200528021c41f391c0004102200528022028020c1100000d0120" - "032005200411010021070c010b2008410171450440200528021c418583c0" - "004103200528022028020c1100000d010b200641013a0017200641206a20" - "0541086a290200370300200641286a200541106a29020037030020064130" - "6a200541186a2802003602002006200529021c3702082005290200210920" - "0641e482c000360238200620093703182006200641176a36021020062006" - "41086a220536023420052001200210210d00200541f391c000410210210d" - "002003200641186a20041101000d002006280234418883c0004102200628" - "023828020c11000021070b200041013a0005200020073a0004200641406b" - "240020000bab04010c7f200141016b210e2000280204210a200028020021" - "0b2000280208210c0240034020050d01027f024020022003490d00034020" - "0120036a2105024002400240200220036b220741074d044020022003470d" - "01200221030c050b0240200541036a417c71220620056b22040440410021" - "000340200020056a2d0000410a460d052004200041016a2200470d000b20" - "04200741086b22004d0d010c030b200741086b21000b0340418082840820" - "062802002209418a94a8d000736b2009724180828408200641046a280200" - "2209418a94a8d000736b2009727141808182847871418081828478470d02" - "200641086a2106200441086a220420004d0d000b0c010b41002100034020" - "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" - "030b20042007460440200221030c030b200420056a2106200220046b2003" - "6b21074100210002400340200020066a2d0000410a460d01200720004101" - "6a2200470d000b200221030c030b200020046a21000b200020036a220441" - "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" - "200322040c030b200220034f0d000b0b20022008460d0241012105200821" - "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" - "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" - "200020086b2100200120086a2107200c20063a000020042108200b200720" - "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" - "042102200028020021030240200028020822002d0000450d00200341fc82" - "c0004104200228020c110000450d0041010f0b20002001410a463a000020" - "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" - "200028020022002000411f7522027320026b2000417f73411f762001100a" - "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" - "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" - "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" - "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" - "0041003a00002002450d00000b000b250020002802002d00004504402001" - "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" - "02082204452001280200220520046b20034f724504402001410036020820" - "0141003a000c410021040b20032005490440200128020420046a20022003" - "10371a200041043a00002001200320046a3602080f0b2000420437020020" - "0141003a000c0bac0301017f230041406a22022400024002400240024002" - "40024020002d000041016b0e03010203000b2002200028020436020441b1" - "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" - "0000200041086a41a495c0002900003700002000419c95c0002900003700" - "00200241143602102002200036020c200241143602082002410336022c20" - "02419c91c000360228200242023702342002200241046aad4280808080b0" - "01843703202002200241086aad4280808080c00184370318200220024118" - "6a360230200128021c2001280220200241286a101e210020022802082201" - "450d03200228020c2001100c0c030b20002d000121002002410136022c20" - "0241c88ac000360228200242013702342002200241186aad4280808080f0" - "008437030820022000410274220041f095c0006a28020036021c20022000" - "419897c0006a2802003602182002200241086a360230200128021c200128" - "0220200241286a101e21000c020b20012000280204220028020020002802" - "04101a21000c010b20002802042200280200200120002802042802101101" - "0021000b200241406b240020000f0b000b10002001200028020420002802" - "08101a0b5501037f2000280204210120002d0000220041044d2000410347" - "7145044020012802002100200141046a2802002202280200220304402000" - "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" - "c709010a7f230041206b2208240002400240024002402001280210450440" - "2001417f36021020032003200241036a417c7120026b220a6b4107714100" - "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" - "016b200220036a220541016b22062d0000410a460d001a2006200220096a" - "2207460d01200441026b200541026b22062d0000410a460d001a20062007" - "460d01200441036b200541036b22062d0000410a460d001a20062007460d" - "01200441046b200541046b22062d0000410a460d001a20062007460d0120" - "0441056b200541056b22062d0000410a460d001a20062007460d01200441" - "066b200541066b22062d0000410a460d001a20062007460d01200441076b" - "200541076b22052d0000410a460d001a20052007460d0120044178720b20" - "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" - "0241046b210d2004417f7320026a21060340024020062105200a21042009" - "2207200c4d0d00200441086b210a200541086b2106418082840820022007" - "41086b22096a280200220b418a94a8d000736b200b724180828408200720" - "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" - "8478460d010b0b20032007490d0202400340200320046a450d0120044101" - "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" - "016a21040c040b02402001411c6a2802002204450440410021040c010b20" - "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" - "00202001411c6a41003602000b2003200128021420046b4f044020002001" - "41146a2002200310280c050b200128021820046a2002200310371a200041" - "043a00002001411c6a200320046a3602000c040b230041306b2200240020" - "00410136020c200041c481c0003602082000420137021420002000412f6a" - "ad4280808080a001843703202000200041206a360210200041086a41d091" - "c0001017000b230041306b22002400200020033602042000200936020020" - "00410236020c200041d887c000360208200042023702142000200041046a" - "ad428080808080018437032820002000ad42808080808001843703202000" - "200041206a360210200041086a418485c0001017000b230041306b220024" - "0020002003360204200020073602002000410236020c200041f887c00036" - "0208200042023702142000200041046aad42808080808001843703282000" - "2000ad42808080808001843703202000200041206a360210200041086a41" - "9485c0001017000b20032004490440200841003602182008410136020c20" - "0841888bc00036020820084204370210200841086a41908bc0001017000b" - "02402001411c6a2802002205450d0002400240200128021420056b20044d" - "0440200841086a200141146a20022004102820082d00084104470d012001" - "411c6a28020021050c020b200141186a28020020056a2002200410371a20" - "01411c6a200420056a22053602000c010b200020082903083702000c020b" - "2005450d00200141003a00202001411c6a41003602000b200220046a2105" - "200320046b220220012802144f04402000200141146a2005200210280c01" - "0b200141186a2802002005200210371a200041043a00002001411c6a2002" - "3602000b2001200128021041016a360210200841206a24000b9a0102047f" - "017e230041106b22032400200341086a200028020828020020012002102c" - "20032d000822054104470440200028020421012003290308210720002d00" - "00220241044d20024103477145044020012802002102200141046a280200" - "220428020022060440200220061103000b20042802042204044020022004" - "100c0b2001410c100c0b200020073702000b200341106a24002005410447" - "0be10202057f017e230041106b2202240020024100360204027f20014180" - "014f044020014180104f04402001418080044f044020022001413f714180" - "01723a00072002200141127641f001723a000420022001410676413f7141" - "8001723a000620022001410c76413f71418001723a000541040c030b2002" - "2001413f71418001723a000620022001410c7641e001723a000420022001" - "410676413f71418001723a000541030c020b20022001413f71418001723a" - "00052002200141067641c001723a000441020c010b200220013a00044101" - "0b2101200241086a2000280208280200200241046a2001102c20022d0008" - "22054104470440200028020421012002290308210720002d000022034104" - "4d20034103477145044020012802002103200141046a2802002204280200" - "22060440200320061103000b20042802042204044020032004100c0b2001" - "410c100c0b200020073702000b200241106a240020054104470b0d002000" - "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" - "36020c2001419892c00036020841c89cc0002d0000410347044002402300" - "41206b22022400024002400240024041c89cc0002d000041026b0e020301" - "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" - "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" - "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" - "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" - "41206a24000c020b000b200241003602182002410136020c200241e895c0" - "0036020820024204370210200241086a41b094c0001017000b0b02400240" - "024041d89cc000290300220650044041e09cc00029030021050340200542" - "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" - "5122021b370300200721052002450d000b41d89cc00020063703000b0240" - "024041a09cc000290300200652044041ac9cc0002d000021034101210241" - "ac9cc00041013a0000200120033a00182003450d01200142003702342001" - "4281808080c00037022c200141c893c000360228230041106b2202240020" - "02418888c00036020c2002200141186a360208230041f0006b2200240020" - "00418c88c00036020c2000200241086a3602082000418c88c00036021420" - "002002410c6a3602102000410236021c200041cd81c00036021802402001" - "41286a22012802004504402000410336025c2000418082c0003602582000" - "42033702642000200041106aad4280808080e00084370348200020004108" - "6aad4280808080e000843703400c010b200041306a200141106a29020037" - "0300200041286a200141086a290200370300200020012902003703202000" - "410436025c200041b482c000360258200042043702642000200041106aad" - "4280808080e000843703502000200041086aad4280808080e00084370348" - "2000200041206aad42808080809001843703400b2000200041186aad4280" - "808080f000843703382000200041386a360260200041d8006a41fc93c000" - "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" - "0041306b220024002000412636020c200041c094c0003602082000410136" - "0214200041c88ac0003602102000420137021c2000200041086aad428080" - "8080f000843703282000200041286a360218200041106a418c95c0001017" - "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" - "36021041042102200141043a00182001200141106a360220200141186a41" - "9c88c0002000101e210320012d0018210002402003450440420021054117" - "2000764101710d01200128021c22002802002102200041046a2802002203" - "28020022040440200220041103000b20032802042203044020022003100c" - "0b2000410c100c410421020c010b20004104460d02200129031822074280" - "7e8321052007a721020b20012802102200200028020841016b2203360208" - "2003450440200041003a000c200042003703000b200241ff01714104470d" - "02200141406b24000f0b230041206b220024002000410036021820004101" - "36020c200041b08ac00036020820004204370210200041086a41b88ac000" - "1017000b200141003602382001410136022c2001419093c0003602282001" - "4204370230200141286a419893c0001017000b200120052002ad42ff0183" - "843703102001410236022c200141f891c000360228200142023702342001" - "200141106aad4280808080d001843703202001200141086aad4280808080" - "f000843703182001200141186a360230200141286a418892c0001017000b" - "0c00200020012902003703000bba0201047f411f21022000420037021020" - "0141ffffff074d04402001410620014108766722036b7641017120034101" - "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" - "20027422034184a0c0002802007145044020042000360200200020043602" - "182000200036020c200020003602084184a0c0004184a0c0002802002003" - "723602000f0b024002402001200428020022032802044178714604402003" - "21020c010b2001411920024101766b41002002411f471b74210503402003" - "2005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c" - "20022000360208200041003602182000200236020c200020013602080f0b" - "20042000360200200020033602182000200036020c200020003602080bf1" - "0201047f200028020c21020240024020014180024f044020002802182103" - "0240024020002002460440200041144110200028021422021b6a28020022" - "010d01410021020c020b20002802082201200236020c200220013602080c" - "010b200041146a200041106a20021b21040340200421052001220241146a" - "200241106a200228021422011b210420024114411020011b6a2802002201" - "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" - "006a220128020047044020034110411420032802102000461b6a20023602" - "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" - "280200417e200028021c77713602000c020b200028020822002002470440" - "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" - "7e200141037677713602000f0b2002200336021820002802102201044020" - "022001360210200120023602180b20002802142200450d00200220003602" - "14200020023602180b0b8f0101027f230041306b22012400024020004100" - "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" - "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" - "14200141d89ac0003602102001420137021c2001411036022c2001200141" - "286a36021820012001410c6a360228200141106a1030200128020c200141" - "306a24000bcf0101067f23004180016b2204240020012802042107200128" - "020021062000280200210020012802142205210202402005410471450d00" - "2005410872210220060d0020014281808080a0013702000b200120024104" - "7236021441810121020340200220046a41026b2000410f71220341307220" - "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" - "762100450d000b20014101419183c0004102200220046a41016b41810120" - "026b10092001200536021420012007360204200120063602002004418001" - "6a24000b6301017f230041306b220224002002200036020c200241023602" - "14200241f49ac0003602102002420137021c2002411036022c2002200241" - "286a36021820022002410c6a360228200241106a10302001044020022802" - "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" - "21030c010b02402000410020006b41037122066a220520004d0d00200021" - "032001210420060440200621070340200320042d00003a0000200441016a" - "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" - "0340200320042d00003a0000200341016a200441016a2d00003a00002003" - "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" - "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" - "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" - "003a0000200441086a2104200341086a22032005470d000b0b2005200220" - "066b2207417c7122086a21030240200120066a2204410371450440200320" - "054d0d0120042101034020052001280200360200200141046a2101200541" - "046a22052003490d000b0c010b200320054d0d0020044103742202411871" - "21062004417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220067620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20074103712102200420086a21010b" - "02402003200220036a22064f0d002002410771220404400340200320012d" - "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" - "200241016b4107490d000340200320012d00003a0000200341016a200141" - "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" - "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" - "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" - "41076a200141076a2d00003a0000200141086a2101200341086a22032006" - "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" - "420022022001422088420a7e7c22014220867c2204370300200020032004" - "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" - "c0000ba40611000000140000000400000012000000000000000100000001" - "00000013000000557466384572726f7276616c69645f75705f746f657272" - "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" - "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" - "003d0000005c0010000a0000001600000037000000636170616369747920" - "6f766572666c6f770000008800100011000000426f72726f774d75744572" - "726f72616c726561647920626f72726f7765643a20b2001000120000005b" - "3d3d617373657274696f6e20606c6566742020726967687460206661696c" - "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" - "00100017000000f60010000900000020726967687460206661696c65643a" - "200a20206c6566743a20000000cf00100010000000180110001000000028" - "01100009000000f6001000090000000100000000000000f3081000020000" - "00000000000c000000040000001400000015000000160000002020202020" - "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230" - "323132323233323432353236323732383239333033313332333333343335" - "333633373338333934303431343234333434343534363437343834393530" - "353135323533353435353536353735383539363036313632363336343635" - "363636373638363937303731373237333734373537363737373837393830" - "383138323833383438353836383738383839393039313932393339343935" - "393639373938393966616c7365747275656c6962726172792f636f72652f" - "7372632f736c6963652f6d656d6368722e72736402100020000000850000" - "001e0000006402100020000000a100000009000000010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010100" - "41e686c0000b330202020202020202020202020202020202020202020202" - "020202020202020303030303030303030303030303030304040404040041" - "a487c0000b6172616e676520737461727420696e64657820206f7574206f" - "662072616e676520666f7220736c696365206f66206c656e67746820a403" - "100012000000b60310002200000072616e676520656e6420696e64657820" - "e803100010000000b60310002200419088c0000b8f140400000004000000" - "17000000180000000c00000004000000190000001a0000001b0000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" - "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" - "61746520756e69717565207468726561642049443a206269747370616365" - "20657868617573746564f904100037000000dc0410001d000000ae040000" - "0d00000001000000000000006c6962726172792f7374642f7372632f696f" - "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e00007d05100009000000500510002d000000160100002900" - "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" - "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" - "696f6e207265736574686f737420756e726561636861626c656e6574776f" - "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" - "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" - "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c7265616479206578" - "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" - "206469726563746f727969732061206469726563746f7279646972656374" - "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c657379737465" - "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" - "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" - "2066696c652068616e646c65696e76616c696420696e7075742070617261" - "6d65746572696e76616c6964206461746174696d6564206f757477726974" - "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" - "756e7365656b61626c652066696c6571756f746120657863656564656466" - "696c6520746f6f206c617267657265736f75726365206275737965786563" - "757461626c652066696c652062757379646561646c6f636b63726f73732d" - "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" - "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" - "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" - "70746564756e737570706f72746564756e657870656374656420656e6420" - "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" - "736f74686572206572726f72756e63617465676f72697a6564206572726f" - "7220286f73206572726f72202900000001000000000000008d0810000b00" - "000098081000010000006c6962726172792f7374642f7372632f696f2f73" - "7464696f2e727300b40810001b00000032030000140000006661696c6564" - "207072696e74696e6720746f203a20000000e008100013000000f3081000" - "02000000b40810001b00000063040000090000007374646f75746c696272" - "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" - "696e6720747261697420696d706c656d656e746174696f6e207265747572" - "6e656420616e206572726f72207768656e2074686520756e6465726c7969" - "6e672073747265616d20646964206e6f7400000037091000560000001e09" - "100019000000680700001500000063616e6e6f7420726563757273697665" - "6c792061637175697265206d75746578a8091000200000006c6962726172" - "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" - "72656164732e7273d00910002c00000013000000090000006c6962726172" - "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" - "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" - "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" - "7273660a100026000000220100002d0000006f7065726174696f6e207375" - "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" - "6e206d6179206e6f7420626520706572666f726d65642072656375727369" - "76656c79b00a100038000000100000001100000012000000100000001000" - "000013000000120000000d0000000e000000150000000c0000000b000000" - "15000000150000000f0000000e0000001300000026000000380000001900" - "0000170000000c000000090000000a00000010000000170000000e000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600" - "0000150000000b000000160000000d0000000b0000000b00000013000000" - "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" - "1000250610003306100048061000540610005f0610007406100089061000" - "98061000a6061000b9061000df0610001707100030071000470710005307" - "10005c07100066071000760710008d0710009b071000a9071000b6071000" - "ca071000d2071000ed071000fb0710000b08100021081000360810004108" - "100057081000640810006f0810007a081000000000000100000001000000" - "1300000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" - "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" - "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" - "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" - "6963652e72737b0c10006d000000a1000000190000005061727365496e74" - "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" - "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" - "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" - "100009000000550d1000010000006465616c6c6f636174652000680d1000" - "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" - "46696e6973684166746572000000090d1000320000008000000016000000" - "42616c616e636500090d1000320000009b00000016000000456d70747949" - "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" - "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" - "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" - "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" - "6e63652d74797065732b0a6d756c746976616c7565"; +extern std::string const ledgerSqnHex; -static auto const deepRecursionHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; +extern std::string const allHostFunctionsHex; + +extern std::string const deepRecursionHex; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index f2f70ee558..b87c23a4a8 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED -#define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED + +#pragma once #include #include @@ -90,4 +90,3 @@ private: }; } // namespace ripple -#endif // RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED