@bitgo-beta/abstract-utxo 1.6.1-alpha.419 → 1.6.1-alpha.420
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/{src → cjs/src}/abstractUtxoCoin.d.ts +12 -23
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/cjs/src/abstractUtxoCoin.js +639 -0
- package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
- package/dist/cjs/src/address/fixedScript.js +150 -0
- package/dist/cjs/src/address/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/address/index.js +1 -1
- package/dist/cjs/src/config.d.ts.map +1 -0
- package/dist/cjs/src/config.js +14 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +66 -0
- package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/builder.js +37 -0
- package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/builder/index.js +1 -1
- package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/builder/parse.js +116 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
- package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/createWallet/index.js +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/descriptor/index.js +1 -1
- package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
- package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
- package/dist/cjs/src/impl/bch/bch.js +70 -0
- package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bch/index.js +1 -1
- package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bch/tbch.js +1 -1
- package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bcha/bcha.js +1 -1
- package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bcha/index.js +1 -1
- package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bcha/tbcha.js +1 -1
- package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bsv/bsv.js +1 -1
- package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bsv/index.js +1 -1
- package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/bsv/tbsv.js +1 -1
- package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/btc.js +1 -1
- package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/index.js +1 -1
- package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/impl/btc/inscriptionBuilder.js +183 -0
- package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtc.js +1 -1
- package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtc4.js +1 -1
- package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.js +1 -1
- package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btc/tbtcsig.js +1 -1
- package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
- package/dist/{src/impl/dash/dash.js → cjs/src/impl/btg/btg.js} +6 -6
- package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/btg/index.js +1 -1
- package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
- package/dist/cjs/src/impl/dash/dash.js +48 -0
- package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/dash/index.js +1 -1
- package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/dash/tdash.js +1 -1
- package/dist/{src → cjs/src}/impl/doge/doge.d.ts +3 -2
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
- package/dist/cjs/src/impl/doge/doge.js +79 -0
- package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/doge/index.js +1 -1
- package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/doge/tdoge.js +1 -1
- package/dist/cjs/src/impl/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/index.js +1 -1
- package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/ltc/index.js +1 -1
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/ltc/ltc.js +1 -1
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/ltc/tltc.js +1 -1
- package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/zec/index.js +1 -1
- package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/zec/tzec.js +1 -1
- package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
- package/dist/{src → cjs/src}/impl/zec/zec.js +1 -1
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/src/keychains.d.ts.map +1 -0
- package/dist/cjs/src/keychains.js +104 -0
- package/dist/cjs/src/names.d.ts.map +1 -0
- package/dist/cjs/src/names.js +214 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +26 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/TransactionExplanation.js +16 -0
- package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/offlineVault/descriptor/index.js +1 -1
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
- package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
- package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/offlineVault/index.js +1 -1
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
- package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/backupKeyRecovery.js +370 -0
- package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/baseApi.js +73 -0
- package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/src/recovery/crossChainRecovery.js +364 -0
- package/dist/cjs/src/recovery/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/recovery/index.js +1 -1
- package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
- package/dist/cjs/src/recovery/mempoolApi.js +36 -0
- package/dist/{src → cjs/src}/replayProtection.d.ts +1 -0
- package/dist/cjs/src/replayProtection.d.ts.map +1 -0
- package/dist/cjs/src/replayProtection.js +58 -0
- package/dist/cjs/src/sign.d.ts.map +1 -0
- package/dist/cjs/src/sign.js +205 -0
- package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
- package/dist/cjs/src/transaction/bip322.js +125 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
- package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
- package/dist/{src → cjs/src}/transaction/descriptor/explainPsbt.d.ts +2 -2
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/explainPsbt.js +80 -0
- package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/descriptor/index.js +1 -1
- package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parse.js +116 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
- package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/signPsbt.js +43 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +108 -0
- package/dist/{src → cjs/src}/transaction/explainTransaction.d.ts +4 -3
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/explainTransaction.js +88 -0
- package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fetchInputs.js +109 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +43 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +63 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +321 -0
- package/dist/{src → cjs/src}/transaction/fixedScript/index.d.ts +1 -0
- package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/fixedScript/index.js +4 -2
- package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/parseOutput.js +213 -0
- package/dist/{src → cjs/src}/transaction/fixedScript/parseTransaction.d.ts +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +203 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +101 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +198 -0
- package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.js +1 -1
- package/dist/cjs/src/transaction/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/index.js +1 -1
- package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
- package/dist/cjs/src/transaction/outputDifference.js +47 -0
- package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/parseTransaction.js +1 -1
- package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
- package/dist/cjs/src/transaction/recipient.js +88 -0
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
- package/dist/cjs/src/transaction/signTransaction.js +102 -0
- package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
- package/dist/{src → cjs/src}/transaction/verifyTransaction.js +1 -1
- package/dist/cjs/src/verifyKey.d.ts.map +1 -0
- package/dist/cjs/src/verifyKey.js +164 -0
- package/dist/cjs/src/wallet.d.ts.map +1 -0
- package/dist/cjs/src/wallet.js +8 -0
- package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
- package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
- package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
- package/dist/cjs/test/unit/address.d.ts +2 -0
- package/dist/cjs/test/unit/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/address.js +182 -0
- package/dist/cjs/test/unit/bip322.d.ts +2 -0
- package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
- package/dist/cjs/test/unit/bip322.js +45 -0
- package/dist/cjs/test/unit/coins.d.ts +2 -0
- package/dist/cjs/test/unit/coins.d.ts.map +1 -0
- package/dist/cjs/test/unit/coins.js +97 -0
- package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
- package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/customChangeWallet.js +154 -0
- package/dist/cjs/test/unit/customSigner.d.ts +3 -0
- package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
- package/dist/cjs/test/unit/customSigner.js +108 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
- package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/builder.js +72 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
- package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
- package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
- package/dist/cjs/test/unit/descriptorAddress.js +102 -0
- package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/explainTransaction.js +74 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
- package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
- package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
- package/dist/cjs/test/unit/keySignatures.js +54 -0
- package/dist/cjs/test/unit/keychains.d.ts +2 -0
- package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/keychains.js +49 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
- package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
- package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/parseTransaction.js +125 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts +6 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
- package/dist/cjs/test/unit/prebuildAndSign.js +270 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +285 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.js +283 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts +30 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/mock.js +138 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +30 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +76 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/parse.js +135 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/sign.js +32 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +108 -0
- package/dist/cjs/test/unit/transaction.d.ts +2 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +501 -0
- package/dist/cjs/test/unit/txFormat.d.ts +30 -0
- package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
- package/dist/cjs/test/unit/txFormat.js +162 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
- package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/fixtures.js +102 -0
- package/dist/cjs/test/unit/util/index.d.ts +7 -0
- package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/index.js +23 -0
- package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
- package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/keychains.js +72 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
- package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/nockIndexerAPI.js +56 -0
- package/dist/cjs/test/unit/util/transaction.d.ts +24 -0
- package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/transaction.js +107 -0
- package/dist/cjs/test/unit/util/unspents.d.ts +13 -0
- package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/unspents.js +106 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts +8 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/utxoCoins.js +95 -0
- package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
- package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/wallet.js +9 -0
- package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/verifyTransaction.js +327 -0
- package/dist/cjs/test/unit/wallet.d.ts +2 -0
- package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
- package/dist/cjs/test/unit/wallet.js +248 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/abstractUtxoCoin.d.ts +464 -0
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
- package/dist/esm/abstractUtxoCoin.js +598 -0
- package/dist/esm/address/fixedScript.d.ts +51 -0
- package/dist/esm/address/fixedScript.js +109 -0
- package/dist/esm/address/index.d.ts +2 -0
- package/dist/esm/address/index.js +2 -0
- package/dist/esm/config.d.ts +9 -0
- package/dist/esm/config.js +11 -0
- package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
- package/dist/esm/descriptor/NamedDescriptor.js +39 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
- package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
- package/dist/esm/descriptor/builder/builder.d.ts +13 -0
- package/dist/esm/descriptor/builder/builder.js +34 -0
- package/dist/esm/descriptor/builder/index.d.ts +3 -0
- package/dist/esm/descriptor/builder/index.js +3 -0
- package/dist/esm/descriptor/builder/parse.d.ts +5 -0
- package/dist/esm/descriptor/builder/parse.js +112 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
- package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
- package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
- package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
- package/dist/esm/descriptor/createWallet/index.js +3 -0
- package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
- package/dist/esm/descriptor/descriptorWallet.js +16 -0
- package/dist/esm/descriptor/index.d.ts +8 -0
- package/dist/esm/descriptor/index.js +7 -0
- package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
- package/dist/esm/descriptor/validatePolicy.js +80 -0
- package/dist/esm/impl/bch/bch.d.ts +20 -0
- package/dist/esm/impl/bch/bch.js +33 -0
- package/dist/esm/impl/bch/index.d.ts +3 -0
- package/dist/esm/impl/bch/index.js +3 -0
- package/dist/esm/impl/bch/tbch.d.ts +10 -0
- package/dist/esm/impl/bch/tbch.js +11 -0
- package/dist/esm/impl/bcha/bcha.d.ts +9 -0
- package/dist/esm/impl/bcha/bcha.js +21 -0
- package/dist/esm/impl/bcha/index.d.ts +3 -0
- package/dist/esm/impl/bcha/index.js +3 -0
- package/dist/esm/impl/bcha/tbcha.d.ts +10 -0
- package/dist/esm/impl/bcha/tbcha.js +11 -0
- package/dist/esm/impl/bsv/bsv.d.ts +8 -0
- package/dist/esm/impl/bsv/bsv.js +11 -0
- package/dist/esm/impl/bsv/index.d.ts +3 -0
- package/dist/esm/impl/bsv/index.js +3 -0
- package/dist/esm/impl/bsv/tbsv.d.ts +10 -0
- package/dist/esm/impl/bsv/tbsv.js +11 -0
- package/dist/esm/impl/btc/btc.d.ts +13 -0
- package/dist/esm/impl/btc/btc.js +18 -0
- package/dist/esm/impl/btc/index.d.ts +7 -0
- package/dist/esm/impl/btc/index.js +7 -0
- package/dist/esm/impl/btc/inscriptionBuilder.d.ts +51 -0
- package/dist/esm/impl/btc/inscriptionBuilder.js +143 -0
- package/dist/esm/impl/btc/tbtc.d.ts +10 -0
- package/dist/esm/impl/btc/tbtc.js +11 -0
- package/dist/esm/impl/btc/tbtc4.d.ts +10 -0
- package/dist/esm/impl/btc/tbtc4.js +11 -0
- package/dist/esm/impl/btc/tbtcbgsig.d.ts +10 -0
- package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
- package/dist/esm/impl/btc/tbtcsig.d.ts +10 -0
- package/dist/esm/impl/btc/tbtcsig.js +11 -0
- package/dist/esm/impl/btg/btg.d.ts +7 -0
- package/dist/esm/impl/btg/btg.js +11 -0
- package/dist/esm/impl/btg/index.d.ts +2 -0
- package/dist/esm/impl/btg/index.js +2 -0
- package/dist/esm/impl/dash/dash.d.ts +7 -0
- package/dist/esm/impl/dash/dash.js +11 -0
- package/dist/esm/impl/dash/index.d.ts +3 -0
- package/dist/esm/impl/dash/index.js +3 -0
- package/dist/esm/impl/dash/tdash.d.ts +10 -0
- package/dist/esm/impl/dash/tdash.js +11 -0
- package/dist/esm/impl/doge/doge.d.ts +31 -0
- package/dist/esm/impl/doge/doge.d.ts.map +1 -0
- package/dist/esm/impl/doge/doge.js +75 -0
- package/dist/esm/impl/doge/index.d.ts +3 -0
- package/dist/esm/impl/doge/index.js +3 -0
- package/dist/esm/impl/doge/tdoge.d.ts +10 -0
- package/dist/esm/impl/doge/tdoge.js +11 -0
- package/dist/esm/impl/index.d.ts +10 -0
- package/dist/esm/impl/index.js +10 -0
- package/dist/esm/impl/ltc/index.d.ts +3 -0
- package/dist/esm/impl/ltc/index.js +3 -0
- package/dist/esm/impl/ltc/ltc.d.ts +7 -0
- package/dist/esm/impl/ltc/ltc.js +15 -0
- package/dist/esm/impl/ltc/tltc.d.ts +7 -0
- package/dist/esm/impl/ltc/tltc.js +14 -0
- package/dist/esm/impl/zec/index.d.ts +3 -0
- package/dist/esm/impl/zec/index.js +3 -0
- package/dist/esm/impl/zec/tzec.d.ts +7 -0
- package/dist/esm/impl/zec/tzec.js +11 -0
- package/dist/esm/impl/zec/zec.d.ts +10 -0
- package/dist/esm/impl/zec/zec.js +11 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/keychains.d.ts +48 -0
- package/dist/esm/keychains.js +61 -0
- package/dist/esm/names.d.ts +26 -0
- package/dist/esm/names.js +171 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +23 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
- package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
- package/dist/esm/offlineVault/TransactionExplanation.d.ts +15 -0
- package/dist/esm/offlineVault/TransactionExplanation.js +13 -0
- package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
- package/dist/esm/offlineVault/descriptor/index.js +2 -0
- package/dist/esm/offlineVault/descriptor/transaction.d.ts +38 -0
- package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
- package/dist/esm/offlineVault/index.d.ts +6 -0
- package/dist/esm/offlineVault/index.js +4 -0
- package/dist/esm/recovery/RecoveryProvider.d.ts +22 -0
- package/dist/{src → esm}/recovery/RecoveryProvider.js +6 -9
- package/dist/esm/recovery/backupKeyRecovery.d.ts +88 -0
- package/dist/esm/recovery/backupKeyRecovery.js +329 -0
- package/dist/esm/recovery/baseApi.d.ts +24 -0
- package/dist/esm/recovery/baseApi.js +64 -0
- package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
- package/dist/esm/recovery/coingeckoApi.js +40 -0
- package/dist/esm/recovery/crossChainRecovery.d.ts +86 -0
- package/dist/esm/recovery/crossChainRecovery.js +325 -0
- package/dist/esm/recovery/index.d.ts +7 -0
- package/dist/esm/recovery/index.js +7 -0
- package/dist/esm/recovery/mempoolApi.d.ts +7 -0
- package/dist/esm/recovery/mempoolApi.js +29 -0
- package/dist/esm/replayProtection.d.ts +5 -0
- package/dist/esm/replayProtection.d.ts.map +1 -0
- package/dist/esm/replayProtection.js +20 -0
- package/dist/esm/sign.d.ts +54 -0
- package/dist/esm/sign.js +162 -0
- package/dist/esm/transaction/bip322.d.ts +27 -0
- package/dist/esm/transaction/bip322.js +86 -0
- package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
- package/dist/{src → esm}/transaction/common/verifyPayGoAmount.js +0 -2
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
- package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
- package/dist/esm/transaction/descriptor/index.d.ts +7 -0
- package/dist/esm/transaction/descriptor/index.js +6 -0
- package/dist/esm/transaction/descriptor/parse.d.ts +15 -0
- package/dist/esm/transaction/descriptor/parse.js +79 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +13 -0
- package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
- package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
- package/dist/{src → esm}/transaction/descriptor/recipient.js +1 -2
- package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
- package/dist/esm/transaction/descriptor/signPsbt.js +38 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +35 -0
- package/dist/esm/transaction/descriptor/verifyTransaction.js +65 -0
- package/dist/esm/transaction/explainTransaction.d.ts +18 -0
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/explainTransaction.js +52 -0
- package/dist/esm/transaction/fetchInputs.d.ts +26 -0
- package/dist/esm/transaction/fetchInputs.js +72 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +40 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +63 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/explainTransaction.js +284 -0
- package/dist/esm/transaction/fixedScript/index.d.ts +7 -0
- package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/index.js +6 -0
- package/dist/esm/transaction/fixedScript/parseOutput.d.ts +26 -0
- package/dist/{src → esm}/transaction/fixedScript/parseOutput.js +22 -28
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +7 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/parseTransaction.js +164 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +18 -0
- package/dist/esm/transaction/fixedScript/signTransaction.js +95 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
- package/dist/esm/transaction/fixedScript/verifyTransaction.js +159 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
- package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
- package/dist/esm/transaction/index.d.ts +7 -0
- package/dist/esm/transaction/index.js +7 -0
- package/dist/esm/transaction/outputDifference.d.ts +40 -0
- package/dist/esm/transaction/outputDifference.js +42 -0
- package/dist/esm/transaction/parseTransaction.d.ts +3 -0
- package/dist/esm/transaction/parseTransaction.js +12 -0
- package/dist/esm/transaction/recipient.d.ts +29 -0
- package/dist/esm/transaction/recipient.js +48 -0
- package/dist/esm/transaction/signTransaction.d.ts +6 -0
- package/dist/esm/transaction/signTransaction.js +63 -0
- package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
- package/dist/esm/transaction/verifyTransaction.js +14 -0
- package/dist/esm/verifyKey.d.ts +28 -0
- package/dist/esm/verifyKey.js +123 -0
- package/dist/esm/wallet.d.ts +15 -0
- package/dist/esm/wallet.js +5 -0
- package/package.json +32 -15
- package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
- package/dist/src/abstractUtxoCoin.js +0 -634
- package/dist/src/address/fixedScript.js +0 -150
- package/dist/src/config.js +0 -14
- package/dist/src/descriptor/NamedDescriptor.js +0 -79
- package/dist/src/descriptor/assertDescriptorWalletAddress.js +0 -66
- package/dist/src/descriptor/builder/builder.js +0 -37
- package/dist/src/descriptor/builder/parse.js +0 -116
- package/dist/src/descriptor/createWallet/createDescriptorWallet.js +0 -41
- package/dist/src/descriptor/createWallet/createDescriptors.js +0 -33
- package/dist/src/descriptor/descriptorWallet.js +0 -54
- package/dist/src/descriptor/validatePolicy.js +0 -92
- package/dist/src/impl/bch/bch.js +0 -70
- package/dist/src/impl/btc/inscriptionBuilder.js +0 -183
- package/dist/src/impl/btg/btg.js +0 -48
- package/dist/src/impl/doge/doge.d.ts.map +0 -1
- package/dist/src/impl/doge/doge.js +0 -79
- package/dist/src/keychains.js +0 -104
- package/dist/src/names.js +0 -214
- package/dist/src/offlineVault/OfflineVaultHalfSigned.js +0 -26
- package/dist/src/offlineVault/OfflineVaultSignable.js +0 -55
- package/dist/src/offlineVault/TransactionExplanation.js +0 -16
- package/dist/src/offlineVault/descriptor/transaction.js +0 -80
- package/dist/src/recovery/backupKeyRecovery.js +0 -370
- package/dist/src/recovery/baseApi.js +0 -73
- package/dist/src/recovery/coingeckoApi.js +0 -44
- package/dist/src/recovery/crossChainRecovery.js +0 -364
- package/dist/src/recovery/mempoolApi.js +0 -36
- package/dist/src/replayProtection.d.ts.map +0 -1
- package/dist/src/replayProtection.js +0 -53
- package/dist/src/sign.js +0 -205
- package/dist/src/transaction/bip322.js +0 -125
- package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +0 -1
- package/dist/src/transaction/descriptor/explainPsbt.js +0 -80
- package/dist/src/transaction/descriptor/parse.js +0 -116
- package/dist/src/transaction/descriptor/parseToAmountType.js +0 -60
- package/dist/src/transaction/descriptor/signPsbt.js +0 -43
- package/dist/src/transaction/descriptor/verifyTransaction.js +0 -108
- package/dist/src/transaction/explainTransaction.d.ts.map +0 -1
- package/dist/src/transaction/explainTransaction.js +0 -67
- package/dist/src/transaction/fetchInputs.js +0 -109
- package/dist/src/transaction/fixedScript/explainTransaction.d.ts +0 -29
- package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +0 -1
- package/dist/src/transaction/fixedScript/explainTransaction.js +0 -321
- package/dist/src/transaction/fixedScript/index.d.ts.map +0 -1
- package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +0 -1
- package/dist/src/transaction/fixedScript/parseTransaction.js +0 -203
- package/dist/src/transaction/fixedScript/signTransaction.js +0 -101
- package/dist/src/transaction/fixedScript/verifyTransaction.js +0 -198
- package/dist/src/transaction/outputDifference.js +0 -47
- package/dist/src/transaction/recipient.js +0 -88
- package/dist/src/transaction/signTransaction.js +0 -102
- package/dist/src/verifyKey.js +0 -164
- package/dist/src/wallet.js +0 -8
- /package/dist/{src → cjs/src}/address/fixedScript.d.ts +0 -0
- /package/dist/{src → cjs/src}/address/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/config.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/NamedDescriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/assertDescriptorWalletAddress.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/builder/builder.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/builder/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/builder/parse.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptorWallet.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptors.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/createWallet/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/descriptorWallet.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/descriptor/validatePolicy.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bch/bch.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bch/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bch/tbch.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bcha/bcha.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bcha/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bcha/tbcha.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bsv/bsv.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bsv/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/bsv/tbsv.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/btc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/inscriptionBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtc4.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btc/tbtcsig.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btg/btg.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/btg/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/dash/dash.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/dash/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/dash/tdash.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/doge/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/doge/tdoge.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/ltc/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/ltc/ltc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/ltc/tltc.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/zec/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/zec/tzec.d.ts +0 -0
- /package/dist/{src → cjs/src}/impl/zec/zec.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/keychains.d.ts +0 -0
- /package/dist/{src → cjs/src}/names.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/OfflineVaultHalfSigned.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/OfflineVaultSignable.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/TransactionExplanation.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/descriptor/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/offlineVault/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/backupKeyRecovery.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/baseApi.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
- /package/dist/{src → cjs/src}/sign.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/bip322.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/common/verifyPayGoAmount.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/parse.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/parseToAmountType.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/recipient.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/signPsbt.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/descriptor/verifyTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fetchInputs.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fixedScript/parseOutput.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fixedScript/signTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/fixedScript/verifyTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/outputDifference.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/parseTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/recipient.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/signTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/transaction/verifyTransaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/verifyKey.d.ts +0 -0
- /package/dist/{src → cjs/src}/wallet.d.ts +0 -0
- /package/dist/{src → esm}/address/fixedScript.d.ts.map +0 -0
- /package/dist/{src → esm}/address/index.d.ts.map +0 -0
- /package/dist/{src → esm}/config.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/NamedDescriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/assertDescriptorWalletAddress.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/builder/builder.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/builder/index.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/builder/parse.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/createWallet/createDescriptorWallet.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/createWallet/createDescriptors.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/createWallet/index.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/descriptorWallet.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/descriptor/validatePolicy.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bch/bch.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bch/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bch/tbch.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bcha/bcha.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bcha/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bcha/tbcha.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bsv/bsv.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bsv/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/bsv/tbsv.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/btc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/inscriptionBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtc4.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtcbgsig.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btc/tbtcsig.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btg/btg.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/btg/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/dash/dash.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/dash/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/dash/tdash.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/doge/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/doge/tdoge.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/ltc/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/ltc/ltc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/ltc/tltc.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/zec/index.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/zec/tzec.d.ts.map +0 -0
- /package/dist/{src → esm}/impl/zec/zec.d.ts.map +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/keychains.d.ts.map +0 -0
- /package/dist/{src → esm}/names.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/OfflineVaultHalfSigned.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/OfflineVaultSignable.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/TransactionExplanation.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/descriptor/transaction.d.ts.map +0 -0
- /package/dist/{src → esm}/offlineVault/index.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/RecoveryProvider.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/backupKeyRecovery.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/baseApi.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/coingeckoApi.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/crossChainRecovery.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/index.d.ts.map +0 -0
- /package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +0 -0
- /package/dist/{src → esm}/sign.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/bip322.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/common/verifyPayGoAmount.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/index.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/parse.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/parseToAmountType.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/recipient.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/signPsbt.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/descriptor/verifyTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fetchInputs.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fixedScript/parseOutput.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fixedScript/signTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/fixedScript/verifyTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/getPayGoVerificationPubkey.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/index.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/outputDifference.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/parseTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/recipient.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/signTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/transaction/verifyTransaction.d.ts.map +0 -0
- /package/dist/{src → esm}/verifyKey.d.ts.map +0 -0
- /package/dist/{src → esm}/wallet.d.ts.map +0 -0
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.explainPsbt = explainPsbt;
|
|
37
|
-
exports.explainLegacyTx = explainLegacyTx;
|
|
38
|
-
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
39
|
-
const utxo_core_1 = require("@bitgo-beta/utxo-core");
|
|
40
|
-
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
41
|
-
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
42
|
-
const utxocore = __importStar(require("@bitgo-beta/utxo-core"));
|
|
43
|
-
const recipient_1 = require("../recipient");
|
|
44
|
-
const getPayGoVerificationPubkey_1 = require("../getPayGoVerificationPubkey");
|
|
45
|
-
function explainCommon(tx, params, network) {
|
|
46
|
-
const displayOrder = ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs'];
|
|
47
|
-
let spendAmount = BigInt(0);
|
|
48
|
-
let changeAmount = BigInt(0);
|
|
49
|
-
const changeOutputs = [];
|
|
50
|
-
const outputs = [];
|
|
51
|
-
const { changeInfo } = params;
|
|
52
|
-
const changeAddresses = changeInfo?.map((info) => info.address) ?? [];
|
|
53
|
-
tx.outs.forEach((currentOutput) => {
|
|
54
|
-
// Try to encode the script pubkey with an address. If it fails, try to parse it as an OP_RETURN output with the prefix.
|
|
55
|
-
// If that fails, then it is an unrecognized scriptPubkey and should fail
|
|
56
|
-
const currentAddress = (0, recipient_1.toExtendedAddressFormat)(currentOutput.script, network);
|
|
57
|
-
const currentAmount = BigInt(currentOutput.value);
|
|
58
|
-
if (changeAddresses.includes(currentAddress)) {
|
|
59
|
-
// this is change
|
|
60
|
-
changeAmount += currentAmount;
|
|
61
|
-
const change = changeInfo?.find((change) => change.address === currentAddress);
|
|
62
|
-
if (!change) {
|
|
63
|
-
throw new Error('changeInfo must have change information for all change outputs');
|
|
64
|
-
}
|
|
65
|
-
changeOutputs.push({
|
|
66
|
-
address: currentAddress,
|
|
67
|
-
amount: currentAmount.toString(),
|
|
68
|
-
chain: change.chain,
|
|
69
|
-
index: change.index,
|
|
70
|
-
external: false,
|
|
71
|
-
});
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
spendAmount += currentAmount;
|
|
75
|
-
outputs.push({
|
|
76
|
-
address: currentAddress,
|
|
77
|
-
amount: currentAmount.toString(),
|
|
78
|
-
// If changeInfo has a length greater than or equal to zero, it means that the change information
|
|
79
|
-
// was provided to the function but the output was not identified as change. In this case,
|
|
80
|
-
// the output is external, and we can set it as so. If changeInfo is undefined, it means we were
|
|
81
|
-
// given no information about change outputs, so we can't determine anything about the output,
|
|
82
|
-
// so we leave it undefined.
|
|
83
|
-
external: changeInfo ? true : undefined,
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
const outputDetails = {
|
|
87
|
-
outputAmount: spendAmount.toString(),
|
|
88
|
-
changeAmount: changeAmount.toString(),
|
|
89
|
-
outputs,
|
|
90
|
-
changeOutputs,
|
|
91
|
-
};
|
|
92
|
-
let fee;
|
|
93
|
-
let locktime;
|
|
94
|
-
if (params.feeInfo) {
|
|
95
|
-
displayOrder.push('fee');
|
|
96
|
-
fee = params.feeInfo;
|
|
97
|
-
}
|
|
98
|
-
if (Number.isInteger(tx.locktime) && tx.locktime > 0) {
|
|
99
|
-
displayOrder.push('locktime');
|
|
100
|
-
locktime = tx.locktime;
|
|
101
|
-
}
|
|
102
|
-
return { displayOrder, id: tx.getId(), ...outputDetails, fee, locktime };
|
|
103
|
-
}
|
|
104
|
-
function getRootWalletKeys(params) {
|
|
105
|
-
if (params.pubs instanceof utxo_lib_1.bitgo.RootWalletKeys) {
|
|
106
|
-
return params.pubs;
|
|
107
|
-
}
|
|
108
|
-
const keys = params.pubs?.map((xpub) => secp256k1_1.bip32.fromBase58(xpub));
|
|
109
|
-
return keys && keys.length === 3 ? new utxo_lib_1.bitgo.RootWalletKeys(keys) : undefined;
|
|
110
|
-
}
|
|
111
|
-
function getPsbtInputSignaturesCount(psbt, params) {
|
|
112
|
-
const rootWalletKeys = getRootWalletKeys(params);
|
|
113
|
-
return rootWalletKeys
|
|
114
|
-
? utxo_lib_1.bitgo.getSignatureValidationArrayPsbt(psbt, rootWalletKeys).map((sv) => sv[1].filter((v) => v).length)
|
|
115
|
-
: Array(psbt.data.inputs.length).fill(0);
|
|
116
|
-
}
|
|
117
|
-
function getTxInputSignaturesCount(tx, params, network) {
|
|
118
|
-
const prevOutputs = params.txInfo?.unspents?.map((u) => utxo_lib_1.bitgo.toOutput(u, network));
|
|
119
|
-
const rootWalletKeys = getRootWalletKeys(params);
|
|
120
|
-
const { unspents = [] } = params.txInfo ?? {};
|
|
121
|
-
// get the number of signatures per input
|
|
122
|
-
return tx.ins.map((input, idx) => {
|
|
123
|
-
if (unspents.length !== tx.ins.length) {
|
|
124
|
-
return 0;
|
|
125
|
-
}
|
|
126
|
-
if (!prevOutputs) {
|
|
127
|
-
throw new Error(`invalid state`);
|
|
128
|
-
}
|
|
129
|
-
if (!rootWalletKeys) {
|
|
130
|
-
// no pub keys or incorrect number of pub keys
|
|
131
|
-
return 0;
|
|
132
|
-
}
|
|
133
|
-
try {
|
|
134
|
-
return utxo_lib_1.bitgo.verifySignatureWithUnspent(tx, idx, unspents, rootWalletKeys).filter((v) => v).length;
|
|
135
|
-
}
|
|
136
|
-
catch (e) {
|
|
137
|
-
// some other error occurred and we can't validate the signatures
|
|
138
|
-
return 0;
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
function getChainAndIndexFromBip32Derivations(output) {
|
|
143
|
-
const derivations = output.bip32Derivation ?? output.tapBip32Derivation ?? undefined;
|
|
144
|
-
if (!derivations) {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
const paths = derivations.map((d) => d.path);
|
|
148
|
-
if (!paths || paths.length !== 3) {
|
|
149
|
-
throw new Error('expected 3 paths in bip32Derivation or tapBip32Derivation');
|
|
150
|
-
}
|
|
151
|
-
if (!paths.every((p) => paths[0] === p)) {
|
|
152
|
-
throw new Error('expected all paths to be the same');
|
|
153
|
-
}
|
|
154
|
-
paths.forEach((path) => {
|
|
155
|
-
if (paths[0] !== path) {
|
|
156
|
-
throw new Error('Unable to get a single chain and index on the output because there are different paths for different keys');
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
return utxolib.bitgo.getChainAndIndexFromPath(paths[0]);
|
|
160
|
-
}
|
|
161
|
-
function getChangeInfo(psbt) {
|
|
162
|
-
try {
|
|
163
|
-
return utxolib.bitgo.findInternalOutputIndices(psbt).map((i) => {
|
|
164
|
-
const derivationInformation = getChainAndIndexFromBip32Derivations(psbt.data.outputs[i]);
|
|
165
|
-
if (!derivationInformation) {
|
|
166
|
-
throw new Error('could not find derivation information on bip32Derivation or tapBip32Derivation');
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
address: utxolib.address.fromOutputScript(psbt.txOutputs[i].script, psbt.network),
|
|
170
|
-
external: false,
|
|
171
|
-
...derivationInformation,
|
|
172
|
-
};
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
catch (e) {
|
|
176
|
-
if (e instanceof utxolib.bitgo.ErrorNoMultiSigInputFound) {
|
|
177
|
-
return undefined;
|
|
178
|
-
}
|
|
179
|
-
throw e;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Extract PayGo address proof information from the PSBT if present
|
|
184
|
-
* @returns Information about the PayGo proof, including the output index and address
|
|
185
|
-
*/
|
|
186
|
-
function getPayGoVerificationInfo(psbt, network) {
|
|
187
|
-
let outputIndex = undefined;
|
|
188
|
-
let address = undefined;
|
|
189
|
-
// Check if this PSBT has any PayGo address proofs
|
|
190
|
-
if (!utxocore.paygo.psbtOutputIncludesPaygoAddressProof(psbt)) {
|
|
191
|
-
return undefined;
|
|
192
|
-
}
|
|
193
|
-
// This pulls the pubkey depending on given network
|
|
194
|
-
const verificationPubkey = (0, getPayGoVerificationPubkey_1.getPayGoVerificationPubkey)(network);
|
|
195
|
-
// find which output index that contains the PayGo proof
|
|
196
|
-
outputIndex = utxocore.paygo.getPayGoAddressProofOutputIndex(psbt);
|
|
197
|
-
if (outputIndex === undefined || !verificationPubkey) {
|
|
198
|
-
return undefined;
|
|
199
|
-
}
|
|
200
|
-
const output = psbt.txOutputs[outputIndex];
|
|
201
|
-
address = utxolib.address.fromOutputScript(output.script, network);
|
|
202
|
-
if (!address) {
|
|
203
|
-
throw new Error(`Can not derive address ${address} Pay Go Attestation.`);
|
|
204
|
-
}
|
|
205
|
-
return { outputIndex, verificationPubkey };
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Extract the BIP322 messages and addresses from the PSBT inputs and perform
|
|
209
|
-
* verification on the transaction to ensure that it meets the BIP322 requirements.
|
|
210
|
-
* @returns An array of objects containing the message and address for each input,
|
|
211
|
-
* or undefined if no BIP322 messages are found.
|
|
212
|
-
*/
|
|
213
|
-
function getBip322MessageInfoAndVerify(psbt, network) {
|
|
214
|
-
const bip322Messages = [];
|
|
215
|
-
for (let i = 0; i < psbt.data.inputs.length; i++) {
|
|
216
|
-
const message = utxo_core_1.bip322.getBip322ProofMessageAtIndex(psbt, i);
|
|
217
|
-
if (message) {
|
|
218
|
-
const input = psbt.data.inputs[i];
|
|
219
|
-
if (!input.witnessUtxo) {
|
|
220
|
-
throw new Error(`Missing witnessUtxo for input index ${i}`);
|
|
221
|
-
}
|
|
222
|
-
if (!input.nonWitnessUtxo) {
|
|
223
|
-
throw new Error(`Missing nonWitnessUtxo for input index ${i}`);
|
|
224
|
-
}
|
|
225
|
-
const scriptPubKey = input.witnessUtxo.script;
|
|
226
|
-
// Verify that the toSpend transaction can be recreated in the PSBT and is encoded correctly in the nonWitnessUtxo
|
|
227
|
-
const toSpend = utxo_core_1.bip322.buildToSpendTransaction(scriptPubKey, message);
|
|
228
|
-
const toSpendB64 = toSpend.toBuffer().toString('base64');
|
|
229
|
-
if (input.nonWitnessUtxo.toString('base64') !== toSpendB64) {
|
|
230
|
-
throw new Error(`Non-witness UTXO does not match the expected toSpend transaction at input index ${i}`);
|
|
231
|
-
}
|
|
232
|
-
// Verify that the toSpend transaction ID matches the input's referenced transaction ID
|
|
233
|
-
if (toSpend.getId() !== utxolib.bitgo.getOutputIdForInput(psbt.txInputs[i]).txid) {
|
|
234
|
-
throw new Error(`ToSpend transaction ID does not match the input at index ${i}`);
|
|
235
|
-
}
|
|
236
|
-
// Verify the input specifics
|
|
237
|
-
if (psbt.txInputs[i].sequence !== 0) {
|
|
238
|
-
throw new Error(`Unexpected sequence number at input index ${i}: ${psbt.txInputs[i].sequence}. Expected 0.`);
|
|
239
|
-
}
|
|
240
|
-
if (psbt.txInputs[i].index !== 0) {
|
|
241
|
-
throw new Error(`Unexpected input index at position ${i}: ${psbt.txInputs[i].index}. Expected 0.`);
|
|
242
|
-
}
|
|
243
|
-
bip322Messages.push({
|
|
244
|
-
message: message.toString('utf8'),
|
|
245
|
-
address: utxolib.address.fromOutputScript(scriptPubKey, network),
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
if (bip322Messages.length > 0) {
|
|
250
|
-
// If there is a BIP322 message in any input, all inputs must have one.
|
|
251
|
-
if (bip322Messages.length !== psbt.data.inputs.length) {
|
|
252
|
-
throw new Error('Inconsistent BIP322 messages across inputs.');
|
|
253
|
-
}
|
|
254
|
-
// Verify the transaction specifics for BIP322
|
|
255
|
-
if (psbt.version !== 0 && psbt.version !== 2) {
|
|
256
|
-
throw new Error(`Unsupported PSBT version for BIP322: ${psbt.version}. Expected 0 `);
|
|
257
|
-
}
|
|
258
|
-
if (psbt.data.outputs.length !== 1 ||
|
|
259
|
-
psbt.txOutputs[0].script.toString('hex') !== '6a' ||
|
|
260
|
-
psbt.txOutputs[0].value !== 0n) {
|
|
261
|
-
throw new Error(`Invalid PSBT outputs for BIP322. Expected exactly one OP_RETURN output with zero value.`);
|
|
262
|
-
}
|
|
263
|
-
return bip322Messages;
|
|
264
|
-
}
|
|
265
|
-
return undefined;
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Decompose a raw psbt into useful information, such as the total amounts,
|
|
269
|
-
* change amounts, and transaction outputs.
|
|
270
|
-
*/
|
|
271
|
-
function explainPsbt(psbt, params, network, { strict = false } = {}) {
|
|
272
|
-
const payGoVerificationInfo = getPayGoVerificationInfo(psbt, network);
|
|
273
|
-
if (payGoVerificationInfo) {
|
|
274
|
-
try {
|
|
275
|
-
utxocore.paygo.verifyPayGoAddressProof(psbt, payGoVerificationInfo.outputIndex, secp256k1_1.bip32.fromBase58(payGoVerificationInfo.verificationPubkey, utxolib.networks.bitcoin).publicKey);
|
|
276
|
-
}
|
|
277
|
-
catch (e) {
|
|
278
|
-
if (strict) {
|
|
279
|
-
throw e;
|
|
280
|
-
}
|
|
281
|
-
console.error(e);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
const messages = getBip322MessageInfoAndVerify(psbt, network);
|
|
285
|
-
const changeInfo = getChangeInfo(psbt);
|
|
286
|
-
const tx = psbt.getUnsignedTx();
|
|
287
|
-
const common = explainCommon(tx, { ...params, changeInfo }, network);
|
|
288
|
-
const inputSignaturesCount = getPsbtInputSignaturesCount(psbt, params);
|
|
289
|
-
// Set fee from subtracting inputs from outputs
|
|
290
|
-
const outputAmount = psbt.txOutputs.reduce((cumulative, curr) => cumulative + BigInt(curr.value), BigInt(0));
|
|
291
|
-
const inputAmount = psbt.txInputs.reduce((cumulative, txInput, i) => {
|
|
292
|
-
const data = psbt.data.inputs[i];
|
|
293
|
-
if (data.witnessUtxo) {
|
|
294
|
-
return cumulative + BigInt(data.witnessUtxo.value);
|
|
295
|
-
}
|
|
296
|
-
else if (data.nonWitnessUtxo) {
|
|
297
|
-
const tx = utxo_lib_1.bitgo.createTransactionFromBuffer(data.nonWitnessUtxo, network, { amountType: 'bigint' });
|
|
298
|
-
return cumulative + BigInt(tx.outs[txInput.index].value);
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
throw new Error('could not find value on input');
|
|
302
|
-
}
|
|
303
|
-
}, BigInt(0));
|
|
304
|
-
return {
|
|
305
|
-
...common,
|
|
306
|
-
fee: (inputAmount - outputAmount).toString(),
|
|
307
|
-
inputSignatures: inputSignaturesCount,
|
|
308
|
-
signatures: inputSignaturesCount.reduce((prev, curr) => (curr > prev ? curr : prev), 0),
|
|
309
|
-
messages,
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
function explainLegacyTx(tx, params, network) {
|
|
313
|
-
const common = explainCommon(tx, params, network);
|
|
314
|
-
const inputSignaturesCount = getTxInputSignaturesCount(tx, params, network);
|
|
315
|
-
return {
|
|
316
|
-
...common,
|
|
317
|
-
inputSignatures: inputSignaturesCount,
|
|
318
|
-
signatures: inputSignaturesCount.reduce((prev, curr) => (curr > prev ? curr : prev), 0),
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L2V4cGxhaW5UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlTQSxrQ0FtREM7QUFFRCwwQ0FnQkM7QUE5V0QsOERBQWdEO0FBQ2hELHFEQUErQztBQUMvQyxxREFBOEQ7QUFDOUQsbURBQTZDO0FBRTdDLGdFQUFrRDtBQUdsRCw0Q0FBdUQ7QUFDdkQsOEVBQTJFO0FBUTNFLFNBQVMsYUFBYSxDQUNwQixFQUFrQyxFQUNsQyxNQUdDLEVBQ0QsT0FBd0I7SUFFeEIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEYsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLGFBQWEsR0FBOEIsRUFBRSxDQUFDO0lBQ3BELE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUU3QixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQzlCLE1BQU0sZUFBZSxHQUFHLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFdEUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUNoQyx3SEFBd0g7UUFDeEgseUVBQXlFO1FBQ3pFLE1BQU0sY0FBYyxHQUFHLElBQUEsbUNBQXVCLEVBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxELElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzdDLGlCQUFpQjtZQUNqQixZQUFZLElBQUksYUFBYSxDQUFDO1lBQzlCLE1BQU0sTUFBTSxHQUFHLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssY0FBYyxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLE1BQU0sRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFFRCxXQUFXLElBQUksYUFBYSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDWCxPQUFPLEVBQUUsY0FBYztZQUN2QixNQUFNLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxpR0FBaUc7WUFDakcsMEZBQTBGO1lBQzFGLGdHQUFnRztZQUNoRyw4RkFBOEY7WUFDOUYsNEJBQTRCO1lBQzVCLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sYUFBYSxHQUFHO1FBQ3BCLFlBQVksRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFO1FBQ3BDLFlBQVksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO1FBQ3JDLE9BQU87UUFDUCxhQUFhO0tBQ2QsQ0FBQztJQUVGLElBQUksR0FBdUIsQ0FBQztJQUM1QixJQUFJLFFBQTRCLENBQUM7SUFFakMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JELFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUIsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDM0UsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBa0Q7SUFDM0UsSUFBSSxNQUFNLENBQUMsSUFBSSxZQUFZLGdCQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsaUJBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBSyxDQUFDLGNBQWMsQ0FBQyxJQUE4QixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMxRyxDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsSUFBb0IsRUFDcEIsTUFFQztJQUVELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE9BQU8sY0FBYztRQUNuQixDQUFDLENBQUMsZ0JBQUssQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEcsQ0FBQyxDQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQ2hDLEVBQWtDLEVBQ2xDLE1BR0MsRUFDRCxPQUF3QjtJQUV4QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGdCQUFLLENBQUMsUUFBUSxDQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sRUFBRSxRQUFRLEdBQUcsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFOUMseUNBQXlDO0lBQ3pDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFVLEVBQUU7UUFDdkMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQiw4Q0FBOEM7WUFDOUMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxnQkFBSyxDQUFDLDBCQUEwQixDQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlHLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsaUVBQWlFO1lBQ2pFLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsb0NBQW9DLENBQUMsTUFBd0I7SUFDcEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksU0FBUyxDQUFDO0lBQ3JGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNyQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLDJHQUEyRyxDQUM1RyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFvQjtJQUN6QyxJQUFJLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDN0QsTUFBTSxxQkFBcUIsR0FBRyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDakYsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsR0FBRyxxQkFBcUI7YUFDekIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDekQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixJQUFvQixFQUNwQixPQUF3QjtJQUV4QixJQUFJLFdBQVcsR0FBdUIsU0FBUyxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUF1QixTQUFTLENBQUM7SUFDNUMsa0RBQWtEO0lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxNQUFNLGtCQUFrQixHQUFHLElBQUEsdURBQTBCLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0Qsd0RBQXdEO0lBQ3hELFdBQVcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDckQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixPQUFPLHNCQUFzQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDZCQUE2QixDQUFDLElBQW9CLEVBQUUsT0FBd0I7SUFDbkYsTUFBTSxjQUFjLEdBQTJDLEVBQUUsQ0FBQztJQUNsRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakQsTUFBTSxPQUFPLEdBQUcsa0JBQU0sQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBRTlDLGtIQUFrSDtZQUNsSCxNQUFNLE9BQU8sR0FBRyxrQkFBTSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsbUZBQW1GLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUcsQ0FBQztZQUVELHVGQUF1RjtZQUN2RixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRixDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsZUFBZSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssZUFBZSxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUVELGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDakMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQzthQUNqRSxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5Qix1RUFBdUU7UUFDdkUsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsOENBQThDO1FBQzlDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxJQUFJLENBQUMsT0FBTyxlQUFlLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsSUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSTtZQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQzlCLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDN0csQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixJQUFvQixFQUNwQixNQUVDLEVBQ0QsT0FBd0IsRUFDeEIsRUFBRSxNQUFNLEdBQUcsS0FBSyxLQUEyQixFQUFFO0lBRTdDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUM7WUFDSCxRQUFRLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUNwQyxJQUFJLEVBQ0oscUJBQXFCLENBQUMsV0FBVyxFQUNqQyxpQkFBSyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDL0YsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLENBQUMsQ0FBQztZQUNWLENBQUM7WUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sb0JBQW9CLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXZFLCtDQUErQztJQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixPQUFPLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0IsTUFBTSxFQUFFLEdBQUcsZ0JBQUssQ0FBQywyQkFBMkIsQ0FBUyxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLE9BQU8sVUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWQsT0FBTztRQUNMLEdBQUcsTUFBTTtRQUNULEdBQUcsRUFBRSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDNUMsZUFBZSxFQUFFLG9CQUFvQjtRQUNyQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RixRQUFRO0tBQ1QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQzdCLEVBQWtDLEVBQ2xDLE1BSUMsRUFDRCxPQUF3QjtJQUV4QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRCxNQUFNLG9CQUFvQixHQUFHLHlCQUF5QixDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUUsT0FBTztRQUNMLEdBQUcsTUFBTTtRQUNULGVBQWUsRUFBRSxvQkFBb0I7UUFDckMsVUFBVSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDeEYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSwgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBUcmlwbGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB1dHhvY29yZSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUnO1xuXG5pbXBvcnQgeyBPdXRwdXQsIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIEJpcDMyMk1lc3NhZ2UsIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyB0b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdCB9IGZyb20gJy4uL3JlY2lwaWVudCc7XG5pbXBvcnQgeyBnZXRQYXlHb1ZlcmlmaWNhdGlvblB1YmtleSB9IGZyb20gJy4uL2dldFBheUdvVmVyaWZpY2F0aW9uUHVia2V5JztcblxuZXhwb3J0IHR5cGUgQ2hhbmdlQWRkcmVzc0luZm8gPSB7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIGV4cGxhaW5Db21tb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIHR4OiBiaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIHBhcmFtczoge1xuICAgIGNoYW5nZUluZm8/OiBDaGFuZ2VBZGRyZXNzSW5mb1tdO1xuICAgIGZlZUluZm8/OiBzdHJpbmc7XG4gIH0sXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKSB7XG4gIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnXTtcbiAgbGV0IHNwZW5kQW1vdW50ID0gQmlnSW50KDApO1xuICBsZXQgY2hhbmdlQW1vdW50ID0gQmlnSW50KDApO1xuICBjb25zdCBjaGFuZ2VPdXRwdXRzOiBGaXhlZFNjcmlwdFdhbGxldE91dHB1dFtdID0gW107XG4gIGNvbnN0IG91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgY29uc3QgeyBjaGFuZ2VJbmZvIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNoYW5nZUFkZHJlc3NlcyA9IGNoYW5nZUluZm8/Lm1hcCgoaW5mbykgPT4gaW5mby5hZGRyZXNzKSA/PyBbXTtcblxuICB0eC5vdXRzLmZvckVhY2goKGN1cnJlbnRPdXRwdXQpID0+IHtcbiAgICAvLyBUcnkgdG8gZW5jb2RlIHRoZSBzY3JpcHQgcHVia2V5IHdpdGggYW4gYWRkcmVzcy4gSWYgaXQgZmFpbHMsIHRyeSB0byBwYXJzZSBpdCBhcyBhbiBPUF9SRVRVUk4gb3V0cHV0IHdpdGggdGhlIHByZWZpeC5cbiAgICAvLyBJZiB0aGF0IGZhaWxzLCB0aGVuIGl0IGlzIGFuIHVucmVjb2duaXplZCBzY3JpcHRQdWJrZXkgYW5kIHNob3VsZCBmYWlsXG4gICAgY29uc3QgY3VycmVudEFkZHJlc3MgPSB0b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdChjdXJyZW50T3V0cHV0LnNjcmlwdCwgbmV0d29yayk7XG4gICAgY29uc3QgY3VycmVudEFtb3VudCA9IEJpZ0ludChjdXJyZW50T3V0cHV0LnZhbHVlKTtcblxuICAgIGlmIChjaGFuZ2VBZGRyZXNzZXMuaW5jbHVkZXMoY3VycmVudEFkZHJlc3MpKSB7XG4gICAgICAvLyB0aGlzIGlzIGNoYW5nZVxuICAgICAgY2hhbmdlQW1vdW50ICs9IGN1cnJlbnRBbW91bnQ7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBjaGFuZ2VJbmZvPy5maW5kKChjaGFuZ2UpID0+IGNoYW5nZS5hZGRyZXNzID09PSBjdXJyZW50QWRkcmVzcyk7XG5cbiAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhbmdlSW5mbyBtdXN0IGhhdmUgY2hhbmdlIGluZm9ybWF0aW9uIGZvciBhbGwgY2hhbmdlIG91dHB1dHMnKTtcbiAgICAgIH1cbiAgICAgIGNoYW5nZU91dHB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGN1cnJlbnRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhaW46IGNoYW5nZS5jaGFpbixcbiAgICAgICAgaW5kZXg6IGNoYW5nZS5pbmRleCxcbiAgICAgICAgZXh0ZXJuYWw6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3BlbmRBbW91bnQgKz0gY3VycmVudEFtb3VudDtcbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICBhbW91bnQ6IGN1cnJlbnRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIC8vIElmIGNoYW5nZUluZm8gaGFzIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtZWFucyB0aGF0IHRoZSBjaGFuZ2UgaW5mb3JtYXRpb25cbiAgICAgIC8vIHdhcyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYnV0IHRoZSBvdXRwdXQgd2FzIG5vdCBpZGVudGlmaWVkIGFzIGNoYW5nZS4gSW4gdGhpcyBjYXNlLFxuICAgICAgLy8gdGhlIG91dHB1dCBpcyBleHRlcm5hbCwgYW5kIHdlIGNhbiBzZXQgaXQgYXMgc28uIElmIGNoYW5nZUluZm8gaXMgdW5kZWZpbmVkLCBpdCBtZWFucyB3ZSB3ZXJlXG4gICAgICAvLyBnaXZlbiBubyBpbmZvcm1hdGlvbiBhYm91dCBjaGFuZ2Ugb3V0cHV0cywgc28gd2UgY2FuJ3QgZGV0ZXJtaW5lIGFueXRoaW5nIGFib3V0IHRoZSBvdXRwdXQsXG4gICAgICAvLyBzbyB3ZSBsZWF2ZSBpdCB1bmRlZmluZWQuXG4gICAgICBleHRlcm5hbDogY2hhbmdlSW5mbyA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dERldGFpbHMgPSB7XG4gICAgb3V0cHV0QW1vdW50OiBzcGVuZEFtb3VudC50b1N0cmluZygpLFxuICAgIGNoYW5nZUFtb3VudDogY2hhbmdlQW1vdW50LnRvU3RyaW5nKCksXG4gICAgb3V0cHV0cyxcbiAgICBjaGFuZ2VPdXRwdXRzLFxuICB9O1xuXG4gIGxldCBmZWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGxvY2t0aW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhcmFtcy5mZWVJbmZvKSB7XG4gICAgZGlzcGxheU9yZGVyLnB1c2goJ2ZlZScpO1xuICAgIGZlZSA9IHBhcmFtcy5mZWVJbmZvO1xuICB9XG5cbiAgaWYgKE51bWJlci5pc0ludGVnZXIodHgubG9ja3RpbWUpICYmIHR4LmxvY2t0aW1lID4gMCkge1xuICAgIGRpc3BsYXlPcmRlci5wdXNoKCdsb2NrdGltZScpO1xuICAgIGxvY2t0aW1lID0gdHgubG9ja3RpbWU7XG4gIH1cblxuICByZXR1cm4geyBkaXNwbGF5T3JkZXIsIGlkOiB0eC5nZXRJZCgpLCAuLi5vdXRwdXREZXRhaWxzLCBmZWUsIGxvY2t0aW1lIH07XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RXYWxsZXRLZXlzKHBhcmFtczogeyBwdWJzPzogYml0Z28uUm9vdFdhbGxldEtleXMgfCBzdHJpbmdbXSB9KTogYml0Z28uUm9vdFdhbGxldEtleXMgfCB1bmRlZmluZWQge1xuICBpZiAocGFyYW1zLnB1YnMgaW5zdGFuY2VvZiBiaXRnby5Sb290V2FsbGV0S2V5cykge1xuICAgIHJldHVybiBwYXJhbXMucHVicztcbiAgfVxuICBjb25zdCBrZXlzID0gcGFyYW1zLnB1YnM/Lm1hcCgoeHB1YikgPT4gYmlwMzIuZnJvbUJhc2U1OCh4cHViKSk7XG4gIHJldHVybiBrZXlzICYmIGtleXMubGVuZ3RoID09PSAzID8gbmV3IGJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleXMgYXMgVHJpcGxlPEJJUDMySW50ZXJmYWNlPikgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFBzYnRJbnB1dFNpZ25hdHVyZXNDb3VudChcbiAgcHNidDogYml0Z28uVXR4b1BzYnQsXG4gIHBhcmFtczoge1xuICAgIHB1YnM/OiBiaXRnby5Sb290V2FsbGV0S2V5cyB8IHN0cmluZ1tdO1xuICB9XG4pIHtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBnZXRSb290V2FsbGV0S2V5cyhwYXJhbXMpO1xuICByZXR1cm4gcm9vdFdhbGxldEtleXNcbiAgICA/IGJpdGdvLmdldFNpZ25hdHVyZVZhbGlkYXRpb25BcnJheVBzYnQocHNidCwgcm9vdFdhbGxldEtleXMpLm1hcCgoc3YpID0+IHN2WzFdLmZpbHRlcigodikgPT4gdikubGVuZ3RoKVxuICAgIDogKEFycmF5KHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoKSBhcyBudW1iZXJbXSkuZmlsbCgwKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHhJbnB1dFNpZ25hdHVyZXNDb3VudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHg6IGJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgcGFyYW1zOiB7XG4gICAgdHhJbmZvPzogeyB1bnNwZW50cz86IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj5bXSB9O1xuICAgIHB1YnM/OiBiaXRnby5Sb290V2FsbGV0S2V5cyB8IHN0cmluZ1tdO1xuICB9LFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbikge1xuICBjb25zdCBwcmV2T3V0cHV0cyA9IHBhcmFtcy50eEluZm8/LnVuc3BlbnRzPy5tYXAoKHUpID0+IGJpdGdvLnRvT3V0cHV0PFROdW1iZXI+KHUsIG5ldHdvcmspKTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBnZXRSb290V2FsbGV0S2V5cyhwYXJhbXMpO1xuICBjb25zdCB7IHVuc3BlbnRzID0gW10gfSA9IHBhcmFtcy50eEluZm8gPz8ge307XG5cbiAgLy8gZ2V0IHRoZSBudW1iZXIgb2Ygc2lnbmF0dXJlcyBwZXIgaW5wdXRcbiAgcmV0dXJuIHR4Lmlucy5tYXAoKGlucHV0LCBpZHgpOiBudW1iZXIgPT4ge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggIT09IHR4Lmlucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoIXByZXZPdXRwdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc3RhdGVgKTtcbiAgICB9XG4gICAgaWYgKCFyb290V2FsbGV0S2V5cykge1xuICAgICAgLy8gbm8gcHViIGtleXMgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBwdWIga2V5c1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYml0Z28udmVyaWZ5U2lnbmF0dXJlV2l0aFVuc3BlbnQ8VE51bWJlcj4odHgsIGlkeCwgdW5zcGVudHMsIHJvb3RXYWxsZXRLZXlzKS5maWx0ZXIoKHYpID0+IHYpLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjYW4ndCB2YWxpZGF0ZSB0aGUgc2lnbmF0dXJlc1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhaW5BbmRJbmRleEZyb21CaXAzMkRlcml2YXRpb25zKG91dHB1dDogYml0Z28uUHNidE91dHB1dCkge1xuICBjb25zdCBkZXJpdmF0aW9ucyA9IG91dHB1dC5iaXAzMkRlcml2YXRpb24gPz8gb3V0cHV0LnRhcEJpcDMyRGVyaXZhdGlvbiA/PyB1bmRlZmluZWQ7XG4gIGlmICghZGVyaXZhdGlvbnMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHBhdGhzID0gZGVyaXZhdGlvbnMubWFwKChkKSA9PiBkLnBhdGgpO1xuICBpZiAoIXBhdGhzIHx8IHBhdGhzLmxlbmd0aCAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgMyBwYXRocyBpbiBiaXAzMkRlcml2YXRpb24gb3IgdGFwQmlwMzJEZXJpdmF0aW9uJyk7XG4gIH1cbiAgaWYgKCFwYXRocy5ldmVyeSgocCkgPT4gcGF0aHNbMF0gPT09IHApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhbGwgcGF0aHMgdG8gYmUgdGhlIHNhbWUnKTtcbiAgfVxuXG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBpZiAocGF0aHNbMF0gIT09IHBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1VuYWJsZSB0byBnZXQgYSBzaW5nbGUgY2hhaW4gYW5kIGluZGV4IG9uIHRoZSBvdXRwdXQgYmVjYXVzZSB0aGVyZSBhcmUgZGlmZmVyZW50IHBhdGhzIGZvciBkaWZmZXJlbnQga2V5cydcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHV0eG9saWIuYml0Z28uZ2V0Q2hhaW5BbmRJbmRleEZyb21QYXRoKHBhdGhzWzBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhbmdlSW5mbyhwc2J0OiBiaXRnby5VdHhvUHNidCk6IENoYW5nZUFkZHJlc3NJbmZvW10gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmZpbmRJbnRlcm5hbE91dHB1dEluZGljZXMocHNidCkubWFwKChpKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmF0aW9uSW5mb3JtYXRpb24gPSBnZXRDaGFpbkFuZEluZGV4RnJvbUJpcDMyRGVyaXZhdGlvbnMocHNidC5kYXRhLm91dHB1dHNbaV0pO1xuICAgICAgaWYgKCFkZXJpdmF0aW9uSW5mb3JtYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCBkZXJpdmF0aW9uIGluZm9ybWF0aW9uIG9uIGJpcDMyRGVyaXZhdGlvbiBvciB0YXBCaXAzMkRlcml2YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHBzYnQudHhPdXRwdXRzW2ldLnNjcmlwdCwgcHNidC5uZXR3b3JrKSxcbiAgICAgICAgZXh0ZXJuYWw6IGZhbHNlLFxuICAgICAgICAuLi5kZXJpdmF0aW9uSW5mb3JtYXRpb24sXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLkVycm9yTm9NdWx0aVNpZ0lucHV0Rm91bmQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IFBheUdvIGFkZHJlc3MgcHJvb2YgaW5mb3JtYXRpb24gZnJvbSB0aGUgUFNCVCBpZiBwcmVzZW50XG4gKiBAcmV0dXJucyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgUGF5R28gcHJvb2YsIGluY2x1ZGluZyB0aGUgb3V0cHV0IGluZGV4IGFuZCBhZGRyZXNzXG4gKi9cbmZ1bmN0aW9uIGdldFBheUdvVmVyaWZpY2F0aW9uSW5mbyhcbiAgcHNidDogYml0Z28uVXR4b1BzYnQsXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKTogeyBvdXRwdXRJbmRleDogbnVtYmVyOyB2ZXJpZmljYXRpb25QdWJrZXk6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG91dHB1dEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGxldCBhZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIC8vIENoZWNrIGlmIHRoaXMgUFNCVCBoYXMgYW55IFBheUdvIGFkZHJlc3MgcHJvb2ZzXG4gIGlmICghdXR4b2NvcmUucGF5Z28ucHNidE91dHB1dEluY2x1ZGVzUGF5Z29BZGRyZXNzUHJvb2YocHNidCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gVGhpcyBwdWxscyB0aGUgcHVia2V5IGRlcGVuZGluZyBvbiBnaXZlbiBuZXR3b3JrXG4gIGNvbnN0IHZlcmlmaWNhdGlvblB1YmtleSA9IGdldFBheUdvVmVyaWZpY2F0aW9uUHVia2V5KG5ldHdvcmspO1xuICAvLyBmaW5kIHdoaWNoIG91dHB1dCBpbmRleCB0aGF0IGNvbnRhaW5zIHRoZSBQYXlHbyBwcm9vZlxuICBvdXRwdXRJbmRleCA9IHV0eG9jb3JlLnBheWdvLmdldFBheUdvQWRkcmVzc1Byb29mT3V0cHV0SW5kZXgocHNidCk7XG4gIGlmIChvdXRwdXRJbmRleCA9PT0gdW5kZWZpbmVkIHx8ICF2ZXJpZmljYXRpb25QdWJrZXkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IHBzYnQudHhPdXRwdXRzW291dHB1dEluZGV4XTtcbiAgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dC5zY3JpcHQsIG5ldHdvcmspO1xuICBpZiAoIWFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZGVyaXZlIGFkZHJlc3MgJHthZGRyZXNzfSBQYXkgR28gQXR0ZXN0YXRpb24uYCk7XG4gIH1cblxuICByZXR1cm4geyBvdXRwdXRJbmRleCwgdmVyaWZpY2F0aW9uUHVia2V5IH07XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgQklQMzIyIG1lc3NhZ2VzIGFuZCBhZGRyZXNzZXMgZnJvbSB0aGUgUFNCVCBpbnB1dHMgYW5kIHBlcmZvcm1cbiAqIHZlcmlmaWNhdGlvbiBvbiB0aGUgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIHRoYXQgaXQgbWVldHMgdGhlIEJJUDMyMiByZXF1aXJlbWVudHMuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgYW5kIGFkZHJlc3MgZm9yIGVhY2ggaW5wdXQsXG4gKiAgICAgICAgICBvciB1bmRlZmluZWQgaWYgbm8gQklQMzIyIG1lc3NhZ2VzIGFyZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gZ2V0QmlwMzIyTWVzc2FnZUluZm9BbmRWZXJpZnkocHNidDogYml0Z28uVXR4b1BzYnQsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayk6IEJpcDMyMk1lc3NhZ2VbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJpcDMyMk1lc3NhZ2VzOiB7IG1lc3NhZ2U6IHN0cmluZzsgYWRkcmVzczogc3RyaW5nIH1bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYmlwMzIyLmdldEJpcDMyMlByb29mTWVzc2FnZUF0SW5kZXgocHNidCwgaSk7XG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gcHNidC5kYXRhLmlucHV0c1tpXTtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHdpdG5lc3NVdHhvIGZvciBpbnB1dCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgICBpZiAoIWlucHV0Lm5vbldpdG5lc3NVdHhvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBub25XaXRuZXNzVXR4byBmb3IgaW5wdXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0UHViS2V5ID0gaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0O1xuXG4gICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdG9TcGVuZCB0cmFuc2FjdGlvbiBjYW4gYmUgcmVjcmVhdGVkIGluIHRoZSBQU0JUIGFuZCBpcyBlbmNvZGVkIGNvcnJlY3RseSBpbiB0aGUgbm9uV2l0bmVzc1V0eG9cbiAgICAgIGNvbnN0IHRvU3BlbmQgPSBiaXAzMjIuYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24oc2NyaXB0UHViS2V5LCBtZXNzYWdlKTtcbiAgICAgIGNvbnN0IHRvU3BlbmRCNjQgPSB0b1NwZW5kLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgaWYgKGlucHV0Lm5vbldpdG5lc3NVdHhvLnRvU3RyaW5nKCdiYXNlNjQnKSAhPT0gdG9TcGVuZEI2NCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vbi13aXRuZXNzIFVUWE8gZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHRvU3BlbmQgdHJhbnNhY3Rpb24gYXQgaW5wdXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdG9TcGVuZCB0cmFuc2FjdGlvbiBJRCBtYXRjaGVzIHRoZSBpbnB1dCdzIHJlZmVyZW5jZWQgdHJhbnNhY3Rpb24gSURcbiAgICAgIGlmICh0b1NwZW5kLmdldElkKCkgIT09IHV0eG9saWIuYml0Z28uZ2V0T3V0cHV0SWRGb3JJbnB1dChwc2J0LnR4SW5wdXRzW2ldKS50eGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9TcGVuZCB0cmFuc2FjdGlvbiBJRCBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgYXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgdGhlIGlucHV0IHNwZWNpZmljc1xuICAgICAgaWYgKHBzYnQudHhJbnB1dHNbaV0uc2VxdWVuY2UgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHNlcXVlbmNlIG51bWJlciBhdCBpbnB1dCBpbmRleCAke2l9OiAke3BzYnQudHhJbnB1dHNbaV0uc2VxdWVuY2V9LiBFeHBlY3RlZCAwLmApO1xuICAgICAgfVxuICAgICAgaWYgKHBzYnQudHhJbnB1dHNbaV0uaW5kZXggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0IGluZGV4IGF0IHBvc2l0aW9uICR7aX06ICR7cHNidC50eElucHV0c1tpXS5pbmRleH0uIEV4cGVjdGVkIDAuYCk7XG4gICAgICB9XG5cbiAgICAgIGJpcDMyMk1lc3NhZ2VzLnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLnRvU3RyaW5nKCd1dGY4JyksXG4gICAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdFB1YktleSwgbmV0d29yayksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoYmlwMzIyTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgIC8vIElmIHRoZXJlIGlzIGEgQklQMzIyIG1lc3NhZ2UgaW4gYW55IGlucHV0LCBhbGwgaW5wdXRzIG11c3QgaGF2ZSBvbmUuXG4gICAgaWYgKGJpcDMyMk1lc3NhZ2VzLmxlbmd0aCAhPT0gcHNidC5kYXRhLmlucHV0cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb25zaXN0ZW50IEJJUDMyMiBtZXNzYWdlcyBhY3Jvc3MgaW5wdXRzLicpO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gc3BlY2lmaWNzIGZvciBCSVAzMjJcbiAgICBpZiAocHNidC52ZXJzaW9uICE9PSAwICYmIHBzYnQudmVyc2lvbiAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBQU0JUIHZlcnNpb24gZm9yIEJJUDMyMjogJHtwc2J0LnZlcnNpb259LiBFeHBlY3RlZCAwIGApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwc2J0LmRhdGEub3V0cHV0cy5sZW5ndGggIT09IDEgfHxcbiAgICAgIHBzYnQudHhPdXRwdXRzWzBdLnNjcmlwdC50b1N0cmluZygnaGV4JykgIT09ICc2YScgfHxcbiAgICAgIHBzYnQudHhPdXRwdXRzWzBdLnZhbHVlICE9PSAwblxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTQlQgb3V0cHV0cyBmb3IgQklQMzIyLiBFeHBlY3RlZCBleGFjdGx5IG9uZSBPUF9SRVRVUk4gb3V0cHV0IHdpdGggemVybyB2YWx1ZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmlwMzIyTWVzc2FnZXM7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlY29tcG9zZSBhIHJhdyBwc2J0IGludG8gdXNlZnVsIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0b3RhbCBhbW91bnRzLFxuICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwbGFpblBzYnQoXG4gIHBzYnQ6IGJpdGdvLlV0eG9Qc2J0LFxuICBwYXJhbXM6IHtcbiAgICBwdWJzPzogYml0Z28uUm9vdFdhbGxldEtleXMgfCBzdHJpbmdbXTtcbiAgfSxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICB7IHN0cmljdCA9IGZhbHNlIH06IHsgc3RyaWN0PzogYm9vbGVhbiB9ID0ge31cbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICBjb25zdCBwYXlHb1ZlcmlmaWNhdGlvbkluZm8gPSBnZXRQYXlHb1ZlcmlmaWNhdGlvbkluZm8ocHNidCwgbmV0d29yayk7XG4gIGlmIChwYXlHb1ZlcmlmaWNhdGlvbkluZm8pIHtcbiAgICB0cnkge1xuICAgICAgdXR4b2NvcmUucGF5Z28udmVyaWZ5UGF5R29BZGRyZXNzUHJvb2YoXG4gICAgICAgIHBzYnQsXG4gICAgICAgIHBheUdvVmVyaWZpY2F0aW9uSW5mby5vdXRwdXRJbmRleCxcbiAgICAgICAgYmlwMzIuZnJvbUJhc2U1OChwYXlHb1ZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uUHVia2V5LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLnB1YmxpY0tleVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VzID0gZ2V0QmlwMzIyTWVzc2FnZUluZm9BbmRWZXJpZnkocHNidCwgbmV0d29yayk7XG4gIGNvbnN0IGNoYW5nZUluZm8gPSBnZXRDaGFuZ2VJbmZvKHBzYnQpO1xuICBjb25zdCB0eCA9IHBzYnQuZ2V0VW5zaWduZWRUeCgpO1xuICBjb25zdCBjb21tb24gPSBleHBsYWluQ29tbW9uKHR4LCB7IC4uLnBhcmFtcywgY2hhbmdlSW5mbyB9LCBuZXR3b3JrKTtcbiAgY29uc3QgaW5wdXRTaWduYXR1cmVzQ291bnQgPSBnZXRQc2J0SW5wdXRTaWduYXR1cmVzQ291bnQocHNidCwgcGFyYW1zKTtcblxuICAvLyBTZXQgZmVlIGZyb20gc3VidHJhY3RpbmcgaW5wdXRzIGZyb20gb3V0cHV0c1xuICBjb25zdCBvdXRwdXRBbW91bnQgPSBwc2J0LnR4T3V0cHV0cy5yZWR1Y2UoKGN1bXVsYXRpdmUsIGN1cnIpID0+IGN1bXVsYXRpdmUgKyBCaWdJbnQoY3Vyci52YWx1ZSksIEJpZ0ludCgwKSk7XG4gIGNvbnN0IGlucHV0QW1vdW50ID0gcHNidC50eElucHV0cy5yZWR1Y2UoKGN1bXVsYXRpdmUsIHR4SW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBkYXRhID0gcHNidC5kYXRhLmlucHV0c1tpXTtcbiAgICBpZiAoZGF0YS53aXRuZXNzVXR4bykge1xuICAgICAgcmV0dXJuIGN1bXVsYXRpdmUgKyBCaWdJbnQoZGF0YS53aXRuZXNzVXR4by52YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChkYXRhLm5vbldpdG5lc3NVdHhvKSB7XG4gICAgICBjb25zdCB0eCA9IGJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcjxiaWdpbnQ+KGRhdGEubm9uV2l0bmVzc1V0eG8sIG5ldHdvcmssIHsgYW1vdW50VHlwZTogJ2JpZ2ludCcgfSk7XG4gICAgICByZXR1cm4gY3VtdWxhdGl2ZSArIEJpZ0ludCh0eC5vdXRzW3R4SW5wdXQuaW5kZXhdLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCB2YWx1ZSBvbiBpbnB1dCcpO1xuICAgIH1cbiAgfSwgQmlnSW50KDApKTtcblxuICByZXR1cm4ge1xuICAgIC4uLmNvbW1vbixcbiAgICBmZWU6IChpbnB1dEFtb3VudCAtIG91dHB1dEFtb3VudCkudG9TdHJpbmcoKSxcbiAgICBpbnB1dFNpZ25hdHVyZXM6IGlucHV0U2lnbmF0dXJlc0NvdW50LFxuICAgIHNpZ25hdHVyZXM6IGlucHV0U2lnbmF0dXJlc0NvdW50LnJlZHVjZSgocHJldiwgY3VycikgPT4gKGN1cnIgPiBwcmV2ID8gY3VyciA6IHByZXYpLCAwKSxcbiAgICBtZXNzYWdlcyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5MZWdhY3lUeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHg6IGJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgcGFyYW1zOiB7XG4gICAgcHVicz86IHN0cmluZ1tdO1xuICAgIHR4SW5mbz86IHsgdW5zcGVudHM/OiBiaXRnby5VbnNwZW50PFROdW1iZXI+W10gfTtcbiAgICBjaGFuZ2VJbmZvPzogeyBhZGRyZXNzOiBzdHJpbmc7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xuICB9LFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb248c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbW1vbiA9IGV4cGxhaW5Db21tb24odHgsIHBhcmFtcywgbmV0d29yayk7XG4gIGNvbnN0IGlucHV0U2lnbmF0dXJlc0NvdW50ID0gZ2V0VHhJbnB1dFNpZ25hdHVyZXNDb3VudCh0eCwgcGFyYW1zLCBuZXR3b3JrKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb21tb24sXG4gICAgaW5wdXRTaWduYXR1cmVzOiBpbnB1dFNpZ25hdHVyZXNDb3VudCxcbiAgICBzaWduYXR1cmVzOiBpbnB1dFNpZ25hdHVyZXNDb3VudC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IChjdXJyID4gcHJldiA/IGN1cnIgOiBwcmV2KSwgMCksXG4gIH07XG59XG4iXX0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAIhB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AAKzE,MAAM,MAAM,4BAA4B,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG;IAC5E,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAwMrC"}
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.parseTransaction = parseTransaction;
|
|
40
|
-
const assert_1 = __importDefault(require("assert"));
|
|
41
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
42
|
-
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
43
|
-
const keychains_1 = require("../../keychains");
|
|
44
|
-
const outputDifference_1 = require("../outputDifference");
|
|
45
|
-
const recipient_1 = require("../recipient");
|
|
46
|
-
const parseOutput_1 = require("./parseOutput");
|
|
47
|
-
async function parseTransaction(coin, params) {
|
|
48
|
-
const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
|
|
49
|
-
if (!lodash_1.default.isUndefined(verification.disableNetworking) && !lodash_1.default.isBoolean(verification.disableNetworking)) {
|
|
50
|
-
throw new Error('verification.disableNetworking must be a boolean');
|
|
51
|
-
}
|
|
52
|
-
const disableNetworking = verification.disableNetworking;
|
|
53
|
-
// obtain the keychains and key signatures
|
|
54
|
-
let keychains = verification.keychains;
|
|
55
|
-
if (!keychains) {
|
|
56
|
-
if (disableNetworking) {
|
|
57
|
-
throw new Error('cannot fetch keychains without networking');
|
|
58
|
-
}
|
|
59
|
-
keychains = await (0, keychains_1.fetchKeychains)(coin, wallet, reqId);
|
|
60
|
-
}
|
|
61
|
-
if (!keychains_1.UtxoNamedKeychains.is(keychains)) {
|
|
62
|
-
throw new Error('invalid keychains');
|
|
63
|
-
}
|
|
64
|
-
const keychainArray = (0, keychains_1.toKeychainTriple)(keychains);
|
|
65
|
-
if (lodash_1.default.isUndefined(txPrebuild.txHex)) {
|
|
66
|
-
throw new Error('missing required txPrebuild property txHex');
|
|
67
|
-
}
|
|
68
|
-
// obtain all outputs
|
|
69
|
-
const explanation = await coin.explainTransaction({
|
|
70
|
-
txHex: txPrebuild.txHex,
|
|
71
|
-
txInfo: txPrebuild.txInfo,
|
|
72
|
-
pubs: keychainArray.map((k) => k.pub),
|
|
73
|
-
});
|
|
74
|
-
const allOutputs = [...explanation.outputs, ...explanation.changeOutputs];
|
|
75
|
-
let expectedOutputs;
|
|
76
|
-
if (txParams.rbfTxIds) {
|
|
77
|
-
(0, assert_1.default)(txParams.rbfTxIds.length === 1);
|
|
78
|
-
const txToBeReplaced = await wallet.getTransaction({ txHash: txParams.rbfTxIds[0], includeRbf: true });
|
|
79
|
-
expectedOutputs = txToBeReplaced.outputs.flatMap((output) => {
|
|
80
|
-
// For self-sends, the walletId will be the same as the wallet's id
|
|
81
|
-
if (output.wallet === wallet.id()) {
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
return [coin.toCanonicalTransactionRecipient(output)];
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// verify that each recipient from txParams has their own output
|
|
89
|
-
expectedOutputs = (txParams.recipients ?? []).flatMap((output) => {
|
|
90
|
-
if (output.address === undefined) {
|
|
91
|
-
if (output.amount.toString() !== '0') {
|
|
92
|
-
throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: ${output}`);
|
|
93
|
-
}
|
|
94
|
-
return [output];
|
|
95
|
-
}
|
|
96
|
-
return [{ ...output, address: coin.canonicalAddress(output.address) }];
|
|
97
|
-
});
|
|
98
|
-
if (txParams.allowExternalChangeAddress && txParams.changeAddress) {
|
|
99
|
-
// when an external change address is explicitly specified, count all outputs going towards that
|
|
100
|
-
// address in the expected outputs (regardless of the output amount)
|
|
101
|
-
expectedOutputs.push(...allOutputs.flatMap((output) => {
|
|
102
|
-
if (output.address === undefined ||
|
|
103
|
-
output.address !== coin.canonicalAddress(txParams.changeAddress)) {
|
|
104
|
-
return [];
|
|
105
|
-
}
|
|
106
|
-
return [{ ...output, address: coin.canonicalAddress(output.address) }];
|
|
107
|
-
}));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// get the keychains from the custom change wallet if needed
|
|
111
|
-
let customChange;
|
|
112
|
-
const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
|
|
113
|
-
if (customChangeWalletId) {
|
|
114
|
-
// fetch keychains from custom change wallet for deriving addresses.
|
|
115
|
-
// These keychains should be signed and this should be verified in verifyTransaction
|
|
116
|
-
const customChangeKeySignatures = wallet._wallet.customChangeKeySignatures;
|
|
117
|
-
const customChangeWallet = await coin.wallets().get({ id: customChangeWalletId });
|
|
118
|
-
const customChangeKeys = await (0, keychains_1.fetchKeychains)(coin, customChangeWallet, reqId);
|
|
119
|
-
if (!customChangeKeys) {
|
|
120
|
-
throw new Error('failed to fetch keychains for custom change wallet');
|
|
121
|
-
}
|
|
122
|
-
if (customChangeKeys.user && customChangeKeys.backup && customChangeKeys.bitgo && customChangeWallet) {
|
|
123
|
-
const customChangeKeychains = [
|
|
124
|
-
customChangeKeys.user,
|
|
125
|
-
customChangeKeys.backup,
|
|
126
|
-
customChangeKeys.bitgo,
|
|
127
|
-
];
|
|
128
|
-
customChange = {
|
|
129
|
-
keys: customChangeKeychains,
|
|
130
|
-
signatures: [customChangeKeySignatures.user, customChangeKeySignatures.backup, customChangeKeySignatures.bitgo],
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Loop through all the outputs and classify each of them as either internal spends
|
|
136
|
-
* or external spends by setting the "external" property to true or false on the output object.
|
|
137
|
-
*/
|
|
138
|
-
const allOutputDetails = await Promise.all(allOutputs.map((currentOutput) => {
|
|
139
|
-
return (0, parseOutput_1.parseOutput)({
|
|
140
|
-
currentOutput,
|
|
141
|
-
coin,
|
|
142
|
-
txPrebuild,
|
|
143
|
-
verification,
|
|
144
|
-
keychainArray: (0, keychains_1.toKeychainTriple)(keychains),
|
|
145
|
-
wallet,
|
|
146
|
-
txParams: {
|
|
147
|
-
recipients: expectedOutputs,
|
|
148
|
-
changeAddress: txParams.changeAddress,
|
|
149
|
-
},
|
|
150
|
-
customChange,
|
|
151
|
-
reqId,
|
|
152
|
-
});
|
|
153
|
-
}));
|
|
154
|
-
const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output?.needsCustomChangeKeySignatureVerification);
|
|
155
|
-
const changeOutputs = lodash_1.default.filter(allOutputDetails, { external: false });
|
|
156
|
-
function toComparableOutputsWithExternal(outputs) {
|
|
157
|
-
return outputs.map((output) => ({
|
|
158
|
-
script: (0, recipient_1.fromExtendedAddressFormatToScript)(output.address, coin.network),
|
|
159
|
-
value: output.amount === 'max' ? 'max' : BigInt(output.amount),
|
|
160
|
-
external: output.external,
|
|
161
|
-
}));
|
|
162
|
-
}
|
|
163
|
-
const missingOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(expectedOutputs), toComparableOutputsWithExternal(allOutputs));
|
|
164
|
-
const implicitOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(allOutputDetails), toComparableOutputsWithExternal(expectedOutputs));
|
|
165
|
-
const explicitOutputs = (0, outputDifference_1.outputDifference)(toComparableOutputsWithExternal(allOutputDetails), implicitOutputs);
|
|
166
|
-
// these are all the non-wallet outputs that had been originally explicitly specified in recipients
|
|
167
|
-
const explicitExternalOutputs = explicitOutputs.filter((output) => output.external);
|
|
168
|
-
// this is the sum of all the originally explicitly specified non-wallet output values
|
|
169
|
-
const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
|
|
170
|
-
/**
|
|
171
|
-
* The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
|
|
172
|
-
* automatically applies to transactions sending money out of the wallet. The logic is fairly straightforward
|
|
173
|
-
* in that we compare the external spend amount that was specified explicitly by the user to the portion
|
|
174
|
-
* that was specified implicitly. To protect customers from people tampering with the transaction outputs, we
|
|
175
|
-
* define a threshold for the maximum percentage of the implicit external spend in relation to the explicit
|
|
176
|
-
* external spend.
|
|
177
|
-
*/
|
|
178
|
-
// make sure that all the extra addresses are change addresses
|
|
179
|
-
// get all the additional external outputs the server added and calculate their values
|
|
180
|
-
const implicitExternalOutputs = implicitOutputs.filter((output) => output.external);
|
|
181
|
-
const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
|
|
182
|
-
function toOutputs(outputs) {
|
|
183
|
-
return outputs.map((output) => ({
|
|
184
|
-
address: (0, recipient_1.toExtendedAddressFormat)(output.script, coin.network),
|
|
185
|
-
amount: output.value.toString(),
|
|
186
|
-
external: output.external,
|
|
187
|
-
}));
|
|
188
|
-
}
|
|
189
|
-
return {
|
|
190
|
-
keychains,
|
|
191
|
-
keySignatures: (0, keychains_1.getKeySignatures)(wallet) ?? {},
|
|
192
|
-
outputs: allOutputDetails,
|
|
193
|
-
missingOutputs: toOutputs(missingOutputs),
|
|
194
|
-
explicitExternalOutputs: toOutputs(explicitExternalOutputs),
|
|
195
|
-
implicitExternalOutputs: toOutputs(implicitExternalOutputs),
|
|
196
|
-
changeOutputs,
|
|
197
|
-
explicitExternalSpendAmount,
|
|
198
|
-
implicitExternalSpendAmount,
|
|
199
|
-
needsCustomChangeKeySignatureVerification,
|
|
200
|
-
customChange,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLDRDQTJNQztBQW5PRCxvREFBNEI7QUFFNUIsb0RBQXVCO0FBRXZCLDhEQUFnRDtBQVVoRCwrQ0FBdUg7QUFDdkgsMERBQXlFO0FBQ3pFLDRDQUEwRjtBQUUxRiwrQ0FBaUU7QUFNMUQsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxJQUFzQixFQUN0QixNQUF3QztJQUV4QyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFMUUsSUFBSSxDQUFDLGdCQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNuRyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBRXpELDBDQUEwQztJQUMxQyxJQUFJLFNBQVMsR0FBc0UsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUMxRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxTQUFTLEdBQUcsTUFBTSxJQUFBLDBCQUFjLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RCxD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QUssQ0FBQyxTQUFTLENBQ3pELHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBVyxFQUM5RixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO0lBRUYsU0FBUyxTQUFTLENBQUMsT0FBdUQ7UUFDeEUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sRUFBRSxJQUFBLG1DQUF1QixFQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM3RCxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU87UUFDTCxTQUFTO1FBQ1QsYUFBYSxFQUFFLElBQUEsNEJBQWdCLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtRQUM3QyxPQUFPLEVBQUUsZ0JBQWdCO1FBQ3pCLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQ3pDLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQztRQUMzRCx1QkFBdUIsRUFBRSxTQUFTLENBQUMsdUJBQXVCLENBQUM7UUFDM0QsYUFBYTtRQUNiLDJCQUEyQjtRQUMzQiwyQkFBMkI7UUFDM0IseUNBQXlDO1FBQ3pDLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFRyaXBsZSwgVmVyaWZpY2F0aW9uT3B0aW9ucywgV2FsbGV0IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCB7XG4gIEFic3RyYWN0VXR4b0NvaW4sXG4gIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0LFxuICBPdXRwdXQsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBmZXRjaEtleWNoYWlucywgZ2V0S2V5U2lnbmF0dXJlcywgdG9LZXljaGFpblRyaXBsZSwgVXR4b0tleWNoYWluLCBVdHhvTmFtZWRLZXljaGFpbnMgfSBmcm9tICcuLi8uLi9rZXljaGFpbnMnO1xuaW1wb3J0IHsgQ29tcGFyYWJsZU91dHB1dCwgb3V0cHV0RGlmZmVyZW5jZSB9IGZyb20gJy4uL291dHB1dERpZmZlcmVuY2UnO1xuaW1wb3J0IHsgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0LCB0b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdCB9IGZyb20gJy4uL3JlY2lwaWVudCc7XG5cbmltcG9ydCB7IEN1c3RvbUNoYW5nZU9wdGlvbnMsIHBhcnNlT3V0cHV0IH0gZnJvbSAnLi9wYXJzZU91dHB1dCc7XG5cbmV4cG9ydCB0eXBlIENvbXBhcmFibGVPdXRwdXRXaXRoRXh0ZXJuYWw8VFZhbHVlPiA9IENvbXBhcmFibGVPdXRwdXQ8VFZhbHVlPiAmIHtcbiAgZXh0ZXJuYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiA9IHt9LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAvLyBvYnRhaW4gdGhlIGtleWNoYWlucyBhbmQga2V5IHNpZ25hdHVyZXNcbiAgbGV0IGtleWNoYWluczogVXR4b05hbWVkS2V5Y2hhaW5zIHwgVmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10gfCB1bmRlZmluZWQgPSB2ZXJpZmljYXRpb24ua2V5Y2hhaW5zO1xuICBpZiAoIWtleWNoYWlucykge1xuICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZmV0Y2gga2V5Y2hhaW5zIHdpdGhvdXQgbmV0d29ya2luZycpO1xuICAgIH1cbiAgICBrZXljaGFpbnMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCB3YWxsZXQsIHJlcUlkKTtcbiAgfVxuXG4gIGlmICghVXR4b05hbWVkS2V5Y2hhaW5zLmlzKGtleWNoYWlucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQga2V5Y2hhaW5zJyk7XG4gIH1cblxuICBjb25zdCBrZXljaGFpbkFycmF5OiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKTtcblxuICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkLnR4SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gIH1cblxuICAvLyBvYnRhaW4gYWxsIG91dHB1dHNcbiAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb248c3RyaW5nIHwgdW5kZWZpbmVkPiA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICB0eEluZm86IHR4UHJlYnVpbGQudHhJbmZvLFxuICAgIHB1YnM6IGtleWNoYWluQXJyYXkubWFwKChrKSA9PiBrLnB1YikgYXMgVHJpcGxlPHN0cmluZz4sXG4gIH0pO1xuXG4gIGNvbnN0IGFsbE91dHB1dHMgPSBbLi4uZXhwbGFuYXRpb24ub3V0cHV0cywgLi4uZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0c107XG5cbiAgbGV0IGV4cGVjdGVkT3V0cHV0cztcbiAgaWYgKHR4UGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzLmxlbmd0aCA9PT0gMSk7XG5cbiAgICBjb25zdCB0eFRvQmVSZXBsYWNlZCA9IGF3YWl0IHdhbGxldC5nZXRUcmFuc2FjdGlvbih7IHR4SGFzaDogdHhQYXJhbXMucmJmVHhJZHNbMF0sIGluY2x1ZGVSYmY6IHRydWUgfSk7XG4gICAgZXhwZWN0ZWRPdXRwdXRzID0gdHhUb0JlUmVwbGFjZWQub3V0cHV0cy5mbGF0TWFwKFxuICAgICAgKG91dHB1dDogeyB2YWx1ZVN0cmluZzogc3RyaW5nOyBhZGRyZXNzPzogc3RyaW5nOyB3YWxsZXQ/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAvLyBGb3Igc2VsZi1zZW5kcywgdGhlIHdhbGxldElkIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHdhbGxldCdzIGlkXG4gICAgICAgIGlmIChvdXRwdXQud2FsbGV0ID09PSB3YWxsZXQuaWQoKSkge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvaW4udG9DYW5vbmljYWxUcmFuc2FjdGlvblJlY2lwaWVudChvdXRwdXQpXTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIHZlcmlmeSB0aGF0IGVhY2ggcmVjaXBpZW50IGZyb20gdHhQYXJhbXMgaGFzIHRoZWlyIG93biBvdXRwdXRcbiAgICBleHBlY3RlZE91dHB1dHMgPSAodHhQYXJhbXMucmVjaXBpZW50cyA/PyBbXSkuZmxhdE1hcCgob3V0cHV0KSA9PiB7XG4gICAgICBpZiAob3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3V0cHV0LmFtb3VudC50b1N0cmluZygpICE9PSAnMCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgemVybyBhbW91bnRzIGFsbG93ZWQgZm9yIG5vbi1lbmNvZGVhYmxlIHNjcmlwdFB1YmtleXM6ICR7b3V0cHV0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbb3V0cHV0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbeyAuLi5vdXRwdXQsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfV07XG4gICAgfSk7XG4gICAgaWYgKHR4UGFyYW1zLmFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzICYmIHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgIC8vIHdoZW4gYW4gZXh0ZXJuYWwgY2hhbmdlIGFkZHJlc3MgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGNvdW50IGFsbCBvdXRwdXRzIGdvaW5nIHRvd2FyZHMgdGhhdFxuICAgICAgLy8gYWRkcmVzcyBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0cyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGFtb3VudClcbiAgICAgIGV4cGVjdGVkT3V0cHV0cy5wdXNoKFxuICAgICAgICAuLi5hbGxPdXRwdXRzLmZsYXRNYXAoKG91dHB1dCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG91dHB1dC5hZGRyZXNzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIG91dHB1dC5hZGRyZXNzICE9PSBjb2luLmNhbm9uaWNhbEFkZHJlc3ModHhQYXJhbXMuY2hhbmdlQWRkcmVzcyBhcyBzdHJpbmcpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbeyAuLi5vdXRwdXQsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfV07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdldCB0aGUga2V5Y2hhaW5zIGZyb20gdGhlIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGlmIG5lZWRlZFxuICBsZXQgY3VzdG9tQ2hhbmdlOiBDdXN0b21DaGFuZ2VPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBjb25zdCB7IGN1c3RvbUNoYW5nZVdhbGxldElkID0gdW5kZWZpbmVkIH0gPSB3YWxsZXQuY29pblNwZWNpZmljKCkgfHwge307XG4gIGlmIChjdXN0b21DaGFuZ2VXYWxsZXRJZCkge1xuICAgIC8vIGZldGNoIGtleWNoYWlucyBmcm9tIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGZvciBkZXJpdmluZyBhZGRyZXNzZXMuXG4gICAgLy8gVGhlc2Uga2V5Y2hhaW5zIHNob3VsZCBiZSBzaWduZWQgYW5kIHRoaXMgc2hvdWxkIGJlIHZlcmlmaWVkIGluIHZlcmlmeVRyYW5zYWN0aW9uXG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyA9IHdhbGxldC5fd2FsbGV0LmN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXM7XG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlV2FsbGV0OiBXYWxsZXQgPSBhd2FpdCBjb2luLndhbGxldHMoKS5nZXQoeyBpZDogY3VzdG9tQ2hhbmdlV2FsbGV0SWQgfSk7XG4gICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5cyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGNvaW4sIGN1c3RvbUNoYW5nZVdhbGxldCwgcmVxSWQpO1xuXG4gICAgaWYgKCFjdXN0b21DaGFuZ2VLZXlzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBrZXljaGFpbnMgZm9yIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUNoYW5nZUtleXMudXNlciAmJiBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCAmJiBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvICYmIGN1c3RvbUNoYW5nZVdhbGxldCkge1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zOiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IFtcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy51c2VyLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJhY2t1cCxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyxcbiAgICAgIF07XG5cbiAgICAgIGN1c3RvbUNoYW5nZSA9IHtcbiAgICAgICAga2V5czogY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zLFxuICAgICAgICBzaWduYXR1cmVzOiBbY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy51c2VyLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJhY2t1cCwgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcy5iaXRnb10sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBvdXRwdXRzIGFuZCBjbGFzc2lmeSBlYWNoIG9mIHRoZW0gYXMgZWl0aGVyIGludGVybmFsIHNwZW5kc1xuICAgKiBvciBleHRlcm5hbCBzcGVuZHMgYnkgc2V0dGluZyB0aGUgXCJleHRlcm5hbFwiIHByb3BlcnR5IHRvIHRydWUgb3IgZmFsc2Ugb24gdGhlIG91dHB1dCBvYmplY3QuXG4gICAqL1xuICBjb25zdCBhbGxPdXRwdXREZXRhaWxzOiBPdXRwdXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGFsbE91dHB1dHMubWFwKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VPdXRwdXQoe1xuICAgICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgICBjb2luLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgIGtleWNoYWluQXJyYXk6IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHJlY2lwaWVudHM6IGV4cGVjdGVkT3V0cHV0cyxcbiAgICAgICAgICBjaGFuZ2VBZGRyZXNzOiB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21DaGFuZ2UsXG4gICAgICAgIHJlcUlkLFxuICAgICAgfSk7XG4gICAgfSlcbiAgKTtcblxuICBjb25zdCBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbiA9IGFsbE91dHB1dERldGFpbHMuc29tZShcbiAgICAob3V0cHV0KSA9PiAob3V0cHV0IGFzIEZpeGVkU2NyaXB0V2FsbGV0T3V0cHV0KT8ubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb25cbiAgKTtcblxuICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gXy5maWx0ZXIoYWxsT3V0cHV0RGV0YWlscywgeyBleHRlcm5hbDogZmFsc2UgfSk7XG5cbiAgZnVuY3Rpb24gdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChvdXRwdXRzOiBPdXRwdXRbXSk6IENvbXBhcmFibGVPdXRwdXRXaXRoRXh0ZXJuYWw8YmlnaW50IHwgJ21heCc+W10ge1xuICAgIHJldHVybiBvdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgc2NyaXB0OiBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQob3V0cHV0LmFkZHJlc3MsIGNvaW4ubmV0d29yayksXG4gICAgICB2YWx1ZTogb3V0cHV0LmFtb3VudCA9PT0gJ21heCcgPyAnbWF4JyA6IChCaWdJbnQob3V0cHV0LmFtb3VudCkgYXMgYmlnaW50IHwgJ21heCcpLFxuICAgICAgZXh0ZXJuYWw6IG91dHB1dC5leHRlcm5hbCxcbiAgICB9KSk7XG4gIH1cblxuICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoXG4gICAgdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChleHBlY3RlZE91dHB1dHMpLFxuICAgIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0cylcbiAgKTtcblxuICBjb25zdCBpbXBsaWNpdE91dHB1dHMgPSBvdXRwdXREaWZmZXJlbmNlKFxuICAgIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0RGV0YWlscyksXG4gICAgdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChleHBlY3RlZE91dHB1dHMpXG4gICk7XG4gIGNvbnN0IGV4cGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UodG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChhbGxPdXRwdXREZXRhaWxzKSwgaW1wbGljaXRPdXRwdXRzKTtcblxuICAvLyB0aGVzZSBhcmUgYWxsIHRoZSBub24td2FsbGV0IG91dHB1dHMgdGhhdCBoYWQgYmVlbiBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHJlY2lwaWVudHNcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMgPSBleHBsaWNpdE91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5leHRlcm5hbCk7XG4gIC8vIHRoaXMgaXMgdGhlIHN1bSBvZiBhbGwgdGhlIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgbm9uLXdhbGxldCBvdXRwdXQgdmFsdWVzXG4gIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG8pID0+IHN1bSArIEJpZ0ludChvLnZhbHVlKSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHBlcnRhaW5zIHRvIHZlcmlmeWluZyB0aGUgcGF5LWFzLXlvdS1nby1mZWUgQml0R29cbiAgICogYXV0b21hdGljYWxseSBhcHBsaWVzIHRvIHRyYW5zYWN0aW9ucyBzZW5kaW5nIG1vbmV5IG91dCBvZiB0aGUgd2FsbGV0LiBUaGUgbG9naWMgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZFxuICAgKiBpbiB0aGF0IHdlIGNvbXBhcmUgdGhlIGV4dGVybmFsIHNwZW5kIGFtb3VudCB0aGF0IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBieSB0aGUgdXNlciB0byB0aGUgcG9ydGlvblxuICAgKiB0aGF0IHdhcyBzcGVjaWZpZWQgaW1wbGljaXRseS4gVG8gcHJvdGVjdCBjdXN0b21lcnMgZnJvbSBwZW9wbGUgdGFtcGVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIG91dHB1dHMsIHdlXG4gICAqIGRlZmluZSBhIHRocmVzaG9sZCBmb3IgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiB0aGUgaW1wbGljaXQgZXh0ZXJuYWwgc3BlbmQgaW4gcmVsYXRpb24gdG8gdGhlIGV4cGxpY2l0XG4gICAqIGV4dGVybmFsIHNwZW5kLlxuICAgKi9cblxuICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICBjb25zdCBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IGltcGxpY2l0T3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LmV4dGVybmFsKTtcbiAgY29uc3QgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbykgPT4gc3VtICsgQmlnSW50KG8udmFsdWUpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKTtcblxuICBmdW5jdGlvbiB0b091dHB1dHMob3V0cHV0czogQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxiaWdpbnQgfCAnbWF4Jz5bXSk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gb3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KG91dHB1dC5zY3JpcHQsIGNvaW4ubmV0d29yayksXG4gICAgICBhbW91bnQ6IG91dHB1dC52YWx1ZS50b1N0cmluZygpLFxuICAgICAgZXh0ZXJuYWw6IG91dHB1dC5leHRlcm5hbCxcbiAgICB9KSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtleWNoYWlucyxcbiAgICBrZXlTaWduYXR1cmVzOiBnZXRLZXlTaWduYXR1cmVzKHdhbGxldCkgPz8ge30sXG4gICAgb3V0cHV0czogYWxsT3V0cHV0RGV0YWlscyxcbiAgICBtaXNzaW5nT3V0cHV0czogdG9PdXRwdXRzKG1pc3NpbmdPdXRwdXRzKSxcbiAgICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogdG9PdXRwdXRzKGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSxcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0czogdG9PdXRwdXRzKGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSxcbiAgICBjaGFuZ2VPdXRwdXRzLFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgY3VzdG9tQ2hhbmdlLFxuICB9O1xufVxuIl19
|