@bitgo-beta/sdk-coin-sol 7.6.4-beta.74 → 7.6.4-beta.741
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/cjs/src/bigint-buffer-guard.js +29 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
- package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +128 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/confidentialTransferBuilder.js +311 -0
- package/dist/{src → cjs/src}/lib/constants.d.ts +96 -2
- package/dist/cjs/src/lib/constants.d.ts.map +1 -0
- package/dist/cjs/src/lib/constants.js +276 -0
- package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
- package/dist/cjs/src/lib/iface.d.ts +526 -0
- package/dist/cjs/src/lib/iface.d.ts.map +1 -0
- package/dist/cjs/src/lib/iface.js +7 -0
- package/dist/{src → cjs/src}/lib/index.d.ts +9 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/index.js +106 -0
- package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.js +1280 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
- package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
- package/dist/cjs/src/lib/keyPair.js +112 -0
- package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
- package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
- package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +36 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +211 -0
- package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
- package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/index.js +27 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
- package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
- package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
- package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Resolve.js +199 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenExtensions.js +109 -0
- package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
- package/dist/{src → cjs/src}/lib/transaction.d.ts +34 -1
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/transaction.js +704 -0
- package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilder.js +462 -0
- package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +37 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.js +249 -0
- package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilder.js +81 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
- package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
- package/dist/cjs/src/lib/utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/utils.js +665 -0
- package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +21 -0
- package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +28 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
- package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +253 -0
- package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/v1TransactionBuilder.js +601 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
- package/dist/cjs/src/register.d.ts +5 -0
- package/dist/cjs/src/register.d.ts.map +1 -0
- package/dist/cjs/src/register.js +29 -0
- package/dist/{src → cjs/src}/sol.d.ts +114 -3
- package/dist/cjs/src/sol.d.ts.map +1 -0
- package/dist/cjs/src/sol.js +1697 -0
- package/dist/{src → cjs/src}/solToken.d.ts +7 -0
- package/dist/cjs/src/solToken.d.ts.map +1 -0
- package/dist/cjs/src/solToken.js +79 -0
- package/dist/cjs/src/tsol.d.ts.map +1 -0
- package/dist/cjs/src/tsol.js +24 -0
- package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
- package/dist/cjs/test/fixtures/sol.js +1433 -0
- package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
- package/dist/cjs/test/resources/sol.d.ts.map +1 -0
- package/dist/cjs/test/resources/sol.js +320 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
- package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
- package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
- package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
- package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
- package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
- package/dist/cjs/test/unit/keyPair.js +177 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/cjs/test/unit/register.d.ts +2 -0
- package/dist/cjs/test/unit/register.d.ts.map +1 -0
- package/dist/cjs/test/unit/register.js +65 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
- package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
- package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
- package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
- package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
- package/dist/cjs/test/unit/sol.js +5364 -0
- package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
- package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
- package/dist/cjs/test/unit/solToken.js +37 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
- package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
- package/dist/cjs/test/unit/token2022Resolve.js +252 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/test/unit/tokenExtensions.js +73 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +1129 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
- package/dist/cjs/test/unit/utils.js +628 -0
- package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/versionedTransaction.js +207 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/bigint-buffer-guard.d.ts +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/esm/lib/ataInitializationBuilder.js +191 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/closeAtaBuilder.js +155 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
- package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
- package/dist/esm/lib/constants.d.ts +234 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +273 -0
- package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
- package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/customInstructionBuilder.js +385 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
- package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
- package/dist/esm/lib/explainTransactionWasm.js +301 -0
- package/dist/esm/lib/iface.d.ts +526 -0
- package/dist/esm/lib/iface.d.ts.map +1 -0
- package/dist/esm/lib/iface.js +3 -0
- package/dist/esm/lib/index.d.ts +31 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +31 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/esm/lib/instructionParamsFactory.js +1272 -0
- package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
- package/dist/esm/lib/keyPair.d.ts +32 -0
- package/dist/esm/lib/keyPair.d.ts.map +1 -0
- package/dist/esm/lib/keyPair.js +75 -0
- package/dist/esm/lib/messages/index.d.ts +2 -0
- package/dist/esm/lib/messages/index.js +2 -0
- package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
- package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
- package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
- package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
- package/dist/esm/lib/scaledUiAmount.js +108 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
- package/dist/esm/lib/serialization/index.d.ts +5 -0
- package/dist/esm/lib/serialization/index.d.ts.map +1 -0
- package/dist/esm/lib/serialization/index.js +5 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
- package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/wire-transaction.js +48 -0
- package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/esm/lib/solInstructionFactory.js +1088 -0
- package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
- package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingActivateBuilder.js +122 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
- package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
- package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
- package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
- package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
- package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
- package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
- package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
- package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
- package/dist/esm/lib/token2022Resolve.d.ts +106 -0
- package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
- package/dist/esm/lib/token2022Resolve.js +194 -0
- package/dist/esm/lib/tokenExtensions.d.ts +26 -0
- package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/esm/lib/tokenExtensions.js +103 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/esm/lib/tokenTransferBuilder.js +230 -0
- package/dist/esm/lib/transaction.d.ts +136 -0
- package/dist/esm/lib/transaction.d.ts.map +1 -0
- package/dist/esm/lib/transaction.js +697 -0
- package/dist/esm/lib/transactionBuilder.d.ts +169 -0
- package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilder.js +455 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilderFactory.js +245 -0
- package/dist/esm/lib/transferBuilder.d.ts +26 -0
- package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/transferBuilder.js +74 -0
- package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
- package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/esm/lib/transferBuilderV2.js +245 -0
- package/dist/esm/lib/utils.d.ts +205 -0
- package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
- package/dist/esm/lib/utils.js +627 -0
- package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +21 -0
- package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1CustomInstructionBuilder.js +24 -0
- package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
- package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1PaymentBuilder.js +63 -0
- package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
- package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/v1TransactionBuilder.js +591 -0
- package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
- package/dist/esm/lib/walletInitializationBuilder.js +64 -0
- package/dist/esm/register.d.ts +5 -0
- package/dist/esm/register.d.ts.map +1 -0
- package/dist/esm/register.js +24 -0
- package/dist/esm/sol.d.ts +351 -0
- package/dist/esm/sol.d.ts.map +1 -0
- package/dist/esm/sol.js +1656 -0
- package/dist/esm/solToken.d.ts +44 -0
- package/dist/esm/solToken.d.ts.map +1 -0
- package/dist/esm/solToken.js +75 -0
- package/dist/esm/tsol.d.ts +11 -0
- package/dist/esm/tsol.js +20 -0
- package/package.json +37 -17
- package/dist/src/config/token2022StaticConfig.d.ts +0 -3
- package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
- package/dist/src/config/token2022StaticConfig.js +0 -50
- package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
- package/dist/src/lib/ataInitializationBuilder.js +0 -196
- package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
- package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
- package/dist/src/lib/closeAtaBuilder.js +0 -69
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -171
- package/dist/src/lib/customInstructionBuilder.js +0 -289
- package/dist/src/lib/iface.d.ts +0 -244
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -7
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -77
- package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
- package/dist/src/lib/instructionParamsFactory.js +0 -1036
- package/dist/src/lib/jitoStakePoolOperations.js +0 -200
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -63
- package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
- package/dist/src/lib/solInstructionFactory.js +0 -572
- package/dist/src/lib/stakingActivateBuilder.js +0 -120
- package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
- package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
- package/dist/src/lib/stakingDelegateBuilder.js +0 -120
- package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
- package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
- package/dist/src/lib/token2022Config.d.ts +0 -44
- package/dist/src/lib/token2022Config.d.ts.map +0 -1
- package/dist/src/lib/token2022Config.js +0 -27
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/tokenTransferBuilder.js +0 -188
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -595
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -380
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -202
- package/dist/src/lib/transferBuilder.js +0 -70
- package/dist/src/lib/transferBuilderV2.d.ts +0 -43
- package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
- package/dist/src/lib/transferBuilderV2.js +0 -210
- package/dist/src/lib/utils.js +0 -589
- package/dist/src/lib/walletInitializationBuilder.js +0 -71
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -15
- package/dist/src/sol.d.ts.map +0 -1
- package/dist/src/sol.js +0 -1324
- package/dist/src/solToken.d.ts.map +0 -1
- package/dist/src/solToken.js +0 -69
- package/dist/src/tsol.js +0 -24
- package/dist/test/fixtures/sol.js +0 -1433
- package/dist/test/resources/sol.d.ts.map +0 -1
- package/dist/test/resources/sol.js +0 -320
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
- package/dist/test/unit/fixtures/solBackupKey.js +0 -8
- package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/getBuilderFactory.js +0 -10
- package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.js +0 -412
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
- package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
- package/dist/test/unit/keyPair.js +0 -177
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
- package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
- package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
- package/dist/test/unit/sol.js +0 -3180
- package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
- package/dist/test/unit/solInstructionFactory.js +0 -454
- package/dist/test/unit/solToken.d.ts.map +0 -1
- package/dist/test/unit/solToken.js +0 -31
- package/dist/test/unit/transaction.d.ts.map +0 -1
- package/dist/test/unit/transaction.js +0 -983
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
- package/dist/test/unit/utils.js +0 -517
- package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
- package/dist/test/unit/versionedTransaction.js +0 -207
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
- /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
- /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
- /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/tsol.d.ts.map +0 -0
|
@@ -0,0 +1,697 @@
|
|
|
1
|
+
import { BaseTransaction, InvalidTransactionError, ParseTransactionError, SigningError, TransactionType, } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { PublicKey, Transaction as SolTransaction, SystemInstruction, } from '@solana/web3.js';
|
|
3
|
+
import BigNumber from 'bignumber.js';
|
|
4
|
+
import base58 from 'bs58';
|
|
5
|
+
import { explainSolTransaction } from '.';
|
|
6
|
+
import { InstructionBuilderTypes, UNAVAILABLE_TEXT, validInstructionData, ValidInstructionTypesEnum, } from './constants';
|
|
7
|
+
import { instructionParamsFactory } from './instructionParamsFactory';
|
|
8
|
+
import { getInstructionType, getTransactionType, isValidRawTransaction, requiresAllSignatures, validateRawMsgInstruction, } from './utils';
|
|
9
|
+
import { SolStakingTypeEnum } from '@bitgo/public-types';
|
|
10
|
+
export class Transaction extends BaseTransaction {
|
|
11
|
+
constructor(_coinConfig) {
|
|
12
|
+
super(_coinConfig);
|
|
13
|
+
this._instructionsData = [];
|
|
14
|
+
this._useTokenAddressTokenName = false;
|
|
15
|
+
}
|
|
16
|
+
get solTransaction() {
|
|
17
|
+
return this._solTransaction;
|
|
18
|
+
}
|
|
19
|
+
set solTransaction(tx) {
|
|
20
|
+
this._solTransaction = tx;
|
|
21
|
+
}
|
|
22
|
+
get numberOfRequiredSignatures() {
|
|
23
|
+
return this._solTransaction.compileMessage().header.numRequiredSignatures;
|
|
24
|
+
}
|
|
25
|
+
get numberOfATACreationInstructions() {
|
|
26
|
+
return this._solTransaction.instructions.filter((instruction) => getInstructionType(instruction) === ValidInstructionTypesEnum.InitializeAssociatedTokenAccount).length;
|
|
27
|
+
}
|
|
28
|
+
/** @inheritDoc */
|
|
29
|
+
get signablePayload() {
|
|
30
|
+
if (this._v1MessageBytes) {
|
|
31
|
+
return Buffer.from(this._v1MessageBytes);
|
|
32
|
+
}
|
|
33
|
+
if (this._versionedTransaction) {
|
|
34
|
+
return Buffer.from(this._versionedTransaction.message.serialize());
|
|
35
|
+
}
|
|
36
|
+
return this._solTransaction.serializeMessage();
|
|
37
|
+
}
|
|
38
|
+
/** @inheritDoc **/
|
|
39
|
+
get id() {
|
|
40
|
+
// Solana transaction ID === first signature: https://docs.solana.com/terminology#transaction-id
|
|
41
|
+
if (this._v1TransactionBytes) {
|
|
42
|
+
// v1 wire format: messageBytes followed by 64-byte signatures; the first signature is the tx id
|
|
43
|
+
const numRequired = this._v1TransactionBytes[1];
|
|
44
|
+
const sigStart = this._v1TransactionBytes.length - numRequired * 64;
|
|
45
|
+
if (numRequired > 0 && sigStart >= 0) {
|
|
46
|
+
const sig = this._v1TransactionBytes.slice(sigStart, sigStart + 64);
|
|
47
|
+
if (sig.some((byte) => byte !== 0)) {
|
|
48
|
+
return base58.encode(sig);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (this._versionedTransaction) {
|
|
53
|
+
const sig = this._versionedTransaction.signatures?.[0];
|
|
54
|
+
// Check if signature exists and is not a placeholder signature (all zeros)
|
|
55
|
+
if (sig && sig.some((byte) => byte !== 0)) {
|
|
56
|
+
return base58.encode(sig);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (this._solTransaction.signature) {
|
|
60
|
+
return base58.encode(this._solTransaction.signature);
|
|
61
|
+
}
|
|
62
|
+
return UNAVAILABLE_TEXT;
|
|
63
|
+
}
|
|
64
|
+
get lamportsPerSignature() {
|
|
65
|
+
return this._lamportsPerSignature;
|
|
66
|
+
}
|
|
67
|
+
set lamportsPerSignature(lamportsPerSignature) {
|
|
68
|
+
this._lamportsPerSignature = lamportsPerSignature;
|
|
69
|
+
}
|
|
70
|
+
get tokenAccountRentExemptAmount() {
|
|
71
|
+
return this._tokenAccountRentExemptAmount;
|
|
72
|
+
}
|
|
73
|
+
set tokenAccountRentExemptAmount(tokenAccountRentExemptAmount) {
|
|
74
|
+
this._tokenAccountRentExemptAmount = tokenAccountRentExemptAmount;
|
|
75
|
+
}
|
|
76
|
+
/** @inheritDoc */
|
|
77
|
+
get signature() {
|
|
78
|
+
const signatures = [];
|
|
79
|
+
if (this._v1TransactionBytes) {
|
|
80
|
+
// v1 wire format: messageBytes followed by 64-byte signatures; filter out
|
|
81
|
+
// zero-filled placeholder slots (unsigned signers)
|
|
82
|
+
const numRequired = this._v1TransactionBytes[1];
|
|
83
|
+
const sigStart = this._v1TransactionBytes.length - numRequired * 64;
|
|
84
|
+
for (let i = 0; i < numRequired; i++) {
|
|
85
|
+
const sig = this._v1TransactionBytes.slice(sigStart + i * 64, sigStart + (i + 1) * 64);
|
|
86
|
+
if (sig.some((b) => b !== 0)) {
|
|
87
|
+
signatures.push(base58.encode(sig));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return signatures;
|
|
91
|
+
}
|
|
92
|
+
if (this._versionedTransaction) {
|
|
93
|
+
// Handle VersionedTransaction signatures
|
|
94
|
+
for (const sig of this._versionedTransaction.signatures) {
|
|
95
|
+
// Filters out placeholder signatures
|
|
96
|
+
if (sig && sig.some((b) => b !== 0)) {
|
|
97
|
+
signatures.push(base58.encode(sig));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Handle legacy transaction signatures
|
|
103
|
+
for (const solSignature of this._solTransaction.signatures) {
|
|
104
|
+
if (solSignature.signature) {
|
|
105
|
+
signatures.push(base58.encode(solSignature.signature));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return signatures;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Set the transaction type.
|
|
113
|
+
*
|
|
114
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
115
|
+
*/
|
|
116
|
+
setTransactionType(transactionType) {
|
|
117
|
+
this._type = transactionType;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Set the instructionData.
|
|
121
|
+
*
|
|
122
|
+
* @param {InstructionParams[]} instructionData The instruction data to be set.
|
|
123
|
+
*/
|
|
124
|
+
setInstructionsData(instructionData) {
|
|
125
|
+
this._instructionsData = instructionData;
|
|
126
|
+
}
|
|
127
|
+
get useTokenAddressTokenName() {
|
|
128
|
+
return this._useTokenAddressTokenName;
|
|
129
|
+
}
|
|
130
|
+
setUseTokenAddressTokenName(value) {
|
|
131
|
+
this._useTokenAddressTokenName = value;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if this transaction is a VersionedTransaction
|
|
135
|
+
* @returns {boolean} True if this is a VersionedTransaction
|
|
136
|
+
*/
|
|
137
|
+
isVersionedTransaction() {
|
|
138
|
+
return !!this._versionedTransaction || !!this._versionedTransactionData || !!this._v1TransactionBytes;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get the serialized v1 wire transaction bytes (message + signatures), if this transaction is v1
|
|
142
|
+
* @returns {Uint8Array | undefined} The v1 wire bytes or undefined
|
|
143
|
+
*/
|
|
144
|
+
get v1TransactionBytes() {
|
|
145
|
+
return this._v1TransactionBytes;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Set the serialized v1 wire transaction bytes (message + signatures)
|
|
149
|
+
* @param {Uint8Array | undefined} bytes The v1 wire bytes to store, or undefined to clear
|
|
150
|
+
*/
|
|
151
|
+
set v1TransactionBytes(bytes) {
|
|
152
|
+
this._v1TransactionBytes = bytes;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get the serialized v1 message bytes (without signatures), if this transaction is v1
|
|
156
|
+
* @returns {Uint8Array | undefined} The v1 message bytes or undefined
|
|
157
|
+
*/
|
|
158
|
+
get v1MessageBytes() {
|
|
159
|
+
return this._v1MessageBytes;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Set the serialized v1 message bytes (without signatures)
|
|
163
|
+
* @param {Uint8Array | undefined} bytes The v1 message bytes to store, or undefined to clear
|
|
164
|
+
*/
|
|
165
|
+
set v1MessageBytes(bytes) {
|
|
166
|
+
this._v1MessageBytes = bytes;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get the original VersionedTransaction if this transaction was parsed from one
|
|
170
|
+
* @returns {VersionedTransaction | undefined} The VersionedTransaction or undefined
|
|
171
|
+
*/
|
|
172
|
+
get versionedTransaction() {
|
|
173
|
+
return this._versionedTransaction;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Set a built VersionedTransaction
|
|
177
|
+
* @param {VersionedTransaction} versionedTx The VersionedTransaction to set
|
|
178
|
+
*/
|
|
179
|
+
set versionedTransaction(versionedTx) {
|
|
180
|
+
this._versionedTransaction = versionedTx;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get the stored VersionedTransactionData
|
|
184
|
+
* @returns {VersionedTransactionData | undefined} The stored data or undefined
|
|
185
|
+
*/
|
|
186
|
+
getVersionedTransactionData() {
|
|
187
|
+
return this._versionedTransactionData;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Set the VersionedTransactionData for this transaction
|
|
191
|
+
* @param {VersionedTransactionData | undefined} data The versioned transaction data to store, or undefined to clear
|
|
192
|
+
*/
|
|
193
|
+
setVersionedTransactionData(data) {
|
|
194
|
+
this._versionedTransactionData = data;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Add a signature produced by the fee payer of this transaction.
|
|
198
|
+
*
|
|
199
|
+
* The fee payer is account 0 of the transaction message, so its signature belongs in slot 0.
|
|
200
|
+
* Use this for signatures produced by the enterprise fee address key (HSM single-sig) of a
|
|
201
|
+
* sponsored transaction.
|
|
202
|
+
*
|
|
203
|
+
* @param {BasePublicKey} publicKey The public key of the fee payer; must be account 0 of the message
|
|
204
|
+
* @param {Buffer} signature The signature of the transaction payload
|
|
205
|
+
*/
|
|
206
|
+
addFeePayerSignature(publicKey, signature) {
|
|
207
|
+
if (this._versionedTransaction) {
|
|
208
|
+
const account0 = this._versionedTransaction.message.staticAccountKeys[0]?.toBase58();
|
|
209
|
+
if (publicKey.pub !== account0) {
|
|
210
|
+
throw new SigningError(`Fee payer signature must come from account 0 of the message, got: ${publicKey.pub}`);
|
|
211
|
+
}
|
|
212
|
+
this._versionedTransaction.addSignature(new PublicKey(publicKey.pub), signature);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (this._solTransaction) {
|
|
216
|
+
// For legacy transactions @solana/web3.js places the fee payer first in the message
|
|
217
|
+
const feePayer = this._solTransaction.feePayer?.toBase58();
|
|
218
|
+
if (publicKey.pub !== feePayer) {
|
|
219
|
+
throw new SigningError(`Fee payer signature must come from account 0 of the message, got: ${publicKey.pub}`);
|
|
220
|
+
}
|
|
221
|
+
this._solTransaction.addSignature(new PublicKey(publicKey.pub), signature);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
throw new SigningError('Fee payer signature requires a built transaction');
|
|
225
|
+
}
|
|
226
|
+
/** @inheritdoc */
|
|
227
|
+
canSign() {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Signs transaction.
|
|
232
|
+
*
|
|
233
|
+
* @param {KeyPair} keyPair Signer keys.
|
|
234
|
+
*/
|
|
235
|
+
async sign(keyPair) {
|
|
236
|
+
// Convert to array and build signers list
|
|
237
|
+
const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
|
|
238
|
+
const signers = [];
|
|
239
|
+
for (const kp of keyPairs) {
|
|
240
|
+
const keys = kp.getKeys(true);
|
|
241
|
+
if (!keys.prv) {
|
|
242
|
+
throw new SigningError('Missing private key');
|
|
243
|
+
}
|
|
244
|
+
signers.push({ publicKey: new PublicKey(keys.pub), secretKey: keys.prv });
|
|
245
|
+
}
|
|
246
|
+
if (this._versionedTransaction) {
|
|
247
|
+
if (!this._versionedTransaction.message.recentBlockhash) {
|
|
248
|
+
throw new SigningError('Nonce is required before signing');
|
|
249
|
+
}
|
|
250
|
+
this._versionedTransaction.sign(signers);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (!this._solTransaction || !this._solTransaction.recentBlockhash) {
|
|
254
|
+
throw new SigningError('Nonce is required before signing');
|
|
255
|
+
}
|
|
256
|
+
if (!this._solTransaction || !this._solTransaction.feePayer) {
|
|
257
|
+
throw new SigningError('feePayer is required before signing');
|
|
258
|
+
}
|
|
259
|
+
this._solTransaction.partialSign(...signers);
|
|
260
|
+
}
|
|
261
|
+
/** @inheritdoc */
|
|
262
|
+
toBroadcastFormat() {
|
|
263
|
+
if (this._v1TransactionBytes) {
|
|
264
|
+
// v1 wire format is message-first with signatures appended (no length prefix)
|
|
265
|
+
return Buffer.from(this._v1TransactionBytes).toString('base64');
|
|
266
|
+
}
|
|
267
|
+
if (this._versionedTransaction) {
|
|
268
|
+
// VersionedTransaction.serialize() doesn't need requireAllSignatures parameter
|
|
269
|
+
// It automatically handles whatever signatures are present
|
|
270
|
+
return Buffer.from(this._versionedTransaction.serialize()).toString('base64');
|
|
271
|
+
}
|
|
272
|
+
if (!this._solTransaction) {
|
|
273
|
+
throw new ParseTransactionError('Empty transaction');
|
|
274
|
+
}
|
|
275
|
+
// The signatures can have null signatures (which means they are required but yet unsigned)
|
|
276
|
+
// In order to be able to serializer the txs, we have to change the requireAllSignatures based
|
|
277
|
+
// on if the TX is fully signed or not
|
|
278
|
+
const requireAllSignatures = requiresAllSignatures(this._solTransaction.signatures);
|
|
279
|
+
// Based on the recomendation encoding found here https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
|
|
280
|
+
// We use base64 encoding
|
|
281
|
+
return this._solTransaction.serialize({ requireAllSignatures }).toString('base64');
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Sets this transaction payload
|
|
285
|
+
*
|
|
286
|
+
* @param rawTransaction
|
|
287
|
+
*/
|
|
288
|
+
fromRawTransaction(rawTransaction) {
|
|
289
|
+
try {
|
|
290
|
+
isValidRawTransaction(rawTransaction);
|
|
291
|
+
this._solTransaction = SolTransaction.from(Buffer.from(rawTransaction, 'base64'));
|
|
292
|
+
if (this._solTransaction.signature && this._solTransaction.signature !== null) {
|
|
293
|
+
this._id = base58.encode(this._solTransaction.signature);
|
|
294
|
+
}
|
|
295
|
+
const transactionType = getTransactionType(this._solTransaction);
|
|
296
|
+
switch (transactionType) {
|
|
297
|
+
case TransactionType.WalletInitialization:
|
|
298
|
+
this.setTransactionType(TransactionType.WalletInitialization);
|
|
299
|
+
break;
|
|
300
|
+
case TransactionType.Send:
|
|
301
|
+
this.setTransactionType(TransactionType.Send);
|
|
302
|
+
break;
|
|
303
|
+
case TransactionType.StakingActivate:
|
|
304
|
+
this.setTransactionType(TransactionType.StakingActivate);
|
|
305
|
+
break;
|
|
306
|
+
case TransactionType.StakingDeactivate:
|
|
307
|
+
this.setTransactionType(TransactionType.StakingDeactivate);
|
|
308
|
+
break;
|
|
309
|
+
case TransactionType.StakingWithdraw:
|
|
310
|
+
this.setTransactionType(TransactionType.StakingWithdraw);
|
|
311
|
+
break;
|
|
312
|
+
case TransactionType.AssociatedTokenAccountInitialization:
|
|
313
|
+
this.setTransactionType(TransactionType.AssociatedTokenAccountInitialization);
|
|
314
|
+
break;
|
|
315
|
+
case TransactionType.CloseAssociatedTokenAccount:
|
|
316
|
+
this.setTransactionType(TransactionType.CloseAssociatedTokenAccount);
|
|
317
|
+
break;
|
|
318
|
+
case TransactionType.StakingAuthorize:
|
|
319
|
+
this.setTransactionType(TransactionType.StakingAuthorize);
|
|
320
|
+
break;
|
|
321
|
+
case TransactionType.StakingAuthorizeRaw:
|
|
322
|
+
this.setTransactionType(TransactionType.StakingAuthorizeRaw);
|
|
323
|
+
break;
|
|
324
|
+
case TransactionType.StakingDelegate:
|
|
325
|
+
this.setTransactionType(TransactionType.StakingDelegate);
|
|
326
|
+
break;
|
|
327
|
+
case TransactionType.CustomTx:
|
|
328
|
+
this.setTransactionType(TransactionType.CustomTx);
|
|
329
|
+
break;
|
|
330
|
+
case TransactionType.ConfidentialTransfer:
|
|
331
|
+
this.setTransactionType(TransactionType.ConfidentialTransfer);
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
if (transactionType !== TransactionType.StakingAuthorizeRaw) {
|
|
335
|
+
this.loadInputsAndOutputs();
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (e) {
|
|
339
|
+
throw e;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/** @inheritdoc */
|
|
343
|
+
toJson() {
|
|
344
|
+
if (!this._solTransaction) {
|
|
345
|
+
throw new ParseTransactionError('Empty transaction');
|
|
346
|
+
}
|
|
347
|
+
let durableNonce;
|
|
348
|
+
if (this._solTransaction.nonceInfo) {
|
|
349
|
+
const nonceInstruction = SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
|
|
350
|
+
durableNonce = {
|
|
351
|
+
walletNonceAddress: nonceInstruction.noncePubkey.toString(),
|
|
352
|
+
authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
const instructionData = instructionParamsFactory(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
|
|
356
|
+
if (this._type) {
|
|
357
|
+
if (!durableNonce &&
|
|
358
|
+
instructionData.length > 1 &&
|
|
359
|
+
instructionData[0].type === InstructionBuilderTypes.NonceAdvance) {
|
|
360
|
+
durableNonce = instructionData[0].params;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
const result = {
|
|
364
|
+
id: this._solTransaction.signature ? this.id : undefined,
|
|
365
|
+
feePayer: this._solTransaction.feePayer?.toString(),
|
|
366
|
+
lamportsPerSignature: this.lamportsPerSignature,
|
|
367
|
+
nonce: this.getNonce(),
|
|
368
|
+
durableNonce: durableNonce,
|
|
369
|
+
numSignatures: this.signature.length,
|
|
370
|
+
instructionsData: instructionData,
|
|
371
|
+
};
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get the nonce from the Solana Transaction
|
|
376
|
+
* Throws if not set
|
|
377
|
+
*/
|
|
378
|
+
getNonce() {
|
|
379
|
+
if (this._solTransaction.recentBlockhash) {
|
|
380
|
+
return this._solTransaction.recentBlockhash;
|
|
381
|
+
}
|
|
382
|
+
else if (this._solTransaction.nonceInfo) {
|
|
383
|
+
return this._solTransaction.nonceInfo.nonce;
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
throw new InvalidTransactionError('Nonce is not set');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Load the input and output data on this transaction.
|
|
391
|
+
*/
|
|
392
|
+
loadInputsAndOutputs() {
|
|
393
|
+
if (!this._solTransaction || this._solTransaction.instructions?.length === 0) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const outputs = [];
|
|
397
|
+
const inputs = [];
|
|
398
|
+
const instructionParams = instructionParamsFactory(this.type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
|
|
399
|
+
for (const instruction of instructionParams) {
|
|
400
|
+
switch (instruction.type) {
|
|
401
|
+
case InstructionBuilderTypes.CreateNonceAccount:
|
|
402
|
+
inputs.push({
|
|
403
|
+
address: instruction.params.fromAddress,
|
|
404
|
+
value: instruction.params.amount,
|
|
405
|
+
coin: this._coinConfig.name,
|
|
406
|
+
});
|
|
407
|
+
break;
|
|
408
|
+
case InstructionBuilderTypes.Transfer:
|
|
409
|
+
inputs.push({
|
|
410
|
+
address: instruction.params.fromAddress,
|
|
411
|
+
value: instruction.params.amount,
|
|
412
|
+
coin: this._coinConfig.name,
|
|
413
|
+
});
|
|
414
|
+
outputs.push({
|
|
415
|
+
address: instruction.params.toAddress,
|
|
416
|
+
value: instruction.params.amount,
|
|
417
|
+
coin: this._coinConfig.name,
|
|
418
|
+
});
|
|
419
|
+
break;
|
|
420
|
+
case InstructionBuilderTypes.TokenTransfer:
|
|
421
|
+
inputs.push({
|
|
422
|
+
address: instruction.params.fromAddress,
|
|
423
|
+
value: instruction.params.amount,
|
|
424
|
+
coin: instruction.params.tokenName,
|
|
425
|
+
});
|
|
426
|
+
outputs.push({
|
|
427
|
+
address: instruction.params.toAddress,
|
|
428
|
+
value: instruction.params.amount,
|
|
429
|
+
coin: instruction.params.tokenName,
|
|
430
|
+
});
|
|
431
|
+
break;
|
|
432
|
+
case InstructionBuilderTypes.StakingActivate:
|
|
433
|
+
inputs.push({
|
|
434
|
+
address: instruction.params.fromAddress,
|
|
435
|
+
value: instruction.params.amount,
|
|
436
|
+
coin: this._coinConfig.name,
|
|
437
|
+
});
|
|
438
|
+
if (instruction.params.stakingType !== SolStakingTypeEnum.JITO) {
|
|
439
|
+
outputs.push({
|
|
440
|
+
address: instruction.params.stakingAddress,
|
|
441
|
+
value: instruction.params.amount,
|
|
442
|
+
coin: this._coinConfig.name,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
break;
|
|
446
|
+
case InstructionBuilderTypes.StakingDeactivate:
|
|
447
|
+
if (instruction.params.amount &&
|
|
448
|
+
instruction.params.unstakingAddress &&
|
|
449
|
+
instruction.params.stakingType !== SolStakingTypeEnum.JITO) {
|
|
450
|
+
inputs.push({
|
|
451
|
+
address: instruction.params.stakingAddress,
|
|
452
|
+
value: instruction.params.amount,
|
|
453
|
+
coin: this._coinConfig.name,
|
|
454
|
+
});
|
|
455
|
+
outputs.push({
|
|
456
|
+
address: instruction.params.unstakingAddress,
|
|
457
|
+
value: instruction.params.amount,
|
|
458
|
+
coin: this._coinConfig.name,
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
break;
|
|
462
|
+
case InstructionBuilderTypes.StakingWithdraw:
|
|
463
|
+
inputs.push({
|
|
464
|
+
address: instruction.params.stakingAddress,
|
|
465
|
+
value: instruction.params.amount,
|
|
466
|
+
coin: this._coinConfig.name,
|
|
467
|
+
});
|
|
468
|
+
outputs.push({
|
|
469
|
+
address: instruction.params.fromAddress,
|
|
470
|
+
value: instruction.params.amount,
|
|
471
|
+
coin: this._coinConfig.name,
|
|
472
|
+
});
|
|
473
|
+
break;
|
|
474
|
+
case InstructionBuilderTypes.CreateAssociatedTokenAccount:
|
|
475
|
+
break;
|
|
476
|
+
case InstructionBuilderTypes.CloseAssociatedTokenAccount:
|
|
477
|
+
break;
|
|
478
|
+
case InstructionBuilderTypes.StakingAuthorize:
|
|
479
|
+
break;
|
|
480
|
+
case InstructionBuilderTypes.StakingDelegate:
|
|
481
|
+
break;
|
|
482
|
+
case InstructionBuilderTypes.SetComputeUnitLimit:
|
|
483
|
+
break;
|
|
484
|
+
case InstructionBuilderTypes.SetPriorityFee:
|
|
485
|
+
break;
|
|
486
|
+
case InstructionBuilderTypes.CustomInstruction:
|
|
487
|
+
break;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
this._outputs = outputs;
|
|
491
|
+
this._inputs = inputs;
|
|
492
|
+
}
|
|
493
|
+
/** @inheritDoc */
|
|
494
|
+
explainTransaction() {
|
|
495
|
+
// Testnet uses WASM-based parsing (no @solana/web3.js dependency).
|
|
496
|
+
// This validates the WASM path against production traffic before
|
|
497
|
+
// replacing the legacy implementation for all networks.
|
|
498
|
+
if (this._coinConfig.name === 'tsol') {
|
|
499
|
+
// explainTransaction should work on unsigned/partially-signed transactions
|
|
500
|
+
// (e.g., during parseTransaction round-trips where null signatures become
|
|
501
|
+
// zero-filled buffers). Use serialize without signature validation since
|
|
502
|
+
// we only need to read the transaction, not broadcast it.
|
|
503
|
+
const txBase64 = Buffer.from(this._solTransaction.serialize({ verifySignatures: false, requireAllSignatures: false })).toString('base64');
|
|
504
|
+
return explainSolTransaction({
|
|
505
|
+
txBase64,
|
|
506
|
+
feeInfo: this._lamportsPerSignature ? { fee: this._lamportsPerSignature.toString() } : undefined,
|
|
507
|
+
tokenAccountRentExemptAmount: this._tokenAccountRentExemptAmount,
|
|
508
|
+
coinName: this._coinConfig.name,
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
if (validateRawMsgInstruction(this._solTransaction.instructions)) {
|
|
512
|
+
return this.explainRawMsgAuthorizeTransaction();
|
|
513
|
+
}
|
|
514
|
+
const decodedInstructions = instructionParamsFactory(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
|
|
515
|
+
let memo = undefined;
|
|
516
|
+
let durableNonce = undefined;
|
|
517
|
+
let outputAmount = new BigNumber(0);
|
|
518
|
+
const outputs = [];
|
|
519
|
+
// Create a separate array for token enablements
|
|
520
|
+
const tokenEnablements = [];
|
|
521
|
+
for (const instruction of decodedInstructions) {
|
|
522
|
+
switch (instruction.type) {
|
|
523
|
+
case InstructionBuilderTypes.NonceAdvance:
|
|
524
|
+
durableNonce = instruction.params;
|
|
525
|
+
break;
|
|
526
|
+
case InstructionBuilderTypes.Memo:
|
|
527
|
+
memo = instruction.params.memo;
|
|
528
|
+
break;
|
|
529
|
+
case InstructionBuilderTypes.Transfer:
|
|
530
|
+
const transferInstruction = instruction;
|
|
531
|
+
outputs.push({
|
|
532
|
+
address: transferInstruction.params.toAddress,
|
|
533
|
+
amount: transferInstruction.params.amount,
|
|
534
|
+
});
|
|
535
|
+
outputAmount = outputAmount.plus(transferInstruction.params.amount);
|
|
536
|
+
break;
|
|
537
|
+
case InstructionBuilderTypes.TokenTransfer:
|
|
538
|
+
const tokenTransferInstruction = instruction;
|
|
539
|
+
outputs.push({
|
|
540
|
+
address: tokenTransferInstruction.params.toAddress,
|
|
541
|
+
amount: tokenTransferInstruction.params.amount,
|
|
542
|
+
tokenName: tokenTransferInstruction.params.tokenName,
|
|
543
|
+
});
|
|
544
|
+
break;
|
|
545
|
+
case InstructionBuilderTypes.CreateNonceAccount:
|
|
546
|
+
const createInstruction = instruction;
|
|
547
|
+
outputs.push({
|
|
548
|
+
address: createInstruction.params.nonceAddress,
|
|
549
|
+
amount: createInstruction.params.amount,
|
|
550
|
+
});
|
|
551
|
+
outputAmount = outputAmount.plus(createInstruction.params.amount);
|
|
552
|
+
break;
|
|
553
|
+
case InstructionBuilderTypes.StakingActivate:
|
|
554
|
+
const stakingActivateInstruction = instruction;
|
|
555
|
+
outputs.push({
|
|
556
|
+
address: stakingActivateInstruction.params.stakingAddress,
|
|
557
|
+
amount: stakingActivateInstruction.params.amount,
|
|
558
|
+
});
|
|
559
|
+
outputAmount = outputAmount.plus(stakingActivateInstruction.params.amount);
|
|
560
|
+
break;
|
|
561
|
+
case InstructionBuilderTypes.StakingWithdraw:
|
|
562
|
+
const stakingWithdrawInstruction = instruction;
|
|
563
|
+
outputs.push({
|
|
564
|
+
address: stakingWithdrawInstruction.params.fromAddress,
|
|
565
|
+
amount: stakingWithdrawInstruction.params.amount,
|
|
566
|
+
});
|
|
567
|
+
outputAmount = outputAmount.plus(stakingWithdrawInstruction.params.amount);
|
|
568
|
+
break;
|
|
569
|
+
case InstructionBuilderTypes.CreateAssociatedTokenAccount:
|
|
570
|
+
// Process token enablement instructions and collect them in the tokenEnablements array
|
|
571
|
+
const ataInit = instruction;
|
|
572
|
+
tokenEnablements.push({
|
|
573
|
+
address: ataInit.params.ataAddress,
|
|
574
|
+
tokenName: ataInit.params.tokenName,
|
|
575
|
+
tokenAddress: ataInit.params.mintAddress,
|
|
576
|
+
});
|
|
577
|
+
break;
|
|
578
|
+
case InstructionBuilderTypes.CustomInstruction:
|
|
579
|
+
// Custom instructions are arbitrary and cannot be explained
|
|
580
|
+
break;
|
|
581
|
+
default:
|
|
582
|
+
continue;
|
|
583
|
+
}
|
|
584
|
+
// After deserializing a transaction, durable nonce details are populated in the nonceInfo field
|
|
585
|
+
if (!durableNonce && this._solTransaction.nonceInfo) {
|
|
586
|
+
const nonceAdvanceInstruction = SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
|
|
587
|
+
durableNonce = {
|
|
588
|
+
authWalletAddress: nonceAdvanceInstruction.authorizedPubkey.toString(),
|
|
589
|
+
walletNonceAddress: nonceAdvanceInstruction.noncePubkey.toString(),
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
return this.getExplainedTransaction(outputAmount, outputs, memo, durableNonce, tokenEnablements);
|
|
594
|
+
}
|
|
595
|
+
calculateFee() {
|
|
596
|
+
if (this.lamportsPerSignature || this.tokenAccountRentExemptAmount) {
|
|
597
|
+
const signatureFees = this.lamportsPerSignature
|
|
598
|
+
? new BigNumber(this.lamportsPerSignature).multipliedBy(this.numberOfRequiredSignatures).toFixed(0)
|
|
599
|
+
: 0;
|
|
600
|
+
const rentFees = this.tokenAccountRentExemptAmount
|
|
601
|
+
? new BigNumber(this.tokenAccountRentExemptAmount).multipliedBy(this.numberOfATACreationInstructions).toFixed(0)
|
|
602
|
+
: 0;
|
|
603
|
+
return new BigNumber(signatureFees).plus(rentFees).toFixed(0);
|
|
604
|
+
}
|
|
605
|
+
return UNAVAILABLE_TEXT;
|
|
606
|
+
}
|
|
607
|
+
getExplainedTransaction(outputAmount, outputs, memo = undefined, durableNonce = undefined, tokenEnablements = []) {
|
|
608
|
+
const feeString = this.calculateFee();
|
|
609
|
+
// Create displayOrder with tokenEnablements always included
|
|
610
|
+
const displayOrder = [
|
|
611
|
+
'id',
|
|
612
|
+
'type',
|
|
613
|
+
'blockhash',
|
|
614
|
+
'durableNonce',
|
|
615
|
+
'outputAmount',
|
|
616
|
+
'changeAmount',
|
|
617
|
+
'outputs',
|
|
618
|
+
'changeOutputs',
|
|
619
|
+
'tokenEnablements',
|
|
620
|
+
'fee',
|
|
621
|
+
'memo',
|
|
622
|
+
];
|
|
623
|
+
// Create the base explanation object with tokenEnablements always included
|
|
624
|
+
const explanation = {
|
|
625
|
+
displayOrder,
|
|
626
|
+
id: this.id,
|
|
627
|
+
type: TransactionType[this.type].toString(),
|
|
628
|
+
changeOutputs: [],
|
|
629
|
+
changeAmount: '0',
|
|
630
|
+
outputAmount: outputAmount.toFixed(0),
|
|
631
|
+
outputs: outputs,
|
|
632
|
+
fee: {
|
|
633
|
+
fee: feeString,
|
|
634
|
+
feeRate: this.lamportsPerSignature,
|
|
635
|
+
},
|
|
636
|
+
memo: memo,
|
|
637
|
+
blockhash: this.getNonce(),
|
|
638
|
+
durableNonce: durableNonce,
|
|
639
|
+
tokenEnablements: tokenEnablements,
|
|
640
|
+
};
|
|
641
|
+
return explanation;
|
|
642
|
+
}
|
|
643
|
+
explainRawMsgAuthorizeTransaction() {
|
|
644
|
+
const { instructions } = this._solTransaction;
|
|
645
|
+
const nonceInstruction = SystemInstruction.decodeNonceAdvance(instructions[0]);
|
|
646
|
+
const durableNonce = {
|
|
647
|
+
walletNonceAddress: nonceInstruction.noncePubkey.toString(),
|
|
648
|
+
authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
|
|
649
|
+
};
|
|
650
|
+
const data = instructions[1].data.toString('hex');
|
|
651
|
+
const stakingAuthorizeParams = data === validInstructionData
|
|
652
|
+
? {
|
|
653
|
+
stakingAddress: instructions[1].keys[0].pubkey.toString(),
|
|
654
|
+
oldWithdrawAddress: instructions[1].keys[2].pubkey.toString(),
|
|
655
|
+
newWithdrawAddress: instructions[1].keys[3].pubkey.toString(),
|
|
656
|
+
custodianAddress: instructions[1].keys[4].pubkey.toString(),
|
|
657
|
+
}
|
|
658
|
+
: {
|
|
659
|
+
stakingAddress: instructions[1].keys[0].pubkey.toString(),
|
|
660
|
+
oldWithdrawAddress: '',
|
|
661
|
+
newWithdrawAddress: '',
|
|
662
|
+
oldStakingAuthorityAddress: instructions[1].keys[2].pubkey.toString(),
|
|
663
|
+
newStakingAuthorityAddress: instructions[1].keys[3].pubkey.toString(),
|
|
664
|
+
};
|
|
665
|
+
const feeString = this.calculateFee();
|
|
666
|
+
return {
|
|
667
|
+
displayOrder: [
|
|
668
|
+
'id',
|
|
669
|
+
'type',
|
|
670
|
+
'blockhash',
|
|
671
|
+
'durableNonce',
|
|
672
|
+
'outputAmount',
|
|
673
|
+
'changeAmount',
|
|
674
|
+
'outputs',
|
|
675
|
+
'changeOutputs',
|
|
676
|
+
'tokenEnablements',
|
|
677
|
+
'fee',
|
|
678
|
+
'memo',
|
|
679
|
+
],
|
|
680
|
+
id: this.id,
|
|
681
|
+
type: TransactionType[this.type].toString(),
|
|
682
|
+
changeOutputs: [],
|
|
683
|
+
changeAmount: '0',
|
|
684
|
+
outputAmount: 0,
|
|
685
|
+
outputs: [],
|
|
686
|
+
fee: {
|
|
687
|
+
fee: feeString,
|
|
688
|
+
feeRate: this.lamportsPerSignature,
|
|
689
|
+
},
|
|
690
|
+
blockhash: this.getNonce(),
|
|
691
|
+
durableNonce: durableNonce,
|
|
692
|
+
stakingAuthorize: stakingAuthorizeParams,
|
|
693
|
+
tokenEnablements: [], // Always include tokenEnablements as an empty array for consistency
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxlQUFlLEVBRWYsdUJBQXVCLEVBRXZCLHFCQUFxQixFQUNyQixZQUFZLEVBRVosZUFBZSxHQUNoQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFFTCxTQUFTLEVBRVQsV0FBVyxJQUFJLGNBQWMsRUFDN0IsaUJBQWlCLEdBRWxCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQ3JDLE9BQU8sTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUscUJBQXFCLEVBQVcsTUFBTSxHQUFHLENBQUM7QUFDbkQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLHlCQUF5QixHQUMxQixNQUFNLGFBQWEsQ0FBQztBQWlCckIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQix5QkFBeUIsR0FDMUIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsTUFBTSxPQUFPLFdBQVksU0FBUSxlQUFlO0lBWTlDLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBUlgsc0JBQWlCLEdBQXdCLEVBQUUsQ0FBQztRQUM5Qyw4QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFRMUMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLEVBQWtCO1FBQ25DLElB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RSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JFLDBCQUEwQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTthQUN0RSxDQUFDO1FBQ1IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE9BQU87WUFDTCxZQUFZLEVBQUU7Z0JBQ1osSUFBSTtnQkFDSixNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsY0FBYztnQkFDZCxjQUFjO2dCQUNkLGNBQWM7Z0JBQ2QsU0FBUztnQkFDVCxlQUFlO2dCQUNmLGtCQUFrQjtnQkFDbEIsS0FBSztnQkFDTCxNQUFNO2FBQ1A7WUFDRCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDM0MsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLEdBQUcsRUFBRTtnQkFDSCxHQUFHLEVBQUUsU0FBUztnQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUNuQztZQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzFCLFlBQVksRUFBRSxZQUFZO1lBQzFCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsb0VBQW9FO1NBQzNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQdWJsaWNLZXkgYXMgQmFzZVB1YmxpY0tleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIElUb2tlbkVuYWJsZW1lbnQsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCbG9ja2hhc2gsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmVyLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IGV4cGxhaW5Tb2xUcmFuc2FjdGlvbiwgS2V5UGFpciB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsXG4gIFVOQVZBSUxBQkxFX1RFWFQsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFJbml0LFxuICBEdXJhYmxlTm9uY2VQYXJhbXMsXG4gIEluc3RydWN0aW9uUGFyYW1zLFxuICBNZW1vLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyLFxuICBUeERhdGEsXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgV2FsbGV0SW5pdCxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkgfSBmcm9tICcuL2luc3RydWN0aW9uUGFyYW1zRmFjdG9yeSc7XG5pbXBvcnQge1xuICBnZXRJbnN0cnVjdGlvblR5cGUsXG4gIGdldFRyYW5zYWN0aW9uVHlwZSxcbiAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uLFxuICByZXF1aXJlc0FsbFNpZ25hdHVyZXMsXG4gIHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfc29sVHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9sYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcm90ZWN0ZWQgX2luc3RydWN0aW9uc0RhdGE6IEluc3RydWN0aW9uUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZlcnNpb25lZFRyYW5zYWN0aW9uOiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3YxVHJhbnNhY3Rpb25CeXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdjFNZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHNvbFRyYW5zYWN0aW9uKCk6IFNvbFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc29sVHJhbnNhY3Rpb24odHg6IFNvbFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmNvbXBpbGVNZXNzYWdlKCkuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLmZpbHRlcihcbiAgICAgIChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fdjFNZXNzYWdlQnl0ZXMpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92MU1lc3NhZ2VCeXRlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLm1lc3NhZ2Uuc2VyaWFsaXplKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplTWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAvLyBTb2xhbmEgdHJhbnNhY3Rpb24gSUQgPT09IGZpcnN0IHNpZ25hdHVyZTogaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjdHJhbnNhY3Rpb24taWRcbiAgICBpZiAodGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzKSB7XG4gICAgICAvLyB2MSB3aXJlIGZvcm1hdDogbWVzc2FnZUJ5dGVzIGZvbGxvd2VkIGJ5IDY0LWJ5dGUgc2lnbmF0dXJlczsgdGhlIGZpcnN0IHNpZ25hdHVyZSBpcyB0aGUgdHggaWRcbiAgICAgIGNvbnN0IG51bVJlcXVpcmVkID0gdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzWzFdO1xuICAgICAgY29uc3Qgc2lnU3RhcnQgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMubGVuZ3RoIC0gbnVtUmVxdWlyZWQgKiA2NDtcbiAgICAgIGlmIChudW1SZXF1aXJlZCA+IDAgJiYgc2lnU3RhcnQgPj0gMCkge1xuICAgICAgICBjb25zdCBzaWcgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMuc2xpY2Uoc2lnU3RhcnQsIHNpZ1N0YXJ0ICsgNjQpO1xuICAgICAgICBpZiAoc2lnLnNvbWUoKGJ5dGUpID0+IGJ5dGUgIT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGJhc2U1OC5lbmNvZGUoc2lnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgY29uc3Qgc2lnID0gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlcz8uWzBdO1xuICAgICAgLy8gQ2hlY2sgaWYgc2lnbmF0dXJlIGV4aXN0cyBhbmQgaXMgbm90IGEgcGxhY2Vob2xkZXIgc2lnbmF0dXJlIChhbGwgemVyb3MpXG4gICAgICBpZiAoc2lnICYmIHNpZy5zb21lKChieXRlKSA9PiBieXRlICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gYmFzZTU4LmVuY29kZShzaWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUpIHtcbiAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBnZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBzZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUobGFtcG9ydHNQZXJTaWduYXR1cmU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID0gbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBnZXQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50O1xuICB9XG5cbiAgc2V0IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQodG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCA9IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMpIHtcbiAgICAgIC8vIHYxIHdpcmUgZm9ybWF0OiBtZXNzYWdlQnl0ZXMgZm9sbG93ZWQgYnkgNjQtYnl0ZSBzaWduYXR1cmVzOyBmaWx0ZXIgb3V0XG4gICAgICAvLyB6ZXJvLWZpbGxlZCBwbGFjZWhvbGRlciBzbG90cyAodW5zaWduZWQgc2lnbmVycylcbiAgICAgIGNvbnN0IG51bVJlcXVpcmVkID0gdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzWzFdO1xuICAgICAgY29uc3Qgc2lnU3RhcnQgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMubGVuZ3RoIC0gbnVtUmVxdWlyZWQgKiA2NDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUmVxdWlyZWQ7IGkrKykge1xuICAgICAgICBjb25zdCBzaWcgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMuc2xpY2Uoc2lnU3RhcnQgKyBpICogNjQsIHNpZ1N0YXJ0ICsgKGkgKyAxKSAqIDY0KTtcbiAgICAgICAgaWYgKHNpZy5zb21lKChiKSA9PiBiICE9PSAwKSkge1xuICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIEhhbmRsZSBWZXJzaW9uZWRUcmFuc2FjdGlvbiBzaWduYXR1cmVzXG4gICAgICBmb3IgKGNvbnN0IHNpZyBvZiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVzKSB7XG4gICAgICAgIC8vIEZpbHRlcnMgb3V0IHBsYWNlaG9sZGVyIHNpZ25hdHVyZXNcbiAgICAgICAgaWYgKHNpZyAmJiBzaWcuc29tZSgoYikgPT4gYiAhPT0gMCkpIHtcbiAgICAgICAgICBzaWduYXR1cmVzLnB1c2goYmFzZTU4LmVuY29kZShzaWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgbGVnYWN5IHRyYW5zYWN0aW9uIHNpZ25hdHVyZXNcbiAgICAgIGZvciAoY29uc3Qgc29sU2lnbmF0dXJlIG9mIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZXMpIHtcbiAgICAgICAgaWYgKHNvbFNpZ25hdHVyZS5zaWduYXR1cmUpIHtcbiAgICAgICAgICBzaWduYXR1cmVzLnB1c2goYmFzZTU4LmVuY29kZShzb2xTaWduYXR1cmUuc2lnbmF0dXJlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGluc3RydWN0aW9uRGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbkRhdGEgVGhlIGluc3RydWN0aW9uIGRhdGEgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0SW5zdHJ1Y3Rpb25zRGF0YShpbnN0cnVjdGlvbkRhdGE6IEluc3RydWN0aW9uUGFyYW1zW10pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gaW5zdHJ1Y3Rpb25EYXRhO1xuICB9XG5cbiAgZ2V0IHVzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lO1xuICB9XG5cbiAgc2V0VXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBhIFZlcnNpb25lZFRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoaXMgaXMgYSBWZXJzaW9uZWRUcmFuc2FjdGlvblxuICAgKi9cbiAgaXNWZXJzaW9uZWRUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbiB8fCAhIXRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8fCAhIXRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlcmlhbGl6ZWQgdjEgd2lyZSB0cmFuc2FjdGlvbiBieXRlcyAobWVzc2FnZSArIHNpZ25hdHVyZXMpLCBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHYxXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBUaGUgdjEgd2lyZSBieXRlcyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldCB2MVRyYW5zYWN0aW9uQnl0ZXMoKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNlcmlhbGl6ZWQgdjEgd2lyZSB0cmFuc2FjdGlvbiBieXRlcyAobWVzc2FnZSArIHNpZ25hdHVyZXMpXG4gICAqIEBwYXJhbSB7VWludDhBcnJheSB8IHVuZGVmaW5lZH0gYnl0ZXMgVGhlIHYxIHdpcmUgYnl0ZXMgdG8gc3RvcmUsIG9yIHVuZGVmaW5lZCB0byBjbGVhclxuICAgKi9cbiAgc2V0IHYxVHJhbnNhY3Rpb25CeXRlcyhieXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcyA9IGJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VyaWFsaXplZCB2MSBtZXNzYWdlIGJ5dGVzICh3aXRob3V0IHNpZ25hdHVyZXMpLCBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHYxXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBUaGUgdjEgbWVzc2FnZSBieXRlcyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldCB2MU1lc3NhZ2VCeXRlcygpOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdjFNZXNzYWdlQnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzZXJpYWxpemVkIHYxIG1lc3NhZ2UgYnl0ZXMgKHdpdGhvdXQgc2lnbmF0dXJlcylcbiAgICogQHBhcmFtIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBieXRlcyBUaGUgdjEgbWVzc2FnZSBieXRlcyB0byBzdG9yZSwgb3IgdW5kZWZpbmVkIHRvIGNsZWFyXG4gICAqL1xuICBzZXQgdjFNZXNzYWdlQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92MU1lc3NhZ2VCeXRlcyA9IGJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3JpZ2luYWwgVmVyc2lvbmVkVHJhbnNhY3Rpb24gaWYgdGhpcyB0cmFuc2FjdGlvbiB3YXMgcGFyc2VkIGZyb20gb25lXG4gICAqIEByZXR1cm5zIHtWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZH0gVGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0IHZlcnNpb25lZFRyYW5zYWN0aW9uKCk6IFZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgYnVpbHQgVmVyc2lvbmVkVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtWZXJzaW9uZWRUcmFuc2FjdGlvbn0gdmVyc2lvbmVkVHggVGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uIHRvIHNldFxuICAgKi9cbiAgc2V0IHZlcnNpb25lZFRyYW5zYWN0aW9uKHZlcnNpb25lZFR4OiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uID0gdmVyc2lvbmVkVHg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdG9yZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhXG4gICAqIEByZXR1cm5zIHtWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWR9IFRoZSBzdG9yZWQgZGF0YSBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSgpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWR9IGRhdGEgVGhlIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhIHRvIHN0b3JlLCBvciB1bmRlZmluZWQgdG8gY2xlYXJcbiAgICovXG4gIHNldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpZ25hdHVyZSBwcm9kdWNlZCBieSB0aGUgZmVlIHBheWVyIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZSBmZWUgcGF5ZXIgaXMgYWNjb3VudCAwIG9mIHRoZSB0cmFuc2FjdGlvbiBtZXNzYWdlLCBzbyBpdHMgc2lnbmF0dXJlIGJlbG9uZ3MgaW4gc2xvdCAwLlxuICAgKiBVc2UgdGhpcyBmb3Igc2lnbmF0dXJlcyBwcm9kdWNlZCBieSB0aGUgZW50ZXJwcmlzZSBmZWUgYWRkcmVzcyBrZXkgKEhTTSBzaW5nbGUtc2lnKSBvZiBhXG4gICAqIHNwb25zb3JlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtCYXNlUHVibGljS2V5fSBwdWJsaWNLZXkgVGhlIHB1YmxpYyBrZXkgb2YgdGhlIGZlZSBwYXllcjsgbXVzdCBiZSBhY2NvdW50IDAgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNpZ25hdHVyZSBUaGUgc2lnbmF0dXJlIG9mIHRoZSB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqL1xuICBhZGRGZWVQYXllclNpZ25hdHVyZShwdWJsaWNLZXk6IEJhc2VQdWJsaWNLZXksIHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICBjb25zdCBhY2NvdW50MCA9IHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLm1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXNbMF0/LnRvQmFzZTU4KCk7XG4gICAgICBpZiAocHVibGljS2V5LnB1YiAhPT0gYWNjb3VudDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihgRmVlIHBheWVyIHNpZ25hdHVyZSBtdXN0IGNvbWUgZnJvbSBhY2NvdW50IDAgb2YgdGhlIG1lc3NhZ2UsIGdvdDogJHtwdWJsaWNLZXkucHVifWApO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uYWRkU2lnbmF0dXJlKG5ldyBQdWJsaWNLZXkocHVibGljS2V5LnB1YiksIHNpZ25hdHVyZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBGb3IgbGVnYWN5IHRyYW5zYWN0aW9ucyBAc29sYW5hL3dlYjMuanMgcGxhY2VzIHRoZSBmZWUgcGF5ZXIgZmlyc3QgaW4gdGhlIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGZlZVBheWVyID0gdGhpcy5fc29sVHJhbnNhY3Rpb24uZmVlUGF5ZXI/LnRvQmFzZTU4KCk7XG4gICAgICBpZiAocHVibGljS2V5LnB1YiAhPT0gZmVlUGF5ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihgRmVlIHBheWVyIHNpZ25hdHVyZSBtdXN0IGNvbWUgZnJvbSBhY2NvdW50IDAgb2YgdGhlIG1lc3NhZ2UsIGdvdDogJHtwdWJsaWNLZXkucHVifWApO1xuICAgICAgfVxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uYWRkU2lnbmF0dXJlKG5ldyBQdWJsaWNLZXkocHVibGljS2V5LnB1YiksIHNpZ25hdHVyZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignRmVlIHBheWVyIHNpZ25hdHVyZSByZXF1aXJlcyBhIGJ1aWx0IHRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFNpZ25lciBrZXlzLlxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyW10gfCBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ29udmVydCB0byBhcnJheSBhbmQgYnVpbGQgc2lnbmVycyBsaXN0XG4gICAgY29uc3Qga2V5UGFpcnMgPSBrZXlQYWlyIGluc3RhbmNlb2YgQXJyYXkgPyBrZXlQYWlyIDogW2tleVBhaXJdO1xuICAgIGNvbnN0IHNpZ25lcnM6IFNpZ25lcltdID0gW107XG4gICAgZm9yIChjb25zdCBrcCBvZiBrZXlQYWlycykge1xuICAgICAgY29uc3Qga2V5cyA9IGtwLmdldEtleXModHJ1ZSk7XG4gICAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICAgIHNpZ25lcnMucHVzaCh7IHB1YmxpY0tleTogbmV3IFB1YmxpY0tleShrZXlzLnB1YiksIHNlY3JldEtleToga2V5cy5wcnYgYXMgVWludDhBcnJheSB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIGlmICghdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24ubWVzc2FnZS5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTm9uY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLnNpZ24oc2lnbmVycyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbiB8fCAhdGhpcy5fc29sVHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdOb25jZSBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uIHx8ICF0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignZmVlUGF5ZXIgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICB9XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24ucGFydGlhbFNpZ24oLi4uc2lnbmVycyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzKSB7XG4gICAgICAvLyB2MSB3aXJlIGZvcm1hdCBpcyBtZXNzYWdlLWZpcnN0IHdpdGggc2lnbmF0dXJlcyBhcHBlbmRlZCAobm8gbGVuZ3RoIHByZWZpeClcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIFZlcnNpb25lZFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSgpIGRvZXNuJ3QgbmVlZCByZXF1aXJlQWxsU2lnbmF0dXJlcyBwYXJhbWV0ZXJcbiAgICAgIC8vIEl0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB3aGF0ZXZlciBzaWduYXR1cmVzIGFyZSBwcmVzZW50XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICAvLyBUaGUgc2lnbmF0dXJlcyBjYW4gaGF2ZSBudWxsIHNpZ25hdHVyZXMgKHdoaWNoIG1lYW5zIHRoZXkgYXJlIHJlcXVpcmVkIGJ1dCB5ZXQgdW5zaWduZWQpXG4gICAgLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzZXJpYWxpemVyIHRoZSB0eHMsIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSByZXF1aXJlQWxsU2lnbmF0dXJlcyBiYXNlZFxuICAgIC8vIG9uIGlmIHRoZSBUWCBpcyBmdWxseSBzaWduZWQgb3Igbm90XG4gICAgY29uc3QgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSByZXF1aXJlc0FsbFNpZ25hdHVyZXModGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcyk7XG4gICAgLy8gQmFzZWQgb24gdGhlIHJlY29tZW5kYXRpb24gZW5jb2RpbmcgZm91bmQgaGVyZSBodHRwczovL2RvY3Muc29sYW5hLmNvbS9kZXZlbG9waW5nL2NsaWVudHMvanNvbnJwYy1hcGkjc2VuZHRyYW5zYWN0aW9uXG4gICAgLy8gV2UgdXNlIGJhc2U2NCBlbmNvZGluZ1xuICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlcyB9KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSAmJiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5faWQgPSBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSBnZXRUcmFuc2FjdGlvblR5cGUodGhpcy5fc29sVHJhbnNhY3Rpb24pO1xuICAgICAgc3dpdGNoICh0cmFuc2FjdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbmZpZGVudGlhbFRyYW5zZmVyOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5Db25maWRlbnRpYWxUcmFuc2Zlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb25UeXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdykge1xuICAgICAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgY29uc3Qgbm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZSh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2VJbnN0cnVjdGlvbik7XG4gICAgICBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gICAgICB0aGlzLl90eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG4gICAgaWYgKHRoaXMuX3R5cGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWR1cmFibGVOb25jZSAmJlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGEubGVuZ3RoID4gMSAmJlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGFbMF0udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlXG4gICAgICApIHtcbiAgICAgICAgZHVyYWJsZU5vbmNlID0gaW5zdHJ1Y3Rpb25EYXRhWzBdLnBhcmFtcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogdGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlID8gdGhpcy5pZCA6IHVuZGVmaW5lZCxcbiAgICAgIGZlZVBheWVyOiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcj8udG9TdHJpbmcoKSxcbiAgICAgIGxhbXBvcnRzUGVyU2lnbmF0dXJlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgbm9uY2U6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgbnVtU2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUubGVuZ3RoLFxuICAgICAgaW5zdHJ1Y3Rpb25zRGF0YTogaW5zdHJ1Y3Rpb25EYXRhLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5vbmNlIGZyb20gdGhlIFNvbGFuYSBUcmFuc2FjdGlvblxuICAgKiBUaHJvd3MgaWYgbm90IHNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXROb25jZSgpOiBCbG9ja2hhc2gge1xuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8pIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTm9uY2UgaXMgbm90IHNldCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24gfHwgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGluc3RydWN0aW9uUGFyYW1zID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICAgICAgdGhpcy50eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9uUGFyYW1zKSB7XG4gICAgICBzd2l0Y2ggKGluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQ6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nVHlwZSAhPT0gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE8pIHtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50ICYmXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudW5zdGFraW5nQWRkcmVzcyAmJlxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdUeXBlICE9PSBTb2xTdGFraW5nVHlwZUVudW0uSklUT1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbjpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBUZXN0bmV0IHVzZXMgV0FTTS1iYXNlZCBwYXJzaW5nIChubyBAc29sYW5hL3dlYjMuanMgZGVwZW5kZW5jeSkuXG4gICAgLy8gVGhpcyB2YWxpZGF0ZXMgdGhlIFdBU00gcGF0aCBhZ2FpbnN0IHByb2R1Y3Rpb24gdHJhZmZpYyBiZWZvcmVcbiAgICAvLyByZXBsYWNpbmcgdGhlIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIG5ldHdvcmtzLlxuICAgIGlmICh0aGlzLl9jb2luQ29uZmlnLm5hbWUgPT09ICd0c29sJykge1xuICAgICAgLy8gZXhwbGFpblRyYW5zYWN0aW9uIHNob3VsZCB3b3JrIG9uIHVuc2lnbmVkL3BhcnRpYWxseS1zaWduZWQgdHJhbnNhY3Rpb25zXG4gICAgICAvLyAoZS5nLiwgZHVyaW5nIHBhcnNlVHJhbnNhY3Rpb24gcm91bmQtdHJpcHMgd2hlcmUgbnVsbCBzaWduYXR1cmVzIGJlY29tZVxuICAgICAgLy8gemVyby1maWxsZWQgYnVmZmVycykuIFVzZSBzZXJpYWxpemUgd2l0aG91dCBzaWduYXR1cmUgdmFsaWRhdGlvbiBzaW5jZVxuICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIHJlYWQgdGhlIHRyYW5zYWN0aW9uLCBub3QgYnJvYWRjYXN0IGl0LlxuICAgICAgY29uc3QgdHhCYXNlNjQgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSB9KVxuICAgICAgKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICByZXR1cm4gZXhwbGFpblNvbFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQsXG4gICAgICAgIGZlZUluZm86IHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID8geyBmZWU6IHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlLnRvU3RyaW5nKCkgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCxcbiAgICAgICAgY29pbk5hbWU6IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZVJhd01zZ0luc3RydWN0aW9uKHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucykpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5SYXdNc2dBdXRob3JpemVUcmFuc2FjdGlvbigpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICAgICAgdGhpcy5fdHlwZSxcbiAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucyxcbiAgICAgIHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEsXG4gICAgICB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWVcbiAgICApO1xuXG4gICAgbGV0IG1lbW86IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW107XG4gICAgLy8gQ3JlYXRlIGEgc2VwYXJhdGUgYXJyYXkgZm9yIHRva2VuIGVuYWJsZW1lbnRzXG4gICAgY29uc3QgdG9rZW5FbmFibGVtZW50czogSVRva2VuRW5hYmxlbWVudFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGRlY29kZWRJbnN0cnVjdGlvbnMpIHtcbiAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZTpcbiAgICAgICAgICBkdXJhYmxlTm9uY2UgPSAoaW5zdHJ1Y3Rpb24gYXMgTm9uY2UpLnBhcmFtcztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vOlxuICAgICAgICAgIG1lbW8gPSAoaW5zdHJ1Y3Rpb24gYXMgTWVtbykucGFyYW1zLm1lbW87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFRyYW5zZmVyO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyh0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXI6XG4gICAgICAgICAgY29uc3QgdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgVG9rZW5UcmFuc2ZlcjtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQ6XG4gICAgICAgICAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBXYWxsZXRJbml0O1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMubm9uY2VBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICBjb25zdCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFN0YWtpbmdXaXRoZHJhdztcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgLy8gUHJvY2VzcyB0b2tlbiBlbmFibGVtZW50IGluc3RydWN0aW9ucyBhbmQgY29sbGVjdCB0aGVtIGluIHRoZSB0b2tlbkVuYWJsZW1lbnRzIGFycmF5XG4gICAgICAgICAgY29uc3QgYXRhSW5pdCA9IGluc3RydWN0aW9uIGFzIEF0YUluaXQ7XG4gICAgICAgICAgdG9rZW5FbmFibGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF0YUluaXQucGFyYW1zLmF0YUFkZHJlc3MsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IGF0YUluaXQucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICAgIHRva2VuQWRkcmVzczogYXRhSW5pdC5wYXJhbXMubWludEFkZHJlc3MsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb246XG4gICAgICAgICAgLy8gQ3VzdG9tIGluc3RydWN0aW9ucyBhcmUgYXJiaXRyYXJ5IGFuZCBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGRlc2VyaWFsaXppbmcgYSB0cmFuc2FjdGlvbiwgZHVyYWJsZSBub25jZSBkZXRhaWxzIGFyZSBwb3B1bGF0ZWQgaW4gdGhlIG5vbmNlSW5mbyBmaWVsZFxuICAgICAgaWYgKCFkdXJhYmxlTm9uY2UgJiYgdGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvKSB7XG4gICAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKFxuICAgICAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGR1cmFibGVOb25jZSA9IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRFeHBsYWluZWRUcmFuc2FjdGlvbihvdXRwdXRBbW91bnQsIG91dHB1dHMsIG1lbW8sIGR1cmFibGVOb25jZSwgdG9rZW5FbmFibGVtZW50cyk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUZlZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlIHx8IHRoaXMudG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlRmVlcyA9IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmVcbiAgICAgICAgPyBuZXcgQmlnTnVtYmVyKHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUpLm11bHRpcGxpZWRCeSh0aGlzLm51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKS50b0ZpeGVkKDApXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHJlbnRGZWVzID0gdGhpcy50b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50XG4gICAgICAgID8gbmV3IEJpZ051bWJlcih0aGlzLnRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQpLm11bHRpcGxpZWRCeSh0aGlzLm51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMpLnRvRml4ZWQoMClcbiAgICAgICAgOiAwO1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoc2lnbmF0dXJlRmVlcykucGx1cyhyZW50RmVlcykudG9GaXhlZCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RXhwbGFpbmVkVHJhbnNhY3Rpb24oXG4gICAgb3V0cHV0QW1vdW50OiBCaWdOdW1iZXIsXG4gICAgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSxcbiAgICBtZW1vOiB1bmRlZmluZWQgfCBzdHJpbmcgPSB1bmRlZmluZWQsXG4gICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQgfCBEdXJhYmxlTm9uY2VQYXJhbXMgPSB1bmRlZmluZWQsXG4gICAgdG9rZW5FbmFibGVtZW50czogSVRva2VuRW5hYmxlbWVudFtdID0gW11cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgZmVlU3RyaW5nID0gdGhpcy5jYWxjdWxhdGVGZWUoKTtcblxuICAgIC8vIENyZWF0ZSBkaXNwbGF5T3JkZXIgd2l0aCB0b2tlbkVuYWJsZW1lbnRzIGFsd2F5cyBpbmNsdWRlZFxuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICdpZCcsXG4gICAgICAndHlwZScsXG4gICAgICAnYmxvY2toYXNoJyxcbiAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICdvdXRwdXRzJyxcbiAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICdmZWUnLFxuICAgICAgJ21lbW8nLFxuICAgIF07XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJhc2UgZXhwbGFuYXRpb24gb2JqZWN0IHdpdGggdG9rZW5FbmFibGVtZW50cyBhbHdheXMgaW5jbHVkZWRcbiAgICBjb25zdCBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlW3RoaXMudHlwZV0udG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBvdXRwdXRBbW91bnQ6IG91dHB1dEFtb3VudC50b0ZpeGVkKDApLFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IGZlZVN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgICBtZW1vOiBtZW1vLFxuICAgICAgYmxvY2toYXNoOiB0aGlzLmdldE5vbmNlKCksXG4gICAgICBkdXJhYmxlTm9uY2U6IGR1cmFibGVOb25jZSxcbiAgICAgIHRva2VuRW5hYmxlbWVudHM6IHRva2VuRW5hYmxlbWVudHMsXG4gICAgfTtcblxuICAgIHJldHVybiBleHBsYW5hdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZXhwbGFpblJhd01zZ0F1dGhvcml6ZVRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0aGlzLl9zb2xUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBub25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uc1swXSk7XG4gICAgY29uc3QgZHVyYWJsZU5vbmNlID0ge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgfTtcbiAgICBjb25zdCBkYXRhID0gaW5zdHJ1Y3Rpb25zWzFdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHN0YWtpbmdBdXRob3JpemVQYXJhbXM6IFN0YWtpbmdBdXRob3JpemVQYXJhbXMgPVxuICAgICAgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRXaXRoZHJhd0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRXaXRoZHJhd0FkZHJlc3M6ICcnLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiAnJyxcbiAgICAgICAgICAgIG9sZFN0YWtpbmdBdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1N0YWtpbmdBdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgIGNvbnN0IGZlZVN0cmluZyA9IHRoaXMuY2FsY3VsYXRlRmVlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAnaWQnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAnZmVlJyxcbiAgICAgICAgJ21lbW8nLFxuICAgICAgXSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlW3RoaXMudHlwZV0udG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBvdXRwdXRBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IGZlZVN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgICBibG9ja2hhc2g6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgc3Rha2luZ0F1dGhvcml6ZTogc3Rha2luZ0F1dGhvcml6ZVBhcmFtcyxcbiAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLCAvLyBBbHdheXMgaW5jbHVkZSB0b2tlbkVuYWJsZW1lbnRzIGFzIGFuIGVtcHR5IGFycmF5IGZvciBjb25zaXN0ZW5jeVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|