@bitgo-beta/sdk-coin-sol 7.6.4-beta.6 → 7.6.4-beta.600
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/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/cjs/src/config/token2022StaticConfig.js +50 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/ataInitializationBuilder.js +201 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts +51 -0
- package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/closeAtaBuilder.js +147 -0
- package/dist/{src → cjs/src}/lib/constants.d.ts +24 -0
- package/dist/cjs/src/lib/constants.d.ts.map +1 -0
- package/dist/cjs/src/lib/constants.js +196 -0
- package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/customInstructionBuilder.js +289 -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 +264 -0
- package/dist/{src → cjs/src}/lib/iface.d.ts +22 -2
- 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 +2 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/lib/index.js +10 -2
- package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/instructionParamsFactory.js +1081 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
- package/dist/cjs/src/lib/keyPair.js +63 -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/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/solInstructionFactory.js +609 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -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 +208 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -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 +78 -0
- package/dist/cjs/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/cjs/src/lib/token2022Config.js +27 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts +31 -0
- package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenExtensions.js +112 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/tokenTransferBuilder.js +196 -0
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/transaction.js +612 -0
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilder.js +380 -0
- package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.js +209 -0
- package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilder.js +70 -0
- package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilderV2.js +213 -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 +632 -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 +68 -2
- package/dist/cjs/src/sol.d.ts.map +1 -0
- package/dist/cjs/src/sol.js +1533 -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 +26 -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/{test → cjs/test}/unit/sol.d.ts.map +1 -1
- package/dist/cjs/test/unit/sol.js +4477 -0
- package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/solInstructionFactory.js +501 -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/tokenExtensions.d.ts +2 -0
- package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
- package/dist/cjs/test/unit/tokenExtensions.js +32 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +1108 -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 +471 -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 +333 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -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 +827 -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 +286 -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/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 +557 -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/config/token2022StaticConfig.d.ts +3 -0
- package/dist/esm/config/token2022StaticConfig.js +47 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/lib/ataInitializationBuilder.d.ts +47 -0
- package/dist/{src → esm}/lib/ataInitializationBuilder.d.ts.map +1 -1
- package/dist/esm/lib/ataInitializationBuilder.js +161 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts +51 -0
- package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
- package/dist/esm/lib/closeAtaBuilder.js +140 -0
- package/dist/esm/lib/constants.d.ts +164 -0
- package/dist/esm/lib/constants.d.ts.map +1 -0
- package/dist/esm/lib/constants.js +193 -0
- package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/esm/lib/customInstructionBuilder.js +282 -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 +261 -0
- package/dist/esm/lib/iface.d.ts +264 -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 +24 -0
- package/dist/{src → esm}/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +24 -0
- package/dist/esm/lib/instructionParamsFactory.d.ts +13 -0
- package/dist/{src → esm}/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/esm/lib/instructionParamsFactory.js +1074 -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 +26 -0
- package/dist/esm/lib/keyPair.js +59 -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/solInstructionFactory.d.ts +10 -0
- package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
- package/dist/esm/lib/solInstructionFactory.js +603 -0
- package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
- package/dist/esm/lib/stakingActivateBuilder.js +113 -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.js +31 -38
- package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
- package/dist/esm/lib/stakingDelegateBuilder.js +113 -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/esm/lib/stakingWithdrawBuilder.js +71 -0
- package/dist/esm/lib/token2022Config.d.ts +44 -0
- package/dist/esm/lib/token2022Config.js +23 -0
- package/dist/esm/lib/tokenExtensions.d.ts +31 -0
- package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
- package/dist/esm/lib/tokenExtensions.js +105 -0
- package/dist/esm/lib/tokenTransferBuilder.d.ts +41 -0
- package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/esm/lib/tokenTransferBuilder.js +189 -0
- package/dist/esm/lib/transaction.d.ts +103 -0
- package/dist/esm/lib/transaction.d.ts.map +1 -0
- package/dist/esm/lib/transaction.js +605 -0
- package/dist/esm/lib/transactionBuilder.d.ts +128 -0
- package/dist/esm/lib/transactionBuilder.js +373 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts +120 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilderFactory.js +205 -0
- package/dist/esm/lib/transferBuilder.d.ts +26 -0
- package/dist/esm/lib/transferBuilder.js +63 -0
- package/dist/esm/lib/transferBuilderV2.d.ts +43 -0
- package/dist/{src → esm}/lib/transferBuilderV2.d.ts.map +1 -1
- package/dist/esm/lib/transferBuilderV2.js +206 -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 +594 -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 +293 -0
- package/dist/esm/sol.d.ts.map +1 -0
- package/dist/esm/sol.js +1492 -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 +35 -16
- package/dist/src/config/token2022StaticConfig.js +0 -50
- 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.map +0 -1
- package/dist/src/lib/iface.js +0 -7
- package/dist/src/lib/instructionParamsFactory.js +0 -1036
- package/dist/src/lib/jitoStakePoolOperations.js +0 -200
- 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/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.js +0 -27
- 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.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.js +0 -210
- package/dist/src/lib/utils.js +0 -586
- 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 -1285
- 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 -3108
- 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}/config/token2022StaticConfig.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/keyPair.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/solInstructionFactory.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/token2022Config.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilderV2.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}/config/token2022StaticConfig.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/keyPair.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/stakingActivateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/token2022Config.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transferBuilder.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,1081 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.instructionParamsFactory = instructionParamsFactory;
|
|
7
|
+
exports.findTokenName = findTokenName;
|
|
8
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
9
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
10
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
11
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
12
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
13
|
+
const assert_1 = __importDefault(require("assert"));
|
|
14
|
+
const constants_1 = require("./constants");
|
|
15
|
+
const utils_1 = require("./utils");
|
|
16
|
+
const jitoStakePoolOperations_1 = require("./jitoStakePoolOperations");
|
|
17
|
+
/**
|
|
18
|
+
* Construct instructions params from Solana instructions
|
|
19
|
+
*
|
|
20
|
+
* @param {TransactionType} type - the transaction type
|
|
21
|
+
* @param {TransactionInstruction[]} instructions - solana instructions
|
|
22
|
+
* @returns {InstructionParams[]} An array containing instruction params
|
|
23
|
+
*/
|
|
24
|
+
function instructionParamsFactory(type, instructions, coinName, instructionMetadata, _useTokenAddressTokenName) {
|
|
25
|
+
switch (type) {
|
|
26
|
+
case sdk_core_1.TransactionType.WalletInitialization:
|
|
27
|
+
return parseWalletInitInstructions(instructions);
|
|
28
|
+
case sdk_core_1.TransactionType.Send:
|
|
29
|
+
return parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
|
|
30
|
+
case sdk_core_1.TransactionType.StakingActivate:
|
|
31
|
+
return parseStakingActivateInstructions(instructions);
|
|
32
|
+
case sdk_core_1.TransactionType.StakingDeactivate:
|
|
33
|
+
return parseStakingDeactivateInstructions(instructions, coinName);
|
|
34
|
+
case sdk_core_1.TransactionType.StakingWithdraw:
|
|
35
|
+
return parseStakingWithdrawInstructions(instructions);
|
|
36
|
+
case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
|
|
37
|
+
return parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
|
|
38
|
+
case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
|
|
39
|
+
return parseAtaCloseInstructions(instructions);
|
|
40
|
+
case sdk_core_1.TransactionType.StakingAuthorize:
|
|
41
|
+
return parseStakingAuthorizeInstructions(instructions);
|
|
42
|
+
case sdk_core_1.TransactionType.StakingAuthorizeRaw:
|
|
43
|
+
return parseStakingAuthorizeRawInstructions(instructions);
|
|
44
|
+
case sdk_core_1.TransactionType.StakingDelegate:
|
|
45
|
+
return parseStakingDelegateInstructions(instructions);
|
|
46
|
+
case sdk_core_1.TransactionType.CustomTx:
|
|
47
|
+
return parseCustomInstructions(instructions, instructionMetadata);
|
|
48
|
+
default:
|
|
49
|
+
throw new sdk_core_1.NotSupported('Invalid transaction, transaction type not supported: ' + type);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parses Solana instructions to Wallet initialization tx instructions params
|
|
54
|
+
*
|
|
55
|
+
* @param {TransactionInstruction[]} instructions - containing create and initialize nonce solana instructions
|
|
56
|
+
* @returns {InstructionParams[]} An array containing instruction params for Wallet initialization tx
|
|
57
|
+
*/
|
|
58
|
+
function parseWalletInitInstructions(instructions) {
|
|
59
|
+
const instructionData = [];
|
|
60
|
+
const createInstruction = web3_js_1.SystemInstruction.decodeCreateAccount(instructions[constants_1.walletInitInstructionIndexes.Create]);
|
|
61
|
+
const nonceInitInstruction = web3_js_1.SystemInstruction.decodeNonceInitialize(instructions[constants_1.walletInitInstructionIndexes.InitializeNonceAccount]);
|
|
62
|
+
const walletInit = {
|
|
63
|
+
type: constants_1.InstructionBuilderTypes.CreateNonceAccount,
|
|
64
|
+
params: {
|
|
65
|
+
fromAddress: createInstruction.fromPubkey.toString(),
|
|
66
|
+
nonceAddress: nonceInitInstruction.noncePubkey.toString(),
|
|
67
|
+
authAddress: nonceInitInstruction.authorizedPubkey.toString(),
|
|
68
|
+
amount: createInstruction.lamports.toString(),
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
instructionData.push(walletInit);
|
|
72
|
+
const memo = getMemo(instructions, constants_1.walletInitInstructionIndexes);
|
|
73
|
+
if (memo) {
|
|
74
|
+
instructionData.push(memo);
|
|
75
|
+
}
|
|
76
|
+
return instructionData;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parses Solana instructions to Send tx instructions params
|
|
80
|
+
* Only supports Memo, Transfer and Advance Nonce Solana instructions
|
|
81
|
+
*
|
|
82
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
83
|
+
* @returns {InstructionParams[]} An array containing instruction params for Send tx
|
|
84
|
+
*/
|
|
85
|
+
function parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
|
|
86
|
+
const instructionData = [];
|
|
87
|
+
for (const instruction of instructions) {
|
|
88
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
89
|
+
switch (type) {
|
|
90
|
+
case constants_1.ValidInstructionTypesEnum.Memo:
|
|
91
|
+
const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
92
|
+
instructionData.push(memo);
|
|
93
|
+
break;
|
|
94
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
95
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
96
|
+
const nonce = {
|
|
97
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
98
|
+
params: {
|
|
99
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
100
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
instructionData.push(nonce);
|
|
104
|
+
break;
|
|
105
|
+
case constants_1.ValidInstructionTypesEnum.Transfer:
|
|
106
|
+
const transferInstruction = web3_js_1.SystemInstruction.decodeTransfer(instruction);
|
|
107
|
+
const transfer = {
|
|
108
|
+
type: constants_1.InstructionBuilderTypes.Transfer,
|
|
109
|
+
params: {
|
|
110
|
+
fromAddress: transferInstruction.fromPubkey.toString(),
|
|
111
|
+
toAddress: transferInstruction.toPubkey.toString(),
|
|
112
|
+
amount: transferInstruction.lamports.toString(),
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
instructionData.push(transfer);
|
|
116
|
+
break;
|
|
117
|
+
case constants_1.ValidInstructionTypesEnum.TokenTransfer:
|
|
118
|
+
const isToken2022Transfer = instruction.programId.toString() === spl_token_1.TOKEN_2022_PROGRAM_ID.toString();
|
|
119
|
+
const isTransferWithFee = isToken2022Transfer &&
|
|
120
|
+
instruction.data.length >= 2 &&
|
|
121
|
+
instruction.data[0] === spl_token_1.TokenInstruction.TransferFeeExtension &&
|
|
122
|
+
instruction.data[1] === spl_token_1.TransferFeeInstruction.TransferCheckedWithFee;
|
|
123
|
+
let ttKeys;
|
|
124
|
+
let ttAmount;
|
|
125
|
+
let ttDecimals;
|
|
126
|
+
let ttFee;
|
|
127
|
+
if (isTransferWithFee) {
|
|
128
|
+
const decoded = (0, spl_token_1.decodeTransferCheckedWithFeeInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
129
|
+
// WithFee exposes `authority` where TransferChecked exposes `owner`; normalize to owner.
|
|
130
|
+
ttKeys = {
|
|
131
|
+
source: decoded.keys.source,
|
|
132
|
+
mint: decoded.keys.mint,
|
|
133
|
+
destination: decoded.keys.destination,
|
|
134
|
+
owner: decoded.keys.authority,
|
|
135
|
+
};
|
|
136
|
+
ttAmount = decoded.data.amount;
|
|
137
|
+
ttDecimals = decoded.data.decimals;
|
|
138
|
+
ttFee = decoded.data.fee.toString();
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const decoded = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction, isToken2022Transfer ? spl_token_1.TOKEN_2022_PROGRAM_ID : undefined);
|
|
142
|
+
ttKeys = decoded.keys;
|
|
143
|
+
ttAmount = decoded.data.amount;
|
|
144
|
+
ttDecimals = decoded.data.decimals;
|
|
145
|
+
}
|
|
146
|
+
const tokenAddress = ttKeys.mint.pubkey.toString();
|
|
147
|
+
const tokenName = findTokenName(tokenAddress, instructionMetadata, _useTokenAddressTokenName);
|
|
148
|
+
let programIDForTokenTransfer;
|
|
149
|
+
if (instruction.programId) {
|
|
150
|
+
programIDForTokenTransfer = instruction.programId.toString();
|
|
151
|
+
}
|
|
152
|
+
const tokenTransfer = {
|
|
153
|
+
type: constants_1.InstructionBuilderTypes.TokenTransfer,
|
|
154
|
+
params: {
|
|
155
|
+
fromAddress: ttKeys.owner.pubkey.toString(),
|
|
156
|
+
toAddress: ttKeys.destination.pubkey.toString(),
|
|
157
|
+
amount: ttAmount.toString(),
|
|
158
|
+
tokenName,
|
|
159
|
+
sourceAddress: ttKeys.source.pubkey.toString(),
|
|
160
|
+
tokenAddress: tokenAddress,
|
|
161
|
+
programId: programIDForTokenTransfer,
|
|
162
|
+
decimalPlaces: ttDecimals,
|
|
163
|
+
...(ttFee !== undefined ? { fee: ttFee } : {}),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
instructionData.push(tokenTransfer);
|
|
167
|
+
break;
|
|
168
|
+
case constants_1.ValidInstructionTypesEnum.Approve:
|
|
169
|
+
const programId = instruction.programId.equals(spl_token_1.TOKEN_2022_PROGRAM_ID) ? spl_token_1.TOKEN_2022_PROGRAM_ID : undefined;
|
|
170
|
+
const approveInstruction = (0, spl_token_1.decodeApproveInstruction)(instruction, programId);
|
|
171
|
+
const approve = {
|
|
172
|
+
type: constants_1.InstructionBuilderTypes.Approve,
|
|
173
|
+
params: {
|
|
174
|
+
accountAddress: approveInstruction.keys.account.toString(),
|
|
175
|
+
delegateAddress: approveInstruction.keys.delegate.toString(),
|
|
176
|
+
ownerAddress: approveInstruction.keys.owner.toString(),
|
|
177
|
+
amount: approveInstruction.data.amount.toString(),
|
|
178
|
+
programId: programId && programId.toString(),
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
instructionData.push(approve);
|
|
182
|
+
break;
|
|
183
|
+
case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
|
|
184
|
+
const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
|
|
185
|
+
const mintTokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
|
|
186
|
+
let programID;
|
|
187
|
+
if (instruction.programId) {
|
|
188
|
+
programID = instruction.programId.toString();
|
|
189
|
+
}
|
|
190
|
+
const ataInit = {
|
|
191
|
+
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
192
|
+
params: {
|
|
193
|
+
mintAddress,
|
|
194
|
+
ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
|
|
195
|
+
ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
|
|
196
|
+
payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
|
|
197
|
+
tokenName: mintTokenName,
|
|
198
|
+
programId: programID,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
instructionData.push(ataInit);
|
|
202
|
+
break;
|
|
203
|
+
case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
|
|
204
|
+
const accountAddress = instruction.keys[closeAtaInstructionKeysIndexes.AccountAddress].pubkey.toString();
|
|
205
|
+
const destinationAddress = instruction.keys[closeAtaInstructionKeysIndexes.DestinationAddress].pubkey.toString();
|
|
206
|
+
const authorityAddress = instruction.keys[closeAtaInstructionKeysIndexes.AuthorityAddress].pubkey.toString();
|
|
207
|
+
const ataClose = {
|
|
208
|
+
type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
|
|
209
|
+
params: {
|
|
210
|
+
accountAddress,
|
|
211
|
+
destinationAddress,
|
|
212
|
+
authorityAddress,
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
instructionData.push(ataClose);
|
|
216
|
+
break;
|
|
217
|
+
case constants_1.ValidInstructionTypesEnum.SetComputeUnitLimit:
|
|
218
|
+
const setComputeUnitLimitParams = web3_js_1.ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction);
|
|
219
|
+
const setComputeUnitLimit = {
|
|
220
|
+
type: constants_1.InstructionBuilderTypes.SetComputeUnitLimit,
|
|
221
|
+
params: {
|
|
222
|
+
units: setComputeUnitLimitParams.units,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
instructionData.push(setComputeUnitLimit);
|
|
226
|
+
break;
|
|
227
|
+
case constants_1.ValidInstructionTypesEnum.SetPriorityFee:
|
|
228
|
+
const setComputeUnitPriceParams = web3_js_1.ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
|
|
229
|
+
const setPriorityFee = {
|
|
230
|
+
type: constants_1.InstructionBuilderTypes.SetPriorityFee,
|
|
231
|
+
params: {
|
|
232
|
+
fee: setComputeUnitPriceParams.microLamports,
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
instructionData.push(setPriorityFee);
|
|
236
|
+
break;
|
|
237
|
+
case constants_1.ValidInstructionTypesEnum.MintTo:
|
|
238
|
+
let mintToInstruction;
|
|
239
|
+
if (instruction.programId.toString() !== spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
240
|
+
mintToInstruction = (0, spl_token_1.decodeMintToInstruction)(instruction);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
mintToInstruction = (0, spl_token_1.decodeMintToInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
244
|
+
}
|
|
245
|
+
const mintAddressForMint = mintToInstruction.keys.mint.pubkey.toString();
|
|
246
|
+
const tokenNameForMint = findTokenName(mintAddressForMint, instructionMetadata, _useTokenAddressTokenName);
|
|
247
|
+
let programIDForMint;
|
|
248
|
+
if (instruction.programId) {
|
|
249
|
+
programIDForMint = instruction.programId.toString();
|
|
250
|
+
}
|
|
251
|
+
const mintTo = {
|
|
252
|
+
type: constants_1.InstructionBuilderTypes.MintTo,
|
|
253
|
+
params: {
|
|
254
|
+
mintAddress: mintAddressForMint,
|
|
255
|
+
destinationAddress: mintToInstruction.keys.destination.pubkey.toString(),
|
|
256
|
+
authorityAddress: mintToInstruction.keys.authority.pubkey.toString(),
|
|
257
|
+
amount: mintToInstruction.data.amount.toString(),
|
|
258
|
+
tokenName: tokenNameForMint,
|
|
259
|
+
decimalPlaces: undefined,
|
|
260
|
+
programId: programIDForMint,
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
instructionData.push(mintTo);
|
|
264
|
+
break;
|
|
265
|
+
case constants_1.ValidInstructionTypesEnum.Burn:
|
|
266
|
+
let burnInstruction;
|
|
267
|
+
if (instruction.programId.toString() !== spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
|
|
268
|
+
burnInstruction = (0, spl_token_1.decodeBurnInstruction)(instruction);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
burnInstruction = (0, spl_token_1.decodeBurnInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
|
|
272
|
+
}
|
|
273
|
+
const mintAddressForBurn = burnInstruction.keys.mint.pubkey.toString();
|
|
274
|
+
const tokenNameForBurn = findTokenName(mintAddressForBurn, instructionMetadata, _useTokenAddressTokenName);
|
|
275
|
+
let programIDForBurn;
|
|
276
|
+
if (instruction.programId) {
|
|
277
|
+
programIDForBurn = instruction.programId.toString();
|
|
278
|
+
}
|
|
279
|
+
const burn = {
|
|
280
|
+
type: constants_1.InstructionBuilderTypes.Burn,
|
|
281
|
+
params: {
|
|
282
|
+
mintAddress: mintAddressForBurn,
|
|
283
|
+
accountAddress: burnInstruction.keys.account.pubkey.toString(),
|
|
284
|
+
authorityAddress: burnInstruction.keys.owner.pubkey.toString(),
|
|
285
|
+
amount: burnInstruction.data.amount.toString(),
|
|
286
|
+
tokenName: tokenNameForBurn,
|
|
287
|
+
decimalPlaces: undefined,
|
|
288
|
+
programId: programIDForBurn,
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
instructionData.push(burn);
|
|
292
|
+
break;
|
|
293
|
+
default:
|
|
294
|
+
throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return instructionData;
|
|
298
|
+
}
|
|
299
|
+
function isJitoStakingInstructions(si) {
|
|
300
|
+
return si.depositSol !== undefined;
|
|
301
|
+
}
|
|
302
|
+
function isMarinadeStakingInstructions(si) {
|
|
303
|
+
return si.create !== undefined && si.initialize !== undefined && si.delegate === undefined;
|
|
304
|
+
}
|
|
305
|
+
function isNativeStakingInstructions(si) {
|
|
306
|
+
return si.create !== undefined && si.initialize !== undefined && si.delegate !== undefined;
|
|
307
|
+
}
|
|
308
|
+
function getStakingTypeFromStakingInstructions(si) {
|
|
309
|
+
const isJito = isJitoStakingInstructions(si);
|
|
310
|
+
const isMarinade = isMarinadeStakingInstructions(si);
|
|
311
|
+
const isNative = isNativeStakingInstructions(si);
|
|
312
|
+
(0, assert_1.default)([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
|
|
313
|
+
if (isJito)
|
|
314
|
+
return public_types_1.SolStakingTypeEnum.JITO;
|
|
315
|
+
if (isMarinade)
|
|
316
|
+
return public_types_1.SolStakingTypeEnum.MARINADE;
|
|
317
|
+
if (isNative)
|
|
318
|
+
return public_types_1.SolStakingTypeEnum.NATIVE;
|
|
319
|
+
(0, assert_1.default)(false, 'No StakingType found');
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Parses Solana instructions to create staking tx and delegate tx instructions params
|
|
323
|
+
* Only supports Nonce, StakingActivate and Memo Solana instructions
|
|
324
|
+
*
|
|
325
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
326
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking activate tx
|
|
327
|
+
*/
|
|
328
|
+
function parseStakingActivateInstructions(instructions) {
|
|
329
|
+
const instructionData = [];
|
|
330
|
+
const stakingInstructions = {};
|
|
331
|
+
for (const instruction of instructions) {
|
|
332
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
333
|
+
switch (type) {
|
|
334
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
335
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
336
|
+
const nonce = {
|
|
337
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
338
|
+
params: {
|
|
339
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
340
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
instructionData.push(nonce);
|
|
344
|
+
break;
|
|
345
|
+
case constants_1.ValidInstructionTypesEnum.Memo:
|
|
346
|
+
const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
347
|
+
instructionData.push(memo);
|
|
348
|
+
break;
|
|
349
|
+
case constants_1.ValidInstructionTypesEnum.Create:
|
|
350
|
+
stakingInstructions.create = web3_js_1.SystemInstruction.decodeCreateAccount(instruction);
|
|
351
|
+
break;
|
|
352
|
+
case constants_1.ValidInstructionTypesEnum.StakingInitialize:
|
|
353
|
+
stakingInstructions.initialize = web3_js_1.StakeInstruction.decodeInitialize(instruction);
|
|
354
|
+
break;
|
|
355
|
+
case constants_1.ValidInstructionTypesEnum.StakingDelegate:
|
|
356
|
+
stakingInstructions.delegate = web3_js_1.StakeInstruction.decodeDelegate(instruction);
|
|
357
|
+
break;
|
|
358
|
+
case constants_1.ValidInstructionTypesEnum.DepositSol:
|
|
359
|
+
stakingInstructions.depositSol = (0, jitoStakePoolOperations_1.decodeDepositSol)(instruction);
|
|
360
|
+
break;
|
|
361
|
+
case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
|
|
362
|
+
stakingInstructions.hasAtaInit = true;
|
|
363
|
+
instructionData.push({
|
|
364
|
+
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
365
|
+
params: {
|
|
366
|
+
mintAddress: instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString(),
|
|
367
|
+
ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
|
|
368
|
+
ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
|
|
369
|
+
payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
|
|
370
|
+
tokenName: findTokenName(instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString()),
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
validateStakingInstructions(stakingInstructions);
|
|
377
|
+
const stakingType = getStakingTypeFromStakingInstructions(stakingInstructions);
|
|
378
|
+
let stakingActivate;
|
|
379
|
+
switch (stakingType) {
|
|
380
|
+
case public_types_1.SolStakingTypeEnum.JITO: {
|
|
381
|
+
(0, assert_1.default)(isJitoStakingInstructions(stakingInstructions));
|
|
382
|
+
const { depositSol, hasAtaInit } = stakingInstructions;
|
|
383
|
+
stakingActivate = {
|
|
384
|
+
type: constants_1.InstructionBuilderTypes.StakingActivate,
|
|
385
|
+
params: {
|
|
386
|
+
stakingType,
|
|
387
|
+
fromAddress: depositSol.fundingAccount.toString(),
|
|
388
|
+
stakingAddress: depositSol.stakePool.toString(),
|
|
389
|
+
amount: depositSol.lamports.toString(),
|
|
390
|
+
validator: depositSol.stakePool.toString(),
|
|
391
|
+
extraParams: {
|
|
392
|
+
stakePoolData: {
|
|
393
|
+
managerFeeAccount: depositSol.managerFeeAccount.toString(),
|
|
394
|
+
poolMint: depositSol.poolMint.toString(),
|
|
395
|
+
reserveStake: depositSol.reserveStake.toString(),
|
|
396
|
+
},
|
|
397
|
+
createAssociatedTokenAccount: !!hasAtaInit,
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
case public_types_1.SolStakingTypeEnum.MARINADE: {
|
|
404
|
+
(0, assert_1.default)(isMarinadeStakingInstructions(stakingInstructions));
|
|
405
|
+
const { create, initialize } = stakingInstructions;
|
|
406
|
+
stakingActivate = {
|
|
407
|
+
type: constants_1.InstructionBuilderTypes.StakingActivate,
|
|
408
|
+
params: {
|
|
409
|
+
stakingType,
|
|
410
|
+
fromAddress: create.fromPubkey.toString(),
|
|
411
|
+
stakingAddress: initialize.stakePubkey.toString(),
|
|
412
|
+
amount: create.lamports.toString(),
|
|
413
|
+
validator: initialize.authorized.staker.toString(),
|
|
414
|
+
},
|
|
415
|
+
};
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
case public_types_1.SolStakingTypeEnum.NATIVE: {
|
|
419
|
+
(0, assert_1.default)(isNativeStakingInstructions(stakingInstructions));
|
|
420
|
+
const { create, initialize, delegate } = stakingInstructions;
|
|
421
|
+
stakingActivate = {
|
|
422
|
+
type: constants_1.InstructionBuilderTypes.StakingActivate,
|
|
423
|
+
params: {
|
|
424
|
+
stakingType,
|
|
425
|
+
fromAddress: create.fromPubkey.toString(),
|
|
426
|
+
stakingAddress: initialize.stakePubkey.toString(),
|
|
427
|
+
amount: create.lamports.toString(),
|
|
428
|
+
validator: delegate.votePubkey.toString(),
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
default: {
|
|
434
|
+
const unreachable = stakingType;
|
|
435
|
+
throw new Error(`Unknown staking type ${unreachable}`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
instructionData.push(stakingActivate);
|
|
439
|
+
return instructionData;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Parses Solana instructions to create delegate tx
|
|
443
|
+
* Only supports Nonce, StakingDelegate
|
|
444
|
+
*
|
|
445
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
446
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
|
|
447
|
+
*/
|
|
448
|
+
function parseStakingDelegateInstructions(instructions) {
|
|
449
|
+
const instructionData = [];
|
|
450
|
+
for (const instruction of instructions) {
|
|
451
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
452
|
+
switch (type) {
|
|
453
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
454
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
455
|
+
const nonce = {
|
|
456
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
457
|
+
params: {
|
|
458
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
459
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
460
|
+
},
|
|
461
|
+
};
|
|
462
|
+
instructionData.push(nonce);
|
|
463
|
+
break;
|
|
464
|
+
case constants_1.ValidInstructionTypesEnum.StakingDelegate:
|
|
465
|
+
const stakingDelegateParams = web3_js_1.StakeInstruction.decodeDelegate(instruction);
|
|
466
|
+
const stakingDelegate = {
|
|
467
|
+
type: constants_1.InstructionBuilderTypes.StakingDelegate,
|
|
468
|
+
params: {
|
|
469
|
+
fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
|
|
470
|
+
stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
|
|
471
|
+
validator: stakingDelegateParams.votePubkey.toString() || '',
|
|
472
|
+
},
|
|
473
|
+
};
|
|
474
|
+
instructionData.push(stakingDelegate);
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return instructionData;
|
|
479
|
+
}
|
|
480
|
+
function validateStakingInstructions(stakingInstructions) {
|
|
481
|
+
if (stakingInstructions.delegate === undefined && stakingInstructions.depositSol !== undefined) {
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
if (!stakingInstructions.create) {
|
|
485
|
+
throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing create stake account instruction');
|
|
486
|
+
}
|
|
487
|
+
if (!stakingInstructions.delegate && !stakingInstructions.initialize) {
|
|
488
|
+
throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing initialize stake account/delegate instruction');
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
function isJitoUnstakingInstructions(ui) {
|
|
492
|
+
return ui.withdrawStake !== undefined && ui.deactivate !== undefined;
|
|
493
|
+
}
|
|
494
|
+
function isMarinadeUnstakingInstructions(ui) {
|
|
495
|
+
return ui.transfer !== undefined && ui.deactivate === undefined;
|
|
496
|
+
}
|
|
497
|
+
function isNativeUnstakingInstructions(ui) {
|
|
498
|
+
return ui.withdrawStake === undefined && ui.deactivate !== undefined;
|
|
499
|
+
}
|
|
500
|
+
function getStakingTypeFromUnstakingInstructions(ui) {
|
|
501
|
+
const isJito = isJitoUnstakingInstructions(ui);
|
|
502
|
+
const isMarinade = isMarinadeUnstakingInstructions(ui);
|
|
503
|
+
const isNative = isNativeUnstakingInstructions(ui);
|
|
504
|
+
(0, assert_1.default)([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
|
|
505
|
+
if (isJito)
|
|
506
|
+
return public_types_1.SolStakingTypeEnum.JITO;
|
|
507
|
+
if (isMarinade)
|
|
508
|
+
return public_types_1.SolStakingTypeEnum.MARINADE;
|
|
509
|
+
if (isNative)
|
|
510
|
+
return public_types_1.SolStakingTypeEnum.NATIVE;
|
|
511
|
+
(0, assert_1.default)(false, 'No StakingType found');
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Parses Solana instructions to create deactivate stake tx instructions params. Supports full stake
|
|
515
|
+
* account deactivation and partial stake account deactivation.
|
|
516
|
+
*
|
|
517
|
+
* When partially deactivating a stake account this method expects the following instructions: Allocate,
|
|
518
|
+
* to allocate a new staking account, Assign, to assign the newly created staking account to the
|
|
519
|
+
* Stake Program, Split, to split the current stake account, and StakingDeactivate to deactivate the
|
|
520
|
+
* newly created stake account.
|
|
521
|
+
*
|
|
522
|
+
* Supports Nonce, StakingDeactivate, Memo, Allocate, Assign, and Split Solana instructions.
|
|
523
|
+
*
|
|
524
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
525
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking deactivate tx
|
|
526
|
+
*/
|
|
527
|
+
function parseStakingDeactivateInstructions(instructions, coinName) {
|
|
528
|
+
const instructionData = [];
|
|
529
|
+
const unstakingInstructions = [];
|
|
530
|
+
for (const instruction of instructions) {
|
|
531
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
532
|
+
switch (type) {
|
|
533
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
534
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
535
|
+
const nonce = {
|
|
536
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
537
|
+
params: {
|
|
538
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
539
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
540
|
+
},
|
|
541
|
+
};
|
|
542
|
+
instructionData.push(nonce);
|
|
543
|
+
break;
|
|
544
|
+
case constants_1.ValidInstructionTypesEnum.Memo:
|
|
545
|
+
const memo = {
|
|
546
|
+
type: constants_1.InstructionBuilderTypes.Memo,
|
|
547
|
+
params: { memo: instruction.data.toString() },
|
|
548
|
+
};
|
|
549
|
+
instructionData.push(memo);
|
|
550
|
+
break;
|
|
551
|
+
case constants_1.ValidInstructionTypesEnum.Allocate:
|
|
552
|
+
if (unstakingInstructions.length > 0 &&
|
|
553
|
+
unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
|
|
554
|
+
unstakingInstructions[unstakingInstructions.length - 1].allocate =
|
|
555
|
+
web3_js_1.SystemInstruction.decodeAllocate(instruction);
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
unstakingInstructions.push({
|
|
559
|
+
allocate: web3_js_1.SystemInstruction.decodeAllocate(instruction),
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
break;
|
|
563
|
+
case constants_1.ValidInstructionTypesEnum.Assign:
|
|
564
|
+
if (unstakingInstructions.length > 0 &&
|
|
565
|
+
unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
|
|
566
|
+
unstakingInstructions[unstakingInstructions.length - 1].assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
|
|
567
|
+
}
|
|
568
|
+
else {
|
|
569
|
+
unstakingInstructions.push({
|
|
570
|
+
assign: web3_js_1.SystemInstruction.decodeAssign(instruction),
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
break;
|
|
574
|
+
case constants_1.ValidInstructionTypesEnum.Split:
|
|
575
|
+
if (unstakingInstructions.length > 0 &&
|
|
576
|
+
unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
|
|
577
|
+
unstakingInstructions[unstakingInstructions.length - 1].split = web3_js_1.StakeInstruction.decodeSplit(instruction);
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
unstakingInstructions.push({
|
|
581
|
+
split: web3_js_1.StakeInstruction.decodeSplit(instruction),
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
break;
|
|
585
|
+
case constants_1.ValidInstructionTypesEnum.StakingDeactivate:
|
|
586
|
+
if (unstakingInstructions.length > 0 &&
|
|
587
|
+
unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
|
|
588
|
+
unstakingInstructions[unstakingInstructions.length - 1].deactivate =
|
|
589
|
+
web3_js_1.StakeInstruction.decodeDeactivate(instruction);
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
unstakingInstructions.push({
|
|
593
|
+
deactivate: web3_js_1.StakeInstruction.decodeDeactivate(instruction),
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
break;
|
|
597
|
+
case constants_1.ValidInstructionTypesEnum.Transfer:
|
|
598
|
+
if (unstakingInstructions.length > 0 &&
|
|
599
|
+
unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
|
|
600
|
+
unstakingInstructions[unstakingInstructions.length - 1].transfer =
|
|
601
|
+
web3_js_1.SystemInstruction.decodeTransfer(instruction);
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
unstakingInstructions.push({
|
|
605
|
+
transfer: web3_js_1.SystemInstruction.decodeTransfer(instruction),
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
break;
|
|
609
|
+
case constants_1.ValidInstructionTypesEnum.WithdrawStake:
|
|
610
|
+
if (unstakingInstructions.length > 0 &&
|
|
611
|
+
unstakingInstructions[unstakingInstructions.length - 1].withdrawStake === undefined) {
|
|
612
|
+
unstakingInstructions[unstakingInstructions.length - 1].withdrawStake = (0, jitoStakePoolOperations_1.decodeWithdrawStake)(instruction);
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
unstakingInstructions.push({
|
|
616
|
+
withdrawStake: (0, jitoStakePoolOperations_1.decodeWithdrawStake)(instruction),
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
break;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
for (const unstakingInstruction of unstakingInstructions) {
|
|
623
|
+
validateUnstakingInstructions(unstakingInstruction);
|
|
624
|
+
const stakingType = getStakingTypeFromUnstakingInstructions(unstakingInstruction);
|
|
625
|
+
let stakingDeactivate;
|
|
626
|
+
switch (stakingType) {
|
|
627
|
+
case public_types_1.SolStakingTypeEnum.JITO: {
|
|
628
|
+
(0, assert_1.default)(isJitoUnstakingInstructions(unstakingInstruction));
|
|
629
|
+
const { withdrawStake } = unstakingInstruction;
|
|
630
|
+
stakingDeactivate = {
|
|
631
|
+
type: constants_1.InstructionBuilderTypes.StakingDeactivate,
|
|
632
|
+
params: {
|
|
633
|
+
stakingType,
|
|
634
|
+
fromAddress: withdrawStake.destinationStakeAuthority.toString(),
|
|
635
|
+
stakingAddress: withdrawStake.stakePool.toString(),
|
|
636
|
+
amount: withdrawStake.poolTokens.toString(),
|
|
637
|
+
unstakingAddress: withdrawStake.destinationStake.toString(),
|
|
638
|
+
extraParams: {
|
|
639
|
+
stakePoolData: {
|
|
640
|
+
managerFeeAccount: withdrawStake.managerFeeAccount.toString(),
|
|
641
|
+
poolMint: withdrawStake.poolMint.toString(),
|
|
642
|
+
validatorListAccount: withdrawStake.validatorList.toString(),
|
|
643
|
+
},
|
|
644
|
+
validatorAddress: withdrawStake.validatorStake.toString(),
|
|
645
|
+
transferAuthorityAddress: withdrawStake.sourceTransferAuthority.toString(),
|
|
646
|
+
},
|
|
647
|
+
},
|
|
648
|
+
};
|
|
649
|
+
break;
|
|
650
|
+
}
|
|
651
|
+
case public_types_1.SolStakingTypeEnum.MARINADE: {
|
|
652
|
+
(0, assert_1.default)(isMarinadeUnstakingInstructions(unstakingInstruction));
|
|
653
|
+
const { transfer } = unstakingInstruction;
|
|
654
|
+
stakingDeactivate = {
|
|
655
|
+
type: constants_1.InstructionBuilderTypes.StakingDeactivate,
|
|
656
|
+
params: {
|
|
657
|
+
stakingType,
|
|
658
|
+
fromAddress: '',
|
|
659
|
+
stakingAddress: '',
|
|
660
|
+
recipients: [
|
|
661
|
+
{
|
|
662
|
+
address: transfer.toPubkey.toString() || '',
|
|
663
|
+
amount: transfer.lamports.toString() || '',
|
|
664
|
+
},
|
|
665
|
+
],
|
|
666
|
+
},
|
|
667
|
+
};
|
|
668
|
+
break;
|
|
669
|
+
}
|
|
670
|
+
case public_types_1.SolStakingTypeEnum.NATIVE: {
|
|
671
|
+
(0, assert_1.default)(isNativeUnstakingInstructions(unstakingInstruction));
|
|
672
|
+
const { deactivate, split } = unstakingInstruction;
|
|
673
|
+
stakingDeactivate = {
|
|
674
|
+
type: constants_1.InstructionBuilderTypes.StakingDeactivate,
|
|
675
|
+
params: {
|
|
676
|
+
stakingType,
|
|
677
|
+
fromAddress: deactivate.authorizedPubkey.toString() || '',
|
|
678
|
+
stakingAddress: split?.stakePubkey.toString() || deactivate.stakePubkey.toString(),
|
|
679
|
+
amount: split?.lamports.toString(),
|
|
680
|
+
unstakingAddress: split?.splitStakePubkey.toString(),
|
|
681
|
+
},
|
|
682
|
+
};
|
|
683
|
+
break;
|
|
684
|
+
}
|
|
685
|
+
default: {
|
|
686
|
+
const unreachable = stakingType;
|
|
687
|
+
throw new Error(`Unknown staking type ${unreachable}`);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
instructionData.push(stakingDeactivate);
|
|
691
|
+
}
|
|
692
|
+
return instructionData;
|
|
693
|
+
}
|
|
694
|
+
function validateUnstakingInstructions(unstakingInstructions) {
|
|
695
|
+
// Cases where exactly one field should be present
|
|
696
|
+
const unstakingInstructionsKeys = [
|
|
697
|
+
'allocate',
|
|
698
|
+
'assign',
|
|
699
|
+
'split',
|
|
700
|
+
'deactivate',
|
|
701
|
+
'transfer',
|
|
702
|
+
];
|
|
703
|
+
if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'transfer'))) {
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'withdrawStake'))) {
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
709
|
+
if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'deactivate'))) {
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
// Cases where deactivate field must be present with another field
|
|
713
|
+
if (!unstakingInstructions.deactivate) {
|
|
714
|
+
throw new sdk_core_1.NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
|
|
715
|
+
}
|
|
716
|
+
// This is a stake pool instruction, not a partial unstake
|
|
717
|
+
if (unstakingInstructions.withdrawStake) {
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
if (!unstakingInstructions.allocate) {
|
|
721
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
|
|
722
|
+
}
|
|
723
|
+
else if (!unstakingInstructions.assign) {
|
|
724
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing assign unstake account instruction');
|
|
725
|
+
}
|
|
726
|
+
else if (!unstakingInstructions.split) {
|
|
727
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing split stake account instruction');
|
|
728
|
+
}
|
|
729
|
+
else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.assign.accountPubkey.toString()) {
|
|
730
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, must allocate and assign the same public key');
|
|
731
|
+
}
|
|
732
|
+
else if (unstakingInstructions.allocate.space !== web3_js_1.StakeProgram.space) {
|
|
733
|
+
throw new sdk_core_1.NotSupported(`Invalid partial deactivate stake transaction, unstaking account must allocate ${web3_js_1.StakeProgram.space} bytes`);
|
|
734
|
+
}
|
|
735
|
+
else if (unstakingInstructions.assign.programId.toString() !== web3_js_1.StakeProgram.programId.toString()) {
|
|
736
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstake account must be assigned to the Stake Program');
|
|
737
|
+
}
|
|
738
|
+
else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.split.splitStakePubkey.toString()) {
|
|
739
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, must allocate the unstaking account');
|
|
740
|
+
}
|
|
741
|
+
else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
|
|
742
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
|
|
743
|
+
}
|
|
744
|
+
else if (!unstakingInstructions.transfer) {
|
|
745
|
+
throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Parses Solana instructions to create staking withdraw tx instructions params
|
|
750
|
+
* Only supports Nonce, StakingWithdraw, and Memo Solana instructions
|
|
751
|
+
*
|
|
752
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
753
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking withdraw tx
|
|
754
|
+
*/
|
|
755
|
+
function parseStakingWithdrawInstructions(instructions) {
|
|
756
|
+
const instructionData = [];
|
|
757
|
+
for (const instruction of instructions) {
|
|
758
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
759
|
+
switch (type) {
|
|
760
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
761
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
762
|
+
const nonce = {
|
|
763
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
764
|
+
params: {
|
|
765
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
766
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
767
|
+
},
|
|
768
|
+
};
|
|
769
|
+
instructionData.push(nonce);
|
|
770
|
+
break;
|
|
771
|
+
case constants_1.ValidInstructionTypesEnum.Memo:
|
|
772
|
+
const memo = {
|
|
773
|
+
type: constants_1.InstructionBuilderTypes.Memo,
|
|
774
|
+
params: { memo: instruction.data.toString() },
|
|
775
|
+
};
|
|
776
|
+
instructionData.push(memo);
|
|
777
|
+
break;
|
|
778
|
+
case constants_1.ValidInstructionTypesEnum.StakingWithdraw:
|
|
779
|
+
const withdrawInstruction = web3_js_1.StakeInstruction.decodeWithdraw(instruction);
|
|
780
|
+
const stakingWithdraw = {
|
|
781
|
+
type: constants_1.InstructionBuilderTypes.StakingWithdraw,
|
|
782
|
+
params: {
|
|
783
|
+
fromAddress: withdrawInstruction.authorizedPubkey.toString(),
|
|
784
|
+
stakingAddress: withdrawInstruction.stakePubkey.toString(),
|
|
785
|
+
amount: withdrawInstruction.lamports.toString(),
|
|
786
|
+
},
|
|
787
|
+
};
|
|
788
|
+
instructionData.push(stakingWithdraw);
|
|
789
|
+
break;
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
return instructionData;
|
|
793
|
+
}
|
|
794
|
+
/**
|
|
795
|
+
* Get the memo object from instructions if it exists
|
|
796
|
+
*
|
|
797
|
+
* @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
|
|
798
|
+
* @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
|
|
799
|
+
* @returns {Memo | undefined} - memo object or undefined
|
|
800
|
+
*/
|
|
801
|
+
function getMemo(instructions, instructionIndexes) {
|
|
802
|
+
const instructionsLength = Object.keys(instructionIndexes).length;
|
|
803
|
+
if (instructions.length === instructionsLength && instructions[instructionIndexes.Memo]) {
|
|
804
|
+
return {
|
|
805
|
+
type: constants_1.InstructionBuilderTypes.Memo,
|
|
806
|
+
params: { memo: instructions[instructionIndexes.Memo].data.toString() },
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
const ataInitInstructionKeysIndexes = {
|
|
811
|
+
PayerAddress: 0,
|
|
812
|
+
ATAAddress: 1,
|
|
813
|
+
OwnerAddress: 2,
|
|
814
|
+
MintAddress: 3,
|
|
815
|
+
};
|
|
816
|
+
const closeAtaInstructionKeysIndexes = {
|
|
817
|
+
AccountAddress: 0,
|
|
818
|
+
DestinationAddress: 1,
|
|
819
|
+
AuthorityAddress: 2,
|
|
820
|
+
};
|
|
821
|
+
/**
|
|
822
|
+
* Parses Solana instructions to initialize associated token account tx instructions params
|
|
823
|
+
*
|
|
824
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
825
|
+
* @returns {InstructionParams[]} An array containing instruction params for Send tx
|
|
826
|
+
*/
|
|
827
|
+
function parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
|
|
828
|
+
const instructionData = [];
|
|
829
|
+
let memo;
|
|
830
|
+
for (const instruction of instructions) {
|
|
831
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
832
|
+
switch (type) {
|
|
833
|
+
case constants_1.ValidInstructionTypesEnum.Memo:
|
|
834
|
+
memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
835
|
+
break;
|
|
836
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
837
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
838
|
+
const nonce = {
|
|
839
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
840
|
+
params: {
|
|
841
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
842
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
843
|
+
},
|
|
844
|
+
};
|
|
845
|
+
instructionData.push(nonce);
|
|
846
|
+
break;
|
|
847
|
+
case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
|
|
848
|
+
const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
|
|
849
|
+
const tokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
|
|
850
|
+
let programID;
|
|
851
|
+
if (instruction.programId) {
|
|
852
|
+
programID = instruction.programId.toString();
|
|
853
|
+
}
|
|
854
|
+
const ataInit = {
|
|
855
|
+
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
856
|
+
params: {
|
|
857
|
+
mintAddress,
|
|
858
|
+
ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
|
|
859
|
+
ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
|
|
860
|
+
payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
|
|
861
|
+
tokenName,
|
|
862
|
+
programId: programID,
|
|
863
|
+
},
|
|
864
|
+
};
|
|
865
|
+
instructionData.push(ataInit);
|
|
866
|
+
break;
|
|
867
|
+
case constants_1.ValidInstructionTypesEnum.DepositSol:
|
|
868
|
+
// AtaInit is a part of spl-stake-pool's depositSol process
|
|
869
|
+
break;
|
|
870
|
+
default:
|
|
871
|
+
throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
if (memo) {
|
|
875
|
+
instructionData.push(memo);
|
|
876
|
+
}
|
|
877
|
+
return instructionData;
|
|
878
|
+
}
|
|
879
|
+
const ataCloseInstructionKeysIndexes = {
|
|
880
|
+
AccountAddress: 0,
|
|
881
|
+
DestinationAddress: 1,
|
|
882
|
+
AuthorityAddress: 2,
|
|
883
|
+
};
|
|
884
|
+
const ataRecoverNestedInstructionKeysIndexes = {
|
|
885
|
+
NestedAccountAddress: 0,
|
|
886
|
+
NestedMintAddress: 1,
|
|
887
|
+
DestinationAccountAddress: 2,
|
|
888
|
+
OwnerAccountAddress: 3,
|
|
889
|
+
OwnerMintAddress: 4,
|
|
890
|
+
WalletAddress: 5,
|
|
891
|
+
};
|
|
892
|
+
/**
|
|
893
|
+
* Parses Solana instructions to close associated token account tx instructions params
|
|
894
|
+
*
|
|
895
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
896
|
+
* @returns {InstructionParams[]} An array containing instruction params for Send tx
|
|
897
|
+
*/
|
|
898
|
+
function parseAtaCloseInstructions(instructions) {
|
|
899
|
+
const instructionData = [];
|
|
900
|
+
for (const instruction of instructions) {
|
|
901
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
902
|
+
switch (type) {
|
|
903
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
904
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
905
|
+
const nonce = {
|
|
906
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
907
|
+
params: {
|
|
908
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
909
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
910
|
+
},
|
|
911
|
+
};
|
|
912
|
+
instructionData.push(nonce);
|
|
913
|
+
break;
|
|
914
|
+
case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
|
|
915
|
+
const ataClose = {
|
|
916
|
+
type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
|
|
917
|
+
params: {
|
|
918
|
+
accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
|
|
919
|
+
destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
|
|
920
|
+
authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
|
|
921
|
+
},
|
|
922
|
+
};
|
|
923
|
+
instructionData.push(ataClose);
|
|
924
|
+
break;
|
|
925
|
+
case constants_1.ValidInstructionTypesEnum.RecoverNestedAssociatedTokenAccount:
|
|
926
|
+
const ataRecoverNested = {
|
|
927
|
+
type: constants_1.InstructionBuilderTypes.RecoverNestedAssociatedTokenAccount,
|
|
928
|
+
params: {
|
|
929
|
+
nestedAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.NestedAccountAddress].pubkey.toString(),
|
|
930
|
+
nestedMintAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.NestedMintAddress].pubkey.toString(),
|
|
931
|
+
destinationAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.DestinationAccountAddress].pubkey.toString(),
|
|
932
|
+
ownerAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.OwnerAccountAddress].pubkey.toString(),
|
|
933
|
+
ownerMintAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.OwnerMintAddress].pubkey.toString(),
|
|
934
|
+
walletAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.WalletAddress].pubkey.toString(),
|
|
935
|
+
},
|
|
936
|
+
};
|
|
937
|
+
instructionData.push(ataRecoverNested);
|
|
938
|
+
break;
|
|
939
|
+
default:
|
|
940
|
+
throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
return instructionData;
|
|
944
|
+
}
|
|
945
|
+
/**
|
|
946
|
+
* Parses Solana instructions to authorized staking account params
|
|
947
|
+
* Only supports Nonce, Authorize instructions
|
|
948
|
+
*
|
|
949
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
950
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
|
|
951
|
+
*/
|
|
952
|
+
function parseStakingAuthorizeInstructions(instructions) {
|
|
953
|
+
const instructionData = [];
|
|
954
|
+
for (const instruction of instructions) {
|
|
955
|
+
const type = (0, utils_1.getInstructionType)(instruction);
|
|
956
|
+
switch (type) {
|
|
957
|
+
case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
|
|
958
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
|
|
959
|
+
const nonce = {
|
|
960
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
961
|
+
params: {
|
|
962
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
963
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
964
|
+
},
|
|
965
|
+
};
|
|
966
|
+
instructionData.push(nonce);
|
|
967
|
+
break;
|
|
968
|
+
case constants_1.ValidInstructionTypesEnum.Memo:
|
|
969
|
+
const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
|
|
970
|
+
instructionData.push(memo);
|
|
971
|
+
break;
|
|
972
|
+
case constants_1.ValidInstructionTypesEnum.Authorize:
|
|
973
|
+
const authorize = web3_js_1.StakeInstruction.decodeAuthorize(instruction);
|
|
974
|
+
instructionData.push({
|
|
975
|
+
type: constants_1.InstructionBuilderTypes.StakingAuthorize,
|
|
976
|
+
params: {
|
|
977
|
+
stakingAddress: authorize.stakePubkey.toString(),
|
|
978
|
+
oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
|
|
979
|
+
newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
|
|
980
|
+
newWithdrawAddress: authorize.custodianPubkey?.toString() || '',
|
|
981
|
+
},
|
|
982
|
+
});
|
|
983
|
+
break;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
return instructionData;
|
|
987
|
+
}
|
|
988
|
+
/**
|
|
989
|
+
* Parses Solana instructions to authorized staking account params
|
|
990
|
+
* Only supports Nonce, Authorize instructions
|
|
991
|
+
*
|
|
992
|
+
* @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
|
|
993
|
+
* @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
|
|
994
|
+
*/
|
|
995
|
+
function parseStakingAuthorizeRawInstructions(instructions) {
|
|
996
|
+
const instructionData = [];
|
|
997
|
+
(0, assert_1.default)(instructions.length === 2, 'Invalid number of instructions');
|
|
998
|
+
const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
|
|
999
|
+
const nonce = {
|
|
1000
|
+
type: constants_1.InstructionBuilderTypes.NonceAdvance,
|
|
1001
|
+
params: {
|
|
1002
|
+
walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
|
|
1003
|
+
authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
|
|
1004
|
+
},
|
|
1005
|
+
};
|
|
1006
|
+
instructionData.push(nonce);
|
|
1007
|
+
const authorize = instructions[1];
|
|
1008
|
+
(0, assert_1.default)(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
|
|
1009
|
+
instructionData.push({
|
|
1010
|
+
type: constants_1.InstructionBuilderTypes.StakingAuthorize,
|
|
1011
|
+
params: {
|
|
1012
|
+
stakingAddress: authorize.keys[0].pubkey.toString(),
|
|
1013
|
+
oldAuthorizeAddress: authorize.keys[2].pubkey.toString(),
|
|
1014
|
+
newAuthorizeAddress: authorize.keys[3].pubkey.toString(),
|
|
1015
|
+
custodianAddress: authorize.keys[4].pubkey.toString(),
|
|
1016
|
+
},
|
|
1017
|
+
});
|
|
1018
|
+
return instructionData;
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Parses Solana instructions to custom instruction params
|
|
1022
|
+
*
|
|
1023
|
+
* @param {TransactionInstruction[]} instructions - containing custom solana instructions
|
|
1024
|
+
* @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
|
|
1025
|
+
* @returns {InstructionParams[]} An array containing instruction params for custom instructions
|
|
1026
|
+
*/
|
|
1027
|
+
function parseCustomInstructions(instructions, instructionMetadata) {
|
|
1028
|
+
const instructionData = [];
|
|
1029
|
+
for (let i = 0; i < instructions.length; i++) {
|
|
1030
|
+
const instruction = instructions[i];
|
|
1031
|
+
// Check if we have metadata for this instruction position
|
|
1032
|
+
if (instructionMetadata &&
|
|
1033
|
+
instructionMetadata[i] &&
|
|
1034
|
+
instructionMetadata[i].type === constants_1.InstructionBuilderTypes.CustomInstruction) {
|
|
1035
|
+
instructionData.push(instructionMetadata[i]);
|
|
1036
|
+
}
|
|
1037
|
+
else {
|
|
1038
|
+
// Convert the raw instruction to CustomInstruction format
|
|
1039
|
+
const customInstruction = {
|
|
1040
|
+
type: constants_1.InstructionBuilderTypes.CustomInstruction,
|
|
1041
|
+
params: {
|
|
1042
|
+
programId: instruction.programId.toString(),
|
|
1043
|
+
keys: instruction.keys.map((key) => ({
|
|
1044
|
+
pubkey: key.pubkey.toString(),
|
|
1045
|
+
isSigner: key.isSigner,
|
|
1046
|
+
isWritable: key.isWritable,
|
|
1047
|
+
})),
|
|
1048
|
+
data: instruction.data.toString('base64'),
|
|
1049
|
+
},
|
|
1050
|
+
};
|
|
1051
|
+
instructionData.push(customInstruction);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
return instructionData;
|
|
1055
|
+
}
|
|
1056
|
+
function findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName) {
|
|
1057
|
+
let token;
|
|
1058
|
+
statics_1.coins.forEach((value, key) => {
|
|
1059
|
+
if (value instanceof statics_1.SolCoin && value.tokenAddress === mintAddress) {
|
|
1060
|
+
token = value.name;
|
|
1061
|
+
}
|
|
1062
|
+
});
|
|
1063
|
+
if (!token && instructionMetadata) {
|
|
1064
|
+
instructionMetadata.forEach((instruction) => {
|
|
1065
|
+
if (instruction.type === constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount &&
|
|
1066
|
+
instruction.params.mintAddress === mintAddress) {
|
|
1067
|
+
token = instruction.params.tokenName;
|
|
1068
|
+
}
|
|
1069
|
+
else if (instruction.type === constants_1.InstructionBuilderTypes.TokenTransfer &&
|
|
1070
|
+
instruction.params.tokenAddress === mintAddress) {
|
|
1071
|
+
token = instruction.params.tokenName;
|
|
1072
|
+
}
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
if (!token && _useTokenAddressTokenName) {
|
|
1076
|
+
token = mintAddress;
|
|
1077
|
+
}
|
|
1078
|
+
(0, assert_1.default)(token);
|
|
1079
|
+
return token;
|
|
1080
|
+
}
|
|
1081
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFtRUEsNERBaUNDO0FBK3FDRCxzQ0FvQ0M7QUF2ekNELGlEQVkyQjtBQUMzQiw2Q0FjeUI7QUFFekIsc0RBQXlEO0FBQ3pELG1EQUFxRTtBQUNyRSxpREFBcUQ7QUFDckQsb0RBQTRCO0FBQzVCLDJDQUErRztBQXVCL0csbUNBQTZDO0FBRTdDLHVFQUFrRjtBQUVsRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsSUFBcUIsRUFDckIsWUFBc0MsRUFDdEMsUUFBaUIsRUFDakIsbUJBQXlDLEVBQ3pDLHlCQUFtQztJQUVuQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSywwQkFBZSxDQUFDLG9CQUFvQjtZQUN2QyxPQUFPLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELEtBQUssMEJBQWUsQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8scUJBQXFCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDN0YsS0FBSywwQkFBZSxDQUFDLGVBQWU7WUFDbEMsT0FBTyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxLQUFLLDBCQUFlLENBQUMsaUJBQWlCO1lBQ3BDLE9BQU8sa0NBQWtDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLG9DQUFvQztZQUN2RCxPQUFPLHdCQUF3QixDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hHLEtBQUssMEJBQWUsQ0FBQywy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QVcsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uLFxuICBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkV2l0aEZlZUluc3RydWN0aW9uLFxuICBEZWNvZGVkQnVybkluc3RydWN0aW9uLFxuICBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24sXG4gIERlY29kZWRNaW50VG9JbnN0cnVjdGlvbixcbiAgZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24sXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgZGVjb2RlQXBwcm92ZUluc3RydWN0aW9uLFxuICBUb2tlbkluc3RydWN0aW9uLFxuICBUcmFuc2ZlckZlZUluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBBbGxvY2F0ZVBhcmFtcyxcbiAgQXNzaWduUGFyYW1zLFxuICBDcmVhdGVBY2NvdW50UGFyYW1zLFxuICBEZWFjdGl2YXRlU3Rha2VQYXJhbXMsXG4gIERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uLFxuICBEZWxlZ2F0ZVN0YWtlUGFyYW1zLFxuICBJbml0aWFsaXplU3Rha2VQYXJhbXMsXG4gIFNwbGl0U3Rha2VQYXJhbXMsXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSwgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEF0YUNsb3NlLFxuICBBdGFJbml0LFxuICBBdGFSZWNvdmVyTmVzdGVkLFxuICBCdXJuLFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgTWVtbyxcbiAgTWludFRvLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplLFxuICBTdGFraW5nRGVhY3RpdmF0ZSxcbiAgU3Rha2luZ0RlbGVnYXRlLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zZmVyLFxuICBXYWxsZXRJbml0LFxuICBTZXRDb21wdXRlVW5pdExpbWl0LFxuICBTZXRQcmlvcml0eUZlZSxcbiAgQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gIEFwcHJvdmUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0SW5zdHJ1Y3Rpb25UeXBlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZXBvc2l0U29sUGFyYW1zLCBXaXRoZHJhd1N0YWtlUGFyYW1zIH0gZnJvbSAnQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCc7XG5pbXBvcnQgeyBkZWNvZGVEZXBvc2l0U29sLCBkZWNvZGVXaXRoZHJhd1N0YWtlIH0gZnJvbSAnLi9qaXRvU3Rha2VQb29sT3BlcmF0aW9ucyc7XG5cbi8qKlxuICogQ29uc3RydWN0IGluc3RydWN0aW9ucyBwYXJhbXMgZnJvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHR5cGUgLSB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICB0eXBlOiBUcmFuc2FjdGlvblR5cGUsXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBJbnN0cnVjdGlvblBhcmFtc1tdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgIHJldHVybiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgY29pbk5hbWUpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICByZXR1cm4gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDpcbiAgICAgIHJldHVybiBwYXJzZUN1c3RvbUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGluc3RydWN0aW9uTWV0YWRhdGEpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyB0eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIFdhbGxldCBpbml0aWFsaXphdGlvbiB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGNvbnRhaW5pbmcgY3JlYXRlIGFuZCBpbml0aWFsaXplIG5vbmNlIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgV2FsbGV0IGluaXRpYWxpemF0aW9uIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlV2FsbGV0SW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PFdhbGxldEluaXQgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8V2FsbGV0SW5pdCB8IE1lbW8+ID0gW107XG4gIGNvbnN0IGNyZWF0ZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbnNbd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcy5DcmVhdGVdKTtcbiAgY29uc3Qgbm9uY2VJbml0SW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUluaXRpYWxpemUoXG4gICAgaW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuSW5pdGlhbGl6ZU5vbmNlQWNjb3VudF1cbiAgKTtcblxuICBjb25zdCB3YWxsZXRJbml0OiBXYWxsZXRJbml0ID0ge1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudCxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGZyb21BZGRyZXNzOiBjcmVhdGVJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBub25jZUFkZHJlc3M6IG5vbmNlSW5pdEluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgYW1vdW50OiBjcmVhdGVJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgIH0sXG4gIH07XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHdhbGxldEluaXQpO1xuXG4gIGNvbnN0IG1lbW8gPSBnZXRNZW1vKGluc3RydWN0aW9ucywgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChtZW1vKSB7XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIFNlbmQgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBNZW1vLCBUcmFuc2ZlciBhbmQgQWR2YW5jZSBOb25jZSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTZW5kSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBBcnJheTxcbiAgfCBOb25jZVxuICB8IE1lbW9cbiAgfCBUcmFuc2ZlclxuICB8IFRva2VuVHJhbnNmZXJcbiAgfCBBdGFJbml0XG4gIHwgQXRhQ2xvc2VcbiAgfCBTZXRDb21wdXRlVW5pdExpbWl0XG4gIHwgU2V0UHJpb3JpdHlGZWVcbiAgfCBNaW50VG9cbiAgfCBCdXJuXG4gIHwgQXBwcm92ZVxuPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8XG4gICAgfCBOb25jZVxuICAgIHwgTWVtb1xuICAgIHwgVHJhbnNmZXJcbiAgICB8IFRva2VuVHJhbnNmZXJcbiAgICB8IEF0YUluaXRcbiAgICB8IEF0YUNsb3NlXG4gICAgfCBTZXRDb21wdXRlVW5pdExpbWl0XG4gICAgfCBTZXRQcmlvcml0eUZlZVxuICAgIHwgTWludFRvXG4gICAgfCBCdXJuXG4gICAgfCBBcHByb3ZlXG4gID4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXI6IFRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9BZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnRvUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaCh0cmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXI6XG4gICAgICAgIGNvbnN0IGlzVG9rZW4yMDIyVHJhbnNmZXIgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSA9PT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGlzVHJhbnNmZXJXaXRoRmVlID1cbiAgICAgICAgICBpc1Rva2VuMjAyMlRyYW5zZmVyICYmXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPj0gMiAmJlxuICAgICAgICAgIGluc3RydWN0aW9uLmRhdGFbMF0gPT09IFRva2VuSW5zdHJ1Y3Rpb24uVHJhbnNmZXJGZWVFeHRlbnNpb24gJiZcbiAgICAgICAgICBpbnN0cnVjdGlvbi5kYXRhWzFdID09PSBUcmFuc2ZlckZlZUluc3RydWN0aW9uLlRyYW5zZmVyQ2hlY2tlZFdpdGhGZWU7XG4gICAgICAgIGxldCB0dEtleXM6IERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvblsna2V5cyddO1xuICAgICAgICBsZXQgdHRBbW91bnQ6IGJpZ2ludDtcbiAgICAgICAgbGV0IHR0RGVjaW1hbHM6IG51bWJlcjtcbiAgICAgICAgbGV0IHR0RmVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpc1RyYW5zZmVyV2l0aEZlZSkge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVUcmFuc2ZlckNoZWNrZWRXaXRoRmVlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgICAgLy8gV2l0aEZlZSBleHBvc2VzIGBhdXRob3JpdHlgIHdoZXJlIFRyYW5zZmVyQ2hlY2tlZCBleHBvc2VzIGBvd25lcmA7IG5vcm1hbGl6ZSB0byBvd25lci5cbiAgICAgICAgICB0dEtleXMgPSB7XG4gICAgICAgICAgICBzb3VyY2U6IGRlY29kZWQua2V5cy5zb3VyY2UsXG4gICAgICAgICAgICBtaW50OiBkZWNvZGVkLmtleXMubWludCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBkZWNvZGVkLmtleXMuZGVzdGluYXRpb24sXG4gICAgICAgICAgICBvd25lcjogZGVjb2RlZC5rZXlzLmF1dGhvcml0eSxcbiAgICAgICAgICB9IGFzIERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvblsna2V5cyddO1xuICAgICAgICAgIHR0QW1vdW50ID0gZGVjb2RlZC5kYXRhLmFtb3VudDtcbiAgICAgICAgICB0dERlY2ltYWxzID0gZGVjb2RlZC5kYXRhLmRlY2ltYWxzO1xuICAgICAgICAgIHR0RmVlID0gZGVjb2RlZC5kYXRhLmZlZS50b1N0cmluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbihcbiAgICAgICAgICAgIGluc3RydWN0aW9uLFxuICAgICAgICAgICAgaXNUb2tlbjIwMjJUcmFuc2ZlciA/IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCA6IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHRLZXlzID0gZGVjb2RlZC5rZXlzO1xuICAgICAgICAgIHR0QW1vdW50ID0gZGVjb2RlZC5kYXRhLmFtb3VudDtcbiAgICAgICAgICB0dERlY2ltYWxzID0gZGVjb2RlZC5kYXRhLmRlY2ltYWxzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9IHR0S2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKHRva2VuQWRkcmVzcywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5UcmFuc2ZlcjogVG9rZW5UcmFuc2ZlciA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHR0S2V5cy5vd25lci5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRvQWRkcmVzczogdHRLZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB0dEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgICAgc291cmNlQWRkcmVzczogdHRLZXlzLnNvdXJjZS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyLFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogdHREZWNpbWFscyxcbiAgICAgICAgICAgIC4uLih0dEZlZSAhPT0gdW5kZWZpbmVkID8geyBmZWU6IHR0RmVlIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2godG9rZW5UcmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFwcHJvdmU6XG4gICAgICAgIGNvbnN0IHByb2dyYW1JZCA9IGluc3RydWN0aW9uLnByb2dyYW1JZC5lcXVhbHMoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKSA/IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYXBwcm92ZUluc3RydWN0aW9uID0gZGVjb2RlQXBwcm92ZUluc3RydWN0aW9uKGluc3RydWN0aW9uLCBwcm9ncmFtSWQpO1xuICAgICAgICBjb25zdCBhcHByb3ZlOiBBcHByb3ZlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcHJvdmUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMuYWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVsZWdhdGVBZGRyZXNzOiBhcHByb3ZlSW5zdHJ1Y3Rpb24ua2V5cy5kZWxlZ2F0ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBhcHByb3ZlSW5zdHJ1Y3Rpb24ua2V5cy5vd25lci50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBhcHByb3ZlSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlkICYmIHByb2dyYW1JZC50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGFwcHJvdmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgbWludFRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0YUluaXQ6IEF0YUluaXQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BVEFBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLlBheWVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IG1pbnRUb2tlbk5hbWUsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JRCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhY2NvdW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID1cbiAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldENvbXB1dGVVbml0TGltaXQ6XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0TGltaXRQYXJhbXMgPSBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlU2V0Q29tcHV0ZVVuaXRMaW1pdChpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0TGltaXQ6IFNldENvbXB1dGVVbml0TGltaXQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0Q29tcHV0ZVVuaXRMaW1pdCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHVuaXRzOiBzZXRDb21wdXRlVW5pdExpbWl0UGFyYW1zLnVuaXRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHNldENvbXB1dGVVbml0TGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgY29uc3Qgc2V0Q29tcHV0ZVVuaXRQcmljZVBhcmFtcyA9IENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5kZWNvZGVTZXRDb21wdXRlVW5pdFByaWNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc2V0UHJpb3JpdHlGZWU6IFNldFByaW9yaXR5RmVlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZmVlOiBzZXRDb21wdXRlVW5pdFByaWNlUGFyYW1zLm1pY3JvTGFtcG9ydHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc2V0UHJpb3JpdHlGZWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NaW50VG86XG4gICAgICAgIGxldCBtaW50VG9JbnN0cnVjdGlvbjogRGVjb2RlZE1pbnRUb0luc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgbWludFRvSW5zdHJ1Y3Rpb24gPSBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWludFRvSW5zdHJ1Y3Rpb24gPSBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50QWRkcmVzc0Zvck1pbnQgPSBtaW50VG9JbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZUZvck1pbnQgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzRm9yTWludCwgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JNaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JNaW50ID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludFRvOiBNaW50VG8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWludFRvLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3M6IG1pbnRBZGRyZXNzRm9yTWludCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzczogbWludFRvSW5zdHJ1Y3Rpb24ua2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IG1pbnRUb0luc3RydWN0aW9uLmtleXMuYXV0aG9yaXR5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBtaW50VG9JbnN0cnVjdGlvbi5kYXRhLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWVGb3JNaW50LFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSURGb3JNaW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1pbnRUbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkJ1cm46XG4gICAgICAgIGxldCBidXJuSW5zdHJ1Y3Rpb246IERlY29kZWRCdXJuSW5zdHJ1Y3Rpb247XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBidXJuSW5zdHJ1Y3Rpb24gPSBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1cm5JbnN0cnVjdGlvbiA9IGRlY29kZUJ1cm5JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50QWRkcmVzc0ZvckJ1cm4gPSBidXJuSW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWVGb3JCdXJuID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzc0ZvckJ1cm4sIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlERm9yQnVybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlERm9yQnVybiA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1cm46IEJ1cm4gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQnVybixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QWRkcmVzc0ZvckJ1cm4sXG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogYnVybkluc3RydWN0aW9uLmtleXMuYWNjb3VudC5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IGJ1cm5JbnN0cnVjdGlvbi5rZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBidXJuSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lRm9yQnVybixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yQnVybixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChidXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbnR5cGUgU3Rha2luZ0luc3RydWN0aW9ucyA9IHtcbiAgZGVwb3NpdFNvbD86IERlcG9zaXRTb2xQYXJhbXM7XG4gIGNyZWF0ZT86IENyZWF0ZUFjY291bnRQYXJhbXM7XG4gIGluaXRpYWxpemU/OiBJbml0aWFsaXplU3Rha2VQYXJhbXM7XG4gIGRlbGVnYXRlPzogRGVsZWdhdGVTdGFrZVBhcmFtcztcbiAgaGFzQXRhSW5pdD86IGJvb2xlYW47XG59O1xuXG50eXBlIEppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgZGVwb3NpdFNvbDogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snZGVwb3NpdFNvbCddPjtcbn07XG5cbmZ1bmN0aW9uIGlzSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBKaXRvU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5kZXBvc2l0U29sICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgY3JlYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydjcmVhdGUnXT47XG4gIGluaXRpYWxpemU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2luaXRpYWxpemUnXT47XG59O1xuXG5mdW5jdGlvbiBpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIE1hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5jcmVhdGUgIT09IHVuZGVmaW5lZCAmJiBzaS5pbml0aWFsaXplICE9PSB1bmRlZmluZWQgJiYgc2kuZGVsZWdhdGUgPT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgY3JlYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydjcmVhdGUnXT47XG4gIGluaXRpYWxpemU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2luaXRpYWxpemUnXT47XG4gIGRlbGVnYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydkZWxlZ2F0ZSddPjtcbn07XG5cbmZ1bmN0aW9uIGlzTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIE5hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuY3JlYXRlICE9PSB1bmRlZmluZWQgJiYgc2kuaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmRlbGVnYXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUeXBlRnJvbVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBTb2xTdGFraW5nVHlwZUVudW0ge1xuICBjb25zdCBpc0ppdG8gPSBpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgY29uc3QgaXNNYXJpbmFkZSA9IGlzTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgY29uc3QgaXNOYXRpdmUgPSBpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2kpO1xuICBhc3NlcnQoW2lzSml0bywgaXNNYXJpbmFkZSwgaXNOYXRpdmVdLmZpbHRlcigoeCkgPT4geCkubGVuZ3RoID09PSAxLCAnU3Rha2luZ1R5cGUgaXMgYW1iaWd1b3VzJyk7XG4gIGlmIChpc0ppdG8pIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uSklUTztcbiAgaWYgKGlzTWFyaW5hZGUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU7XG4gIGlmIChpc05hdGl2ZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU7XG4gIGFzc2VydChmYWxzZSwgJ05vIFN0YWtpbmdUeXBlIGZvdW5kJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgdHggYW5kIGRlbGVnYXRlIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdBY3RpdmF0ZSBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8gfCBBdGFJbml0PiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vIHwgQXRhSW5pdD4gPSBbXTtcbiAgY29uc3Qgc3Rha2luZ0luc3RydWN0aW9ucyA9IHt9IGFzIFN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNyZWF0ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nSW5pdGlhbGl6ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVJbml0aWFsaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlbGVnYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5EZXBvc2l0U29sOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlcG9zaXRTb2wgPSBkZWNvZGVEZXBvc2l0U29sKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5oYXNBdGFJbml0ID0gdHJ1ZTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogZmluZFRva2VuTmFtZShpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcbiAgY29uc3Qgc3Rha2luZ1R5cGUgPSBnZXRTdGFraW5nVHlwZUZyb21TdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuXG4gIGxldCBzdGFraW5nQWN0aXZhdGU6IFN0YWtpbmdBY3RpdmF0ZSB8IHVuZGVmaW5lZDtcblxuICBzd2l0Y2ggKHN0YWtpbmdUeXBlKSB7XG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uSklUTzoge1xuICAgICAgYXNzZXJ0KGlzSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucykpO1xuICAgICAgY29uc3QgeyBkZXBvc2l0U29sLCBoYXNBdGFJbml0IH0gPSBzdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICAgICAgc3Rha2luZ0FjdGl2YXRlID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBkZXBvc2l0U29sLmZ1bmRpbmdBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGRlcG9zaXRTb2wuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgYW1vdW50OiBkZXBvc2l0U29sLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsaWRhdG9yOiBkZXBvc2l0U29sLnN0YWtlUG9vbC50b1N0cmluZygpLFxuICAgICAgICAgIGV4dHJhUGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgICAgIG1hbmFnZXJGZWVBY2NvdW50OiBkZXBvc2l0U29sLm1hbmFnZXJGZWVBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHBvb2xNaW50OiBkZXBvc2l0U29sLnBvb2xNaW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHJlc2VydmVTdGFrZTogZGVwb3NpdFNvbC5yZXNlcnZlU3Rha2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OiAhIWhhc0F0YUluaXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERToge1xuICAgICAgYXNzZXJ0KGlzTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlLCBpbml0aWFsaXplIH0gPSBzdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICAgICAgc3Rha2luZ0FjdGl2YXRlID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBjcmVhdGUuZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbml0aWFsaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgYW1vdW50OiBjcmVhdGUubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IGluaXRpYWxpemUuYXV0aG9yaXplZC5zdGFrZXIudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU6IHtcbiAgICAgIGFzc2VydChpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucykpO1xuICAgICAgY29uc3QgeyBjcmVhdGUsIGluaXRpYWxpemUsIGRlbGVnYXRlIH0gPSBzdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICAgICAgc3Rha2luZ0FjdGl2YXRlID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBjcmVhdGUuZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbml0aWFsaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgYW1vdW50OiBjcmVhdGUubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IGRlbGVnYXRlLnZvdGVQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCB1bnJlYWNoYWJsZTogbmV2ZXIgPSBzdGFraW5nVHlwZTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFraW5nIHR5cGUgJHt1bnJlYWNoYWJsZX1gKTtcbiAgICB9XG4gIH1cblxuICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nQWN0aXZhdGUpO1xuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBkZWxlZ2F0ZSB0eFxuICogT25seSBzdXBwb3J0cyBOb25jZSwgU3Rha2luZ0RlbGVnYXRlXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgZGVsZWdhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlbGVnYXRlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgY29uc3Qgc3Rha2luZ0RlbGVnYXRlUGFyYW1zID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZTogU3Rha2luZ0RlbGVnYXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWxlZ2F0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMudm90ZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9uczogU3Rha2luZ0luc3RydWN0aW9ucykge1xuICBpZiAoc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSA9PT0gdW5kZWZpbmVkICYmIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVwb3NpdFNvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgc3Rha2luZyBhY3RpdmF0ZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBjcmVhdGUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlICYmICFzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgc3Rha2luZyBhY3RpdmF0ZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBpbml0aWFsaXplIHN0YWtlIGFjY291bnQvZGVsZWdhdGUgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIFVuc3Rha2luZ0luc3RydWN0aW9ucyA9IHtcbiAgYWxsb2NhdGU/OiBBbGxvY2F0ZVBhcmFtcztcbiAgYXNzaWduPzogQXNzaWduUGFyYW1zO1xuICBzcGxpdD86IFNwbGl0U3Rha2VQYXJhbXM7XG4gIGRlYWN0aXZhdGU/OiBEZWFjdGl2YXRlU3Rha2VQYXJhbXM7XG4gIHRyYW5zZmVyPzogRGVjb2RlZFRyYW5zZmVySW5zdHJ1Y3Rpb247XG4gIHdpdGhkcmF3U3Rha2U/OiBXaXRoZHJhd1N0YWtlUGFyYW1zO1xufTtcblxudHlwZSBKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0gVW5zdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICB3aXRoZHJhd1N0YWtlOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3dpdGhkcmF3U3Rha2UnXT47XG59O1xuXG5mdW5jdGlvbiBpc0ppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnModWk6IFVuc3Rha2luZ0luc3RydWN0aW9ucyk6IHVpIGlzIEppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkud2l0aGRyYXdTdGFrZSAhPT0gdW5kZWZpbmVkICYmIHVpLmRlYWN0aXZhdGUgIT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyA9IFVuc3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgdHJhbnNmZXI6IE5vbk51bGxhYmxlPFVuc3Rha2luZ0luc3RydWN0aW9uc1sndHJhbnNmZXInXT47XG59O1xuXG5mdW5jdGlvbiBpc01hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiB1aS50cmFuc2ZlciAhPT0gdW5kZWZpbmVkICYmIHVpLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGRlYWN0aXZhdGU6IE5vbk51bGxhYmxlPFVuc3Rha2luZ0luc3RydWN0aW9uc1snZGVhY3RpdmF0ZSddPjtcbiAgc3BsaXQ6IFVuc3Rha2luZ0luc3RydWN0aW9uc1snc3BsaXQnXTtcbn07XG5cbmZ1bmN0aW9uIGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkud2l0aGRyYXdTdGFrZSA9PT0gdW5kZWZpbmVkICYmIHVpLmRlYWN0aXZhdGUgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0U3Rha2luZ1R5cGVGcm9tVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiBTb2xTdGFraW5nVHlwZUVudW0ge1xuICBjb25zdCBpc0ppdG8gPSBpc0ppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBjb25zdCBpc01hcmluYWRlID0gaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aSk7XG4gIGNvbnN0IGlzTmF0aXZlID0gaXNOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBhc3NlcnQoW2lzSml0bywgaXNNYXJpbmFkZSwgaXNOYXRpdmVdLmZpbHRlcigoeCkgPT4geCkubGVuZ3RoID09PSAxLCAnU3Rha2luZ1R5cGUgaXMgYW1iaWd1b3VzJyk7XG4gIGlmIChpc0ppdG8pIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uSklUTztcbiAgaWYgKGlzTWFyaW5hZGUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU7XG4gIGlmIChpc05hdGl2ZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU7XG4gIGFzc2VydChmYWxzZSwgJ05vIFN0YWtpbmdUeXBlIGZvdW5kJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIGRlYWN0aXZhdGUgc3Rha2UgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtcy4gU3VwcG9ydHMgZnVsbCBzdGFrZVxuICogYWNjb3VudCBkZWFjdGl2YXRpb24gYW5kIHBhcnRpYWwgc3Rha2UgYWNjb3VudCBkZWFjdGl2YXRpb24uXG4gKlxuICogV2hlbiBwYXJ0aWFsbHkgZGVhY3RpdmF0aW5nIGEgc3Rha2UgYWNjb3VudCB0aGlzIG1ldGhvZCBleHBlY3RzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOiBBbGxvY2F0ZSxcbiAqIHRvIGFsbG9jYXRlIGEgbmV3IHN0YWtpbmcgYWNjb3VudCwgQXNzaWduLCB0byBhc3NpZ24gdGhlIG5ld2x5IGNyZWF0ZWQgc3Rha2luZyBhY2NvdW50IHRvIHRoZVxuICogU3Rha2UgUHJvZ3JhbSwgU3BsaXQsIHRvIHNwbGl0IHRoZSBjdXJyZW50IHN0YWtlIGFjY291bnQsIGFuZCBTdGFraW5nRGVhY3RpdmF0ZSB0byBkZWFjdGl2YXRlIHRoZVxuICogbmV3bHkgY3JlYXRlZCBzdGFrZSBhY2NvdW50LlxuICpcbiAqIFN1cHBvcnRzIE5vbmNlLCBTdGFraW5nRGVhY3RpdmF0ZSwgTWVtbywgQWxsb2NhdGUsIEFzc2lnbiwgYW5kIFNwbGl0IFNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgY29pbk5hbWU/OiBzdHJpbmdcbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVhY3RpdmF0ZSB8IE1lbW8+ID0gW107XG4gIGNvbnN0IHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BbGxvY2F0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hbGxvY2F0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPVxuICAgICAgICAgICAgU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFsbG9jYXRlOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Bc3NpZ246XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hc3NpZ24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFzc2lnbjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNwbGl0OlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnNwbGl0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlU3BsaXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNwbGl0OiBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPVxuICAgICAgICAgICAgU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkZWFjdGl2YXRlOiBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNmZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2ZlcjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uV2l0aGRyYXdTdGFrZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS53aXRoZHJhd1N0YWtlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS53aXRoZHJhd1N0YWtlID0gZGVjb2RlV2l0aGRyYXdTdGFrZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgd2l0aGRyYXdTdGFrZTogZGVjb2RlV2l0aGRyYXdTdGFrZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbiBvZiB1bnN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgICB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbik7XG4gICAgY29uc3Qgc3Rha2luZ1R5cGUgPSBnZXRTdGFraW5nVHlwZUZyb21VbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pO1xuXG4gICAgbGV0IHN0YWtpbmdEZWFjdGl2YXRlOiBTdGFraW5nRGVhY3RpdmF0ZSB8IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLkpJVE86IHtcbiAgICAgICAgYXNzZXJ0KGlzSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbikpO1xuICAgICAgICBjb25zdCB7IHdpdGhkcmF3U3Rha2UgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3U3Rha2UuZGVzdGluYXRpb25TdGFrZUF1dGhvcml0eS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3U3Rha2Uuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHdpdGhkcmF3U3Rha2UucG9vbFRva2Vucy50b1N0cmluZygpLFxuICAgICAgICAgICAgdW5zdGFraW5nQWRkcmVzczogd2l0aGRyYXdTdGFrZS5kZXN0aW5hdGlvblN0YWtlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBleHRyYVBhcmFtczoge1xuICAgICAgICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgICAgICAgbWFuYWdlckZlZUFjY291bnQ6IHdpdGhkcmF3U3Rha2UubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBwb29sTWludDogd2l0aGRyYXdTdGFrZS5wb29sTWludC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRvckxpc3RBY2NvdW50OiB3aXRoZHJhd1N0YWtlLnZhbGlkYXRvckxpc3QudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogd2l0aGRyYXdTdGFrZS52YWxpZGF0b3JTdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICB0cmFuc2ZlckF1dGhvcml0eUFkZHJlc3M6IHdpdGhkcmF3U3Rha2Uuc291cmNlVHJhbnNmZXJBdXRob3JpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICAgIGFzc2VydChpc01hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKSk7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNmZXIgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuXG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogJycsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlci50b1B1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXIubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRToge1xuICAgICAgICBhc3NlcnQoaXNOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgY29uc3QgeyBkZWFjdGl2YXRlLCBzcGxpdCB9ID0gdW5zdGFraW5nSW5zdHJ1Y3Rpb247XG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogZGVhY3RpdmF0ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogc3BsaXQ/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHwgZGVhY3RpdmF0ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBzcGxpdD8ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHNwbGl0Py5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgdW5yZWFjaGFibGU6IG5ldmVyID0gc3Rha2luZ1R5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFraW5nIHR5cGUgJHt1bnJlYWNoYWJsZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVhY3RpdmF0ZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9ucykge1xuICAvLyBDYXNlcyB3aGVyZSBleGFjdGx5IG9uZSBmaWVsZCBzaG91bGQgYmUgcHJlc2VudFxuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzOiAoa2V5b2YgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKVtdID0gW1xuICAgICdhbGxvY2F0ZScsXG4gICAgJ2Fzc2lnbicsXG4gICAgJ3NwbGl0JyxcbiAgICAnZGVhY3RpdmF0ZScsXG4gICAgJ3RyYW5zZmVyJyxcbiAgXSBhcyBjb25zdDtcbiAgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9uc0tleXMuZXZlcnkoKGspID0+ICEhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW2tdID09PSAoayA9PT0gJ3RyYW5zZmVyJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICd3aXRoZHJhd1N0YWtlJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICdkZWFjdGl2YXRlJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FzZXMgd2hlcmUgZGVhY3RpdmF0ZSBmaWVsZCBtdXN0IGJlIHByZXNlbnQgd2l0aCBhbm90aGVyIGZpZWxkXG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH1cblxuICAvLyBUaGlzIGlzIGEgc3Rha2UgcG9vbCBpbnN0cnVjdGlvbiwgbm90IGEgcGFydGlhbCB1bnN0YWtlXG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMud2l0aGRyYXdTdGFrZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhbGxvY2F0ZSB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbikge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFzc2lnbiB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0KSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3Npbmcgc3BsaXQgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24uYWNjb3VudFB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgYW5kIGFzc2lnbiB0aGUgc2FtZSBwdWJsaWMga2V5J1xuICAgICk7XG4gIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLnNwYWNlICE9PSBTdGFrZVByb2dyYW0uc3BhY2UpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgYEludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGFsbG9jYXRlICR7U3Rha2VQcm9ncmFtLnNwYWNlfSBieXRlc2BcbiAgICApO1xuICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtlIGFjY291bnQgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgU3Rha2UgUHJvZ3JhbSdcbiAgICApO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgdGhlIHVuc3Rha2luZyBhY2NvdW50Jyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgPT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIFN0YWtlIEFjY291bnQnXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBmdW5kaW5nIG9mIHVuc3Rha2UgYWRkcmVzcyBpbnN0cnVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgIHdpdGhkcmF3IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdXaXRoZHJhdywgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIHdpdGhkcmF3IHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgY29uc3Qgd2l0aGRyYXdJbnN0cnVjdGlvbiA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlV2l0aGRyYXcoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXc6IFN0YWtpbmdXaXRoZHJhdyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nV2l0aGRyYXcsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogd2l0aGRyYXdJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogd2l0aGRyYXdJbnN0cnVjdGlvbi5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB3aXRoZHJhd0luc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ1dpdGhkcmF3KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1lbW8gb2JqZWN0IGZyb20gaW5zdHJ1Y3Rpb25zIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSB0aGUgYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYmUgcGFyc2VkXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlcj59IGluc3RydWN0aW9uSW5kZXhlcyAtIHRoZSBpbnN0cnVjdGlvbnMgaW5kZXhlcyBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICogQHJldHVybnMge01lbW8gfCB1bmRlZmluZWR9IC0gbWVtbyBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lbW8oaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IE1lbW8gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnN0cnVjdGlvbnNMZW5ndGggPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpLmxlbmd0aDtcbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IGluc3RydWN0aW9uc0xlbmd0aCAmJiBpbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25JbmRleGVzLk1lbW9dKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXS5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICB9O1xuICB9XG59XG5cbmNvbnN0IGF0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBQYXllckFkZHJlc3M6IDAsXG4gIEFUQUFkZHJlc3M6IDEsXG4gIE93bmVyQWRkcmVzczogMixcbiAgTWludEFkZHJlc3M6IDMsXG59O1xuXG5jb25zdCBjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIEFjY291bnRBZGRyZXNzOiAwLFxuICBEZXN0aW5hdGlvbkFkZHJlc3M6IDEsXG4gIEF1dGhvcml0eUFkZHJlc3M6IDIsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGluaXRpYWxpemUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXSxcbiAgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZT86IGJvb2xlYW5cbik6IEFycmF5PEF0YUluaXQgfCBNZW1vIHwgTm9uY2U+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxBdGFJbml0IHwgTWVtbyB8IE5vbmNlPiA9IFtdO1xuICBsZXQgbWVtbzogTWVtbyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIG1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkRlcG9zaXRTb2w6XG4gICAgICAgIC8vIEF0YUluaXQgaXMgYSBwYXJ0IG9mIHNwbC1zdGFrZS1wb29sJ3MgZGVwb3NpdFNvbCBwcm9jZXNzXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmNvbnN0IGF0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgQWNjb3VudEFkZHJlc3M6IDAsXG4gIERlc3RpbmF0aW9uQWRkcmVzczogMSxcbiAgQXV0aG9yaXR5QWRkcmVzczogMixcbn07XG5cbmNvbnN0IGF0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBOZXN0ZWRBY2NvdW50QWRkcmVzczogMCxcbiAgTmVzdGVkTWludEFkZHJlc3M6IDEsXG4gIERlc3RpbmF0aW9uQWNjb3VudEFkZHJlc3M6IDIsXG4gIE93bmVyQWNjb3VudEFkZHJlc3M6IDMsXG4gIE93bmVyTWludEFkZHJlc3M6IDQsXG4gIFdhbGxldEFkZHJlc3M6IDUsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNsb3NlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PEF0YUNsb3NlIHwgQXRhUmVjb3Zlck5lc3RlZCB8IE5vbmNlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8QXRhQ2xvc2UgfCBBdGFSZWNvdmVyTmVzdGVkIHwgTm9uY2U+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BdXRob3JpdHlBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlJlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhdGFSZWNvdmVyTmVzdGVkOiBBdGFSZWNvdmVyTmVzdGVkID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlJlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbmVzdGVkQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTmVzdGVkQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmVzdGVkTWludEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTmVzdGVkTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BY2NvdW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lck1pbnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgd2FsbGV0QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5XYWxsZXRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFSZWNvdmVyTmVzdGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYXV0aG9yaXplZCBzdGFraW5nIGFjY291bnQgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYXV0aG9yaXplIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemUgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BdXRob3JpemU6XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlQXV0aG9yaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLm5ld0F1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1dpdGhkcmF3QWRkcmVzczogYXV0aG9yaXplLmN1c3RvZGlhblB1YmtleT8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiA9IFtdO1xuICBhc3NlcnQoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMiwgJ0ludmFsaWQgbnVtYmVyIG9mIGluc3RydWN0aW9ucycpO1xuICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbnNbMF0pO1xuICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgIHBhcmFtczoge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gIGNvbnN0IGF1dGhvcml6ZSA9IGluc3RydWN0aW9uc1sxXTtcbiAgYXNzZXJ0KGF1dGhvcml6ZS5rZXlzLmxlbmd0aCA9PT0gNSwgJ0ludmFsaWQgbnVtYmVyIG9mIGtleXMgaW4gYXV0aG9yaXplIGluc3RydWN0aW9uJyk7XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplLFxuICAgIHBhcmFtczoge1xuICAgICAgc3Rha2luZ0FkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgb2xkQXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGN1c3RvbSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjdXN0b20gc29sYW5hIGluc3RydWN0aW9uc1xuICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbk1ldGFkYXRhIC0gdGhlIGluc3RydWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgY3VzdG9tIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBwYXJzZUN1c3RvbUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdXG4pOiBDdXN0b21JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBDdXN0b21JbnN0cnVjdGlvbltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uc1tpXTtcblxuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbWV0YWRhdGEgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gcG9zaXRpb25cbiAgICBpZiAoXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhICYmXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldICYmXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uXG4gICAgKSB7XG4gICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChpbnN0cnVjdGlvbk1ldGFkYXRhW2ldIGFzIEN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCB0aGUgcmF3IGluc3RydWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uIGZvcm1hdFxuICAgICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb246IEN1c3RvbUluc3RydWN0aW9uID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbixcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBrZXlzOiBpbnN0cnVjdGlvbi5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRva2VuTmFtZShcbiAgbWludEFkZHJlc3M6IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBsZXQgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb2lucy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU29sQ29pbiAmJiB2YWx1ZS50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzKSB7XG4gICAgICB0b2tlbiA9IHZhbHVlLm5hbWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAoIXRva2VuICYmIGluc3RydWN0aW9uTWV0YWRhdGEpIHtcbiAgICBpbnN0cnVjdGlvbk1ldGFkYXRhLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLm1pbnRBZGRyZXNzID09PSBtaW50QWRkcmVzc1xuICAgICAgKSB7XG4gICAgICAgIHRva2VuID0gaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuQWRkcmVzcyA9PT0gbWludEFkZHJlc3NcbiAgICAgICkge1xuICAgICAgICB0b2tlbiA9IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXRva2VuICYmIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpIHtcbiAgICB0b2tlbiA9IG1pbnRBZGRyZXNzO1xuICB9XG5cbiAgYXNzZXJ0KHRva2VuKTtcblxuICByZXR1cm4gdG9rZW47XG59XG4iXX0=
|