@bitgo-beta/sdk-coin-sol 7.6.4-beta.73 → 7.6.4-beta.730
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,1272 @@
|
|
|
1
|
+
import { decodeTransferCheckedInstruction, decodeTransferCheckedWithFeeInstruction, decodeBurnInstruction, decodeMintToInstruction, TOKEN_2022_PROGRAM_ID, decodeApproveInstruction, TokenInstruction, TransferFeeInstruction, } from '@solana/spl-token';
|
|
2
|
+
import { StakeInstruction, StakeProgram, SystemInstruction, ComputeBudgetInstruction, } from '@solana/web3.js';
|
|
3
|
+
import { SolStakingTypeEnum } from '@bitgo/public-types';
|
|
4
|
+
import { NotSupported, TransactionType } from '@bitgo-beta/sdk-core';
|
|
5
|
+
import { coins, SolCoin } from '@bitgo-beta/statics';
|
|
6
|
+
import assert from 'assert';
|
|
7
|
+
import { InstructionBuilderTypes, ValidInstructionTypesEnum, walletInitInstructionIndexes } from './constants';
|
|
8
|
+
import { getInstructionType } from './utils';
|
|
9
|
+
import { decodeDepositSol, decodeWithdrawStake } from './jitoStakePoolOperations';
|
|
10
|
+
/**
|
|
11
|
+
* Construct instructions params from Solana instructions
|
|
12
|
+
*
|
|
13
|
+
* @param {TransactionType} type - the transaction type
|
|
14
|
+
* @param {TransactionInstruction[]} instructions - solana instructions
|
|
15
|
+
* @returns {InstructionParams[]} An array containing instruction params
|
|
16
|
+
*/
|
|
17
|
+
export function instructionParamsFactory(type, instructions, coinName, instructionMetadata, _useTokenAddressTokenName) {
|
|
18
|
+
switch (type) {
|
|
19
|
+
case TransactionType.WalletInitialization:
|
|
20
|
+
return parseWalletInitInstructions(instructions);
|
|
21
|
+
case TransactionType.Send:
|
|
22
|
+
return parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
|
|
23
|
+
case TransactionType.StakingActivate:
|
|
24
|
+
return parseStakingActivateInstructions(instructions);
|
|
25
|
+
case TransactionType.StakingDeactivate:
|
|
26
|
+
return parseStakingDeactivateInstructions(instructions, coinName);
|
|
27
|
+
case TransactionType.StakingWithdraw:
|
|
28
|
+
return parseStakingWithdrawInstructions(instructions);
|
|
29
|
+
case TransactionType.AssociatedTokenAccountInitialization:
|
|
30
|
+
return parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
|
|
31
|
+
case TransactionType.CloseAssociatedTokenAccount:
|
|
32
|
+
return parseAtaCloseInstructions(instructions);
|
|
33
|
+
case TransactionType.StakingAuthorize:
|
|
34
|
+
return parseStakingAuthorizeInstructions(instructions);
|
|
35
|
+
case TransactionType.StakingAuthorizeRaw:
|
|
36
|
+
return parseStakingAuthorizeRawInstructions(instructions);
|
|
37
|
+
case TransactionType.StakingDelegate:
|
|
38
|
+
return parseStakingDelegateInstructions(instructions);
|
|
39
|
+
case TransactionType.CustomTx:
|
|
40
|
+
return parseCustomInstructions(instructions, instructionMetadata);
|
|
41
|
+
case TransactionType.ConfidentialTransfer:
|
|
42
|
+
return parseConfidentialTransferInstructions(instructions, instructionMetadata);
|
|
43
|
+
default:
|
|
44
|
+
throw new NotSupported('Invalid transaction, transaction type not supported: ' + type);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parses Solana instructions to Wallet initialization tx instructions params
|
|
49
|
+
*
|
|
50
|
+
* @param {TransactionInstruction[]} instructions - containing create and initialize nonce solana instructions
|
|
51
|
+
* @returns {InstructionParams[]} An array containing instruction params for Wallet initialization tx
|
|
52
|
+
*/
|
|
53
|
+
function parseWalletInitInstructions(instructions) {
|
|
54
|
+
const instructionData = [];
|
|
55
|
+
// Compute-budget instructions can lead the transaction but are not part of the fixed
|
|
56
|
+
// wallet-init layout, so parse them apart from the indexed create/initialize instructions
|
|
57
|
+
const walletInitInstructions = instructions.filter((instruction) => !isComputeBudgetInstruction(instruction));
|
|
58
|
+
for (const instruction of instructions) {
|
|
59
|
+
if (isComputeBudgetInstruction(instruction)) {
|
|
60
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const createInstruction = SystemInstruction.decodeCreateAccount(walletInitInstructions[walletInitInstructionIndexes.Create]);
|
|
64
|
+
const nonceInitInstruction = SystemInstruction.decodeNonceInitialize(walletInitInstructions[walletInitInstructionIndexes.InitializeNonceAccount]);
|
|
65
|
+
const walletInit = {
|
|
66
|
+
type: InstructionBuilderTypes.CreateNonceAccount,
|
|
67
|
+
params: {
|
|
68
|
+
fromAddress: createInstruction.fromPubkey.toString(),
|
|
69
|
+
nonceAddress: nonceInitInstruction.noncePubkey.toString(),
|
|
70
|
+
authAddress: nonceInitInstruction.authorizedPubkey.toString(),
|
|
71
|
+
amount: createInstruction.lamports.toString(),
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
instructionData.push(walletInit);
|
|
75
|
+
const memo = getMemo(walletInitInstructions, walletInitInstructionIndexes);
|
|
76
|
+
if (memo) {
|
|
77
|
+
instructionData.push(memo);
|
|
78
|
+
}
|
|
79
|
+
return instructionData;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Returns whether the instruction is a compute-budget instruction (SetComputeUnitLimit or
|
|
83
|
+
* SetPriorityFee), which can lead any transaction without affecting its type or layout.
|
|
84
|
+
*
|
|
85
|
+
* @param {TransactionInstruction} instruction - the instruction to be checked
|
|
86
|
+
* @returns {boolean} true if the instruction is a compute-budget instruction
|
|
87
|
+
*/
|
|
88
|
+
function isComputeBudgetInstruction(instruction) {
|
|
89
|
+
const type = getInstructionType(instruction);
|
|
90
|
+
return type === ValidInstructionTypesEnum.SetComputeUnitLimit || type === ValidInstructionTypesEnum.SetPriorityFee;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parses a compute-budget instruction (SetComputeUnitLimit or SetPriorityFee) into its
|
|
94
|
+
* instructions params form.
|
|
95
|
+
*
|
|
96
|
+
* Compute-budget instructions are boilerplate that can lead any transaction, so every
|
|
97
|
+
* parser accepts them: initBuilder relies on them to restore the compute unit limit
|
|
98
|
+
* and the priority fee on a rebuild from raw, and explain filters them out.
|
|
99
|
+
*
|
|
100
|
+
* @param {TransactionInstruction} instruction - the compute-budget instruction to be parsed
|
|
101
|
+
* @returns {SetComputeUnitLimit | SetPriorityFee} the parsed instruction params
|
|
102
|
+
*/
|
|
103
|
+
function parseComputeBudgetInstruction(instruction) {
|
|
104
|
+
switch (getInstructionType(instruction)) {
|
|
105
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
106
|
+
const setComputeUnitLimitParams = ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction);
|
|
107
|
+
return {
|
|
108
|
+
type: InstructionBuilderTypes.SetComputeUnitLimit,
|
|
109
|
+
params: {
|
|
110
|
+
units: setComputeUnitLimitParams.units,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
114
|
+
const setComputeUnitPriceParams = ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
|
|
115
|
+
return {
|
|
116
|
+
type: InstructionBuilderTypes.SetPriorityFee,
|
|
117
|
+
params: {
|
|
118
|
+
fee: setComputeUnitPriceParams.microLamports,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
default:
|
|
122
|
+
throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parses Solana instructions to Send tx instructions params
|
|
127
|
+
* Only supports Memo, Transfer and Advance Nonce Solana instructions
|
|
128
|
+
*
|
|
129
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
130
|
+
* @returns {InstructionParams[]} An array containing instruction params for Send tx
|
|
131
|
+
*/
|
|
132
|
+
function parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
|
|
133
|
+
const instructionData = [];
|
|
134
|
+
for (const instruction of instructions) {
|
|
135
|
+
const type = getInstructionType(instruction);
|
|
136
|
+
switch (type) {
|
|
137
|
+
case ValidInstructionTypesEnum.Memo:
|
|
138
|
+
const memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
139
|
+
instructionData.push(memo);
|
|
140
|
+
break;
|
|
141
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
142
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
143
|
+
const nonce = {
|
|
144
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
145
|
+
params: {
|
|
146
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
147
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
instructionData.push(nonce);
|
|
151
|
+
break;
|
|
152
|
+
case ValidInstructionTypesEnum.Transfer:
|
|
153
|
+
const transferInstruction = SystemInstruction.decodeTransfer(instruction);
|
|
154
|
+
const transfer = {
|
|
155
|
+
type: InstructionBuilderTypes.Transfer,
|
|
156
|
+
params: {
|
|
157
|
+
fromAddress: transferInstruction.fromPubkey.toString(),
|
|
158
|
+
toAddress: transferInstruction.toPubkey.toString(),
|
|
159
|
+
amount: transferInstruction.lamports.toString(),
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
instructionData.push(transfer);
|
|
163
|
+
break;
|
|
164
|
+
case ValidInstructionTypesEnum.TokenTransfer:
|
|
165
|
+
const isToken2022Transfer = instruction.programId.toString() === TOKEN_2022_PROGRAM_ID.toString();
|
|
166
|
+
const isTransferWithFee = isToken2022Transfer &&
|
|
167
|
+
instruction.data.length >= 2 &&
|
|
168
|
+
instruction.data[0] === TokenInstruction.TransferFeeExtension &&
|
|
169
|
+
instruction.data[1] === TransferFeeInstruction.TransferCheckedWithFee;
|
|
170
|
+
let ttKeys;
|
|
171
|
+
let ttAmount;
|
|
172
|
+
let ttDecimals;
|
|
173
|
+
let ttFee;
|
|
174
|
+
if (isTransferWithFee) {
|
|
175
|
+
const decoded = decodeTransferCheckedWithFeeInstruction(instruction, TOKEN_2022_PROGRAM_ID);
|
|
176
|
+
// WithFee exposes `authority` where TransferChecked exposes `owner`; normalize to owner.
|
|
177
|
+
ttKeys = {
|
|
178
|
+
source: decoded.keys.source,
|
|
179
|
+
mint: decoded.keys.mint,
|
|
180
|
+
destination: decoded.keys.destination,
|
|
181
|
+
owner: decoded.keys.authority,
|
|
182
|
+
};
|
|
183
|
+
ttAmount = decoded.data.amount;
|
|
184
|
+
ttDecimals = decoded.data.decimals;
|
|
185
|
+
ttFee = decoded.data.fee.toString();
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const decoded = decodeTransferCheckedInstruction(instruction, isToken2022Transfer ? TOKEN_2022_PROGRAM_ID : undefined);
|
|
189
|
+
ttKeys = decoded.keys;
|
|
190
|
+
ttAmount = decoded.data.amount;
|
|
191
|
+
ttDecimals = decoded.data.decimals;
|
|
192
|
+
}
|
|
193
|
+
const tokenAddress = ttKeys.mint.pubkey.toString();
|
|
194
|
+
const tokenName = findTokenName(tokenAddress, instructionMetadata, _useTokenAddressTokenName);
|
|
195
|
+
let programIDForTokenTransfer;
|
|
196
|
+
if (instruction.programId) {
|
|
197
|
+
programIDForTokenTransfer = instruction.programId.toString();
|
|
198
|
+
}
|
|
199
|
+
const transferHookAccounts = findTransferHookAccounts(ttKeys.owner.pubkey.toString(), ttKeys.destination.pubkey.toString(), tokenAddress, instructionMetadata);
|
|
200
|
+
const tokenTransfer = {
|
|
201
|
+
type: InstructionBuilderTypes.TokenTransfer,
|
|
202
|
+
params: {
|
|
203
|
+
fromAddress: ttKeys.owner.pubkey.toString(),
|
|
204
|
+
toAddress: ttKeys.destination.pubkey.toString(),
|
|
205
|
+
amount: ttAmount.toString(),
|
|
206
|
+
tokenName,
|
|
207
|
+
sourceAddress: ttKeys.source.pubkey.toString(),
|
|
208
|
+
tokenAddress: tokenAddress,
|
|
209
|
+
programId: programIDForTokenTransfer,
|
|
210
|
+
decimalPlaces: ttDecimals,
|
|
211
|
+
...(ttFee !== undefined ? { fee: ttFee } : {}),
|
|
212
|
+
...(transferHookAccounts ? { transferHookAccounts } : {}),
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
instructionData.push(tokenTransfer);
|
|
216
|
+
break;
|
|
217
|
+
case ValidInstructionTypesEnum.Approve:
|
|
218
|
+
const programId = instruction.programId.equals(TOKEN_2022_PROGRAM_ID) ? TOKEN_2022_PROGRAM_ID : undefined;
|
|
219
|
+
const approveInstruction = decodeApproveInstruction(instruction, programId);
|
|
220
|
+
const approve = {
|
|
221
|
+
type: InstructionBuilderTypes.Approve,
|
|
222
|
+
params: {
|
|
223
|
+
accountAddress: approveInstruction.keys.account.toString(),
|
|
224
|
+
delegateAddress: approveInstruction.keys.delegate.toString(),
|
|
225
|
+
ownerAddress: approveInstruction.keys.owner.toString(),
|
|
226
|
+
amount: approveInstruction.data.amount.toString(),
|
|
227
|
+
programId: programId && programId.toString(),
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
instructionData.push(approve);
|
|
231
|
+
break;
|
|
232
|
+
case ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
|
|
233
|
+
const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
|
|
234
|
+
const mintTokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
|
|
235
|
+
let programID;
|
|
236
|
+
if (instruction.programId) {
|
|
237
|
+
programID = instruction.programId.toString();
|
|
238
|
+
}
|
|
239
|
+
const ataInit = {
|
|
240
|
+
type: InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
241
|
+
params: {
|
|
242
|
+
mintAddress,
|
|
243
|
+
ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
|
|
244
|
+
ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
|
|
245
|
+
payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
|
|
246
|
+
tokenName: mintTokenName,
|
|
247
|
+
programId: programID,
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
instructionData.push(ataInit);
|
|
251
|
+
break;
|
|
252
|
+
case ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
|
|
253
|
+
const accountAddress = instruction.keys[closeAtaInstructionKeysIndexes.AccountAddress].pubkey.toString();
|
|
254
|
+
const destinationAddress = instruction.keys[closeAtaInstructionKeysIndexes.DestinationAddress].pubkey.toString();
|
|
255
|
+
const authorityAddress = instruction.keys[closeAtaInstructionKeysIndexes.AuthorityAddress].pubkey.toString();
|
|
256
|
+
const ataClose = {
|
|
257
|
+
type: InstructionBuilderTypes.CloseAssociatedTokenAccount,
|
|
258
|
+
params: {
|
|
259
|
+
accountAddress,
|
|
260
|
+
destinationAddress,
|
|
261
|
+
authorityAddress,
|
|
262
|
+
...(instruction.programId.equals(TOKEN_2022_PROGRAM_ID)
|
|
263
|
+
? { programId: instruction.programId.toString() }
|
|
264
|
+
: {}),
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
instructionData.push(ataClose);
|
|
268
|
+
break;
|
|
269
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
270
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
271
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
272
|
+
break;
|
|
273
|
+
case ValidInstructionTypesEnum.MintTo:
|
|
274
|
+
let mintToInstruction;
|
|
275
|
+
if (instruction.programId.toString() !== TOKEN_2022_PROGRAM_ID.toString()) {
|
|
276
|
+
mintToInstruction = decodeMintToInstruction(instruction);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
mintToInstruction = decodeMintToInstruction(instruction, TOKEN_2022_PROGRAM_ID);
|
|
280
|
+
}
|
|
281
|
+
const mintAddressForMint = mintToInstruction.keys.mint.pubkey.toString();
|
|
282
|
+
const tokenNameForMint = findTokenName(mintAddressForMint, instructionMetadata, _useTokenAddressTokenName);
|
|
283
|
+
let programIDForMint;
|
|
284
|
+
if (instruction.programId) {
|
|
285
|
+
programIDForMint = instruction.programId.toString();
|
|
286
|
+
}
|
|
287
|
+
const mintTo = {
|
|
288
|
+
type: InstructionBuilderTypes.MintTo,
|
|
289
|
+
params: {
|
|
290
|
+
mintAddress: mintAddressForMint,
|
|
291
|
+
destinationAddress: mintToInstruction.keys.destination.pubkey.toString(),
|
|
292
|
+
authorityAddress: mintToInstruction.keys.authority.pubkey.toString(),
|
|
293
|
+
amount: mintToInstruction.data.amount.toString(),
|
|
294
|
+
tokenName: tokenNameForMint,
|
|
295
|
+
decimalPlaces: undefined,
|
|
296
|
+
programId: programIDForMint,
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
instructionData.push(mintTo);
|
|
300
|
+
break;
|
|
301
|
+
case ValidInstructionTypesEnum.Burn:
|
|
302
|
+
let burnInstruction;
|
|
303
|
+
if (instruction.programId.toString() !== TOKEN_2022_PROGRAM_ID.toString()) {
|
|
304
|
+
burnInstruction = decodeBurnInstruction(instruction);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
burnInstruction = decodeBurnInstruction(instruction, TOKEN_2022_PROGRAM_ID);
|
|
308
|
+
}
|
|
309
|
+
const mintAddressForBurn = burnInstruction.keys.mint.pubkey.toString();
|
|
310
|
+
const tokenNameForBurn = findTokenName(mintAddressForBurn, instructionMetadata, _useTokenAddressTokenName);
|
|
311
|
+
let programIDForBurn;
|
|
312
|
+
if (instruction.programId) {
|
|
313
|
+
programIDForBurn = instruction.programId.toString();
|
|
314
|
+
}
|
|
315
|
+
const burn = {
|
|
316
|
+
type: InstructionBuilderTypes.Burn,
|
|
317
|
+
params: {
|
|
318
|
+
mintAddress: mintAddressForBurn,
|
|
319
|
+
accountAddress: burnInstruction.keys.account.pubkey.toString(),
|
|
320
|
+
authorityAddress: burnInstruction.keys.owner.pubkey.toString(),
|
|
321
|
+
amount: burnInstruction.data.amount.toString(),
|
|
322
|
+
tokenName: tokenNameForBurn,
|
|
323
|
+
decimalPlaces: undefined,
|
|
324
|
+
programId: programIDForBurn,
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
instructionData.push(burn);
|
|
328
|
+
break;
|
|
329
|
+
case ValidInstructionTypesEnum.PermissionlessThawIdempotent:
|
|
330
|
+
// Account order matches the fixed layout emitted by solInstructionFactory:
|
|
331
|
+
// [authority, mint, tokenAccount, flagAccount, tokenAccountOwner, mintConfig,
|
|
332
|
+
// tokenProgram, systemProgram, gatingProgram, ...extraAccounts].
|
|
333
|
+
const thawExtraAccounts = instruction.keys.slice(9).map((key) => ({
|
|
334
|
+
pubkey: key.pubkey.toString(),
|
|
335
|
+
isSigner: key.isSigner,
|
|
336
|
+
isWritable: key.isWritable,
|
|
337
|
+
}));
|
|
338
|
+
const permissionlessThaw = {
|
|
339
|
+
type: InstructionBuilderTypes.PermissionlessThawIdempotent,
|
|
340
|
+
params: {
|
|
341
|
+
authority: instruction.keys[0].pubkey.toString(),
|
|
342
|
+
mint: instruction.keys[1].pubkey.toString(),
|
|
343
|
+
tokenAccount: instruction.keys[2].pubkey.toString(),
|
|
344
|
+
flagAccount: instruction.keys[3].pubkey.toString(),
|
|
345
|
+
tokenAccountOwner: instruction.keys[4].pubkey.toString(),
|
|
346
|
+
mintConfig: instruction.keys[5].pubkey.toString(),
|
|
347
|
+
tokenProgram: instruction.keys[6].pubkey.toString(),
|
|
348
|
+
systemProgram: instruction.keys[7].pubkey.toString(),
|
|
349
|
+
gatingProgram: instruction.keys[8].pubkey.toString(),
|
|
350
|
+
extraAccounts: thawExtraAccounts,
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
instructionData.push(permissionlessThaw);
|
|
354
|
+
break;
|
|
355
|
+
default:
|
|
356
|
+
throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return instructionData;
|
|
360
|
+
}
|
|
361
|
+
function isJitoStakingInstructions(si) {
|
|
362
|
+
return si.depositSol !== undefined;
|
|
363
|
+
}
|
|
364
|
+
function isMarinadeStakingInstructions(si) {
|
|
365
|
+
return si.create !== undefined && si.initialize !== undefined && si.delegate === undefined;
|
|
366
|
+
}
|
|
367
|
+
function isNativeStakingInstructions(si) {
|
|
368
|
+
return si.create !== undefined && si.initialize !== undefined && si.delegate !== undefined;
|
|
369
|
+
}
|
|
370
|
+
function getStakingTypeFromStakingInstructions(si) {
|
|
371
|
+
const isJito = isJitoStakingInstructions(si);
|
|
372
|
+
const isMarinade = isMarinadeStakingInstructions(si);
|
|
373
|
+
const isNative = isNativeStakingInstructions(si);
|
|
374
|
+
assert([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
|
|
375
|
+
if (isJito)
|
|
376
|
+
return SolStakingTypeEnum.JITO;
|
|
377
|
+
if (isMarinade)
|
|
378
|
+
return SolStakingTypeEnum.MARINADE;
|
|
379
|
+
if (isNative)
|
|
380
|
+
return SolStakingTypeEnum.NATIVE;
|
|
381
|
+
assert(false, 'No StakingType found');
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Parses Solana instructions to create staking tx and delegate tx instructions params
|
|
385
|
+
* Only supports Nonce, StakingActivate and Memo Solana instructions
|
|
386
|
+
*
|
|
387
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
388
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking activate tx
|
|
389
|
+
*/
|
|
390
|
+
function parseStakingActivateInstructions(instructions) {
|
|
391
|
+
const instructionData = [];
|
|
392
|
+
const stakingInstructions = {};
|
|
393
|
+
for (const instruction of instructions) {
|
|
394
|
+
const type = getInstructionType(instruction);
|
|
395
|
+
switch (type) {
|
|
396
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
397
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
398
|
+
const nonce = {
|
|
399
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
400
|
+
params: {
|
|
401
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
402
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
403
|
+
},
|
|
404
|
+
};
|
|
405
|
+
instructionData.push(nonce);
|
|
406
|
+
break;
|
|
407
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
408
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
409
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
410
|
+
break;
|
|
411
|
+
case ValidInstructionTypesEnum.Memo:
|
|
412
|
+
const memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
413
|
+
instructionData.push(memo);
|
|
414
|
+
break;
|
|
415
|
+
case ValidInstructionTypesEnum.Create:
|
|
416
|
+
stakingInstructions.create = SystemInstruction.decodeCreateAccount(instruction);
|
|
417
|
+
break;
|
|
418
|
+
case ValidInstructionTypesEnum.StakingInitialize:
|
|
419
|
+
stakingInstructions.initialize = StakeInstruction.decodeInitialize(instruction);
|
|
420
|
+
break;
|
|
421
|
+
case ValidInstructionTypesEnum.StakingDelegate:
|
|
422
|
+
stakingInstructions.delegate = StakeInstruction.decodeDelegate(instruction);
|
|
423
|
+
break;
|
|
424
|
+
case ValidInstructionTypesEnum.DepositSol:
|
|
425
|
+
stakingInstructions.depositSol = decodeDepositSol(instruction);
|
|
426
|
+
break;
|
|
427
|
+
case ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
|
|
428
|
+
stakingInstructions.hasAtaInit = true;
|
|
429
|
+
instructionData.push({
|
|
430
|
+
type: InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
431
|
+
params: {
|
|
432
|
+
mintAddress: instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString(),
|
|
433
|
+
ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
|
|
434
|
+
ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
|
|
435
|
+
payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
|
|
436
|
+
tokenName: findTokenName(instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString()),
|
|
437
|
+
},
|
|
438
|
+
});
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
validateStakingInstructions(stakingInstructions);
|
|
443
|
+
const stakingType = getStakingTypeFromStakingInstructions(stakingInstructions);
|
|
444
|
+
let stakingActivate;
|
|
445
|
+
switch (stakingType) {
|
|
446
|
+
case SolStakingTypeEnum.JITO: {
|
|
447
|
+
assert(isJitoStakingInstructions(stakingInstructions));
|
|
448
|
+
const { depositSol, hasAtaInit } = stakingInstructions;
|
|
449
|
+
stakingActivate = {
|
|
450
|
+
type: InstructionBuilderTypes.StakingActivate,
|
|
451
|
+
params: {
|
|
452
|
+
stakingType,
|
|
453
|
+
fromAddress: depositSol.fundingAccount.toString(),
|
|
454
|
+
stakingAddress: depositSol.stakePool.toString(),
|
|
455
|
+
amount: depositSol.lamports.toString(),
|
|
456
|
+
validator: depositSol.stakePool.toString(),
|
|
457
|
+
extraParams: {
|
|
458
|
+
stakePoolData: {
|
|
459
|
+
managerFeeAccount: depositSol.managerFeeAccount.toString(),
|
|
460
|
+
poolMint: depositSol.poolMint.toString(),
|
|
461
|
+
reserveStake: depositSol.reserveStake.toString(),
|
|
462
|
+
},
|
|
463
|
+
createAssociatedTokenAccount: !!hasAtaInit,
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
case SolStakingTypeEnum.MARINADE: {
|
|
470
|
+
assert(isMarinadeStakingInstructions(stakingInstructions));
|
|
471
|
+
const { create, initialize } = stakingInstructions;
|
|
472
|
+
stakingActivate = {
|
|
473
|
+
type: InstructionBuilderTypes.StakingActivate,
|
|
474
|
+
params: {
|
|
475
|
+
stakingType,
|
|
476
|
+
fromAddress: create.fromPubkey.toString(),
|
|
477
|
+
stakingAddress: initialize.stakePubkey.toString(),
|
|
478
|
+
amount: create.lamports.toString(),
|
|
479
|
+
validator: initialize.authorized.staker.toString(),
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
case SolStakingTypeEnum.NATIVE: {
|
|
485
|
+
assert(isNativeStakingInstructions(stakingInstructions));
|
|
486
|
+
const { create, initialize, delegate } = stakingInstructions;
|
|
487
|
+
stakingActivate = {
|
|
488
|
+
type: InstructionBuilderTypes.StakingActivate,
|
|
489
|
+
params: {
|
|
490
|
+
stakingType,
|
|
491
|
+
fromAddress: create.fromPubkey.toString(),
|
|
492
|
+
stakingAddress: initialize.stakePubkey.toString(),
|
|
493
|
+
amount: create.lamports.toString(),
|
|
494
|
+
validator: delegate.votePubkey.toString(),
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
default: {
|
|
500
|
+
const unreachable = stakingType;
|
|
501
|
+
throw new Error(`Unknown staking type ${unreachable}`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
instructionData.push(stakingActivate);
|
|
505
|
+
return instructionData;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Parses Solana instructions to create delegate tx
|
|
509
|
+
* Only supports Nonce, StakingDelegate
|
|
510
|
+
*
|
|
511
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
512
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
|
|
513
|
+
*/
|
|
514
|
+
function parseStakingDelegateInstructions(instructions) {
|
|
515
|
+
const instructionData = [];
|
|
516
|
+
for (const instruction of instructions) {
|
|
517
|
+
const type = getInstructionType(instruction);
|
|
518
|
+
switch (type) {
|
|
519
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
520
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
521
|
+
const nonce = {
|
|
522
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
523
|
+
params: {
|
|
524
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
525
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
526
|
+
},
|
|
527
|
+
};
|
|
528
|
+
instructionData.push(nonce);
|
|
529
|
+
break;
|
|
530
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
531
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
532
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
533
|
+
break;
|
|
534
|
+
case ValidInstructionTypesEnum.StakingDelegate:
|
|
535
|
+
const stakingDelegateParams = StakeInstruction.decodeDelegate(instruction);
|
|
536
|
+
const stakingDelegate = {
|
|
537
|
+
type: InstructionBuilderTypes.StakingDelegate,
|
|
538
|
+
params: {
|
|
539
|
+
fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
|
|
540
|
+
stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
|
|
541
|
+
validator: stakingDelegateParams.votePubkey.toString() || '',
|
|
542
|
+
},
|
|
543
|
+
};
|
|
544
|
+
instructionData.push(stakingDelegate);
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return instructionData;
|
|
549
|
+
}
|
|
550
|
+
function validateStakingInstructions(stakingInstructions) {
|
|
551
|
+
if (stakingInstructions.delegate === undefined && stakingInstructions.depositSol !== undefined) {
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
if (!stakingInstructions.create) {
|
|
555
|
+
throw new NotSupported('Invalid staking activate transaction, missing create stake account instruction');
|
|
556
|
+
}
|
|
557
|
+
if (!stakingInstructions.delegate && !stakingInstructions.initialize) {
|
|
558
|
+
throw new NotSupported('Invalid staking activate transaction, missing initialize stake account/delegate instruction');
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
function isJitoUnstakingInstructions(ui) {
|
|
562
|
+
return ui.withdrawStake !== undefined && ui.deactivate !== undefined;
|
|
563
|
+
}
|
|
564
|
+
function isMarinadeUnstakingInstructions(ui) {
|
|
565
|
+
return ui.transfer !== undefined && ui.deactivate === undefined;
|
|
566
|
+
}
|
|
567
|
+
function isNativeUnstakingInstructions(ui) {
|
|
568
|
+
return ui.withdrawStake === undefined && ui.deactivate !== undefined;
|
|
569
|
+
}
|
|
570
|
+
function getStakingTypeFromUnstakingInstructions(ui) {
|
|
571
|
+
const isJito = isJitoUnstakingInstructions(ui);
|
|
572
|
+
const isMarinade = isMarinadeUnstakingInstructions(ui);
|
|
573
|
+
const isNative = isNativeUnstakingInstructions(ui);
|
|
574
|
+
assert([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
|
|
575
|
+
if (isJito)
|
|
576
|
+
return SolStakingTypeEnum.JITO;
|
|
577
|
+
if (isMarinade)
|
|
578
|
+
return SolStakingTypeEnum.MARINADE;
|
|
579
|
+
if (isNative)
|
|
580
|
+
return SolStakingTypeEnum.NATIVE;
|
|
581
|
+
assert(false, 'No StakingType found');
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Parses Solana instructions to create deactivate stake tx instructions params. Supports full stake
|
|
585
|
+
* account deactivation and partial stake account deactivation.
|
|
586
|
+
*
|
|
587
|
+
* When partially deactivating a stake account this method expects the following instructions: Allocate,
|
|
588
|
+
* to allocate a new staking account, Assign, to assign the newly created staking account to the
|
|
589
|
+
* Stake Program, Split, to split the current stake account, and StakingDeactivate to deactivate the
|
|
590
|
+
* newly created stake account.
|
|
591
|
+
*
|
|
592
|
+
* Supports Nonce, StakingDeactivate, Memo, Allocate, Assign, and Split Solana instructions.
|
|
593
|
+
*
|
|
594
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
595
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking deactivate tx
|
|
596
|
+
*/
|
|
597
|
+
function parseStakingDeactivateInstructions(instructions, coinName) {
|
|
598
|
+
const instructionData = [];
|
|
599
|
+
const unstakingInstructions = [];
|
|
600
|
+
for (const instruction of instructions) {
|
|
601
|
+
const type = getInstructionType(instruction);
|
|
602
|
+
switch (type) {
|
|
603
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
604
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
605
|
+
const nonce = {
|
|
606
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
607
|
+
params: {
|
|
608
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
609
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
610
|
+
},
|
|
611
|
+
};
|
|
612
|
+
instructionData.push(nonce);
|
|
613
|
+
break;
|
|
614
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
615
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
616
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
617
|
+
break;
|
|
618
|
+
case ValidInstructionTypesEnum.Memo:
|
|
619
|
+
const memo = {
|
|
620
|
+
type: InstructionBuilderTypes.Memo,
|
|
621
|
+
params: { memo: instruction.data.toString() },
|
|
622
|
+
};
|
|
623
|
+
instructionData.push(memo);
|
|
624
|
+
break;
|
|
625
|
+
case ValidInstructionTypesEnum.Allocate:
|
|
626
|
+
if (unstakingInstructions.length > 0 &&
|
|
627
|
+
unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
|
|
628
|
+
unstakingInstructions[unstakingInstructions.length - 1].allocate =
|
|
629
|
+
SystemInstruction.decodeAllocate(instruction);
|
|
630
|
+
}
|
|
631
|
+
else {
|
|
632
|
+
unstakingInstructions.push({
|
|
633
|
+
allocate: SystemInstruction.decodeAllocate(instruction),
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
break;
|
|
637
|
+
case ValidInstructionTypesEnum.Assign:
|
|
638
|
+
if (unstakingInstructions.length > 0 &&
|
|
639
|
+
unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
|
|
640
|
+
unstakingInstructions[unstakingInstructions.length - 1].assign = SystemInstruction.decodeAssign(instruction);
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
unstakingInstructions.push({
|
|
644
|
+
assign: SystemInstruction.decodeAssign(instruction),
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
break;
|
|
648
|
+
case ValidInstructionTypesEnum.Split:
|
|
649
|
+
if (unstakingInstructions.length > 0 &&
|
|
650
|
+
unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
|
|
651
|
+
unstakingInstructions[unstakingInstructions.length - 1].split = StakeInstruction.decodeSplit(instruction);
|
|
652
|
+
}
|
|
653
|
+
else {
|
|
654
|
+
unstakingInstructions.push({
|
|
655
|
+
split: StakeInstruction.decodeSplit(instruction),
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
break;
|
|
659
|
+
case ValidInstructionTypesEnum.StakingDeactivate:
|
|
660
|
+
if (unstakingInstructions.length > 0 &&
|
|
661
|
+
unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
|
|
662
|
+
unstakingInstructions[unstakingInstructions.length - 1].deactivate =
|
|
663
|
+
StakeInstruction.decodeDeactivate(instruction);
|
|
664
|
+
}
|
|
665
|
+
else {
|
|
666
|
+
unstakingInstructions.push({
|
|
667
|
+
deactivate: StakeInstruction.decodeDeactivate(instruction),
|
|
668
|
+
});
|
|
669
|
+
}
|
|
670
|
+
break;
|
|
671
|
+
case ValidInstructionTypesEnum.Transfer:
|
|
672
|
+
if (unstakingInstructions.length > 0 &&
|
|
673
|
+
unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
|
|
674
|
+
unstakingInstructions[unstakingInstructions.length - 1].transfer =
|
|
675
|
+
SystemInstruction.decodeTransfer(instruction);
|
|
676
|
+
}
|
|
677
|
+
else {
|
|
678
|
+
unstakingInstructions.push({
|
|
679
|
+
transfer: SystemInstruction.decodeTransfer(instruction),
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
break;
|
|
683
|
+
case ValidInstructionTypesEnum.WithdrawStake:
|
|
684
|
+
if (unstakingInstructions.length > 0 &&
|
|
685
|
+
unstakingInstructions[unstakingInstructions.length - 1].withdrawStake === undefined) {
|
|
686
|
+
unstakingInstructions[unstakingInstructions.length - 1].withdrawStake = decodeWithdrawStake(instruction);
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
unstakingInstructions.push({
|
|
690
|
+
withdrawStake: decodeWithdrawStake(instruction),
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
break;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
for (const unstakingInstruction of unstakingInstructions) {
|
|
697
|
+
validateUnstakingInstructions(unstakingInstruction);
|
|
698
|
+
const stakingType = getStakingTypeFromUnstakingInstructions(unstakingInstruction);
|
|
699
|
+
let stakingDeactivate;
|
|
700
|
+
switch (stakingType) {
|
|
701
|
+
case SolStakingTypeEnum.JITO: {
|
|
702
|
+
assert(isJitoUnstakingInstructions(unstakingInstruction));
|
|
703
|
+
const { withdrawStake } = unstakingInstruction;
|
|
704
|
+
stakingDeactivate = {
|
|
705
|
+
type: InstructionBuilderTypes.StakingDeactivate,
|
|
706
|
+
params: {
|
|
707
|
+
stakingType,
|
|
708
|
+
fromAddress: withdrawStake.destinationStakeAuthority.toString(),
|
|
709
|
+
stakingAddress: withdrawStake.stakePool.toString(),
|
|
710
|
+
amount: withdrawStake.poolTokens.toString(),
|
|
711
|
+
unstakingAddress: withdrawStake.destinationStake.toString(),
|
|
712
|
+
extraParams: {
|
|
713
|
+
stakePoolData: {
|
|
714
|
+
managerFeeAccount: withdrawStake.managerFeeAccount.toString(),
|
|
715
|
+
poolMint: withdrawStake.poolMint.toString(),
|
|
716
|
+
validatorListAccount: withdrawStake.validatorList.toString(),
|
|
717
|
+
},
|
|
718
|
+
validatorAddress: withdrawStake.validatorStake.toString(),
|
|
719
|
+
transferAuthorityAddress: withdrawStake.sourceTransferAuthority.toString(),
|
|
720
|
+
},
|
|
721
|
+
},
|
|
722
|
+
};
|
|
723
|
+
break;
|
|
724
|
+
}
|
|
725
|
+
case SolStakingTypeEnum.MARINADE: {
|
|
726
|
+
assert(isMarinadeUnstakingInstructions(unstakingInstruction));
|
|
727
|
+
const { transfer } = unstakingInstruction;
|
|
728
|
+
stakingDeactivate = {
|
|
729
|
+
type: InstructionBuilderTypes.StakingDeactivate,
|
|
730
|
+
params: {
|
|
731
|
+
stakingType,
|
|
732
|
+
fromAddress: '',
|
|
733
|
+
stakingAddress: '',
|
|
734
|
+
recipients: [
|
|
735
|
+
{
|
|
736
|
+
address: transfer.toPubkey.toString() || '',
|
|
737
|
+
amount: transfer.lamports.toString() || '',
|
|
738
|
+
},
|
|
739
|
+
],
|
|
740
|
+
},
|
|
741
|
+
};
|
|
742
|
+
break;
|
|
743
|
+
}
|
|
744
|
+
case SolStakingTypeEnum.NATIVE: {
|
|
745
|
+
assert(isNativeUnstakingInstructions(unstakingInstruction));
|
|
746
|
+
const { deactivate, split } = unstakingInstruction;
|
|
747
|
+
stakingDeactivate = {
|
|
748
|
+
type: InstructionBuilderTypes.StakingDeactivate,
|
|
749
|
+
params: {
|
|
750
|
+
stakingType,
|
|
751
|
+
fromAddress: deactivate.authorizedPubkey.toString() || '',
|
|
752
|
+
stakingAddress: split?.stakePubkey.toString() || deactivate.stakePubkey.toString(),
|
|
753
|
+
amount: split?.lamports.toString(),
|
|
754
|
+
unstakingAddress: split?.splitStakePubkey.toString(),
|
|
755
|
+
},
|
|
756
|
+
};
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
default: {
|
|
760
|
+
const unreachable = stakingType;
|
|
761
|
+
throw new Error(`Unknown staking type ${unreachable}`);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
instructionData.push(stakingDeactivate);
|
|
765
|
+
}
|
|
766
|
+
return instructionData;
|
|
767
|
+
}
|
|
768
|
+
function validateUnstakingInstructions(unstakingInstructions) {
|
|
769
|
+
// Cases where exactly one field should be present
|
|
770
|
+
const unstakingInstructionsKeys = [
|
|
771
|
+
'allocate',
|
|
772
|
+
'assign',
|
|
773
|
+
'split',
|
|
774
|
+
'deactivate',
|
|
775
|
+
'transfer',
|
|
776
|
+
];
|
|
777
|
+
if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'transfer'))) {
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'withdrawStake'))) {
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'deactivate'))) {
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
// Cases where deactivate field must be present with another field
|
|
787
|
+
if (!unstakingInstructions.deactivate) {
|
|
788
|
+
throw new NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
|
|
789
|
+
}
|
|
790
|
+
// This is a stake pool instruction, not a partial unstake
|
|
791
|
+
if (unstakingInstructions.withdrawStake) {
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
if (!unstakingInstructions.allocate) {
|
|
795
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
|
|
796
|
+
}
|
|
797
|
+
else if (!unstakingInstructions.assign) {
|
|
798
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, missing assign unstake account instruction');
|
|
799
|
+
}
|
|
800
|
+
else if (!unstakingInstructions.split) {
|
|
801
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, missing split stake account instruction');
|
|
802
|
+
}
|
|
803
|
+
else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.assign.accountPubkey.toString()) {
|
|
804
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, must allocate and assign the same public key');
|
|
805
|
+
}
|
|
806
|
+
else if (unstakingInstructions.allocate.space !== StakeProgram.space) {
|
|
807
|
+
throw new NotSupported(`Invalid partial deactivate stake transaction, unstaking account must allocate ${StakeProgram.space} bytes`);
|
|
808
|
+
}
|
|
809
|
+
else if (unstakingInstructions.assign.programId.toString() !== StakeProgram.programId.toString()) {
|
|
810
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, the unstake account must be assigned to the Stake Program');
|
|
811
|
+
}
|
|
812
|
+
else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.split.splitStakePubkey.toString()) {
|
|
813
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, must allocate the unstaking account');
|
|
814
|
+
}
|
|
815
|
+
else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
|
|
816
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
|
|
817
|
+
}
|
|
818
|
+
else if (!unstakingInstructions.transfer) {
|
|
819
|
+
throw new NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
/**
|
|
823
|
+
* Parses Solana instructions to create staking withdraw tx instructions params
|
|
824
|
+
* Only supports Nonce, StakingWithdraw, and Memo Solana instructions
|
|
825
|
+
*
|
|
826
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
827
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking withdraw tx
|
|
828
|
+
*/
|
|
829
|
+
function parseStakingWithdrawInstructions(instructions) {
|
|
830
|
+
const instructionData = [];
|
|
831
|
+
for (const instruction of instructions) {
|
|
832
|
+
const type = getInstructionType(instruction);
|
|
833
|
+
switch (type) {
|
|
834
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
835
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
836
|
+
const nonce = {
|
|
837
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
838
|
+
params: {
|
|
839
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
840
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
841
|
+
},
|
|
842
|
+
};
|
|
843
|
+
instructionData.push(nonce);
|
|
844
|
+
break;
|
|
845
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
846
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
847
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
848
|
+
break;
|
|
849
|
+
case ValidInstructionTypesEnum.Memo:
|
|
850
|
+
const memo = {
|
|
851
|
+
type: InstructionBuilderTypes.Memo,
|
|
852
|
+
params: { memo: instruction.data.toString() },
|
|
853
|
+
};
|
|
854
|
+
instructionData.push(memo);
|
|
855
|
+
break;
|
|
856
|
+
case ValidInstructionTypesEnum.StakingWithdraw:
|
|
857
|
+
const withdrawInstruction = StakeInstruction.decodeWithdraw(instruction);
|
|
858
|
+
const stakingWithdraw = {
|
|
859
|
+
type: InstructionBuilderTypes.StakingWithdraw,
|
|
860
|
+
params: {
|
|
861
|
+
fromAddress: withdrawInstruction.authorizedPubkey.toString(),
|
|
862
|
+
stakingAddress: withdrawInstruction.stakePubkey.toString(),
|
|
863
|
+
amount: withdrawInstruction.lamports.toString(),
|
|
864
|
+
},
|
|
865
|
+
};
|
|
866
|
+
instructionData.push(stakingWithdraw);
|
|
867
|
+
break;
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
return instructionData;
|
|
871
|
+
}
|
|
872
|
+
/**
|
|
873
|
+
* Get the memo object from instructions if it exists
|
|
874
|
+
*
|
|
875
|
+
* @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
|
|
876
|
+
* @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
|
|
877
|
+
* @returns {Memo | undefined} - memo object or undefined
|
|
878
|
+
*/
|
|
879
|
+
function getMemo(instructions, instructionIndexes) {
|
|
880
|
+
const instructionsLength = Object.keys(instructionIndexes).length;
|
|
881
|
+
if (instructions.length === instructionsLength && instructions[instructionIndexes.Memo]) {
|
|
882
|
+
return {
|
|
883
|
+
type: InstructionBuilderTypes.Memo,
|
|
884
|
+
params: { memo: instructions[instructionIndexes.Memo].data.toString() },
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
const ataInitInstructionKeysIndexes = {
|
|
889
|
+
PayerAddress: 0,
|
|
890
|
+
ATAAddress: 1,
|
|
891
|
+
OwnerAddress: 2,
|
|
892
|
+
MintAddress: 3,
|
|
893
|
+
};
|
|
894
|
+
const closeAtaInstructionKeysIndexes = {
|
|
895
|
+
AccountAddress: 0,
|
|
896
|
+
DestinationAddress: 1,
|
|
897
|
+
AuthorityAddress: 2,
|
|
898
|
+
};
|
|
899
|
+
/**
|
|
900
|
+
* Parses Solana instructions to initialize associated token account tx instructions params
|
|
901
|
+
*
|
|
902
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
903
|
+
* @returns {InstructionParams[]} An array containing instruction params for Send tx
|
|
904
|
+
*/
|
|
905
|
+
function parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
|
|
906
|
+
const instructionData = [];
|
|
907
|
+
let memo;
|
|
908
|
+
for (const instruction of instructions) {
|
|
909
|
+
const type = getInstructionType(instruction);
|
|
910
|
+
switch (type) {
|
|
911
|
+
case ValidInstructionTypesEnum.Memo:
|
|
912
|
+
memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
913
|
+
break;
|
|
914
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
915
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
916
|
+
const nonce = {
|
|
917
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
918
|
+
params: {
|
|
919
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
920
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
921
|
+
},
|
|
922
|
+
};
|
|
923
|
+
instructionData.push(nonce);
|
|
924
|
+
break;
|
|
925
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
926
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
927
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
928
|
+
break;
|
|
929
|
+
case ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
|
|
930
|
+
const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
|
|
931
|
+
const tokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
|
|
932
|
+
let programID;
|
|
933
|
+
if (instruction.programId) {
|
|
934
|
+
programID = instruction.programId.toString();
|
|
935
|
+
}
|
|
936
|
+
const ataInit = {
|
|
937
|
+
type: InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
938
|
+
params: {
|
|
939
|
+
mintAddress,
|
|
940
|
+
ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
|
|
941
|
+
ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
|
|
942
|
+
payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
|
|
943
|
+
tokenName,
|
|
944
|
+
programId: programID,
|
|
945
|
+
},
|
|
946
|
+
};
|
|
947
|
+
instructionData.push(ataInit);
|
|
948
|
+
break;
|
|
949
|
+
case ValidInstructionTypesEnum.PermissionlessThawIdempotent:
|
|
950
|
+
const thawExtraAccounts = instruction.keys.slice(9).map((key) => ({
|
|
951
|
+
pubkey: key.pubkey.toString(),
|
|
952
|
+
isSigner: key.isSigner,
|
|
953
|
+
isWritable: key.isWritable,
|
|
954
|
+
}));
|
|
955
|
+
const permissionlessThaw = {
|
|
956
|
+
type: InstructionBuilderTypes.PermissionlessThawIdempotent,
|
|
957
|
+
params: {
|
|
958
|
+
authority: instruction.keys[0].pubkey.toString(),
|
|
959
|
+
mint: instruction.keys[1].pubkey.toString(),
|
|
960
|
+
tokenAccount: instruction.keys[2].pubkey.toString(),
|
|
961
|
+
flagAccount: instruction.keys[3].pubkey.toString(),
|
|
962
|
+
tokenAccountOwner: instruction.keys[4].pubkey.toString(),
|
|
963
|
+
mintConfig: instruction.keys[5].pubkey.toString(),
|
|
964
|
+
tokenProgram: instruction.keys[6].pubkey.toString(),
|
|
965
|
+
systemProgram: instruction.keys[7].pubkey.toString(),
|
|
966
|
+
gatingProgram: instruction.keys[8].pubkey.toString(),
|
|
967
|
+
extraAccounts: thawExtraAccounts,
|
|
968
|
+
},
|
|
969
|
+
};
|
|
970
|
+
instructionData.push(permissionlessThaw);
|
|
971
|
+
break;
|
|
972
|
+
case ValidInstructionTypesEnum.DepositSol:
|
|
973
|
+
// AtaInit is a part of spl-stake-pool's depositSol process
|
|
974
|
+
break;
|
|
975
|
+
default:
|
|
976
|
+
throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
if (memo) {
|
|
980
|
+
instructionData.push(memo);
|
|
981
|
+
}
|
|
982
|
+
return instructionData;
|
|
983
|
+
}
|
|
984
|
+
const ataCloseInstructionKeysIndexes = {
|
|
985
|
+
AccountAddress: 0,
|
|
986
|
+
DestinationAddress: 1,
|
|
987
|
+
AuthorityAddress: 2,
|
|
988
|
+
};
|
|
989
|
+
const ataRecoverNestedInstructionKeysIndexes = {
|
|
990
|
+
NestedAccountAddress: 0,
|
|
991
|
+
NestedMintAddress: 1,
|
|
992
|
+
DestinationAccountAddress: 2,
|
|
993
|
+
OwnerAccountAddress: 3,
|
|
994
|
+
OwnerMintAddress: 4,
|
|
995
|
+
WalletAddress: 5,
|
|
996
|
+
};
|
|
997
|
+
/**
|
|
998
|
+
* Parses Solana instructions to close associated token account tx instructions params
|
|
999
|
+
*
|
|
1000
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
1001
|
+
* @returns {InstructionParams[]} An array containing instruction params for Send tx
|
|
1002
|
+
*/
|
|
1003
|
+
function parseAtaCloseInstructions(instructions) {
|
|
1004
|
+
const instructionData = [];
|
|
1005
|
+
for (const instruction of instructions) {
|
|
1006
|
+
const type = getInstructionType(instruction);
|
|
1007
|
+
switch (type) {
|
|
1008
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
1009
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
1010
|
+
const nonce = {
|
|
1011
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
1012
|
+
params: {
|
|
1013
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
1014
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
1015
|
+
},
|
|
1016
|
+
};
|
|
1017
|
+
instructionData.push(nonce);
|
|
1018
|
+
break;
|
|
1019
|
+
case ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
1020
|
+
case ValidInstructionTypesEnum.SetPriorityFee:
|
|
1021
|
+
instructionData.push(parseComputeBudgetInstruction(instruction));
|
|
1022
|
+
break;
|
|
1023
|
+
case ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
|
|
1024
|
+
const ataClose = {
|
|
1025
|
+
type: InstructionBuilderTypes.CloseAssociatedTokenAccount,
|
|
1026
|
+
params: {
|
|
1027
|
+
accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
|
|
1028
|
+
destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
|
|
1029
|
+
authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
|
|
1030
|
+
...(instruction.programId.equals(TOKEN_2022_PROGRAM_ID)
|
|
1031
|
+
? { programId: instruction.programId.toString() }
|
|
1032
|
+
: {}),
|
|
1033
|
+
},
|
|
1034
|
+
};
|
|
1035
|
+
instructionData.push(ataClose);
|
|
1036
|
+
break;
|
|
1037
|
+
case ValidInstructionTypesEnum.RecoverNestedAssociatedTokenAccount:
|
|
1038
|
+
const ataRecoverNested = {
|
|
1039
|
+
type: InstructionBuilderTypes.RecoverNestedAssociatedTokenAccount,
|
|
1040
|
+
params: {
|
|
1041
|
+
nestedAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.NestedAccountAddress].pubkey.toString(),
|
|
1042
|
+
nestedMintAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.NestedMintAddress].pubkey.toString(),
|
|
1043
|
+
destinationAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.DestinationAccountAddress].pubkey.toString(),
|
|
1044
|
+
ownerAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.OwnerAccountAddress].pubkey.toString(),
|
|
1045
|
+
ownerMintAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.OwnerMintAddress].pubkey.toString(),
|
|
1046
|
+
walletAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.WalletAddress].pubkey.toString(),
|
|
1047
|
+
},
|
|
1048
|
+
};
|
|
1049
|
+
instructionData.push(ataRecoverNested);
|
|
1050
|
+
break;
|
|
1051
|
+
default:
|
|
1052
|
+
throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
return instructionData;
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Parses Solana instructions to authorized staking account params
|
|
1059
|
+
* Only supports Nonce, Authorize instructions
|
|
1060
|
+
*
|
|
1061
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
1062
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
|
|
1063
|
+
*/
|
|
1064
|
+
function parseStakingAuthorizeInstructions(instructions) {
|
|
1065
|
+
const instructionData = [];
|
|
1066
|
+
for (const instruction of instructions) {
|
|
1067
|
+
const type = getInstructionType(instruction);
|
|
1068
|
+
switch (type) {
|
|
1069
|
+
case ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
1070
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
|
|
1071
|
+
const nonce = {
|
|
1072
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
1073
|
+
params: {
|
|
1074
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
1075
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
1076
|
+
},
|
|
1077
|
+
};
|
|
1078
|
+
instructionData.push(nonce);
|
|
1079
|
+
break;
|
|
1080
|
+
case ValidInstructionTypesEnum.Memo:
|
|
1081
|
+
const memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
1082
|
+
instructionData.push(memo);
|
|
1083
|
+
break;
|
|
1084
|
+
case ValidInstructionTypesEnum.Authorize:
|
|
1085
|
+
const authorize = StakeInstruction.decodeAuthorize(instruction);
|
|
1086
|
+
instructionData.push({
|
|
1087
|
+
type: InstructionBuilderTypes.StakingAuthorize,
|
|
1088
|
+
params: {
|
|
1089
|
+
stakingAddress: authorize.stakePubkey.toString(),
|
|
1090
|
+
oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
|
|
1091
|
+
newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
|
|
1092
|
+
newWithdrawAddress: authorize.custodianPubkey?.toString() || '',
|
|
1093
|
+
},
|
|
1094
|
+
});
|
|
1095
|
+
break;
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
return instructionData;
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* Parses Solana instructions to authorized staking account params
|
|
1102
|
+
* Only supports Nonce, Authorize instructions
|
|
1103
|
+
*
|
|
1104
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
1105
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
|
|
1106
|
+
*/
|
|
1107
|
+
function parseStakingAuthorizeRawInstructions(instructions) {
|
|
1108
|
+
const instructionData = [];
|
|
1109
|
+
assert(instructions.length === 2, 'Invalid number of instructions');
|
|
1110
|
+
const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instructions[0]);
|
|
1111
|
+
const nonce = {
|
|
1112
|
+
type: InstructionBuilderTypes.NonceAdvance,
|
|
1113
|
+
params: {
|
|
1114
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
1115
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
1116
|
+
},
|
|
1117
|
+
};
|
|
1118
|
+
instructionData.push(nonce);
|
|
1119
|
+
const authorize = instructions[1];
|
|
1120
|
+
assert(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
|
|
1121
|
+
instructionData.push({
|
|
1122
|
+
type: InstructionBuilderTypes.StakingAuthorize,
|
|
1123
|
+
params: {
|
|
1124
|
+
stakingAddress: authorize.keys[0].pubkey.toString(),
|
|
1125
|
+
oldAuthorizeAddress: authorize.keys[2].pubkey.toString(),
|
|
1126
|
+
newAuthorizeAddress: authorize.keys[3].pubkey.toString(),
|
|
1127
|
+
custodianAddress: authorize.keys[4].pubkey.toString(),
|
|
1128
|
+
},
|
|
1129
|
+
});
|
|
1130
|
+
return instructionData;
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Returns true if the instruction type is a confidential transfer instruction
|
|
1134
|
+
* (Token-2022 CT extension or zk-elgamal-proof program).
|
|
1135
|
+
*/
|
|
1136
|
+
function isConfidentialTransferInstruction(type) {
|
|
1137
|
+
switch (type) {
|
|
1138
|
+
case InstructionBuilderTypes.ConfigureConfidentialTransferAccount:
|
|
1139
|
+
case InstructionBuilderTypes.ApplyPendingBalance:
|
|
1140
|
+
case InstructionBuilderTypes.ConfidentialDeposit:
|
|
1141
|
+
case InstructionBuilderTypes.ConfidentialWithdraw:
|
|
1142
|
+
case InstructionBuilderTypes.ConfidentialTransfer:
|
|
1143
|
+
case InstructionBuilderTypes.VerifyPubkeyValidity:
|
|
1144
|
+
case InstructionBuilderTypes.VerifyEqualityProof:
|
|
1145
|
+
case InstructionBuilderTypes.VerifyValidityProof:
|
|
1146
|
+
case InstructionBuilderTypes.VerifyRangeProof:
|
|
1147
|
+
return true;
|
|
1148
|
+
default:
|
|
1149
|
+
return false;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* Parses Solana instructions to custom instruction params
|
|
1154
|
+
*
|
|
1155
|
+
* @param {TransactionInstruction[]} instructions - containing custom solana instructions
|
|
1156
|
+
* @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
|
|
1157
|
+
* @returns {InstructionParams[]} An array containing instruction params for custom instructions
|
|
1158
|
+
*/
|
|
1159
|
+
function parseCustomInstructions(instructions, instructionMetadata) {
|
|
1160
|
+
const instructionData = [];
|
|
1161
|
+
for (let i = 0; i < instructions.length; i++) {
|
|
1162
|
+
const instruction = instructions[i];
|
|
1163
|
+
// Check if we have metadata for this instruction position
|
|
1164
|
+
if (instructionMetadata &&
|
|
1165
|
+
instructionMetadata[i] &&
|
|
1166
|
+
instructionMetadata[i].type === InstructionBuilderTypes.CustomInstruction) {
|
|
1167
|
+
instructionData.push(instructionMetadata[i]);
|
|
1168
|
+
}
|
|
1169
|
+
else {
|
|
1170
|
+
// Convert the raw instruction to CustomInstruction format
|
|
1171
|
+
const customInstruction = {
|
|
1172
|
+
type: InstructionBuilderTypes.CustomInstruction,
|
|
1173
|
+
params: {
|
|
1174
|
+
programId: instruction.programId.toString(),
|
|
1175
|
+
keys: instruction.keys.map((key) => ({
|
|
1176
|
+
pubkey: key.pubkey.toString(),
|
|
1177
|
+
isSigner: key.isSigner,
|
|
1178
|
+
isWritable: key.isWritable,
|
|
1179
|
+
})),
|
|
1180
|
+
data: instruction.data.toString('base64'),
|
|
1181
|
+
},
|
|
1182
|
+
};
|
|
1183
|
+
instructionData.push(customInstruction);
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
return instructionData;
|
|
1187
|
+
}
|
|
1188
|
+
/**
|
|
1189
|
+
* Parses Solana instructions to confidential transfer instruction params.
|
|
1190
|
+
*
|
|
1191
|
+
* Iterates raw instructions in order, checking metadata at each position:
|
|
1192
|
+
* - CT instruction metadata is preserved as-is (CT instructions cannot be
|
|
1193
|
+
* decoded by @solana/spl-token or @solana/web3.js).
|
|
1194
|
+
* - CustomInstruction metadata is preserved as-is.
|
|
1195
|
+
* - All other instructions fall back to CustomInstruction format with raw
|
|
1196
|
+
* programId/keys/data.
|
|
1197
|
+
*
|
|
1198
|
+
* This single-pass approach preserves original instruction order so that
|
|
1199
|
+
* round-trip reconstruction is faithful.
|
|
1200
|
+
*
|
|
1201
|
+
* @param {TransactionInstruction[]} instructions - containing CT solana instructions
|
|
1202
|
+
* @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
|
|
1203
|
+
* @returns {InstructionParams[]} An array containing instruction params in original order
|
|
1204
|
+
*/
|
|
1205
|
+
function parseConfidentialTransferInstructions(instructions, instructionMetadata) {
|
|
1206
|
+
const instructionData = [];
|
|
1207
|
+
for (let i = 0; i < instructions.length; i++) {
|
|
1208
|
+
const instruction = instructions[i];
|
|
1209
|
+
// Check if we have metadata for this instruction position
|
|
1210
|
+
if (instructionMetadata && instructionMetadata[i]) {
|
|
1211
|
+
const metaType = instructionMetadata[i].type;
|
|
1212
|
+
// Preserve confidential transfer and custom instruction metadata as-is
|
|
1213
|
+
if (isConfidentialTransferInstruction(metaType) || metaType === InstructionBuilderTypes.CustomInstruction) {
|
|
1214
|
+
instructionData.push(instructionMetadata[i]);
|
|
1215
|
+
continue;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
// Convert the raw instruction to CustomInstruction format
|
|
1219
|
+
const customInstruction = {
|
|
1220
|
+
type: InstructionBuilderTypes.CustomInstruction,
|
|
1221
|
+
params: {
|
|
1222
|
+
programId: instruction.programId.toString(),
|
|
1223
|
+
keys: instruction.keys.map((key) => ({
|
|
1224
|
+
pubkey: key.pubkey.toString(),
|
|
1225
|
+
isSigner: key.isSigner,
|
|
1226
|
+
isWritable: key.isWritable,
|
|
1227
|
+
})),
|
|
1228
|
+
data: instruction.data.toString('base64'),
|
|
1229
|
+
},
|
|
1230
|
+
};
|
|
1231
|
+
instructionData.push(customInstruction);
|
|
1232
|
+
}
|
|
1233
|
+
return instructionData;
|
|
1234
|
+
}
|
|
1235
|
+
export function findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName) {
|
|
1236
|
+
let token;
|
|
1237
|
+
coins.forEach((value, key) => {
|
|
1238
|
+
if (value instanceof SolCoin && value.tokenAddress === mintAddress) {
|
|
1239
|
+
token = value.name;
|
|
1240
|
+
}
|
|
1241
|
+
});
|
|
1242
|
+
if (!token && instructionMetadata) {
|
|
1243
|
+
instructionMetadata.forEach((instruction) => {
|
|
1244
|
+
if (instruction.type === InstructionBuilderTypes.CreateAssociatedTokenAccount &&
|
|
1245
|
+
instruction.params.mintAddress === mintAddress) {
|
|
1246
|
+
token = instruction.params.tokenName;
|
|
1247
|
+
}
|
|
1248
|
+
else if (instruction.type === InstructionBuilderTypes.TokenTransfer &&
|
|
1249
|
+
instruction.params.tokenAddress === mintAddress) {
|
|
1250
|
+
token = instruction.params.tokenName;
|
|
1251
|
+
}
|
|
1252
|
+
});
|
|
1253
|
+
}
|
|
1254
|
+
if (!token && _useTokenAddressTokenName) {
|
|
1255
|
+
token = mintAddress;
|
|
1256
|
+
}
|
|
1257
|
+
assert(token);
|
|
1258
|
+
return token;
|
|
1259
|
+
}
|
|
1260
|
+
export function findTransferHookAccounts(fromAddress, toAddress, tokenAddress, instructionMetadata) {
|
|
1261
|
+
let transferHookAccounts;
|
|
1262
|
+
instructionMetadata?.forEach((instruction) => {
|
|
1263
|
+
if (instruction.type === InstructionBuilderTypes.TokenTransfer &&
|
|
1264
|
+
instruction.params.tokenAddress === tokenAddress &&
|
|
1265
|
+
instruction.params.fromAddress === fromAddress &&
|
|
1266
|
+
instruction.params.toAddress === toAddress) {
|
|
1267
|
+
transferHookAccounts = instruction.params.transferHookAccounts;
|
|
1268
|
+
}
|
|
1269
|
+
});
|
|
1270
|
+
return transferHookAccounts;
|
|
1271
|
+
}
|
|
1272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdDQUFnQyxFQUNoQyx1Q0FBdUMsRUFFdkMscUJBQXFCLEVBRXJCLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixzQkFBc0IsR0FDdkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBU0wsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixpQkFBaUIsRUFFakIsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUF5Qi9HLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLElBQXFCLEVBQ3JCLFlBQXNDLEVBQ3RDLFFBQWlCLEVBQ2pCLG1CQUF5QyxFQUN6Qyx5QkFBbUM7SUFFbkMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssZUFBZSxDQUFDLG9CQUFvQjtZQUN2QyxPQUFPLDJCQUEyQixDQUFDLFlBQVksQ0FB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QUssWUFBWTtZQUNoRCxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQzlDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFDMUMsQ0FBQztZQUNELG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7UUFDakUsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uLFxuICBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkV2l0aEZlZUluc3RydWN0aW9uLFxuICBEZWNvZGVkQnVybkluc3RydWN0aW9uLFxuICBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24sXG4gIERlY29kZWRNaW50VG9JbnN0cnVjdGlvbixcbiAgZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24sXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgZGVjb2RlQXBwcm92ZUluc3RydWN0aW9uLFxuICBUb2tlbkluc3RydWN0aW9uLFxuICBUcmFuc2ZlckZlZUluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBBbGxvY2F0ZVBhcmFtcyxcbiAgQXNzaWduUGFyYW1zLFxuICBDcmVhdGVBY2NvdW50UGFyYW1zLFxuICBEZWFjdGl2YXRlU3Rha2VQYXJhbXMsXG4gIERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uLFxuICBEZWxlZ2F0ZVN0YWtlUGFyYW1zLFxuICBJbml0aWFsaXplU3Rha2VQYXJhbXMsXG4gIFNwbGl0U3Rha2VQYXJhbXMsXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSwgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEF0YUNsb3NlLFxuICBBdGFJbml0LFxuICBBdGFSZWNvdmVyTmVzdGVkLFxuICBCdXJuLFxuICBFeHRyYUFjY291bnRNZXRhLFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgTWVtbyxcbiAgTWludFRvLFxuICBOb25jZSxcbiAgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplLFxuICBTdGFraW5nRGVhY3RpdmF0ZSxcbiAgU3Rha2luZ0RlbGVnYXRlLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zZmVyLFxuICBXYWxsZXRJbml0LFxuICBTZXRDb21wdXRlVW5pdExpbWl0LFxuICBTZXRQcmlvcml0eUZlZSxcbiAgQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gIEFwcHJvdmUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0SW5zdHJ1Y3Rpb25UeXBlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZXBvc2l0U29sUGFyYW1zLCBXaXRoZHJhd1N0YWtlUGFyYW1zIH0gZnJvbSAnQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCc7XG5pbXBvcnQgeyBkZWNvZGVEZXBvc2l0U29sLCBkZWNvZGVXaXRoZHJhd1N0YWtlIH0gZnJvbSAnLi9qaXRvU3Rha2VQb29sT3BlcmF0aW9ucyc7XG5cbi8qKlxuICogQ29uc3RydWN0IGluc3RydWN0aW9ucyBwYXJhbXMgZnJvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHR5cGUgLSB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICB0eXBlOiBUcmFuc2FjdGlvblR5cGUsXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBJbnN0cnVjdGlvblBhcmFtc1tdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgIHJldHVybiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgY29pbk5hbWUpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICByZXR1cm4gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDpcbiAgICAgIHJldHVybiBwYXJzZUN1c3RvbUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGluc3RydWN0aW9uTWV0YWRhdGEpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbmZpZGVudGlhbFRyYW5zZmVyOlxuICAgICAgcmV0dXJuIHBhcnNlQ29uZmlkZW50aWFsVHJhbnNmZXJJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBub25jZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFdhbGxldCBpbml0aWFsaXphdGlvbiB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbyB8IFNldENvbXB1dGVVbml0TGltaXQgfCBTZXRQcmlvcml0eUZlZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PFdhbGxldEluaXQgfCBNZW1vIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlPiA9IFtdO1xuICAvLyBDb21wdXRlLWJ1ZGdldCBpbnN0cnVjdGlvbnMgY2FuIGxlYWQgdGhlIHRyYW5zYWN0aW9uIGJ1dCBhcmUgbm90IHBhcnQgb2YgdGhlIGZpeGVkXG4gIC8vIHdhbGxldC1pbml0IGxheW91dCwgc28gcGFyc2UgdGhlbSBhcGFydCBmcm9tIHRoZSBpbmRleGVkIGNyZWF0ZS9pbml0aWFsaXplIGluc3RydWN0aW9uc1xuICBjb25zdCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zLmZpbHRlcigoaW5zdHJ1Y3Rpb24pID0+ICFpc0NvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGlmIChpc0NvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpIHtcbiAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHBhcnNlQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNyZWF0ZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChcbiAgICB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuQ3JlYXRlXVxuICApO1xuICBjb25zdCBub25jZUluaXRJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlSW5pdGlhbGl6ZShcbiAgICB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuSW5pdGlhbGl6ZU5vbmNlQWNjb3VudF1cbiAgKTtcblxuICBjb25zdCB3YWxsZXRJbml0OiBXYWxsZXRJbml0ID0ge1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudCxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGZyb21BZGRyZXNzOiBjcmVhdGVJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBub25jZUFkZHJlc3M6IG5vbmNlSW5pdEluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgYW1vdW50OiBjcmVhdGVJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHdhbGxldEluaXQpO1xuXG4gIGNvbnN0IG1lbW8gPSBnZXRNZW1vKHdhbGxldEluaXRJbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzIGEgY29tcHV0ZS1idWRnZXQgaW5zdHJ1Y3Rpb24gKFNldENvbXB1dGVVbml0TGltaXQgb3JcbiAqIFNldFByaW9yaXR5RmVlKSwgd2hpY2ggY2FuIGxlYWQgYW55IHRyYW5zYWN0aW9uIHdpdGhvdXQgYWZmZWN0aW5nIGl0cyB0eXBlIG9yIGxheW91dC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gdGhlIGluc3RydWN0aW9uIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIGNvbXB1dGUtYnVkZ2V0IGluc3RydWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICByZXR1cm4gdHlwZSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRDb21wdXRlVW5pdExpbWl0IHx8IHR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0UHJpb3JpdHlGZWU7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgY29tcHV0ZS1idWRnZXQgaW5zdHJ1Y3Rpb24gKFNldENvbXB1dGVVbml0TGltaXQgb3IgU2V0UHJpb3JpdHlGZWUpIGludG8gaXRzXG4gKiBpbnN0cnVjdGlvbnMgcGFyYW1zIGZvcm0uXG4gKlxuICogQ29tcHV0ZS1idWRnZXQgaW5zdHJ1Y3Rpb25zIGFyZSBib2lsZXJwbGF0ZSB0aGF0IGNhbiBsZWFkIGFueSB0cmFuc2FjdGlvbiwgc28gZXZlcnlcbiAqIHBhcnNlciBhY2NlcHRzIHRoZW06IGluaXRCdWlsZGVyIHJlbGllcyBvbiB0aGVtIHRvIHJlc3RvcmUgdGhlIGNvbXB1dGUgdW5pdCBsaW1pdFxuICogYW5kIHRoZSBwcmlvcml0eSBmZWUgb24gYSByZWJ1aWxkIGZyb20gcmF3LCBhbmQgZXhwbGFpbiBmaWx0ZXJzIHRoZW0gb3V0LlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb24gLSB0aGUgY29tcHV0ZS1idWRnZXQgaW5zdHJ1Y3Rpb24gdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7U2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlfSB0aGUgcGFyc2VkIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5mdW5jdGlvbiBwYXJzZUNvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IFNldENvbXB1dGVVbml0TGltaXQgfCBTZXRQcmlvcml0eUZlZSB7XG4gIHN3aXRjaCAoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkge1xuICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgY29uc3Qgc2V0Q29tcHV0ZVVuaXRMaW1pdFBhcmFtcyA9IENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5kZWNvZGVTZXRDb21wdXRlVW5pdExpbWl0KGluc3RydWN0aW9uKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldENvbXB1dGVVbml0TGltaXQsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHVuaXRzOiBzZXRDb21wdXRlVW5pdExpbWl0UGFyYW1zLnVuaXRzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0UHJpb3JpdHlGZWU6XG4gICAgICBjb25zdCBzZXRDb21wdXRlVW5pdFByaWNlUGFyYW1zID0gQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLmRlY29kZVNldENvbXB1dGVVbml0UHJpY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0UHJpb3JpdHlGZWUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZlZTogc2V0Q29tcHV0ZVVuaXRQcmljZVBhcmFtcy5taWNyb0xhbXBvcnRzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBTZW5kIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTWVtbywgVHJhbnNmZXIgYW5kIEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2VuZEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogQXJyYXk8XG4gIHwgTm9uY2VcbiAgfCBNZW1vXG4gIHwgVHJhbnNmZXJcbiAgfCBUb2tlblRyYW5zZmVyXG4gIHwgQXRhSW5pdFxuICB8IEF0YUNsb3NlXG4gIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdFxuICB8IFNldFByaW9yaXR5RmVlXG4gIHwgTWludFRvXG4gIHwgQnVyblxuICB8IEFwcHJvdmVcbiAgfCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50XG4+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxcbiAgICB8IE5vbmNlXG4gICAgfCBNZW1vXG4gICAgfCBUcmFuc2ZlclxuICAgIHwgVG9rZW5UcmFuc2ZlclxuICAgIHwgQXRhSW5pdFxuICAgIHwgQXRhQ2xvc2VcbiAgICB8IFNldENvbXB1dGVVbml0TGltaXRcbiAgICB8IFNldFByaW9yaXR5RmVlXG4gICAgfCBNaW50VG9cbiAgICB8IEJ1cm5cbiAgICB8IEFwcHJvdmVcbiAgICB8IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRcbiAgPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcjogVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24udG9QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgaXNUb2tlbjIwMjJUcmFuc2ZlciA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgaXNUcmFuc2ZlcldpdGhGZWUgPVxuICAgICAgICAgIGlzVG9rZW4yMDIyVHJhbnNmZXIgJiZcbiAgICAgICAgICBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA+PSAyICYmXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YVswXSA9PT0gVG9rZW5JbnN0cnVjdGlvbi5UcmFuc2ZlckZlZUV4dGVuc2lvbiAmJlxuICAgICAgICAgIGluc3RydWN0aW9uLmRhdGFbMV0gPT09IFRyYW5zZmVyRmVlSW5zdHJ1Y3Rpb24uVHJhbnNmZXJDaGVja2VkV2l0aEZlZTtcbiAgICAgICAgbGV0IHR0S2V5czogRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uWydrZXlzJ107XG4gICAgICAgIGxldCB0dEFtb3VudDogYmlnaW50O1xuICAgICAgICBsZXQgdHREZWNpbWFsczogbnVtYmVyO1xuICAgICAgICBsZXQgdHRGZWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGlzVHJhbnNmZXJXaXRoRmVlKSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZFdpdGhGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgICAvLyBXaXRoRmVlIGV4cG9zZXMgYGF1dGhvcml0eWAgd2hlcmUgVHJhbnNmZXJDaGVja2VkIGV4cG9zZXMgYG93bmVyYDsgbm9ybWFsaXplIHRvIG93bmVyLlxuICAgICAgICAgIHR0S2V5cyA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogZGVjb2RlZC5rZXlzLnNvdXJjZSxcbiAgICAgICAgICAgIG1pbnQ6IGRlY29kZWQua2V5cy5taW50LFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGRlY29kZWQua2V5cy5kZXN0aW5hdGlvbixcbiAgICAgICAgICAgIG93bmVyOiBkZWNvZGVkLmtleXMuYXV0aG9yaXR5LFxuICAgICAgICAgIH0gYXMgRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uWydrZXlzJ107XG4gICAgICAgICAgdHRBbW91bnQgPSBkZWNvZGVkLmRhdGEuYW1vdW50O1xuICAgICAgICAgIHR0RGVjaW1hbHMgPSBkZWNvZGVkLmRhdGEuZGVjaW1hbHM7XG4gICAgICAgICAgdHRGZWUgPSBkZWNvZGVkLmRhdGEuZmVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICBpc1Rva2VuMjAyMlRyYW5zZmVyID8gVE9LRU5fMjAyMl9QUk9HUkFNX0lEIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0dEtleXMgPSBkZWNvZGVkLmtleXM7XG4gICAgICAgICAgdHRBbW91bnQgPSBkZWNvZGVkLmRhdGEuYW1vdW50O1xuICAgICAgICAgIHR0RGVjaW1hbHMgPSBkZWNvZGVkLmRhdGEuZGVjaW1hbHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gdHRLZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUodG9rZW5BZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvclRva2VuVHJhbnNmZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvclRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2Zlckhvb2tBY2NvdW50cyA9IGZpbmRUcmFuc2Zlckhvb2tBY2NvdW50cyhcbiAgICAgICAgICB0dEtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgdHRLZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRva2VuVHJhbnNmZXI6IFRva2VuVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0dEtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHR0S2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHR0S2V5cy5zb3VyY2UucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHR0RGVjaW1hbHMsXG4gICAgICAgICAgICAuLi4odHRGZWUgIT09IHVuZGVmaW5lZCA/IHsgZmVlOiB0dEZlZSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHRyYW5zZmVySG9va0FjY291bnRzID8geyB0cmFuc2Zlckhvb2tBY2NvdW50cyB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRva2VuVHJhbnNmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BcHByb3ZlOlxuICAgICAgICBjb25zdCBwcm9ncmFtSWQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQuZXF1YWxzKFRPS0VOXzIwMjJfUFJPR1JBTV9JRCkgPyBUT0tFTl8yMDIyX1BST0dSQU1fSUQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVJbnN0cnVjdGlvbiA9IGRlY29kZUFwcHJvdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgcHJvZ3JhbUlkKTtcbiAgICAgICAgY29uc3QgYXBwcm92ZTogQXBwcm92ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHByb3ZlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3M6IGFwcHJvdmVJbnN0cnVjdGlvbi5rZXlzLmFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRlbGVnYXRlQWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMuZGVsZWdhdGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMub3duZXIudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogYXBwcm92ZUluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JZCAmJiBwcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhcHByb3ZlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnRUb2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JRDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlEID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBtaW50VG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWNjb3VudEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQWRkcmVzcyA9XG4gICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuRGVzdGluYXRpb25BZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkF1dGhvcml0eUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGF0YUNsb3NlOiBBdGFDbG9zZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzcyxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgICAuLi4oaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLmVxdWFscyhUT0tFTl8yMDIyX1BST0dSQU1fSUQpXG4gICAgICAgICAgICAgID8geyBwcm9ncmFtSWQ6IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldFByaW9yaXR5RmVlOlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChwYXJzZUNvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NaW50VG86XG4gICAgICAgIGxldCBtaW50VG9JbnN0cnVjdGlvbjogRGVjb2RlZE1pbnRUb0luc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgbWludFRvSW5zdHJ1Y3Rpb24gPSBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWludFRvSW5zdHJ1Y3Rpb24gPSBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50QWRkcmVzc0Zvck1pbnQgPSBtaW50VG9JbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZUZvck1pbnQgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzRm9yTWludCwgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JNaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JNaW50ID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludFRvOiBNaW50VG8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWludFRvLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3M6IG1pbnRBZGRyZXNzRm9yTWludCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzczogbWludFRvSW5zdHJ1Y3Rpb24ua2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IG1pbnRUb0luc3RydWN0aW9uLmtleXMuYXV0aG9yaXR5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBtaW50VG9JbnN0cnVjdGlvbi5kYXRhLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWVGb3JNaW50LFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSURGb3JNaW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1pbnRUbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkJ1cm46XG4gICAgICAgIGxldCBidXJuSW5zdHJ1Y3Rpb246IERlY29kZWRCdXJuSW5zdHJ1Y3Rpb247XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBidXJuSW5zdHJ1Y3Rpb24gPSBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1cm5JbnN0cnVjdGlvbiA9IGRlY29kZUJ1cm5JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50QWRkcmVzc0ZvckJ1cm4gPSBidXJuSW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWVGb3JCdXJuID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzc0ZvckJ1cm4sIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlERm9yQnVybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlERm9yQnVybiA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1cm46IEJ1cm4gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQnVybixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QWRkcmVzc0ZvckJ1cm4sXG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogYnVybkluc3RydWN0aW9uLmtleXMuYWNjb3VudC5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IGJ1cm5JbnN0cnVjdGlvbi5rZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBidXJuSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lRm9yQnVybixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yQnVybixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChidXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudDpcbiAgICAgICAgLy8gQWNjb3VudCBvcmRlciBtYXRjaGVzIHRoZSBmaXhlZCBsYXlvdXQgZW1pdHRlZCBieSBzb2xJbnN0cnVjdGlvbkZhY3Rvcnk6XG4gICAgICAgIC8vIFthdXRob3JpdHksIG1pbnQsIHRva2VuQWNjb3VudCwgZmxhZ0FjY291bnQsIHRva2VuQWNjb3VudE93bmVyLCBtaW50Q29uZmlnLFxuICAgICAgICAvLyAgdG9rZW5Qcm9ncmFtLCBzeXN0ZW1Qcm9ncmFtLCBnYXRpbmdQcm9ncmFtLCAuLi5leHRyYUFjY291bnRzXS5cbiAgICAgICAgY29uc3QgdGhhd0V4dHJhQWNjb3VudHM6IEV4dHJhQWNjb3VudE1ldGFbXSA9IGluc3RydWN0aW9uLmtleXMuc2xpY2UoOSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgaXNTaWduZXI6IGtleS5pc1NpZ25lcixcbiAgICAgICAgICBpc1dyaXRhYmxlOiBrZXkuaXNXcml0YWJsZSxcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ubGVzc1RoYXc6IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGF1dGhvcml0eTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1pbnQ6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFjY291bnQ6IGluc3RydWN0aW9uLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBmbGFnQWNjb3VudDogaW5zdHJ1Y3Rpb24ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuQWNjb3VudE93bmVyOiBpbnN0cnVjdGlvbi5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbWludENvbmZpZzogaW5zdHJ1Y3Rpb24ua2V5c1s1XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s2XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN5c3RlbVByb2dyYW06IGluc3RydWN0aW9uLmtleXNbN10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBnYXRpbmdQcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzhdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZXh0cmFBY2NvdW50czogdGhhd0V4dHJhQWNjb3VudHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gocGVybWlzc2lvbmxlc3NUaGF3KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbnR5cGUgU3Rha2luZ0luc3RydWN0aW9ucyA9IHtcbiAgZGVwb3NpdFNvbD86IERlcG9zaXRTb2xQYXJhbXM7XG4gIGNyZWF0ZT86IENyZWF0ZUFjY291bnRQYXJhbXM7XG4gIGluaXRpYWxpemU/OiBJbml0aWFsaXplU3Rha2VQYXJhbXM7XG4gIGRlbGVnYXRlPzogRGVsZWdhdGVTdGFrZVBhcmFtcztcbiAgaGFzQXRhSW5pdD86IGJvb2xlYW47XG59O1xuXG50eXBlIEppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgZGVwb3NpdFNvbDogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snZGVwb3NpdFNvbCddPjtcbn07XG5cbmZ1bmN0aW9uIGlzSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBKaXRvU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5kZXBvc2l0U29sICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgY3JlYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydjcmVhdGUnXT47XG4gIGluaXRpYWxpemU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2luaXRpYWxpemUnXT47XG59O1xuXG5mdW5jdGlvbiBpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIE1hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5jcmVhdGUgIT09IHVuZGVmaW5lZCAmJiBzaS5pbml0aWFsaXplICE9PSB1bmRlZmluZWQgJiYgc2kuZGVsZWdhdGUgPT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgY3JlYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydjcmVhdGUnXT47XG4gIGluaXRpYWxpemU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2luaXRpYWxpemUnXT47XG4gIGRlbGVnYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydkZWxlZ2F0ZSddPjtcbn07XG5cbmZ1bmN0aW9uIGlzTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIE5hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuY3JlYXRlICE9PSB1bmRlZmluZWQgJiYgc2kuaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmRlbGVnYXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUeXBlRnJvbVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBTb2xTdGFraW5nVHlwZUVudW0ge1xuICBjb25zdCBpc0ppdG8gPSBpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgY29uc3QgaXNNYXJpbmFkZSA9IGlzTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgY29uc3QgaXNOYXRpdmUgPSBpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2kpO1xuICBhc3NlcnQoW2lzSml0bywgaXNNYXJpbmFkZSwgaXNOYXRpdmVdLmZpbHRlcigoeCkgPT4geCkubGVuZ3RoID09PSAxLCAnU3Rha2luZ1R5cGUgaXMgYW1iaWd1b3VzJyk7XG4gIGlmIChpc0ppdG8pIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uSklUTztcbiAgaWYgKGlzTWFyaW5hZGUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU7XG4gIGlmIChpc05hdGl2ZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU7XG4gIGFzc2VydChmYWxzZSwgJ05vIFN0YWtpbmdUeXBlIGZvdW5kJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgdHggYW5kIGRlbGVnYXRlIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdBY3RpdmF0ZSBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8gfCBBdGFJbml0IHwgU2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vIHwgQXRhSW5pdCB8IFNldENvbXB1dGVVbml0TGltaXQgfCBTZXRQcmlvcml0eUZlZT4gPSBbXTtcbiAgY29uc3Qgc3Rha2luZ0luc3RydWN0aW9ucyA9IHt9IGFzIFN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gocGFyc2VDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ3JlYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdJbml0aWFsaXplOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZUluaXRpYWxpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkRlcG9zaXRTb2w6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVwb3NpdFNvbCA9IGRlY29kZURlcG9zaXRTb2woaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkluaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmhhc0F0YUluaXQgPSB0cnVlO1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBmaW5kVG9rZW5OYW1lKGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuICBjb25zdCBzdGFraW5nVHlwZSA9IGdldFN0YWtpbmdUeXBlRnJvbVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucyk7XG5cbiAgbGV0IHN0YWtpbmdBY3RpdmF0ZTogU3Rha2luZ0FjdGl2YXRlIHwgdW5kZWZpbmVkO1xuXG4gIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPOiB7XG4gICAgICBhc3NlcnQoaXNKaXRvU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKSk7XG4gICAgICBjb25zdCB7IGRlcG9zaXRTb2wsIGhhc0F0YUluaXQgfSA9IHN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gICAgICBzdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGRlcG9zaXRTb2wuZnVuZGluZ0FjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogZGVwb3NpdFNvbC5zdGFrZVBvb2wudG9TdHJpbmcoKSxcbiAgICAgICAgICBhbW91bnQ6IGRlcG9zaXRTb2wubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IGRlcG9zaXRTb2wuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgZXh0cmFQYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtlUG9vbERhdGE6IHtcbiAgICAgICAgICAgICAgbWFuYWdlckZlZUFjY291bnQ6IGRlcG9zaXRTb2wubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgcG9vbE1pbnQ6IGRlcG9zaXRTb2wucG9vbE1pbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgcmVzZXJ2ZVN0YWtlOiBkZXBvc2l0U29sLnJlc2VydmVTdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6ICEhaGFzQXRhSW5pdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICBhc3NlcnQoaXNNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucykpO1xuICAgICAgY29uc3QgeyBjcmVhdGUsIGluaXRpYWxpemUgfSA9IHN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gICAgICBzdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZS5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGluaXRpYWxpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBhbW91bnQ6IGNyZWF0ZS5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIHZhbGlkYXRvcjogaW5pdGlhbGl6ZS5hdXRob3JpemVkLnN0YWtlci50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRToge1xuICAgICAgYXNzZXJ0KGlzTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKSk7XG4gICAgICBjb25zdCB7IGNyZWF0ZSwgaW5pdGlhbGl6ZSwgZGVsZWdhdGUgfSA9IHN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gICAgICBzdGFraW5nQWN0aXZhdGUgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZS5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGluaXRpYWxpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBhbW91bnQ6IGNyZWF0ZS5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIHZhbGlkYXRvcjogZGVsZWdhdGUudm90ZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IHVucmVhY2hhYmxlOiBuZXZlciA9IHN0YWtpbmdUeXBlO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YWtpbmcgdHlwZSAke3VucmVhY2hhYmxlfWApO1xuICAgIH1cbiAgfVxuXG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdBY3RpdmF0ZSk7XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIGRlbGVnYXRlIHR4XG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nRGVsZWdhdGVcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBkZWxlZ2F0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlbGVnYXRlIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVsZWdhdGUgfCBTZXRDb21wdXRlVW5pdExpbWl0IHwgU2V0UHJpb3JpdHlGZWU+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gocGFyc2VDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcyA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nRGVsZWdhdGU6IFN0YWtpbmdEZWxlZ2F0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLnZvdGVQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVsZWdhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnM6IFN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgaWYgKHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPT09IHVuZGVmaW5lZCAmJiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlcG9zaXRTb2wgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSAmJiAhc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgaW5pdGlhbGl6ZSBzdGFrZSBhY2NvdW50L2RlbGVnYXRlIGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7XG4gIGFsbG9jYXRlPzogQWxsb2NhdGVQYXJhbXM7XG4gIGFzc2lnbj86IEFzc2lnblBhcmFtcztcbiAgc3BsaXQ/OiBTcGxpdFN0YWtlUGFyYW1zO1xuICBkZWFjdGl2YXRlPzogRGVhY3RpdmF0ZVN0YWtlUGFyYW1zO1xuICB0cmFuc2Zlcj86IERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uO1xuICB3aXRoZHJhd1N0YWtlPzogV2l0aGRyYXdTdGFrZVBhcmFtcztcbn07XG5cbnR5cGUgSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyA9IFVuc3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgd2l0aGRyYXdTdGFrZTogTm9uTnVsbGFibGU8VW5zdGFraW5nSW5zdHJ1Y3Rpb25zWyd3aXRoZHJhd1N0YWtlJ10+O1xufTtcblxuZnVuY3Rpb24gaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLndpdGhkcmF3U3Rha2UgIT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIHRyYW5zZmVyOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3RyYW5zZmVyJ10+O1xufTtcblxuZnVuY3Rpb24gaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkudHJhbnNmZXIgIT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlID09PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0gVW5zdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICBkZWFjdGl2YXRlOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ2RlYWN0aXZhdGUnXT47XG4gIHNwbGl0OiBVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3NwbGl0J107XG59O1xuXG5mdW5jdGlvbiBpc05hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLndpdGhkcmF3U3Rha2UgPT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUeXBlRnJvbVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogU29sU3Rha2luZ1R5cGVFbnVtIHtcbiAgY29uc3QgaXNKaXRvID0gaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgY29uc3QgaXNNYXJpbmFkZSA9IGlzTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBjb25zdCBpc05hdGl2ZSA9IGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgYXNzZXJ0KFtpc0ppdG8sIGlzTWFyaW5hZGUsIGlzTmF0aXZlXS5maWx0ZXIoKHgpID0+IHgpLmxlbmd0aCA9PT0gMSwgJ1N0YWtpbmdUeXBlIGlzIGFtYmlndW91cycpO1xuICBpZiAoaXNKaXRvKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE87XG4gIGlmIChpc01hcmluYWRlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFO1xuICBpZiAoaXNOYXRpdmUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFO1xuICBhc3NlcnQoZmFsc2UsICdObyBTdGFraW5nVHlwZSBmb3VuZCcpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBkZWFjdGl2YXRlIHN0YWtlIHR4IGluc3RydWN0aW9ucyBwYXJhbXMuIFN1cHBvcnRzIGZ1bGwgc3Rha2VcbiAqIGFjY291bnQgZGVhY3RpdmF0aW9uIGFuZCBwYXJ0aWFsIHN0YWtlIGFjY291bnQgZGVhY3RpdmF0aW9uLlxuICpcbiAqIFdoZW4gcGFydGlhbGx5IGRlYWN0aXZhdGluZyBhIHN0YWtlIGFjY291bnQgdGhpcyBtZXRob2QgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczogQWxsb2NhdGUsXG4gKiB0byBhbGxvY2F0ZSBhIG5ldyBzdGFraW5nIGFjY291bnQsIEFzc2lnbiwgdG8gYXNzaWduIHRoZSBuZXdseSBjcmVhdGVkIHN0YWtpbmcgYWNjb3VudCB0byB0aGVcbiAqIFN0YWtlIFByb2dyYW0sIFNwbGl0LCB0byBzcGxpdCB0aGUgY3VycmVudCBzdGFrZSBhY2NvdW50LCBhbmQgU3Rha2luZ0RlYWN0aXZhdGUgdG8gZGVhY3RpdmF0ZSB0aGVcbiAqIG5ld2x5IGNyZWF0ZWQgc3Rha2UgYWNjb3VudC5cbiAqXG4gKiBTdXBwb3J0cyBOb25jZSwgU3Rha2luZ0RlYWN0aXZhdGUsIE1lbW8sIEFsbG9jYXRlLCBBc3NpZ24sIGFuZCBTcGxpdCBTb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGNvaW5OYW1lPzogc3RyaW5nXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbyB8IFNldENvbXB1dGVVbml0TGltaXQgfCBTZXRQcmlvcml0eUZlZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlPiA9IFtdO1xuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9uc1tdID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gocGFyc2VDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BbGxvY2F0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hbGxvY2F0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPVxuICAgICAgICAgICAgU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFsbG9jYXRlOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Bc3NpZ246XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hc3NpZ24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFzc2lnbjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNwbGl0OlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnNwbGl0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlU3BsaXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNwbGl0OiBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPVxuICAgICAgICAgICAgU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkZWFjdGl2YXRlOiBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNmZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2ZlcjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uV2l0aGRyYXdTdGFrZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS53aXRoZHJhd1N0YWtlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS53aXRoZHJhd1N0YWtlID0gZGVjb2RlV2l0aGRyYXdTdGFrZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgd2l0aGRyYXdTdGFrZTogZGVjb2RlV2l0aGRyYXdTdGFrZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbiBvZiB1bnN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgICB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbik7XG4gICAgY29uc3Qgc3Rha2luZ1R5cGUgPSBnZXRTdGFraW5nVHlwZUZyb21VbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pO1xuXG4gICAgbGV0IHN0YWtpbmdEZWFjdGl2YXRlOiBTdGFraW5nRGVhY3RpdmF0ZSB8IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLkpJVE86IHtcbiAgICAgICAgYXNzZXJ0KGlzSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbikpO1xuICAgICAgICBjb25zdCB7IHdpdGhkcmF3U3Rha2UgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3U3Rha2UuZGVzdGluYXRpb25TdGFrZUF1dGhvcml0eS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3U3Rha2Uuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHdpdGhkcmF3U3Rha2UucG9vbFRva2Vucy50b1N0cmluZygpLFxuICAgICAgICAgICAgdW5zdGFraW5nQWRkcmVzczogd2l0aGRyYXdTdGFrZS5kZXN0aW5hdGlvblN0YWtlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBleHRyYVBhcmFtczoge1xuICAgICAgICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgICAgICAgbWFuYWdlckZlZUFjY291bnQ6IHdpdGhkcmF3U3Rha2UubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBwb29sTWludDogd2l0aGRyYXdTdGFrZS5wb29sTWludC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRvckxpc3RBY2NvdW50OiB3aXRoZHJhd1N0YWtlLnZhbGlkYXRvckxpc3QudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogd2l0aGRyYXdTdGFrZS52YWxpZGF0b3JTdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICB0cmFuc2ZlckF1dGhvcml0eUFkZHJlc3M6IHdpdGhkcmF3U3Rha2Uuc291cmNlVHJhbnNmZXJBdXRob3JpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICAgIGFzc2VydChpc01hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKSk7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNmZXIgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuXG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogJycsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlci50b1B1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXIubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRToge1xuICAgICAgICBhc3NlcnQoaXNOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgY29uc3QgeyBkZWFjdGl2YXRlLCBzcGxpdCB9ID0gdW5zdGFraW5nSW5zdHJ1Y3Rpb247XG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogZGVhY3RpdmF0ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogc3BsaXQ/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHwgZGVhY3RpdmF0ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBzcGxpdD8ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHNwbGl0Py5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgdW5yZWFjaGFibGU6IG5ldmVyID0gc3Rha2luZ1R5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFraW5nIHR5cGUgJHt1bnJlYWNoYWJsZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVhY3RpdmF0ZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9ucykge1xuICAvLyBDYXNlcyB3aGVyZSBleGFjdGx5IG9uZSBmaWVsZCBzaG91bGQgYmUgcHJlc2VudFxuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzOiAoa2V5b2YgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKVtdID0gW1xuICAgICdhbGxvY2F0ZScsXG4gICAgJ2Fzc2lnbicsXG4gICAgJ3NwbGl0JyxcbiAgICAnZGVhY3RpdmF0ZScsXG4gICAgJ3RyYW5zZmVyJyxcbiAgXSBhcyBjb25zdDtcbiAgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9uc0tleXMuZXZlcnkoKGspID0+ICEhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW2tdID09PSAoayA9PT0gJ3RyYW5zZmVyJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICd3aXRoZHJhd1N0YWtlJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICdkZWFjdGl2YXRlJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FzZXMgd2hlcmUgZGVhY3RpdmF0ZSBmaWVsZCBtdXN0IGJlIHByZXNlbnQgd2l0aCBhbm90aGVyIGZpZWxkXG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH1cblxuICAvLyBUaGlzIGlzIGEgc3Rha2UgcG9vbCBpbnN0cnVjdGlvbiwgbm90IGEgcGFydGlhbCB1bnN0YWtlXG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMud2l0aGRyYXdTdGFrZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhbGxvY2F0ZSB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbikge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFzc2lnbiB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0KSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3Npbmcgc3BsaXQgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24uYWNjb3VudFB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgYW5kIGFzc2lnbiB0aGUgc2FtZSBwdWJsaWMga2V5J1xuICAgICk7XG4gIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLnNwYWNlICE9PSBTdGFrZVByb2dyYW0uc3BhY2UpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgYEludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGFsbG9jYXRlICR7U3Rha2VQcm9ncmFtLnNwYWNlfSBieXRlc2BcbiAgICApO1xuICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtlIGFjY291bnQgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgU3Rha2UgUHJvZ3JhbSdcbiAgICApO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgdGhlIHVuc3Rha2luZyBhY2NvdW50Jyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgPT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIFN0YWtlIEFjY291bnQnXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBmdW5kaW5nIG9mIHVuc3Rha2UgYWRkcmVzcyBpbnN0cnVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgIHdpdGhkcmF3IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdXaXRoZHJhdywgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIHdpdGhkcmF3IHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdCB8IFNldFByaW9yaXR5RmVlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldENvbXB1dGVVbml0TGltaXQ6XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0UHJpb3JpdHlGZWU6XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHBhcnNlQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uKGluc3RydWN0aW9uKSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICBjb25zdCB3aXRoZHJhd0luc3RydWN0aW9uID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVXaXRoZHJhdyhpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHN0YWtpbmdXaXRoZHJhdzogU3Rha2luZ1dpdGhkcmF3ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB3aXRoZHJhd0luc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiB3aXRoZHJhd0luc3RydWN0aW9uLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nV2l0aGRyYXcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbWVtbyBvYmplY3QgZnJvbSBpbnN0cnVjdGlvbnMgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9ucyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gaW5zdHJ1Y3Rpb25JbmRleGVzIC0gdGhlIGluc3RydWN0aW9ucyBpbmRleGVzIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7TWVtbyB8IHVuZGVmaW5lZH0gLSBtZW1vIG9iamVjdCBvciB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gZ2V0TWVtbyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSwgaW5zdHJ1Y3Rpb25JbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTogTWVtbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0xlbmd0aCA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcykubGVuZ3RoO1xuICBpZiAoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gaW5zdHJ1Y3Rpb25zTGVuZ3RoICYmIGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25JbmRleGVzLk1lbW9dLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgIH07XG4gIH1cbn1cblxuY29uc3QgYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIFBheWVyQWRkcmVzczogMCxcbiAgQVRBQWRkcmVzczogMSxcbiAgT3duZXJBZGRyZXNzOiAyLFxuICBNaW50QWRkcmVzczogMyxcbn07XG5cbmNvbnN0IGNsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgQWNjb3VudEFkZHJlc3M6IDAsXG4gIERlc3RpbmF0aW9uQWRkcmVzczogMSxcbiAgQXV0aG9yaXR5QWRkcmVzczogMixcbn07XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gaW5pdGlhbGl6ZSBhc3NvY2lhdGVkIHRva2VuIGFjY291bnQgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXRhSW5pdEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogQXJyYXk8QXRhSW5pdCB8IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQgfCBNZW1vIHwgTm9uY2UgfCBTZXRDb21wdXRlVW5pdExpbWl0IHwgU2V0UHJpb3JpdHlGZWU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxcbiAgICBBdGFJbml0IHwgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCB8IE1lbW8gfCBOb25jZSB8IFNldENvbXB1dGVVbml0TGltaXQgfCBTZXRQcmlvcml0eUZlZVxuICA+ID0gW107XG4gIGxldCBtZW1vOiBNZW1vIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgbWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldFByaW9yaXR5RmVlOlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChwYXJzZUNvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzcywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSUQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JRCA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF0YUluaXQ6IEF0YUluaXQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BVEFBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLlBheWVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JRCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudDpcbiAgICAgICAgY29uc3QgdGhhd0V4dHJhQWNjb3VudHM6IEV4dHJhQWNjb3VudE1ldGFbXSA9IGluc3RydWN0aW9uLmtleXMuc2xpY2UoOSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgaXNTaWduZXI6IGtleS5pc1NpZ25lcixcbiAgICAgICAgICBpc1dyaXRhYmxlOiBrZXkuaXNXcml0YWJsZSxcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ubGVzc1RoYXc6IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGF1dGhvcml0eTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1pbnQ6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFjY291bnQ6IGluc3RydWN0aW9uLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBmbGFnQWNjb3VudDogaW5zdHJ1Y3Rpb24ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuQWNjb3VudE93bmVyOiBpbnN0cnVjdGlvbi5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbWludENvbmZpZzogaW5zdHJ1Y3Rpb24ua2V5c1s1XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s2XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN5c3RlbVByb2dyYW06IGluc3RydWN0aW9uLmtleXNbN10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBnYXRpbmdQcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzhdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZXh0cmFBY2NvdW50czogdGhhd0V4dHJhQWNjb3VudHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gocGVybWlzc2lvbmxlc3NUaGF3KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uRGVwb3NpdFNvbDpcbiAgICAgICAgLy8gQXRhSW5pdCBpcyBhIHBhcnQgb2Ygc3BsLXN0YWtlLXBvb2wncyBkZXBvc2l0U29sIHByb2Nlc3NcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmIChtZW1vKSB7XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuY29uc3QgYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBBY2NvdW50QWRkcmVzczogMCxcbiAgRGVzdGluYXRpb25BZGRyZXNzOiAxLFxuICBBdXRob3JpdHlBZGRyZXNzOiAyLFxufTtcblxuY29uc3QgYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIE5lc3RlZEFjY291bnRBZGRyZXNzOiAwLFxuICBOZXN0ZWRNaW50QWRkcmVzczogMSxcbiAgRGVzdGluYXRpb25BY2NvdW50QWRkcmVzczogMixcbiAgT3duZXJBY2NvdW50QWRkcmVzczogMyxcbiAgT3duZXJNaW50QWRkcmVzczogNCxcbiAgV2FsbGV0QWRkcmVzczogNSxcbn07XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY2xvc2UgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZUF0YUNsb3NlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8QXRhQ2xvc2UgfCBBdGFSZWNvdmVyTmVzdGVkIHwgTm9uY2UgfCBTZXRDb21wdXRlVW5pdExpbWl0IHwgU2V0UHJpb3JpdHlGZWU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxBdGFDbG9zZSB8IEF0YVJlY292ZXJOZXN0ZWQgfCBOb25jZSB8IFNldENvbXB1dGVVbml0TGltaXQgfCBTZXRQcmlvcml0eUZlZT4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gocGFyc2VDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhdGFDbG9zZTogQXRhQ2xvc2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzLkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFDbG9zZUluc3RydWN0aW9uS2V5c0luZGV4ZXMuRGVzdGluYXRpb25BZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzLkF1dGhvcml0eUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgLi4uKGluc3RydWN0aW9uLnByb2dyYW1JZC5lcXVhbHMoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKVxuICAgICAgICAgICAgICA/IHsgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YUNsb3NlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uUmVjb3Zlck5lc3RlZEFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IGF0YVJlY292ZXJOZXN0ZWQ6IEF0YVJlY292ZXJOZXN0ZWQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuUmVjb3Zlck5lc3RlZEFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBuZXN0ZWRBY2NvdW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5OZXN0ZWRBY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXN0ZWRNaW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5OZXN0ZWRNaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFjY291bnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBY2NvdW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyTWludEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJNaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB3YWxsZXRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLldhbGxldEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGF0YVJlY292ZXJOZXN0ZWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbilcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkF1dGhvcml6ZTpcbiAgICAgICAgY29uc3QgYXV0aG9yaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVBdXRob3JpemUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBhdXRob3JpemUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZEF1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUubmV3QXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBhdXRob3JpemUuY3VzdG9kaWFuUHVia2V5Py50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGF1dGhvcml6ZWQgc3Rha2luZyBhY2NvdW50IHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGF1dGhvcml6ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemU+ID0gW107XG4gIGFzc2VydChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyLCAnSW52YWxpZCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zJyk7XG4gIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uc1swXSk7XG4gIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgcGFyYW1zOiB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgY29uc3QgYXV0aG9yaXplID0gaW5zdHJ1Y3Rpb25zWzFdO1xuICBhc3NlcnQoYXV0aG9yaXplLmtleXMubGVuZ3RoID09PSA1LCAnSW52YWxpZCBudW1iZXIgb2Yga2V5cyBpbiBhdXRob3JpemUgaW5zdHJ1Y3Rpb24nKTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5ld0F1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgY3VzdG9kaWFuQWRkcmVzczogYXV0aG9yaXplLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiB0eXBlIGlzIGEgY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gKiAoVG9rZW4tMjAyMiBDVCBleHRlbnNpb24gb3IgemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtKS5cbiAqL1xuZnVuY3Rpb24gaXNDb25maWRlbnRpYWxUcmFuc2Zlckluc3RydWN0aW9uKHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50OlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQXBwbHlQZW5kaW5nQmFsYW5jZTpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZGVudGlhbERlcG9zaXQ6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxXaXRoZHJhdzpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZGVudGlhbFRyYW5zZmVyOlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5UHVia2V5VmFsaWRpdHk6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlFcXVhbGl0eVByb29mOlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5VmFsaWRpdHlQcm9vZjpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVJhbmdlUHJvb2Y6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3VzdG9tIGluc3RydWN0aW9uIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIGN1c3RvbSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcGFyYW0ge0luc3RydWN0aW9uUGFyYW1zW119IGluc3RydWN0aW9uTWV0YWRhdGEgLSB0aGUgaW5zdHJ1Y3Rpb24gbWV0YWRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBjdXN0b20gaW5zdHJ1Y3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3VzdG9tSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW11cbik6IEN1c3RvbUluc3RydWN0aW9uW10ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEN1c3RvbUluc3RydWN0aW9uW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25zW2ldO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBtZXRhZGF0YSBmb3IgdGhpcyBpbnN0cnVjdGlvbiBwb3NpdGlvblxuICAgIGlmIChcbiAgICAgIGluc3RydWN0aW9uTWV0YWRhdGEgJiZcbiAgICAgIGluc3RydWN0aW9uTWV0YWRhdGFbaV0gJiZcbiAgICAgIGluc3RydWN0aW9uTWV0YWRhdGFbaV0udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb25cbiAgICApIHtcbiAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGluc3RydWN0aW9uTWV0YWRhdGFbaV0gYXMgQ3VzdG9tSW5zdHJ1Y3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb252ZXJ0IHRoZSByYXcgaW5zdHJ1Y3Rpb24gdG8gQ3VzdG9tSW5zdHJ1Y3Rpb24gZm9ybWF0XG4gICAgICBjb25zdCBjdXN0b21JbnN0cnVjdGlvbjogQ3VzdG9tSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBwcm9ncmFtSWQ6IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpLFxuICAgICAgICAgIGtleXM6IGluc3RydWN0aW9uLmtleXMubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgICBwdWJrZXk6IGtleS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICAgICAgICBpc1dyaXRhYmxlOiBrZXkuaXNXcml0YWJsZSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goY3VzdG9tSW5zdHJ1Y3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uIHBhcmFtcy5cbiAqXG4gKiBJdGVyYXRlcyByYXcgaW5zdHJ1Y3Rpb25zIGluIG9yZGVyLCBjaGVja2luZyBtZXRhZGF0YSBhdCBlYWNoIHBvc2l0aW9uOlxuICogLSBDVCBpbnN0cnVjdGlvbiBtZXRhZGF0YSBpcyBwcmVzZXJ2ZWQgYXMtaXMgKENUIGluc3RydWN0aW9ucyBjYW5ub3QgYmVcbiAqICAgZGVjb2RlZCBieSBAc29sYW5hL3NwbC10b2tlbiBvciBAc29sYW5hL3dlYjMuanMpLlxuICogLSBDdXN0b21JbnN0cnVjdGlvbiBtZXRhZGF0YSBpcyBwcmVzZXJ2ZWQgYXMtaXMuXG4gKiAtIEFsbCBvdGhlciBpbnN0cnVjdGlvbnMgZmFsbCBiYWNrIHRvIEN1c3RvbUluc3RydWN0aW9uIGZvcm1hdCB3aXRoIHJhd1xuICogICBwcm9ncmFtSWQva2V5cy9kYXRhLlxuICpcbiAqIFRoaXMgc2luZ2xlLXBhc3MgYXBwcm9hY2ggcHJlc2VydmVzIG9yaWdpbmFsIGluc3RydWN0aW9uIG9yZGVyIHNvIHRoYXRcbiAqIHJvdW5kLXRyaXAgcmVjb25zdHJ1Y3Rpb24gaXMgZmFpdGhmdWwuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGNvbnRhaW5pbmcgQ1Qgc29sYW5hIGluc3RydWN0aW9uc1xuICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbk1ldGFkYXRhIC0gdGhlIGluc3RydWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBpbiBvcmlnaW5hbCBvcmRlclxuICovXG5mdW5jdGlvbiBwYXJzZUNvbmZpZGVudGlhbFRyYW5zZmVySW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW11cbik6IEluc3RydWN0aW9uUGFyYW1zW10ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEluc3RydWN0aW9uUGFyYW1zW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25zW2ldO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBtZXRhZGF0YSBmb3IgdGhpcyBpbnN0cnVjdGlvbiBwb3NpdGlvblxuICAgIGlmIChpbnN0cnVjdGlvbk1ldGFkYXRhICYmIGluc3RydWN0aW9uTWV0YWRhdGFbaV0pIHtcbiAgICAgIGNvbnN0IG1ldGFUeXBlID0gaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXS50eXBlO1xuICAgICAgLy8gUHJlc2VydmUgY29uZmlkZW50aWFsIHRyYW5zZmVyIGFuZCBjdXN0b20gaW5zdHJ1Y3Rpb24gbWV0YWRhdGEgYXMtaXNcbiAgICAgIGlmIChpc0NvbmZpZGVudGlhbFRyYW5zZmVySW5zdHJ1Y3Rpb24obWV0YVR5cGUpIHx8IG1ldGFUeXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbikge1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChpbnN0cnVjdGlvbk1ldGFkYXRhW2ldKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0aGUgcmF3IGluc3RydWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uIGZvcm1hdFxuICAgIGNvbnN0IGN1c3RvbUluc3RydWN0aW9uOiBDdXN0b21JbnN0cnVjdGlvbiA9IHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHByb2dyYW1JZDogaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCksXG4gICAgICAgIGtleXM6IGluc3RydWN0aW9uLmtleXMubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgaXNTaWduZXI6IGtleS5pc1NpZ25lcixcbiAgICAgICAgICBpc1dyaXRhYmxlOiBrZXkuaXNXcml0YWJsZSxcbiAgICAgICAgfSkpLFxuICAgICAgICBkYXRhOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChjdXN0b21JbnN0cnVjdGlvbik7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRva2VuTmFtZShcbiAgbWludEFkZHJlc3M6IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBsZXQgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb2lucy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU29sQ29pbiAmJiB2YWx1ZS50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzKSB7XG4gICAgICB0b2tlbiA9IHZhbHVlLm5hbWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAoIXRva2VuICYmIGluc3RydWN0aW9uTWV0YWRhdGEpIHtcbiAgICBpbnN0cnVjdGlvbk1ldGFkYXRhLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLm1pbnRBZGRyZXNzID09PSBtaW50QWRkcmVzc1xuICAgICAgKSB7XG4gICAgICAgIHRva2VuID0gaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyA9PT0gbWludEFkZHJlc3NcbiAgICAgICkge1xuICAgICAgICB0b2tlbiA9IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXRva2VuICYmIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpIHtcbiAgICB0b2tlbiA9IG1pbnRBZGRyZXNzO1xuICB9XG5cbiAgYXNzZXJ0KHRva2VuKTtcblxuICByZXR1cm4gdG9rZW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVHJhbnNmZXJIb29rQWNjb3VudHMoXG4gIGZyb21BZGRyZXNzOiBzdHJpbmcsXG4gIHRvQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW11cbik6IEV4dHJhQWNjb3VudE1ldGFbXSB8IHVuZGVmaW5lZCB7XG4gIGxldCB0cmFuc2Zlckhvb2tBY2NvdW50czogRXh0cmFBY2NvdW50TWV0YVtdIHwgdW5kZWZpbmVkO1xuXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/LmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb24udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlciAmJlxuICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyA9PT0gdG9rZW5BZGRyZXNzICYmXG4gICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MgPT09IGZyb21BZGRyZXNzICYmXG4gICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzID09PSB0b0FkZHJlc3NcbiAgICApIHtcbiAgICAgIHRyYW5zZmVySG9va0FjY291bnRzID0gaW5zdHJ1Y3Rpb24ucGFyYW1zLnRyYW5zZmVySG9va0FjY291bnRzO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRyYW5zZmVySG9va0FjY291bnRzO1xufVxuIl19
|