@bitgo-beta/sdk-core 8.2.1-beta.213 → 8.2.1-beta.2131
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/account-lib/baseCoin/baseTransaction.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +43 -31
- package/dist/src/account-lib/baseCoin/enum.d.ts +59 -5
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +112 -10
- package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/errors.js +8 -2
- package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +26 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +8 -5
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
- package/dist/src/account-lib/index.d.ts +0 -1
- package/dist/src/account-lib/index.d.ts.map +1 -1
- package/dist/src/account-lib/index.js +23 -10
- package/dist/src/account-lib/mpc/index.d.ts +1 -1
- package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/index.js +6 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
- package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/index.js +23 -9
- package/dist/src/account-lib/mpc/util.d.ts +7 -1
- package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/util.js +24 -1
- package/dist/src/account-lib/staking/index.js +6 -2
- package/dist/src/account-lib/staking/utils.js +3 -3
- package/dist/src/account-lib/util/crypto.d.ts +8 -2
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +69 -38
- package/dist/src/api/bip32path.js +2 -3
- package/dist/src/api/index.js +6 -2
- package/dist/src/api/types.d.ts +37 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +8 -1
- package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -1
- package/dist/src/bitgo/address-book/address-book.js +20 -12
- package/dist/src/bitgo/address-book/index.js +6 -2
- package/dist/src/bitgo/address-book/types.d.ts +36 -36
- package/dist/src/bitgo/address-book/types.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +123 -13
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +200 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +337 -33
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
- package/dist/src/bitgo/baseCoin/index.js +6 -2
- package/dist/src/bitgo/bip32util.d.ts +3 -16
- package/dist/src/bitgo/bip32util.d.ts.map +1 -1
- package/dist/src/bitgo/bip32util.js +4 -56
- package/dist/src/bitgo/bitcoin.d.ts +0 -1
- package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoin.js +26 -13
- package/dist/src/bitgo/bitgoBase.d.ts +17 -4
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/coinFactory.d.ts +24 -3
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +35 -3
- package/dist/src/bitgo/config.d.ts +3 -101
- package/dist/src/bitgo/config.d.ts.map +1 -1
- package/dist/src/bitgo/config.js +26 -15
- package/dist/src/bitgo/defi/defiVault.d.ts +171 -0
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/defiVault.js +445 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts +101 -0
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
- package/dist/src/bitgo/defi/iDefiVault.js +6 -0
- package/dist/src/bitgo/defi/index.d.ts +3 -0
- package/dist/src/bitgo/defi/index.d.ts.map +1 -0
- package/dist/src/bitgo/defi/index.js +22 -0
- package/dist/src/bitgo/ecdh.d.ts +0 -1
- package/dist/src/bitgo/ecdh.d.ts.map +1 -1
- package/dist/src/bitgo/ecdh.js +26 -13
- package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +47 -21
- package/dist/src/bitgo/enterprise/enterprises.js +27 -13
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/enterprise/index.js +6 -2
- package/dist/src/bitgo/environments.d.ts +74 -3
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +417 -34
- package/dist/src/bitgo/errors.d.ts +193 -1
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +194 -3
- package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
- package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
- package/dist/src/bitgo/evm/evmUtils.js +50 -0
- package/dist/src/bitgo/index.d.ts +6 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +32 -11
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
- package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
- package/dist/src/bitgo/internal/index.js +6 -2
- package/dist/src/bitgo/internal/internal.js +5 -6
- package/dist/src/bitgo/internal/keycard.d.ts +13 -8
- package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
- package/dist/src/bitgo/internal/keycard.js +63 -48
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts +180 -11
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +2 -2
- package/dist/src/bitgo/keychain/index.d.ts +1 -0
- package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/index.js +7 -2
- package/dist/src/bitgo/keychain/keychains.d.ts +106 -13
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +423 -72
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
- package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
- package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/legacyBitcoin.js +27 -13
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
- package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
- package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
- package/dist/src/bitgo/market/index.js +6 -2
- package/dist/src/bitgo/market/markets.js +23 -9
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +5 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
- package/dist/src/bitgo/pendingApproval/index.js +6 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +246 -111
- package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
- package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
- package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
- package/dist/src/bitgo/proofs/index.d.ts +2 -0
- package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/index.js +6 -0
- package/dist/src/bitgo/proofs/types.d.ts +80 -0
- package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/types.js +80 -0
- package/dist/src/bitgo/recovery/index.js +6 -2
- package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +49 -41
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +72 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +186 -0
- package/dist/src/bitgo/safe/iSafe.d.ts +124 -0
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/iSafe.js +3 -0
- package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
- package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/iSafes.js +3 -0
- package/dist/src/bitgo/safe/index.d.ts +8 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -0
- package/dist/src/bitgo/safe/index.js +24 -0
- package/dist/src/bitgo/safe/recovery.d.ts +192 -0
- package/dist/src/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/src/bitgo/safe/recovery.js +253 -0
- package/dist/src/bitgo/safe/rootCoin.d.ts +15 -0
- package/dist/src/bitgo/safe/rootCoin.d.ts.map +1 -0
- package/dist/src/bitgo/safe/rootCoin.js +47 -0
- package/dist/src/bitgo/safe/safe.d.ts +88 -0
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safe.js +417 -0
- package/dist/src/bitgo/safe/safes.d.ts +102 -0
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safes.js +281 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +161 -8
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
- package/dist/src/bitgo/staking/index.d.ts +3 -0
- package/dist/src/bitgo/staking/index.d.ts.map +1 -1
- package/dist/src/bitgo/staking/index.js +9 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +153 -7
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/index.d.ts +1 -0
- package/dist/src/bitgo/trading/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/index.js +7 -2
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt.js +58 -0
- package/dist/src/bitgo/trading/network/index.d.ts +2 -0
- package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/index.js +8 -2
- package/dist/src/bitgo/trading/network/network.d.ts +4 -3
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/network.js +24 -27
- package/dist/src/bitgo/trading/network/types.d.ts +79 -46
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
- package/dist/src/bitgo/trading/network/types.js +1 -1
- package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
- package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/utils.js +54 -0
- package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +55 -7
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
- package/dist/src/bitgo/tss/common.d.ts +50 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +139 -17
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
- package/dist/src/bitgo/tss/eddsa/index.js +23 -9
- package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
- package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.d.ts +3 -2
- package/dist/src/bitgo/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.js +26 -10
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +138 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +255 -0
- package/dist/src/bitgo/tss/types.d.ts +3 -3
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +2 -2
- package/dist/src/bitgo/types.d.ts +3 -3
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
- package/dist/src/bitgo/utils/codecProps.js +24 -11
- package/dist/src/bitgo/utils/codecs.d.ts +11 -0
- package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
- package/dist/src/bitgo/utils/codecs.js +59 -0
- package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
- package/dist/src/bitgo/utils/decode.js +30 -16
- package/dist/src/bitgo/utils/index.d.ts +5 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +28 -11
- package/dist/src/bitgo/utils/messageTypes.d.ts +46 -0
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/src/bitgo/utils/messageTypes.js +23 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +210 -14
- package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/src/bitgo/utils/notEmpty.js +7 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -7
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +79 -62
- package/dist/src/bitgo/utils/postWithCodec.js +2 -3
- package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
- package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/promise-utils.js +2 -3
- package/dist/src/bitgo/utils/siws.d.ts +17 -0
- package/dist/src/bitgo/utils/siws.d.ts.map +1 -0
- package/dist/src/bitgo/utils/siws.js +171 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/transactionUtils.js +29 -0
- package/dist/src/bitgo/utils/triple.d.ts +1 -1
- package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
- package/dist/src/bitgo/utils/triple.js +2 -3
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +99 -17
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +322 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +478 -55
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +241 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1082 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +17 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +39 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +65 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +439 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +5 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +11 -2
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +151 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +119 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +43 -11
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +261 -96
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +261 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +994 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +14 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +29 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +44 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +268 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +5 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +30 -8
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +15 -7
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +75 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
- package/dist/src/bitgo/utils/tss/index.d.ts +7 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +31 -10
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts +40 -0
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyShareEnvelope.js +103 -0
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts +45 -0
- package/dist/src/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/keyVerification.js +192 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +42 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.js +179 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
- package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
- package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
- package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
- package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/src/bitgo/utils/txRequest.js +49 -0
- package/dist/src/bitgo/utils/util.js +24 -10
- package/dist/src/bitgo/utils/wallet.d.ts +7 -0
- package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/src/bitgo/utils/wallet.js +48 -0
- package/dist/src/bitgo/v1Wallets.d.ts +170 -0
- package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
- package/dist/src/bitgo/v1Wallets.js +3 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts +92 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +97 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +647 -33
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +311 -16
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +84 -3
- package/dist/src/bitgo/wallet/index.d.ts +1 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/index.js +7 -2
- package/dist/src/bitgo/wallet/safeKeychain.d.ts +75 -0
- package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/safeKeychain.js +152 -0
- package/dist/src/bitgo/wallet/wallet.d.ts +410 -27
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +2525 -510
- package/dist/src/bitgo/wallet/wallets.d.ts +99 -4
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +1256 -156
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/index.js +19 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
- package/dist/src/bitgo/webauthn/base64url.d.ts +16 -0
- package/dist/src/bitgo/webauthn/base64url.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/base64url.js +27 -0
- package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts +18 -0
- package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.js +26 -0
- package/dist/src/bitgo/webauthn/derivePassword.d.ts +11 -0
- package/dist/src/bitgo/webauthn/derivePassword.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/derivePassword.js +16 -0
- package/dist/src/bitgo/webauthn/index.d.ts +5 -0
- package/dist/src/bitgo/webauthn/index.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/index.js +21 -0
- package/dist/src/bitgo/webauthn/types.d.ts +18 -0
- package/dist/src/bitgo/webauthn/types.d.ts.map +1 -0
- package/dist/src/bitgo/webauthn/types.js +3 -0
- package/dist/src/bitgo/webhook/index.js +6 -2
- package/dist/src/bitgo/webhook/webhooks.js +23 -9
- package/dist/src/coins/fiat.d.ts +45 -0
- package/dist/src/coins/fiat.d.ts.map +1 -0
- package/dist/src/coins/fiat.js +94 -0
- package/dist/src/coins/index.d.ts +1 -6
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +7 -8
- package/dist/src/coins/ofc.d.ts +21 -2
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +29 -3
- package/dist/src/coins/ofcToken.d.ts +15 -4
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +43 -5
- package/dist/src/coins/susd.d.ts +3 -2
- package/dist/src/coins/susd.d.ts.map +1 -1
- package/dist/src/coins/susd.js +5 -1
- package/dist/src/common.js +27 -13
- package/dist/src/index.d.ts +9 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +40 -11
- package/dist/src/lightning.d.ts +20 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +13 -0
- package/dist/src/units.js +5 -6
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
- package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
- package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/util.js +53 -0
- package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
- package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
- package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
- package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
- package/dist/test/unit/bitgo/defi/defiVault.js +863 -0
- package/dist/test/unit/bitgo/environment.d.ts +2 -0
- package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
- package/dist/test/unit/bitgo/environment.js +38 -0
- package/dist/test/unit/bitgo/errors.d.ts +2 -0
- package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/errors.js +276 -0
- package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
- package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
- package/dist/test/unit/bitgo/keychain/keychains.js +426 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
- package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
- package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +257 -0
- package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +72 -0
- package/dist/test/unit/bitgo/safe/fixtures/safeBip44Vectors.json +319 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/recovery.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/recovery.js +647 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/rootCoin.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/rootCoin.js +13 -0
- package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safe.js +607 -0
- package/dist/test/unit/bitgo/safe/safeBip44Vectors.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safeBip44Vectors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safeBip44Vectors.js +189 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.js +37 -0
- package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safes.js +376 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
- package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
- package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/common.js +84 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +370 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.js +109 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.js +24 -10
- package/dist/test/unit/bitgo/utils/siws.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/siws.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/siws.js +206 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1246 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +2410 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +553 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +376 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.js +83 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/keyVerification.js +229 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +498 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
- package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/wallet.js +55 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.js +167 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +79 -9
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
- package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +651 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/safeShareWallet.js +304 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.js +210 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletVerifyKey.js +160 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +304 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +853 -0
- package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
- package/dist/test/unit/coins/ofc.d.ts +2 -0
- package/dist/test/unit/coins/ofc.d.ts.map +1 -0
- package/dist/test/unit/coins/ofc.js +124 -0
- package/dist/test/unit/lightning.d.ts +2 -0
- package/dist/test/unit/lightning.d.ts.map +1 -0
- package/dist/test/unit/lightning.js +23 -0
- package/dist/test/unit/units.d.ts.map +1 -1
- package/dist/test/unit/units.js +64 -64
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -22
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -1866
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -49
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -87
- package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
- package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/iLightning.js +0 -106
- package/dist/src/bitgo/lightning/index.d.ts +0 -5
- package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/index.js +0 -17
- package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
- package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightning.js +0 -111
- package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
- package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
- package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
- package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/blsUtils.js +0 -237
- package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
- package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
- package/dist/src/coins/fiateur.d.ts +0 -31
- package/dist/src/coins/fiateur.d.ts.map +0 -1
- package/dist/src/coins/fiateur.js +0 -57
- package/dist/src/coins/fiatgbp.d.ts +0 -31
- package/dist/src/coins/fiatgbp.d.ts.map +0 -1
- package/dist/src/coins/fiatgbp.js +0 -57
- package/dist/src/coins/fiatusd.d.ts +0 -31
- package/dist/src/coins/fiatusd.d.ts.map +0 -1
- package/dist/src/coins/fiatusd.js +0 -57
- package/dist/src/coins/tfiateur.d.ts +0 -11
- package/dist/src/coins/tfiateur.d.ts.map +0 -1
- package/dist/src/coins/tfiateur.js +0 -17
- package/dist/src/coins/tfiatgbp.d.ts +0 -11
- package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
- package/dist/src/coins/tfiatgbp.js +0 -17
- package/dist/src/coins/tfiatusd.d.ts +0 -11
- package/dist/src/coins/tfiatusd.d.ts.map +0 -1
- package/dist/src/coins/tfiatusd.js +0 -17
- package/dist/src/openssl/index.d.ts +0 -5
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -9
- package/dist/test/unit/openssl.d.ts +0 -2
- package/dist/test/unit/openssl.d.ts.map +0 -1
- package/dist/test/unit/openssl.js +0 -39
|
@@ -0,0 +1,647 @@
|
|
|
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
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
require("should");
|
|
41
|
+
const sinon = __importStar(require("sinon"));
|
|
42
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
43
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
44
|
+
const sjcl = __importStar(require("@bitgo-beta/sjcl"));
|
|
45
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
46
|
+
const keyShareEnvelope_1 = require("../../../../src/bitgo/utils/tss/keyShareEnvelope");
|
|
47
|
+
const errors_1 = require("../../../../src/bitgo/errors");
|
|
48
|
+
const recovery_1 = require("../../../../src/bitgo/safe/recovery");
|
|
49
|
+
const src_1 = require("../../../../src");
|
|
50
|
+
const eddsa_1 = require("../../../../src/bitgo/tss/eddsa/eddsa");
|
|
51
|
+
const eddsaMPCv2_1 = require("../../../../src/bitgo/utils/tss/eddsa/eddsaMPCv2");
|
|
52
|
+
// The ed25519 soft co-signer private halves asserted below are pinned cross-repo in the shared
|
|
53
|
+
// GV1 fixture (byte-identical to wallet-platform's copy).
|
|
54
|
+
const bip44Fixture = __importStar(require("./fixtures/safeBip44Vectors.json"));
|
|
55
|
+
const PASSWORD = 'safe-password';
|
|
56
|
+
function makeMockBitGo(decryptImpl) {
|
|
57
|
+
return {
|
|
58
|
+
decrypt: sinon.stub().callsFake(async (params) => decryptImpl(params)),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** A fake decrypt that only recognizes the user/backup tokens; any other input (e.g. a Box C public) throws. */
|
|
62
|
+
function makeDecryptMap(entries) {
|
|
63
|
+
return ({ password, input }) => {
|
|
64
|
+
password.should.equal(PASSWORD);
|
|
65
|
+
if (!(input in entries)) {
|
|
66
|
+
throw new Error(`unexpected decrypt input: ${input}`);
|
|
67
|
+
}
|
|
68
|
+
return entries[input];
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function box(values) {
|
|
72
|
+
return JSON.stringify(values);
|
|
73
|
+
}
|
|
74
|
+
describe('decryptSafeKeycard', () => {
|
|
75
|
+
afterEach(() => {
|
|
76
|
+
sinon.restore();
|
|
77
|
+
});
|
|
78
|
+
it('decrypts onchain roots to strings and returns Box C verbatim', async () => {
|
|
79
|
+
const userBox = box({
|
|
80
|
+
secp256k1Multisig: 'enc-user-secp',
|
|
81
|
+
ed25519Multisig: 'enc-user-ed25519',
|
|
82
|
+
ecdsaMpc: 'enc-user-ecdsa',
|
|
83
|
+
eddsaMpc: 'enc-user-eddsa',
|
|
84
|
+
});
|
|
85
|
+
const backupBox = box({
|
|
86
|
+
secp256k1Multisig: 'enc-backup-secp',
|
|
87
|
+
ed25519Multisig: { prv: 'enc-backup-ed25519', chainCode: 'C'.repeat(52) },
|
|
88
|
+
ecdsaMpc: 'enc-backup-ecdsa',
|
|
89
|
+
eddsaMpc: 'enc-backup-eddsa',
|
|
90
|
+
});
|
|
91
|
+
const bitgoBox = box({
|
|
92
|
+
secp256k1Multisig: 'xpub-secp-bitgo',
|
|
93
|
+
ed25519Multisig: 'pub-ed25519-bitgo',
|
|
94
|
+
ecdsaMpc: 'common-ecdsa-bitgo',
|
|
95
|
+
eddsaMpc: 'common-eddsa-bitgo',
|
|
96
|
+
});
|
|
97
|
+
const mpcUser = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('user-signing'), Buffer.from('user-reduced'), Buffer.from('user-vrf'));
|
|
98
|
+
const mpcBackup = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('backup-signing'), Buffer.from('backup-reduced'), Buffer.from('backup-vrf'));
|
|
99
|
+
const bitgo = makeMockBitGo(makeDecryptMap({
|
|
100
|
+
'enc-user-secp': 'xprv-user',
|
|
101
|
+
'enc-backup-secp': 'xprv-backup',
|
|
102
|
+
'enc-user-ed25519': 'S-user-seed',
|
|
103
|
+
'enc-backup-ed25519': 'S-backup-seed',
|
|
104
|
+
'enc-user-ecdsa': mpcUser.reducedEnvelope.toString('base64'),
|
|
105
|
+
'enc-backup-ecdsa': mpcBackup.reducedEnvelope.toString('base64'),
|
|
106
|
+
'enc-user-eddsa': mpcUser.reducedEnvelope.toString('base64'),
|
|
107
|
+
'enc-backup-eddsa': mpcBackup.reducedEnvelope.toString('base64'),
|
|
108
|
+
}));
|
|
109
|
+
const result = await (0, recovery_1.decryptSafeKeycard)({
|
|
110
|
+
bitgo,
|
|
111
|
+
userKeyBox: userBox,
|
|
112
|
+
backupKeyBox: backupBox,
|
|
113
|
+
bitgoKeyBox: bitgoBox,
|
|
114
|
+
password: PASSWORD,
|
|
115
|
+
});
|
|
116
|
+
result.secp256k1Multisig.user.should.equal('xprv-user');
|
|
117
|
+
result.secp256k1Multisig.backup.should.equal('xprv-backup');
|
|
118
|
+
result.secp256k1Multisig.bitgo.should.equal('xpub-secp-bitgo');
|
|
119
|
+
result.ed25519Multisig.user.should.equal('S-user-seed');
|
|
120
|
+
result.ed25519Multisig.backup.prv.should.equal('S-backup-seed');
|
|
121
|
+
result.ed25519Multisig.backup.chainCode.should.equal('C'.repeat(52));
|
|
122
|
+
result.ed25519Multisig.bitgo.should.equal('pub-ed25519-bitgo');
|
|
123
|
+
result.ecdsaMpc.user.signing.toString('hex').should.equal(Buffer.from('user-reduced').toString('hex'));
|
|
124
|
+
result.ecdsaMpc.user.vrf.toString('hex').should.equal(Buffer.from('user-vrf').toString('hex'));
|
|
125
|
+
result.ecdsaMpc.backup.signing.toString('hex').should.equal(Buffer.from('backup-reduced').toString('hex'));
|
|
126
|
+
result.ecdsaMpc.backup.vrf.toString('hex').should.equal(Buffer.from('backup-vrf').toString('hex'));
|
|
127
|
+
result.ecdsaMpc.bitgo.should.equal('common-ecdsa-bitgo');
|
|
128
|
+
result.eddsaMpc.bitgo.should.equal('common-eddsa-bitgo');
|
|
129
|
+
// 4 slots × (user + backup) = 8 decrypts; BitGo (Box C) is never decrypted.
|
|
130
|
+
bitgo.decrypt.callCount.should.equal(8);
|
|
131
|
+
});
|
|
132
|
+
it('decrypts the seed from an object-form ed25519Multisig backup entry', async () => {
|
|
133
|
+
const userBox = box({
|
|
134
|
+
secp256k1Multisig: 'enc-user-secp',
|
|
135
|
+
ed25519Multisig: 'enc-user-ed25519',
|
|
136
|
+
ecdsaMpc: 'enc-user-ecdsa',
|
|
137
|
+
eddsaMpc: 'enc-user-eddsa',
|
|
138
|
+
});
|
|
139
|
+
const backupBox = JSON.stringify({
|
|
140
|
+
secp256k1Multisig: 'enc-backup-secp',
|
|
141
|
+
ed25519Multisig: { prv: 'enc-backup-ed25519', chainCode: 'A'.repeat(52) },
|
|
142
|
+
ecdsaMpc: 'enc-backup-ecdsa',
|
|
143
|
+
eddsaMpc: 'enc-backup-eddsa',
|
|
144
|
+
});
|
|
145
|
+
const bitgoBox = box({
|
|
146
|
+
secp256k1Multisig: 'xpub-secp-bitgo',
|
|
147
|
+
ed25519Multisig: 'pub-ed25519-bitgo',
|
|
148
|
+
ecdsaMpc: 'common-ecdsa-bitgo',
|
|
149
|
+
eddsaMpc: 'common-eddsa-bitgo',
|
|
150
|
+
});
|
|
151
|
+
const mpcUser = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('user-signing'), Buffer.from('user-reduced'), Buffer.from('user-vrf'));
|
|
152
|
+
const mpcBackup = (0, keyShareEnvelope_1.buildSafeMpcKeyEnvelopes)(Buffer.from('backup-signing'), Buffer.from('backup-reduced'), Buffer.from('backup-vrf'));
|
|
153
|
+
const bitgo = makeMockBitGo(makeDecryptMap({
|
|
154
|
+
'enc-user-secp': 'xprv-user',
|
|
155
|
+
'enc-backup-secp': 'xprv-backup',
|
|
156
|
+
'enc-user-ed25519': 'S-user-seed',
|
|
157
|
+
'enc-backup-ed25519': 'S-backup-seed',
|
|
158
|
+
'enc-user-ecdsa': mpcUser.reducedEnvelope.toString('base64'),
|
|
159
|
+
'enc-backup-ecdsa': mpcBackup.reducedEnvelope.toString('base64'),
|
|
160
|
+
'enc-user-eddsa': mpcUser.reducedEnvelope.toString('base64'),
|
|
161
|
+
'enc-backup-eddsa': mpcBackup.reducedEnvelope.toString('base64'),
|
|
162
|
+
}));
|
|
163
|
+
const result = await (0, recovery_1.decryptSafeKeycard)({
|
|
164
|
+
bitgo,
|
|
165
|
+
userKeyBox: userBox,
|
|
166
|
+
backupKeyBox: backupBox,
|
|
167
|
+
bitgoKeyBox: bitgoBox,
|
|
168
|
+
password: PASSWORD,
|
|
169
|
+
});
|
|
170
|
+
result.ed25519Multisig.backup.prv.should.equal('S-backup-seed');
|
|
171
|
+
result.ed25519Multisig.backup.chainCode.should.equal('A'.repeat(52));
|
|
172
|
+
});
|
|
173
|
+
it('rejects an ed25519 chain-code entry in a non-backup slot (fail closed)', async () => {
|
|
174
|
+
const userBox = JSON.stringify({
|
|
175
|
+
secp256k1Multisig: { prv: 'enc-user-secp', chainCode: 'A'.repeat(52) },
|
|
176
|
+
ed25519Multisig: 'enc-user-ed25519',
|
|
177
|
+
ecdsaMpc: 'enc-user-ecdsa',
|
|
178
|
+
eddsaMpc: 'enc-user-eddsa',
|
|
179
|
+
});
|
|
180
|
+
await (0, recovery_1.decryptSafeKeycard)({
|
|
181
|
+
bitgo: makeMockBitGo(makeDecryptMap({})),
|
|
182
|
+
userKeyBox: userBox,
|
|
183
|
+
backupKeyBox: userBox,
|
|
184
|
+
bitgoKeyBox: userBox,
|
|
185
|
+
password: PASSWORD,
|
|
186
|
+
}).should.be.rejectedWith(/unexpected ed25519 chain-code entry/);
|
|
187
|
+
});
|
|
188
|
+
it('throws IncorrectPasswordError when decryption fails (wrong password)', async () => {
|
|
189
|
+
const userBox = box({
|
|
190
|
+
secp256k1Multisig: 'enc-user-secp',
|
|
191
|
+
ed25519Multisig: 'enc-user-ed25519',
|
|
192
|
+
ecdsaMpc: 'enc-user-ecdsa',
|
|
193
|
+
eddsaMpc: 'enc-user-eddsa',
|
|
194
|
+
});
|
|
195
|
+
const bitgo = makeMockBitGo(() => {
|
|
196
|
+
throw new Error('argon2: tag does not match');
|
|
197
|
+
});
|
|
198
|
+
await (0, recovery_1.decryptSafeKeycard)({
|
|
199
|
+
bitgo,
|
|
200
|
+
userKeyBox: userBox,
|
|
201
|
+
backupKeyBox: userBox,
|
|
202
|
+
bitgoKeyBox: userBox,
|
|
203
|
+
password: 'wrong-password',
|
|
204
|
+
}).should.be.rejectedWith(errors_1.IncorrectPasswordError);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
const MPC_ROOT = { signing: Buffer.alloc(0), vrf: Buffer.alloc(0) };
|
|
208
|
+
function makeRoots(secp) {
|
|
209
|
+
return {
|
|
210
|
+
secp256k1Multisig: secp,
|
|
211
|
+
ed25519Multisig: { user: 'u', backup: { prv: 'b', chainCode: 'c' }, bitgo: 'g' },
|
|
212
|
+
ecdsaMpc: { user: MPC_ROOT, backup: MPC_ROOT, bitgo: 'g' },
|
|
213
|
+
eddsaMpc: { user: MPC_ROOT, backup: MPC_ROOT, bitgo: 'g' },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
describe('deriveSafeWalletKeys', () => {
|
|
217
|
+
const userRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'));
|
|
218
|
+
const backupRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100', 'hex'));
|
|
219
|
+
const bitgoRoot = utxo_lib_1.bip32
|
|
220
|
+
.fromSeed(Buffer.from('2f2e2d2c2b2a292827262524232221201f1e1d1c1b1a19181716151413121110', 'hex'))
|
|
221
|
+
.neutered();
|
|
222
|
+
const roots = makeRoots({
|
|
223
|
+
user: userRoot.toBase58(),
|
|
224
|
+
backup: backupRoot.toBase58(),
|
|
225
|
+
bitgo: bitgoRoot.toBase58(),
|
|
226
|
+
});
|
|
227
|
+
it('derives the BIP44 child triplet for slot 1', async () => {
|
|
228
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 0, roots });
|
|
229
|
+
if (result.slot !== 'secp256k1Multisig') {
|
|
230
|
+
throw new Error('expected secp256k1Multisig slot');
|
|
231
|
+
}
|
|
232
|
+
result.path.should.equal("m/44'/0'/1'/0'");
|
|
233
|
+
result.keys.user.prv.should.equal(userRoot.derivePath("m/44'/0'/1'/0'").toBase58());
|
|
234
|
+
result.keys.user.pub.should.equal(userRoot.derivePath("m/44'/0'/1'/0'").neutered().toBase58());
|
|
235
|
+
result.keys.backup.prv.should.equal(backupRoot.derivePath('m/44/0/1/0').toBase58());
|
|
236
|
+
result.keys.bitgo.pub.should.equal(bitgoRoot.derivePath('m/44/0/1/0').toBase58());
|
|
237
|
+
});
|
|
238
|
+
it('varies the path with the account', async () => {
|
|
239
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 2, roots });
|
|
240
|
+
result.path.should.equal("m/44'/0'/1'/2'");
|
|
241
|
+
});
|
|
242
|
+
it('derives the ecdsaMpc child via the DKLs ceremony', async () => {
|
|
243
|
+
const [userDkg, backupDkg] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
244
|
+
const [vrfUser, vrfBackup] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
245
|
+
const mpcRoots = {
|
|
246
|
+
...roots,
|
|
247
|
+
ecdsaMpc: {
|
|
248
|
+
user: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
|
|
249
|
+
backup: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
|
|
250
|
+
bitgo: 'g',
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'eth', slot: 'ecdsaMpc', account: 0, roots: mpcRoots });
|
|
254
|
+
if (result.slot !== 'ecdsaMpc') {
|
|
255
|
+
throw new Error('expected ecdsaMpc slot');
|
|
256
|
+
}
|
|
257
|
+
result.path.should.equal("m/44'/60'/3'/0'");
|
|
258
|
+
result.keys.commonKeychain.should.be.a.String();
|
|
259
|
+
result.keys.user.should.be.a.String();
|
|
260
|
+
result.keys.backup.should.be.a.String();
|
|
261
|
+
});
|
|
262
|
+
it('derives and signs the eddsaMpc slot-4 BIP44 child', async function () {
|
|
263
|
+
const [userDkg, backupDkg, bitgoDkg] = await sdk_lib_mpc_1.MPSUtil.generateEdDsaDKGKeyShares();
|
|
264
|
+
const [vrfUser, vrfBackup, vrfBitgo] = await sdk_lib_mpc_1.MpsVrfUtils.generateVrfDKGKeyShares();
|
|
265
|
+
const mpcRoots = {
|
|
266
|
+
...roots,
|
|
267
|
+
eddsaMpc: {
|
|
268
|
+
user: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
|
|
269
|
+
backup: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
|
|
270
|
+
bitgo: bitgoDkg.getCommonKeychain(),
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'sol', slot: 'eddsaMpc', account: 0, roots: mpcRoots });
|
|
274
|
+
if (result.slot !== 'eddsaMpc') {
|
|
275
|
+
throw new Error('expected eddsaMpc slot');
|
|
276
|
+
}
|
|
277
|
+
result.path.should.equal("m/44'/501'/4'/0'");
|
|
278
|
+
// Play mint's user↔BitGo role locally at the same BIP44 path; no dev-minted wallet is needed.
|
|
279
|
+
const userMint = new sdk_lib_mpc_1.MpsDerive.Derive(3, 2, 0, userDkg.getKeyShare(), vrfUser.getKeyShare(), result.path);
|
|
280
|
+
const bitgoMint = new sdk_lib_mpc_1.MpsDerive.Derive(3, 2, 2, bitgoDkg.getKeyShare(), vrfBitgo.getKeyShare(), result.path);
|
|
281
|
+
const [userRound0, bitgoRound0] = await Promise.all([userMint.initDerive(), bitgoMint.initDerive()]);
|
|
282
|
+
const [userRound1] = userMint.handleIncomingMessages([bitgoRound0]);
|
|
283
|
+
const [bitgoRound1] = bitgoMint.handleIncomingMessages([userRound0]);
|
|
284
|
+
if (!userRound1 || !bitgoRound1) {
|
|
285
|
+
throw new Error('expected user and BitGo derive round-1 messages');
|
|
286
|
+
}
|
|
287
|
+
assert_1.default.deepStrictEqual(userMint.handleIncomingMessages([bitgoRound1]), []);
|
|
288
|
+
assert_1.default.deepStrictEqual(bitgoMint.handleIncomingMessages([userRound1]), []);
|
|
289
|
+
const mintedChildCommonKeychain = userMint.getCommonKeychain();
|
|
290
|
+
assert_1.default.strictEqual(bitgoMint.getCommonKeychain(), mintedChildCommonKeychain);
|
|
291
|
+
assert_1.default.strictEqual(result.keys.commonKeychain, mintedChildCommonKeychain);
|
|
292
|
+
const walletPassphrase = 'safe-recovery-passphrase';
|
|
293
|
+
const userKey = sjcl.encrypt(walletPassphrase, result.keys.user);
|
|
294
|
+
const backupKey = sjcl.encrypt(walletPassphrase, result.keys.backup);
|
|
295
|
+
const rootCommonKeychain = userDkg.getCommonKeychain();
|
|
296
|
+
await assert_1.default.rejects((0, eddsaMPCv2_1.signEddsaMpcV2RecoveryTx)({
|
|
297
|
+
message: Buffer.from('wrong keychain must fail'),
|
|
298
|
+
userKey,
|
|
299
|
+
backupKey,
|
|
300
|
+
walletPassphrase,
|
|
301
|
+
bitgoKey: rootCommonKeychain,
|
|
302
|
+
derivationPath: 'm/0',
|
|
303
|
+
}), /commonKeyChain from keycard does not match bitgoKey/);
|
|
304
|
+
const mpc = await (0, eddsa_1.getInitializedMpcInstance)();
|
|
305
|
+
for (const derivationPath of ['m/0', 'm/3']) {
|
|
306
|
+
const message = Buffer.from(`Safe EdDSA recovery ${derivationPath}`);
|
|
307
|
+
const signature = await (0, eddsaMPCv2_1.signEddsaMpcV2RecoveryTx)({
|
|
308
|
+
message,
|
|
309
|
+
userKey,
|
|
310
|
+
backupKey,
|
|
311
|
+
walletPassphrase,
|
|
312
|
+
bitgoKey: result.keys.commonKeychain,
|
|
313
|
+
derivationPath,
|
|
314
|
+
});
|
|
315
|
+
const derivedKeychain = mpc.deriveUnhardened(result.keys.commonKeychain, derivationPath);
|
|
316
|
+
const publicKeyBytes = Buffer.from(derivedKeychain.slice(0, 64), 'hex');
|
|
317
|
+
assert_1.default.strictEqual(ed25519_1.ed25519.verify(new Uint8Array(signature), new Uint8Array(message), new Uint8Array(publicKeyBytes)), true);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
it('derives the ed25519Multisig triplet at the BIP44 path', async () => {
|
|
321
|
+
const STRKEY_SEED = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
|
|
322
|
+
const backupChainCode = Buffer.alloc(32, 0xab);
|
|
323
|
+
// Distinct BitGo root + chain code: if the BitGo composite were derived from the backup root, the
|
|
324
|
+
// backup child and the BitGo child would be the same key and a slot swap would pass every golden.
|
|
325
|
+
const bitgoSeed = Buffer.alloc(32, 0x22);
|
|
326
|
+
const bitgoRootPub = Buffer.from(ed25519_1.ed25519.getPublicKey(bitgoSeed));
|
|
327
|
+
const bitgoChainCode = Buffer.alloc(32, 0xcd);
|
|
328
|
+
const ed25519Roots = {
|
|
329
|
+
...roots,
|
|
330
|
+
ed25519Multisig: {
|
|
331
|
+
user: STRKEY_SEED,
|
|
332
|
+
backup: { prv: STRKEY_SEED, chainCode: (0, src_1.encodeEd25519ChainCode)(backupChainCode) },
|
|
333
|
+
bitgo: (0, src_1.encodeDerivableEd25519Pub)(bitgoRootPub, bitgoChainCode),
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
const result = await (0, recovery_1.deriveSafeWalletKeys)({
|
|
337
|
+
coin: 'algo',
|
|
338
|
+
slot: 'ed25519Multisig',
|
|
339
|
+
account: 0,
|
|
340
|
+
roots: ed25519Roots,
|
|
341
|
+
});
|
|
342
|
+
if (result.slot !== 'ed25519Multisig') {
|
|
343
|
+
throw new Error('expected ed25519Multisig slot');
|
|
344
|
+
}
|
|
345
|
+
result.path.should.equal("m/44'/283'/2'/0'");
|
|
346
|
+
// user: hardened SLIP-0010 child, pinned to the leaf's golden vector
|
|
347
|
+
result.keys.user.kind.should.equal('seed');
|
|
348
|
+
result.keys.user.seed.should.equal('be69531ebbab851b69aa41bb9c905afed52d26ff4278e6418609d4d60570510c');
|
|
349
|
+
result.keys.user.pub.should.equal(Buffer.from(ed25519_1.ed25519.getPublicKey(Buffer.from(result.keys.user.seed, 'hex'))).toString('hex'));
|
|
350
|
+
// backup: extended key whose public half equals the public soft-derive of root pub ‖ chain code
|
|
351
|
+
const bitgoPub = (await (0, src_1.softDeriveChildPubEd25519AtPath)(ed25519Roots.ed25519Multisig.bitgo, 'm/44/283/2/0')).toString('hex');
|
|
352
|
+
result.keys.backup.kind.should.equal('extended');
|
|
353
|
+
// Pin the private halves to the cross-repo GV1 golden vector for this path.
|
|
354
|
+
const algoSoft = bip44Fixture.ed25519Soft.vectors.find((v) => v.path === 'm/44/283/2/0');
|
|
355
|
+
if (algoSoft === undefined) {
|
|
356
|
+
throw new Error('fixture is missing the m/44/283/2/0 soft co-signer vector');
|
|
357
|
+
}
|
|
358
|
+
result.keys.backup.kL.should.equal(algoSoft.childKLHex);
|
|
359
|
+
result.keys.backup.kR.should.equal(algoSoft.childKRHex);
|
|
360
|
+
// With distinct roots the three children are provably distinct, so a slot swap cannot sneak through.
|
|
361
|
+
result.keys.user.pub.should.not.equal(result.keys.backup.pub);
|
|
362
|
+
result.keys.backup.pub.should.not.equal(result.keys.bitgo.pub);
|
|
363
|
+
result.keys.bitgo.pub.should.equal(bitgoPub);
|
|
364
|
+
});
|
|
365
|
+
it('rejects a non-integer account', async () => {
|
|
366
|
+
await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 1.5, roots }).should.be.rejectedWith(/invalid account/);
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
describe('buildSafeRecoverKeyParams', () => {
|
|
370
|
+
afterEach(() => {
|
|
371
|
+
sinon.restore();
|
|
372
|
+
});
|
|
373
|
+
const userRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'));
|
|
374
|
+
const backupRoot = utxo_lib_1.bip32.fromSeed(Buffer.from('1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100', 'hex'));
|
|
375
|
+
const bitgoRoot = utxo_lib_1.bip32
|
|
376
|
+
.fromSeed(Buffer.from('2f2e2d2c2b2a292827262524232221201f1e1d1c1b1a19181716151413121110', 'hex'))
|
|
377
|
+
.neutered();
|
|
378
|
+
const keys = {
|
|
379
|
+
user: { prv: userRoot.toBase58(), pub: userRoot.neutered().toBase58() },
|
|
380
|
+
backup: { prv: backupRoot.toBase58(), pub: backupRoot.neutered().toBase58() },
|
|
381
|
+
bitgo: { pub: bitgoRoot.toBase58() },
|
|
382
|
+
};
|
|
383
|
+
it('signed mode re-encrypts child xprvs under a single ephemeral passphrase', async () => {
|
|
384
|
+
const passphrases = [];
|
|
385
|
+
const encrypt = sinon.stub().callsFake(async ({ input, password, encryptionVersion }) => {
|
|
386
|
+
passphrases.push(password);
|
|
387
|
+
encryptionVersion.should.equal(1);
|
|
388
|
+
return `enc(${input})`;
|
|
389
|
+
});
|
|
390
|
+
const bitgo = { encrypt };
|
|
391
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
392
|
+
bitgo,
|
|
393
|
+
coin: 'btc',
|
|
394
|
+
slot: 'secp256k1Multisig',
|
|
395
|
+
keys,
|
|
396
|
+
mode: 'signed',
|
|
397
|
+
});
|
|
398
|
+
result.userKey.should.equal(`enc(${keys.user.prv})`);
|
|
399
|
+
result.backupKey.should.equal(`enc(${keys.backup.prv})`);
|
|
400
|
+
result.bitgoKey.should.equal(keys.bitgo.pub);
|
|
401
|
+
result.walletPassphrase.should.be.a.String();
|
|
402
|
+
passphrases.should.have.length(2);
|
|
403
|
+
passphrases[0].should.equal(passphrases[1]);
|
|
404
|
+
passphrases[0].should.equal(result.walletPassphrase);
|
|
405
|
+
encrypt.callCount.should.equal(2);
|
|
406
|
+
});
|
|
407
|
+
it('rejects non-private child keys in signed mode', async () => {
|
|
408
|
+
const bitgo = { encrypt: sinon.stub() };
|
|
409
|
+
await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
410
|
+
bitgo,
|
|
411
|
+
coin: 'btc',
|
|
412
|
+
slot: 'secp256k1Multisig',
|
|
413
|
+
keys: { user: { prv: keys.user.pub, pub: keys.user.pub }, backup: keys.backup, bitgo: keys.bitgo },
|
|
414
|
+
mode: 'signed',
|
|
415
|
+
}).should.be.rejectedWith(/must be private xprvs/);
|
|
416
|
+
});
|
|
417
|
+
it('unsigned mode returns pubs and never encrypts', async () => {
|
|
418
|
+
const encrypt = sinon.stub().callsFake(async () => {
|
|
419
|
+
throw new Error('encrypt should not be called');
|
|
420
|
+
});
|
|
421
|
+
const bitgo = { encrypt };
|
|
422
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
423
|
+
bitgo,
|
|
424
|
+
coin: 'btc',
|
|
425
|
+
slot: 'secp256k1Multisig',
|
|
426
|
+
keys,
|
|
427
|
+
mode: 'unsigned',
|
|
428
|
+
});
|
|
429
|
+
result.userKey.should.equal(keys.user.pub);
|
|
430
|
+
result.backupKey.should.equal(keys.backup.pub);
|
|
431
|
+
result.bitgoKey.should.equal(keys.bitgo.pub);
|
|
432
|
+
result.should.not.have.property('walletPassphrase');
|
|
433
|
+
encrypt.callCount.should.equal(0);
|
|
434
|
+
});
|
|
435
|
+
it('rejects unsupported slots', async () => {
|
|
436
|
+
const bitgo = { encrypt: sinon.stub() };
|
|
437
|
+
await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
438
|
+
bitgo,
|
|
439
|
+
coin: 'btc',
|
|
440
|
+
slot: 'eddsaMpc',
|
|
441
|
+
keys: { commonKeychain: 'ck', user: 'u', backup: 'b' },
|
|
442
|
+
mode: 'signed',
|
|
443
|
+
}).should.be.rejectedWith(/not supported yet/);
|
|
444
|
+
});
|
|
445
|
+
describe('ed25519Multisig', () => {
|
|
446
|
+
// Golden vectors generated with algosdk: encodeAddress(Buffer.alloc(32, n)) and
|
|
447
|
+
// multisigAddress({ version: 1, threshold: 2, addrs: [...] }) over the same pubs.
|
|
448
|
+
const edKeys = {
|
|
449
|
+
user: { kind: 'seed', seed: '11'.repeat(32), pub: '21'.repeat(32) },
|
|
450
|
+
backup: { kind: 'extended', kL: '31'.repeat(32), kR: '41'.repeat(32), pub: '51'.repeat(32) },
|
|
451
|
+
bitgo: { pub: '61'.repeat(32) },
|
|
452
|
+
};
|
|
453
|
+
it('unsigned mode returns ALGO addresses and the multisig rootAddress, and never encrypts', async () => {
|
|
454
|
+
const encrypt = sinon.stub().callsFake(async () => {
|
|
455
|
+
throw new Error('encrypt should not be called');
|
|
456
|
+
});
|
|
457
|
+
const bitgo = { encrypt };
|
|
458
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
459
|
+
bitgo,
|
|
460
|
+
coin: 'algo',
|
|
461
|
+
slot: 'ed25519Multisig',
|
|
462
|
+
keys: edKeys,
|
|
463
|
+
mode: 'unsigned',
|
|
464
|
+
});
|
|
465
|
+
if (result.slot !== 'ed25519Multisig' || result.mode !== 'unsigned') {
|
|
466
|
+
throw new Error('expected unsigned ed25519Multisig key params');
|
|
467
|
+
}
|
|
468
|
+
result.userKey.should.equal('EEQSCIJBEEQSCIJBEEQSCIJBEEQSCIJBEEQSCIJBEEQSCIJBEEQYNI53HM');
|
|
469
|
+
result.backupKey.should.equal('KFIVCUKRKFIVCUKRKFIVCUKRKFIVCUKRKFIVCUKRKFIVCUKRKFI33B3AOY');
|
|
470
|
+
result.bitgoKey.should.equal('MFQWCYLBMFQWCYLBMFQWCYLBMFQWCYLBMFQWCYLBMFQWCYLBMFQS3KHEHM');
|
|
471
|
+
(0, assert_1.default)(result.rootAddress);
|
|
472
|
+
result.rootAddress.should.equal('LHWEIOU2UIPSKCZ3XMKQUKRYY3FM6XTZKBHDMIU737OQQEXQTYSGDFOHDM');
|
|
473
|
+
result.userKey.should.match(/^[A-Z2-7]{58}$/);
|
|
474
|
+
result.should.not.have.property('walletPassphrase');
|
|
475
|
+
result.should.not.have.property('externalBackupSigner');
|
|
476
|
+
encrypt.callCount.should.equal(0);
|
|
477
|
+
});
|
|
478
|
+
it('signed mode encrypts the 58-char seed and returns a lazy external backup signer', async () => {
|
|
479
|
+
// Real derivation output, with a distinct BitGo root so the backup child and the BitGo child
|
|
480
|
+
// are different keys — a slot swap between them must change the outputs.
|
|
481
|
+
const STRKEY_SEED = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
|
|
482
|
+
const backupChainCode = Buffer.alloc(32, 0xab);
|
|
483
|
+
const bitgoSeed = Buffer.alloc(32, 0x22);
|
|
484
|
+
const bitgoRootPub = Buffer.from(ed25519_1.ed25519.getPublicKey(bitgoSeed));
|
|
485
|
+
const bitgoChainCode = Buffer.alloc(32, 0xcd);
|
|
486
|
+
const ed25519Roots = {
|
|
487
|
+
...makeRoots({ user: 'x', backup: 'y', bitgo: 'z' }),
|
|
488
|
+
ed25519Multisig: {
|
|
489
|
+
user: STRKEY_SEED,
|
|
490
|
+
backup: { prv: STRKEY_SEED, chainCode: (0, src_1.encodeEd25519ChainCode)(backupChainCode) },
|
|
491
|
+
bitgo: (0, src_1.encodeDerivableEd25519Pub)(bitgoRootPub, bitgoChainCode),
|
|
492
|
+
},
|
|
493
|
+
};
|
|
494
|
+
const derived = await (0, recovery_1.deriveSafeWalletKeys)({
|
|
495
|
+
coin: 'algo',
|
|
496
|
+
slot: 'ed25519Multisig',
|
|
497
|
+
account: 0,
|
|
498
|
+
roots: ed25519Roots,
|
|
499
|
+
});
|
|
500
|
+
if (derived.slot !== 'ed25519Multisig') {
|
|
501
|
+
throw new Error('expected ed25519Multisig slot');
|
|
502
|
+
}
|
|
503
|
+
const passphrases = [];
|
|
504
|
+
const encrypt = sinon.stub().callsFake(async ({ input, password, encryptionVersion }) => {
|
|
505
|
+
passphrases.push(password);
|
|
506
|
+
encryptionVersion.should.equal(1);
|
|
507
|
+
return `enc(${input})`;
|
|
508
|
+
});
|
|
509
|
+
const bitgo = { encrypt };
|
|
510
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
511
|
+
bitgo,
|
|
512
|
+
coin: 'talgo',
|
|
513
|
+
slot: 'ed25519Multisig',
|
|
514
|
+
keys: derived.keys,
|
|
515
|
+
mode: 'signed',
|
|
516
|
+
});
|
|
517
|
+
if (result.slot !== 'ed25519Multisig' || result.mode !== 'signed') {
|
|
518
|
+
throw new Error('expected signed ed25519Multisig key params');
|
|
519
|
+
}
|
|
520
|
+
derived.keys.user.pub.should.not.equal(derived.keys.backup.pub);
|
|
521
|
+
derived.keys.backup.pub.should.not.equal(derived.keys.bitgo.pub);
|
|
522
|
+
// user seed re-encoded as the 58-char ALGO seed before encryption; no backupKey — the
|
|
523
|
+
// seedless backup child only exists as the lazy signer.
|
|
524
|
+
result.userKey.should.equal(`enc(${(0, src_1.encodeAlgoKey)(Buffer.from(derived.keys.user.seed, 'hex'))})`);
|
|
525
|
+
result.should.not.have.property('backupKey');
|
|
526
|
+
result.bitgoKey.should.equal((0, src_1.encodeAlgoKey)(Buffer.from(derived.keys.bitgo.pub, 'hex')));
|
|
527
|
+
result.bitgoKey.should.match(/^[A-Z2-7]{58}$/);
|
|
528
|
+
// The wallet's on-chain address over the three distinct children, in wallet-creation order.
|
|
529
|
+
(0, assert_1.default)(result.rootAddress);
|
|
530
|
+
result.rootAddress.should.equal((0, src_1.algoMultisigAddress)(1, 2, [
|
|
531
|
+
Buffer.from(derived.keys.user.pub, 'hex'),
|
|
532
|
+
Buffer.from(derived.keys.backup.pub, 'hex'),
|
|
533
|
+
Buffer.from(derived.keys.bitgo.pub, 'hex'),
|
|
534
|
+
]));
|
|
535
|
+
result.rootAddress.should.match(/^[A-Z2-7]{58}$/);
|
|
536
|
+
result.walletPassphrase.should.be.a.String();
|
|
537
|
+
passphrases.should.have.length(1);
|
|
538
|
+
passphrases[0].should.equal(result.walletPassphrase);
|
|
539
|
+
encrypt.callCount.should.equal(1);
|
|
540
|
+
// the lazy signer signs with the real extended key halves and its pub matches the backup child
|
|
541
|
+
result.externalBackupSigner.publicKey.should.equal(derived.keys.backup.pub);
|
|
542
|
+
const message = Buffer.from('deadbeef', 'hex');
|
|
543
|
+
const { signature } = await result.externalBackupSigner.sign(message);
|
|
544
|
+
signature.should.match(/^[0-9a-f]{128}$/);
|
|
545
|
+
ed25519_1.ed25519
|
|
546
|
+
.verify(new Uint8Array(Buffer.from(signature, 'hex')), new Uint8Array(message), new Uint8Array(Buffer.from(result.externalBackupSigner.publicKey, 'hex')))
|
|
547
|
+
.should.equal(true);
|
|
548
|
+
});
|
|
549
|
+
for (const coin of ['hbar', 'thbar']) {
|
|
550
|
+
for (const mode of ['signed', 'unsigned']) {
|
|
551
|
+
it(`${coin} ${mode} mode encodes Hedera keys without overwriting the caller's rootAddress`, async () => {
|
|
552
|
+
const encrypt = sinon.stub().callsFake(async ({ input }) => `enc(${input})`);
|
|
553
|
+
const bitgo = { encrypt };
|
|
554
|
+
const result = await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
555
|
+
bitgo,
|
|
556
|
+
coin,
|
|
557
|
+
slot: 'ed25519Multisig',
|
|
558
|
+
keys: edKeys,
|
|
559
|
+
mode,
|
|
560
|
+
});
|
|
561
|
+
(0, assert_1.default)(!('rootAddress' in result));
|
|
562
|
+
const rootAddress = '0.0.12345';
|
|
563
|
+
assert_1.default.strictEqual({ rootAddress, ...result }.rootAddress, rootAddress);
|
|
564
|
+
result.bitgoKey.should.equal('302a300506032b6570032100' + edKeys.bitgo.pub);
|
|
565
|
+
if (result.mode === 'unsigned') {
|
|
566
|
+
result.userKey.should.equal('302a300506032b6570032100' + edKeys.user.pub);
|
|
567
|
+
result.backupKey.should.equal('302a300506032b6570032100' + edKeys.backup.pub);
|
|
568
|
+
result.should.not.have.property('walletPassphrase');
|
|
569
|
+
result.should.not.have.property('externalBackupSigner');
|
|
570
|
+
sinon.assert.notCalled(encrypt);
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
const encodedSeed = '302e020100300506032b657004220420' + edKeys.user.seed;
|
|
574
|
+
result.userKey.should.equal(`enc(${encodedSeed})`);
|
|
575
|
+
result.should.not.have.property('backupKey');
|
|
576
|
+
result.externalBackupSigner.publicKey.should.equal(edKeys.backup.pub);
|
|
577
|
+
result.walletPassphrase.should.match(/^[0-9a-f]{64}$/);
|
|
578
|
+
sinon.assert.calledOnce(encrypt);
|
|
579
|
+
sinon.assert.calledWithExactly(encrypt, {
|
|
580
|
+
input: encodedSeed,
|
|
581
|
+
password: result.walletPassphrase,
|
|
582
|
+
encryptionVersion: 1,
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
it('rejects slot-2 coins that have no registry entry yet', async () => {
|
|
589
|
+
const bitgo = { encrypt: sinon.stub() };
|
|
590
|
+
await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
591
|
+
bitgo,
|
|
592
|
+
coin: 'xlm',
|
|
593
|
+
slot: 'ed25519Multisig',
|
|
594
|
+
keys: edKeys,
|
|
595
|
+
mode: 'signed',
|
|
596
|
+
}).should.be.rejectedWith(/coin 'xlm' ed25519Multisig is not supported yet/);
|
|
597
|
+
});
|
|
598
|
+
it('rejects ed25519 children with malformed public keys', async () => {
|
|
599
|
+
const bitgo = { encrypt: sinon.stub() };
|
|
600
|
+
await (0, recovery_1.buildSafeRecoverKeyParams)({
|
|
601
|
+
bitgo,
|
|
602
|
+
coin: 'algo',
|
|
603
|
+
slot: 'ed25519Multisig',
|
|
604
|
+
keys: { ...edKeys, bitgo: { pub: '1234' } },
|
|
605
|
+
mode: 'unsigned',
|
|
606
|
+
}).should.be.rejectedWith(/ed25519 child public keys must be 32 bytes/);
|
|
607
|
+
});
|
|
608
|
+
});
|
|
609
|
+
});
|
|
610
|
+
describe('Safe ecdsaMpc derive → sign (gate)', function () {
|
|
611
|
+
it('derives a child, rebuilds 2-of-2 shares, and signs a message verified at m/0', async function () {
|
|
612
|
+
const [userDkg, backupDkg] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
|
|
613
|
+
const [vrfUser, vrfBackup] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
|
|
614
|
+
const rootCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userDkg.getKeyShare());
|
|
615
|
+
const { commonKeychain, userChild, backupChild } = await sdk_lib_mpc_1.DklsVrfUtils.deriveSafeEcdsaMpcChild({
|
|
616
|
+
userRoot: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
|
|
617
|
+
backupRoot: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
|
|
618
|
+
account: 0,
|
|
619
|
+
coinType: 60,
|
|
620
|
+
safeSlotOrdinal: 3,
|
|
621
|
+
});
|
|
622
|
+
// The derived child must never be the root (the "root envelope in the child position" footgun).
|
|
623
|
+
commonKeychain.should.not.equal(rootCommonKeychain);
|
|
624
|
+
// Rebuild 2-of-2 keyshares from the derived reduced CBOR, exactly as the signer's retrofit does.
|
|
625
|
+
const toRetrofit = (b64) => {
|
|
626
|
+
const reduced = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(Buffer.from(b64, 'base64'));
|
|
627
|
+
return {
|
|
628
|
+
xShare: {
|
|
629
|
+
x: Buffer.from(reduced.prv).toString('hex'),
|
|
630
|
+
y: Buffer.from(reduced.pub).toString('hex'),
|
|
631
|
+
chaincode: Buffer.from(reduced.rootChainCode).toString('hex'),
|
|
632
|
+
},
|
|
633
|
+
xiList: reduced.xList.slice(0, 2),
|
|
634
|
+
};
|
|
635
|
+
};
|
|
636
|
+
const [user2of2, backup2of2] = await sdk_lib_mpc_1.DklsUtils.generate2of2KeyShares(toRetrofit(userChild), toRetrofit(backupChild));
|
|
637
|
+
const messageHash = Buffer.from('0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', 'hex');
|
|
638
|
+
const userDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(user2of2.getKeyShare(), 0, 'm/0', messageHash);
|
|
639
|
+
const backupDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(backup2of2.getKeyShare(), 1, 'm/0', messageHash);
|
|
640
|
+
const signatureString = sdk_lib_mpc_1.DklsUtils.verifyAndConvertDklsSignature(messageHash, (await sdk_lib_mpc_1.DklsUtils.executeTillRound(5, userDsg, backupDsg)), commonKeychain, 'm/0', undefined, false);
|
|
641
|
+
// verifyAndConvertDklsSignature recovers the pubkey from the signature and checks it against
|
|
642
|
+
// deriveUnhardened(childCK, 'm/0'); it throws on mismatch, so a returned string is proof.
|
|
643
|
+
signatureString.should.be.a.String();
|
|
644
|
+
signatureString.should.match(/^\d+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+$/);
|
|
645
|
+
});
|
|
646
|
+
});
|
|
647
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIsNkNBQStCO0FBQy9CLG1EQUE2QztBQUM3QyxtREFBZ0Q7QUFDaEQsdURBQXlDO0FBQ3pDLHlEQUF1SDtBQUN2SCx1RkFBNEY7QUFDNUYseURBQXNFO0FBQ3RFLGtFQUs2QztBQUM3Qyx5Q0FNeUI7QUFFekIsaUVBQWtGO0FBQ2xGLGlGQUE0RjtBQUU1RiwrRkFBK0Y7QUFDL0YsMERBQTBEO0FBQzFELCtFQUFpRTtBQUVqRSxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUM7QUFFakMsU0FBUyxhQUFhLENBQUMsV0FBb0U7SUFDekYsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUEyQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDcEYsQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0hBQWdIO0FBQ2hILFNBQVMsY0FBYyxDQUFDLE9BQStCO0lBQ3JELE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzdCLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxT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S0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkYsTUFBTSxlQUFlLEdBQUcsdUJBQVMsQ0FBQyw2QkFBNkIsQ0FDN0QsV0FBVyxFQUNYLENBQUMsTUFBTSx1QkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQXdDLEVBQ2hHLGNBQWMsRUFDZCxLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFDO1FBRUYsNkZBQTZGO1FBQzdGLDBGQUEwRjtRQUMxRixlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBlZDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvLWJldGEvc2pjbCc7XG5pbXBvcnQgeyBEa2xzRHNnLCBEa2xzVHlwZXMsIERrbHNVdGlscywgRGtsc1ZyZlV0aWxzLCBNUFNVdGlsLCBNcHNEZXJpdmUsIE1wc1ZyZlV0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcbmltcG9ydCB7IEluY29ycmVjdFBhc3N3b3JkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vZXJyb3JzJztcbmltcG9ydCB7XG4gIERlY3J5cHRlZFNhZmVSb290cyxcbiAgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyxcbiAgZGVjcnlwdFNhZmVLZXljYXJkLFxuICBkZXJpdmVTYWZlV2FsbGV0S2V5cyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3NhZmUvcmVjb3ZlcnknO1xuaW1wb3J0IHtcbiAgYWxnb011bHRpc2lnQWRkcmVzcyxcbiAgZW5jb2RlQWxnb0tleSxcbiAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZW5jb2RlRWQyNTUxOUNoYWluQ29kZSxcbiAgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOUF0UGF0aCxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby90c3MvZWRkc2EvZWRkc2EnO1xuaW1wb3J0IHsgc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9lZGRzYS9lZGRzYU1QQ3YyJztcblxuLy8gVGhlIGVkMjU1MTkgc29mdCBjby1zaWduZXIgcHJpdmF0ZSBoYWx2ZXMgYXNzZXJ0ZWQgYmVsb3cgYXJlIHBpbm5lZCBjcm9zcy1yZXBvIGluIHRoZSBzaGFyZWRcbi8vIEdWMSBmaXh0dXJlIChieXRlLWlkZW50aWNhbCB0byB3YWxsZXQtcGxhdGZvcm0ncyBjb3B5KS5cbmltcG9ydCAqIGFzIGJpcDQ0Rml4dHVyZSBmcm9tICcuL2ZpeHR1cmVzL3NhZmVCaXA0NFZlY3RvcnMuanNvbic7XG5cbmNvbnN0IFBBU1NXT1JEID0gJ3NhZmUtcGFzc3dvcmQnO1xuXG5mdW5jdGlvbiBtYWtlTW9ja0JpdEdvKGRlY3J5cHRJbXBsOiAocGFyYW1zOiB7IHBhc3N3b3JkOiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gc3RyaW5nKTogQml0R29CYXNlIHtcbiAgcmV0dXJuIHtcbiAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jIChwYXJhbXM6IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBkZWNyeXB0SW1wbChwYXJhbXMpKSxcbiAgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbn1cblxuLyoqIEEgZmFrZSBkZWNyeXB0IHRoYXQgb25seSByZWNvZ25pemVzIHRoZSB1c2VyL2JhY2t1cCB0b2tlbnM7IGFueSBvdGhlciBpbnB1dCAoZS5nLiBhIEJveCBDIHB1YmxpYykgdGhyb3dzLiAqL1xuZnVuY3Rpb24gbWFrZURlY3J5cHRNYXAoZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IChwYXJhbXM6IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBzdHJpbmcge1xuICByZXR1cm4gKHsgcGFzc3dvcmQsIGlucHV0IH0pID0+IHtcbiAgICBwYXNzd29yZC5zaG91bGQuZXF1YWwoUEFTU1dPUkQpO1xuICAgIGlmICghKGlucHV0IGluIGVudHJpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgZGVjcnlwdCBpbnB1dDogJHtpbnB1dH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXNbaW5wdXRdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBib3godmFsdWVzOiB7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBzdHJpbmc7XG4gIGVkMjU1MTlNdWx0aXNpZzogc3RyaW5nIHwgeyBwcnY6IHN0cmluZzsgY2hhaW5Db2RlOiBzdHJpbmcgfTtcbiAgZWNkc2FNcGM6IHN0cmluZztcbiAgZWRkc2FNcGM6IHN0cmluZztcbn0pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWVzKTtcbn1cblxuZGVzY3JpYmUoJ2RlY3J5cHRTYWZlS2V5Y2FyZCcsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdkZWNyeXB0cyBvbmNoYWluIHJvb3RzIHRvIHN0cmluZ3MgYW5kIHJldHVybnMgQm94IEMgdmVyYmF0aW0nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXNlckJveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2VuYy11c2VyLXNlY3AnLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAnZW5jLXVzZXItZWQyNTUxOScsXG4gICAgICBlY2RzYU1wYzogJ2VuYy11c2VyLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLXVzZXItZWRkc2EnLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEJveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2VuYy1iYWNrdXAtc2VjcCcsXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6IHsgcHJ2OiAnZW5jLWJhY2t1cC1lZDI1NTE5JywgY2hhaW5Db2RlOiAnQycucmVwZWF0KDUyKSB9LFxuICAgICAgZWNkc2FNcGM6ICdlbmMtYmFja3VwLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLWJhY2t1cC1lZGRzYScsXG4gICAgfSk7XG4gICAgY29uc3QgYml0Z29Cb3ggPSBib3goe1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICd4cHViLXNlY3AtYml0Z28nLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAncHViLWVkMjU1MTktYml0Z28nLFxuICAgICAgZWNkc2FNcGM6ICdjb21tb24tZWNkc2EtYml0Z28nLFxuICAgICAgZWRkc2FNcGM6ICdjb21tb24tZWRkc2EtYml0Z28nLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbXBjVXNlciA9IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyhcbiAgICAgIEJ1ZmZlci5mcm9tKCd1c2VyLXNpZ25pbmcnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCd1c2VyLXJlZHVjZWQnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCd1c2VyLXZyZicpXG4gICAgKTtcbiAgICBjb25zdCBtcGNCYWNrdXAgPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBCdWZmZXIuZnJvbSgnYmFja3VwLXNpZ25pbmcnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCdiYWNrdXAtcmVkdWNlZCcpLFxuICAgICAgQnVmZmVyLmZyb20oJ2JhY2t1cC12cmYnKVxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oXG4gICAgICBtYWtlRGVjcnlwdE1hcCh7XG4gICAgICAgICdlbmMtdXNlci1zZWNwJzogJ3hwcnYtdXNlcicsXG4gICAgICAgICdlbmMtYmFja3VwLXNlY3AnOiAneHBydi1iYWNrdXAnLFxuICAgICAgICAnZW5jLXVzZXItZWQyNTUxOSc6ICdTLXVzZXItc2VlZCcsXG4gICAgICAgICdlbmMtYmFja3VwLWVkMjU1MTknOiAnUy1iYWNrdXAtc2VlZCcsXG4gICAgICAgICdlbmMtdXNlci1lY2RzYSc6IG1wY1VzZXIucmVkdWNlZEVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgJ2VuYy1iYWNrdXAtZWNkc2EnOiBtcGNCYWNrdXAucmVkdWNlZEVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgJ2VuYy11c2VyLWVkZHNhJzogbXBjVXNlci5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAnZW5jLWJhY2t1cC1lZGRzYSc6IG1wY0JhY2t1cC5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdFNhZmVLZXljYXJkKHtcbiAgICAgIGJpdGdvLFxuICAgICAgdXNlcktleUJveDogdXNlckJveCxcbiAgICAgIGJhY2t1cEtleUJveDogYmFja3VwQm94LFxuICAgICAgYml0Z29LZXlCb3g6IGJpdGdvQm94LFxuICAgICAgcGFzc3dvcmQ6IFBBU1NXT1JELFxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnNlY3AyNTZrMU11bHRpc2lnLnVzZXIuc2hvdWxkLmVxdWFsKCd4cHJ2LXVzZXInKTtcbiAgICByZXN1bHQuc2VjcDI1NmsxTXVsdGlzaWcuYmFja3VwLnNob3VsZC5lcXVhbCgneHBydi1iYWNrdXAnKTtcbiAgICByZXN1bHQuc2VjcDI1NmsxTXVsdGlzaWcuYml0Z28uc2hvdWxkLmVxdWFsKCd4cHViLXNlY3AtYml0Z28nKTtcblxuICAgIHJlc3VsdC5lZDI1NTE5TXVsdGlzaWcudXNlci5zaG91bGQuZXF1YWwoJ1MtdXNlci1zZWVkJyk7XG4gICAgcmVzdWx0LmVkMjU1MTlNdWx0aXNpZy5iYWNrdXAucHJ2LnNob3VsZC5lcXVhbCgnUy1iYWNrdXAtc2VlZCcpO1xuICAgIHJlc3VsdC5lZDI1NTE5TXVsdGlzaWcuYmFja3VwLmNoYWluQ29kZS5zaG91bGQuZXF1YWwoJ0MnLnJlcGVhdCg1MikpO1xuICAgIHJlc3VsdC5lZDI1NTE5TXVsdGlzaWcuYml0Z28uc2hvdWxkLmVxdWFsKCdwdWItZWQyNTUxOS1iaXRnbycpO1xuXG4gICAgcmVzdWx0LmVjZHNhTXBjLnVzZXIuc2lnbmluZy50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCd1c2VyLXJlZHVjZWQnKS50b1N0cmluZygnaGV4JykpO1xuICAgIHJlc3VsdC5lY2RzYU1wYy51c2VyLnZyZi50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCd1c2VyLXZyZicpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgcmVzdWx0LmVjZHNhTXBjLmJhY2t1cC5zaWduaW5nLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oJ2JhY2t1cC1yZWR1Y2VkJykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICByZXN1bHQuZWNkc2FNcGMuYmFja3VwLnZyZi50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCdiYWNrdXAtdnJmJykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICByZXN1bHQuZWNkc2FNcGMuYml0Z28uc2hvdWxkLmVxdWFsKCdjb21tb24tZWNkc2EtYml0Z28nKTtcblxuICAgIHJlc3VsdC5lZGRzYU1wYy5iaXRnby5zaG91bGQuZXF1YWwoJ2NvbW1vbi1lZGRzYS1iaXRnbycpO1xuXG4gICAgLy8gNCBzbG90cyDDlyAodXNlciArIGJhY2t1cCkgPSA4IGRlY3J5cHRzOyBCaXRHbyAoQm94IEMpIGlzIG5ldmVyIGRlY3J5cHRlZC5cbiAgICAoYml0Z28uZGVjcnlwdCBhcyBzaW5vbi5TaW5vblN0dWIpLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoOCk7XG4gIH0pO1xuXG4gIGl0KCdkZWNyeXB0cyB0aGUgc2VlZCBmcm9tIGFuIG9iamVjdC1mb3JtIGVkMjU1MTlNdWx0aXNpZyBiYWNrdXAgZW50cnknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXNlckJveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2VuYy11c2VyLXNlY3AnLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAnZW5jLXVzZXItZWQyNTUxOScsXG4gICAgICBlY2RzYU1wYzogJ2VuYy11c2VyLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLXVzZXItZWRkc2EnLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEJveCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHNlY3AyNTZrMU11bHRpc2lnOiAnZW5jLWJhY2t1cC1zZWNwJyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogeyBwcnY6ICdlbmMtYmFja3VwLWVkMjU1MTknLCBjaGFpbkNvZGU6ICdBJy5yZXBlYXQoNTIpIH0sXG4gICAgICBlY2RzYU1wYzogJ2VuYy1iYWNrdXAtZWNkc2EnLFxuICAgICAgZWRkc2FNcGM6ICdlbmMtYmFja3VwLWVkZHNhJyxcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnb0JveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ3hwdWItc2VjcC1iaXRnbycsXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6ICdwdWItZWQyNTUxOS1iaXRnbycsXG4gICAgICBlY2RzYU1wYzogJ2NvbW1vbi1lY2RzYS1iaXRnbycsXG4gICAgICBlZGRzYU1wYzogJ2NvbW1vbi1lZGRzYS1iaXRnbycsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtcGNVc2VyID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgQnVmZmVyLmZyb20oJ3VzZXItc2lnbmluZycpLFxuICAgICAgQnVmZmVyLmZyb20oJ3VzZXItcmVkdWNlZCcpLFxuICAgICAgQnVmZmVyLmZyb20oJ3VzZXItdnJmJylcbiAgICApO1xuICAgIGNvbnN0IG1wY0JhY2t1cCA9IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyhcbiAgICAgIEJ1ZmZlci5mcm9tKCdiYWNrdXAtc2lnbmluZycpLFxuICAgICAgQnVmZmVyLmZyb20oJ2JhY2t1cC1yZWR1Y2VkJyksXG4gICAgICBCdWZmZXIuZnJvbSgnYmFja3VwLXZyZicpXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbyhcbiAgICAgIG1ha2VEZWNyeXB0TWFwKHtcbiAgICAgICAgJ2VuYy11c2VyLXNlY3AnOiAneHBydi11c2VyJyxcbiAgICAgICAgJ2VuYy1iYWNrdXAtc2VjcCc6ICd4cHJ2LWJhY2t1cCcsXG4gICAgICAgICdlbmMtdXNlci1lZDI1NTE5JzogJ1MtdXNlci1zZWVkJyxcbiAgICAgICAgJ2VuYy1iYWNrdXAtZWQyNTUxOSc6ICdTLWJhY2t1cC1zZWVkJyxcbiAgICAgICAgJ2VuYy11c2VyLWVjZHNhJzogbXBjVXNlci5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAnZW5jLWJhY2t1cC1lY2RzYSc6IG1wY0JhY2t1cC5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAnZW5jLXVzZXItZWRkc2EnOiBtcGNVc2VyLnJlZHVjZWRFbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICdlbmMtYmFja3VwLWVkZHNhJzogbXBjQmFja3VwLnJlZHVjZWRFbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWNyeXB0U2FmZUtleWNhcmQoe1xuICAgICAgYml0Z28sXG4gICAgICB1c2VyS2V5Qm94OiB1c2VyQm94LFxuICAgICAgYmFja3VwS2V5Qm94OiBiYWNrdXBCb3gsXG4gICAgICBiaXRnb0tleUJveDogYml0Z29Cb3gsXG4gICAgICBwYXNzd29yZDogUEFTU1dPUkQsXG4gICAgfSk7XG5cbiAgICByZXN1bHQuZWQyNTUxOU11bHRpc2lnLmJhY2t1cC5wcnYuc2hvdWxkLmVxdWFsKCdTLWJhY2t1cC1zZWVkJyk7XG4gICAgcmVzdWx0LmVkMjU1MTlNdWx0aXNpZy5iYWNrdXAuY2hhaW5Db2RlLnNob3VsZC5lcXVhbCgnQScucmVwZWF0KDUyKSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGFuIGVkMjU1MTkgY2hhaW4tY29kZSBlbnRyeSBpbiBhIG5vbi1iYWNrdXAgc2xvdCAoZmFpbCBjbG9zZWQpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVzZXJCb3ggPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogeyBwcnY6ICdlbmMtdXNlci1zZWNwJywgY2hhaW5Db2RlOiAnQScucmVwZWF0KDUyKSB9LFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAnZW5jLXVzZXItZWQyNTUxOScsXG4gICAgICBlY2RzYU1wYzogJ2VuYy11c2VyLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLXVzZXItZWRkc2EnLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZGVjcnlwdFNhZmVLZXljYXJkKHtcbiAgICAgIGJpdGdvOiBtYWtlTW9ja0JpdEdvKG1ha2VEZWNyeXB0TWFwKHt9KSksXG4gICAgICB1c2VyS2V5Qm94OiB1c2VyQm94LFxuICAgICAgYmFja3VwS2V5Qm94OiB1c2VyQm94LFxuICAgICAgYml0Z29LZXlCb3g6IHVzZXJCb3gsXG4gICAgICBwYXNzd29yZDogUEFTU1dPUkQsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvdW5leHBlY3RlZCBlZDI1NTE5IGNoYWluLWNvZGUgZW50cnkvKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIHdoZW4gZGVjcnlwdGlvbiBmYWlscyAod3JvbmcgcGFzc3dvcmQpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVzZXJCb3ggPSBib3goe1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICdlbmMtdXNlci1zZWNwJyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogJ2VuYy11c2VyLWVkMjU1MTknLFxuICAgICAgZWNkc2FNcGM6ICdlbmMtdXNlci1lY2RzYScsXG4gICAgICBlZGRzYU1wYzogJ2VuYy11c2VyLWVkZHNhJyxcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcmdvbjI6IHRhZyBkb2VzIG5vdCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgZGVjcnlwdFNhZmVLZXljYXJkKHtcbiAgICAgIGJpdGdvLFxuICAgICAgdXNlcktleUJveDogdXNlckJveCxcbiAgICAgIGJhY2t1cEtleUJveDogdXNlckJveCxcbiAgICAgIGJpdGdvS2V5Qm94OiB1c2VyQm94LFxuICAgICAgcGFzc3dvcmQ6ICd3cm9uZy1wYXNzd29yZCcsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChJbmNvcnJlY3RQYXNzd29yZEVycm9yKTtcbiAgfSk7XG59KTtcblxuY29uc3QgTVBDX1JPT1QgPSB7IHNpZ25pbmc6IEJ1ZmZlci5hbGxvYygwKSwgdnJmOiBCdWZmZXIuYWxsb2MoMCkgfTtcblxuZnVuY3Rpb24gbWFrZVJvb3RzKHNlY3A6IHsgdXNlcjogc3RyaW5nOyBiYWNrdXA6IHN0cmluZzsgYml0Z286IHN0cmluZyB9KTogRGVjcnlwdGVkU2FmZVJvb3RzIHtcbiAgcmV0dXJuIHtcbiAgICBzZWNwMjU2azFNdWx0aXNpZzogc2VjcCxcbiAgICBlZDI1NTE5TXVsdGlzaWc6IHsgdXNlcjogJ3UnLCBiYWNrdXA6IHsgcHJ2OiAnYicsIGNoYWluQ29kZTogJ2MnIH0sIGJpdGdvOiAnZycgfSxcbiAgICBlY2RzYU1wYzogeyB1c2VyOiBNUENfUk9PVCwgYmFja3VwOiBNUENfUk9PVCwgYml0Z286ICdnJyB9LFxuICAgIGVkZHNhTXBjOiB7IHVzZXI6IE1QQ19ST09ULCBiYWNrdXA6IE1QQ19ST09ULCBiaXRnbzogJ2cnIH0sXG4gIH07XG59XG5cbmRlc2NyaWJlKCdkZXJpdmVTYWZlV2FsbGV0S2V5cycsICgpID0+IHtcbiAgY29uc3QgdXNlclJvb3QgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbSgnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnLCAnaGV4JykpO1xuICBjb25zdCBiYWNrdXBSb290ID0gYmlwMzIuZnJvbVNlZWQoXG4gICAgQnVmZmVyLmZyb20oJzFmMWUxZDFjMWIxYTE5MTgxNzE2MTUxNDEzMTIxMTEwMGYwZTBkMGMwYjBhMDkwODA3MDYwNTA0MDMwMjAxMDAnLCAnaGV4JylcbiAgKTtcbiAgY29uc3QgYml0Z29Sb290ID0gYmlwMzJcbiAgICAuZnJvbVNlZWQoQnVmZmVyLmZyb20oJzJmMmUyZDJjMmIyYTI5MjgyNzI2MjUyNDIzMjIyMTIwMWYxZTFkMWMxYjFhMTkxODE3MTYxNTE0MTMxMjExMTAnLCAnaGV4JykpXG4gICAgLm5ldXRlcmVkKCk7XG5cbiAgY29uc3Qgcm9vdHMgPSBtYWtlUm9vdHMoe1xuICAgIHVzZXI6IHVzZXJSb290LnRvQmFzZTU4KCksXG4gICAgYmFja3VwOiBiYWNrdXBSb290LnRvQmFzZTU4KCksXG4gICAgYml0Z286IGJpdGdvUm9vdC50b0Jhc2U1OCgpLFxuICB9KTtcblxuICBpdCgnZGVyaXZlcyB0aGUgQklQNDQgY2hpbGQgdHJpcGxldCBmb3Igc2xvdCAxJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2J0YycsIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIGFjY291bnQ6IDAsIHJvb3RzIH0pO1xuICAgIGlmIChyZXN1bHQuc2xvdCAhPT0gJ3NlY3AyNTZrMU11bHRpc2lnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzZWNwMjU2azFNdWx0aXNpZyBzbG90Jyk7XG4gICAgfVxuXG4gICAgcmVzdWx0LnBhdGguc2hvdWxkLmVxdWFsKFwibS80NCcvMCcvMScvMCdcIik7XG4gICAgcmVzdWx0LmtleXMudXNlci5wcnYuc2hvdWxkLmVxdWFsKHVzZXJSb290LmRlcml2ZVBhdGgoXCJtLzQ0Jy8wJy8xJy8wJ1wiKS50b0Jhc2U1OCgpKTtcbiAgICByZXN1bHQua2V5cy51c2VyLnB1Yi5zaG91bGQuZXF1YWwodXNlclJvb3QuZGVyaXZlUGF0aChcIm0vNDQnLzAnLzEnLzAnXCIpLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgcmVzdWx0LmtleXMuYmFja3VwLnBydi5zaG91bGQuZXF1YWwoYmFja3VwUm9vdC5kZXJpdmVQYXRoKCdtLzQ0LzAvMS8wJykudG9CYXNlNTgoKSk7XG4gICAgcmVzdWx0LmtleXMuYml0Z28ucHViLnNob3VsZC5lcXVhbChiaXRnb1Jvb3QuZGVyaXZlUGF0aCgnbS80NC8wLzEvMCcpLnRvQmFzZTU4KCkpO1xuICB9KTtcblxuICBpdCgndmFyaWVzIHRoZSBwYXRoIHdpdGggdGhlIGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnYnRjJywgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgYWNjb3VudDogMiwgcm9vdHMgfSk7XG4gICAgcmVzdWx0LnBhdGguc2hvdWxkLmVxdWFsKFwibS80NCcvMCcvMScvMidcIik7XG4gIH0pO1xuXG4gIGl0KCdkZXJpdmVzIHRoZSBlY2RzYU1wYyBjaGlsZCB2aWEgdGhlIERLTHMgY2VyZW1vbnknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3VzZXJEa2csIGJhY2t1cERrZ10gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXMoKTtcbiAgICBjb25zdCBbdnJmVXNlciwgdnJmQmFja3VwXSA9IGF3YWl0IERrbHNWcmZVdGlscy5nZW5lcmF0ZVZyZkRLR0tleVNoYXJlcygpO1xuXG4gICAgY29uc3QgbXBjUm9vdHM6IERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgICAgIC4uLnJvb3RzLFxuICAgICAgZWNkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiB1c2VyRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgICBiYWNrdXA6IHsgc2lnbmluZzogYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZkJhY2t1cC5nZXRLZXlTaGFyZSgpIH0sXG4gICAgICAgIGJpdGdvOiAnZycsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7IGNvaW46ICdldGgnLCBzbG90OiAnZWNkc2FNcGMnLCBhY2NvdW50OiAwLCByb290czogbXBjUm9vdHMgfSk7XG4gICAgaWYgKHJlc3VsdC5zbG90ICE9PSAnZWNkc2FNcGMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGVjZHNhTXBjIHNsb3QnKTtcbiAgICB9XG5cbiAgICByZXN1bHQucGF0aC5zaG91bGQuZXF1YWwoXCJtLzQ0Jy82MCcvMycvMCdcIik7XG4gICAgcmVzdWx0LmtleXMuY29tbW9uS2V5Y2hhaW4uc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgcmVzdWx0LmtleXMudXNlci5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICByZXN1bHQua2V5cy5iYWNrdXAuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gIH0pO1xuXG4gIGl0KCdkZXJpdmVzIGFuZCBzaWducyB0aGUgZWRkc2FNcGMgc2xvdC00IEJJUDQ0IGNoaWxkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFt1c2VyRGtnLCBiYWNrdXBEa2csIGJpdGdvRGtnXSA9IGF3YWl0IE1QU1V0aWwuZ2VuZXJhdGVFZERzYURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IFt2cmZVc2VyLCB2cmZCYWNrdXAsIHZyZkJpdGdvXSA9IGF3YWl0IE1wc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgbXBjUm9vdHM6IERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgICAgIC4uLnJvb3RzLFxuICAgICAgZWRkc2FNcGM6IHtcbiAgICAgICAgdXNlcjogeyBzaWduaW5nOiB1c2VyRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgICBiYWNrdXA6IHsgc2lnbmluZzogYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZkJhY2t1cC5nZXRLZXlTaGFyZSgpIH0sXG4gICAgICAgIGJpdGdvOiBiaXRnb0RrZy5nZXRDb21tb25LZXljaGFpbigpLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnc29sJywgc2xvdDogJ2VkZHNhTXBjJywgYWNjb3VudDogMCwgcm9vdHM6IG1wY1Jvb3RzIH0pO1xuICAgIGlmIChyZXN1bHQuc2xvdCAhPT0gJ2VkZHNhTXBjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBlZGRzYU1wYyBzbG90Jyk7XG4gICAgfVxuICAgIHJlc3VsdC5wYXRoLnNob3VsZC5lcXVhbChcIm0vNDQnLzUwMScvNCcvMCdcIik7XG5cbiAgICAvLyBQbGF5IG1pbnQncyB1c2Vy4oaUQml0R28gcm9sZSBsb2NhbGx5IGF0IHRoZSBzYW1lIEJJUDQ0IHBhdGg7IG5vIGRldi1taW50ZWQgd2FsbGV0IGlzIG5lZWRlZC5cbiAgICBjb25zdCB1c2VyTWludCA9IG5ldyBNcHNEZXJpdmUuRGVyaXZlKDMsIDIsIDAsIHVzZXJEa2cuZ2V0S2V5U2hhcmUoKSwgdnJmVXNlci5nZXRLZXlTaGFyZSgpLCByZXN1bHQucGF0aCk7XG4gICAgY29uc3QgYml0Z29NaW50ID0gbmV3IE1wc0Rlcml2ZS5EZXJpdmUoMywgMiwgMiwgYml0Z29Ea2cuZ2V0S2V5U2hhcmUoKSwgdnJmQml0Z28uZ2V0S2V5U2hhcmUoKSwgcmVzdWx0LnBhdGgpO1xuICAgIGNvbnN0IFt1c2VyUm91bmQwLCBiaXRnb1JvdW5kMF0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlck1pbnQuaW5pdERlcml2ZSgpLCBiaXRnb01pbnQuaW5pdERlcml2ZSgpXSk7XG4gICAgY29uc3QgW3VzZXJSb3VuZDFdID0gdXNlck1pbnQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbYml0Z29Sb3VuZDBdKTtcbiAgICBjb25zdCBbYml0Z29Sb3VuZDFdID0gYml0Z29NaW50LmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJSb3VuZDBdKTtcbiAgICBpZiAoIXVzZXJSb3VuZDEgfHwgIWJpdGdvUm91bmQxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHVzZXIgYW5kIEJpdEdvIGRlcml2ZSByb3VuZC0xIG1lc3NhZ2VzJyk7XG4gICAgfVxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwodXNlck1pbnQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbYml0Z29Sb3VuZDFdKSwgW10pO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYml0Z29NaW50LmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJSb3VuZDFdKSwgW10pO1xuICAgIGNvbnN0IG1pbnRlZENoaWxkQ29tbW9uS2V5Y2hhaW4gPSB1c2VyTWludC5nZXRDb21tb25LZXljaGFpbigpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChiaXRnb01pbnQuZ2V0Q29tbW9uS2V5Y2hhaW4oKSwgbWludGVkQ2hpbGRDb21tb25LZXljaGFpbik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5rZXlzLmNvbW1vbktleWNoYWluLCBtaW50ZWRDaGlsZENvbW1vbktleWNoYWluKTtcblxuICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAnc2FmZS1yZWNvdmVyeS1wYXNzcGhyYXNlJztcbiAgICBjb25zdCB1c2VyS2V5ID0gc2pjbC5lbmNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIHJlc3VsdC5rZXlzLnVzZXIpO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHNqY2wuZW5jcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCByZXN1bHQua2V5cy5iYWNrdXApO1xuICAgIGNvbnN0IHJvb3RDb21tb25LZXljaGFpbiA9IHVzZXJEa2cuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCh7XG4gICAgICAgIG1lc3NhZ2U6IEJ1ZmZlci5mcm9tKCd3cm9uZyBrZXljaGFpbiBtdXN0IGZhaWwnKSxcbiAgICAgICAgdXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBiaXRnb0tleTogcm9vdENvbW1vbktleWNoYWluLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogJ20vMCcsXG4gICAgICB9KSxcbiAgICAgIC9jb21tb25LZXlDaGFpbiBmcm9tIGtleWNhcmQgZG9lcyBub3QgbWF0Y2ggYml0Z29LZXkvXG4gICAgKTtcblxuICAgIGNvbnN0IG1wYyA9IGF3YWl0IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBmb3IgKGNvbnN0IGRlcml2YXRpb25QYXRoIG9mIFsnbS8wJywgJ20vMyddKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmZyb20oYFNhZmUgRWREU0EgcmVjb3ZlcnkgJHtkZXJpdmF0aW9uUGF0aH1gKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCh7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYml0Z29LZXk6IHJlc3VsdC5rZXlzLmNvbW1vbktleWNoYWluLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVyaXZlZEtleWNoYWluID0gbXBjLmRlcml2ZVVuaGFyZGVuZWQocmVzdWx0LmtleXMuY29tbW9uS2V5Y2hhaW4sIGRlcml2YXRpb25QYXRoKTtcbiAgICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gQnVmZmVyLmZyb20oZGVyaXZlZEtleWNoYWluLnNsaWNlKDAsIDY0KSwgJ2hleCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBlZDI1NTE5LnZlcmlmeShuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShtZXNzYWdlKSwgbmV3IFVpbnQ4QXJyYXkocHVibGljS2V5Qnl0ZXMpKSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdkZXJpdmVzIHRoZSBlZDI1NTE5TXVsdGlzaWcgdHJpcGxldCBhdCB0aGUgQklQNDQgcGF0aCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBTVFJLRVlfU0VFRCA9ICdTQUFBQ0FRREFRQ1FNQllJQkVGQVdEQU5CWUhSQUVJU0NNS0JLRlFYREFNUlVHWTREVVBCNk5LSSc7XG4gICAgY29uc3QgYmFja3VwQ2hhaW5Db2RlID0gQnVmZmVyLmFsbG9jKDMyLCAweGFiKTtcbiAgICAvLyBEaXN0aW5jdCBCaXRHbyByb290ICsgY2hhaW4gY29kZTogaWYgdGhlIEJpdEdvIGNvbXBvc2l0ZSB3ZXJlIGRlcml2ZWQgZnJvbSB0aGUgYmFja3VwIHJvb3QsIHRoZVxuICAgIC8vIGJhY2t1cCBjaGlsZCBhbmQgdGhlIEJpdEdvIGNoaWxkIHdvdWxkIGJlIHRoZSBzYW1lIGtleSBhbmQgYSBzbG90IHN3YXAgd291bGQgcGFzcyBldmVyeSBnb2xkZW4uXG4gICAgY29uc3QgYml0Z29TZWVkID0gQnVmZmVyLmFsbG9jKDMyLCAweDIyKTtcbiAgICBjb25zdCBiaXRnb1Jvb3RQdWIgPSBCdWZmZXIuZnJvbShlZDI1NTE5LmdldFB1YmxpY0tleShiaXRnb1NlZWQpKTtcbiAgICBjb25zdCBiaXRnb0NoYWluQ29kZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHhjZCk7XG4gICAgY29uc3QgZWQyNTUxOVJvb3RzOiBEZWNyeXB0ZWRTYWZlUm9vdHMgPSB7XG4gICAgICAuLi5yb290cyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzoge1xuICAgICAgICB1c2VyOiBTVFJLRVlfU0VFRCxcbiAgICAgICAgYmFja3VwOiB7IHBydjogU1RSS0VZX1NFRUQsIGNoYWluQ29kZTogZW5jb2RlRWQyNTUxOUNoYWluQ29kZShiYWNrdXBDaGFpbkNvZGUpIH0sXG4gICAgICAgIGJpdGdvOiBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKGJpdGdvUm9vdFB1YiwgYml0Z29DaGFpbkNvZGUpLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoe1xuICAgICAgY29pbjogJ2FsZ28nLFxuICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICBhY2NvdW50OiAwLFxuICAgICAgcm9vdHM6IGVkMjU1MTlSb290cyxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LnNsb3QgIT09ICdlZDI1NTE5TXVsdGlzaWcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGVkMjU1MTlNdWx0aXNpZyBzbG90Jyk7XG4gICAgfVxuXG4gICAgcmVzdWx0LnBhdGguc2hvdWxkLmVxdWFsKFwibS80NCcvMjgzJy8yJy8wJ1wiKTtcblxuICAgIC8vIHVzZXI6IGhhcmRlbmVkIFNMSVAtMDAxMCBjaGlsZCwgcGlubmVkIHRvIHRoZSBsZWFmJ3MgZ29sZGVuIHZlY3RvclxuICAgIHJlc3VsdC5rZXlzLnVzZXIua2luZC5zaG91bGQuZXF1YWwoJ3NlZWQnKTtcbiAgICByZXN1bHQua2V5cy51c2VyLnNlZWQuc2hvdWxkLmVxdWFsKCdiZTY5NTMxZWJiYWI4NTFiNjlhYTQxYmI5YzkwNWFmZWQ1MmQyNmZmNDI3OGU2NDE4NjA5ZDRkNjA1NzA1MTBjJyk7XG4gICAgcmVzdWx0LmtleXMudXNlci5wdWIuc2hvdWxkLmVxdWFsKFxuICAgICAgQnVmZmVyLmZyb20oZWQyNTUxOS5nZXRQdWJsaWNLZXkoQnVmZmVyLmZyb20ocmVzdWx0LmtleXMudXNlci5zZWVkLCAnaGV4JykpKS50b1N0cmluZygnaGV4JylcbiAgICApO1xuXG4gICAgLy8gYmFja3VwOiBleHRlbmRlZCBrZXkgd2hvc2UgcHVibGljIGhhbGYgZXF1YWxzIHRoZSBwdWJsaWMgc29mdC1kZXJpdmUgb2Ygcm9vdCBwdWIg4oCWIGNoYWluIGNvZGVcbiAgICBjb25zdCBiaXRnb1B1YiA9IChcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlBdFBhdGgoZWQyNTUxOVJvb3RzLmVkMjU1MTlNdWx0aXNpZy5iaXRnbywgJ20vNDQvMjgzLzIvMCcpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG4gICAgcmVzdWx0LmtleXMuYmFja3VwLmtpbmQuc2hvdWxkLmVxdWFsKCdleHRlbmRlZCcpO1xuICAgIC8vIFBpbiB0aGUgcHJpdmF0ZSBoYWx2ZXMgdG8gdGhlIGNyb3NzLXJlcG8gR1YxIGdvbGRlbiB2ZWN0b3IgZm9yIHRoaXMgcGF0aC5cbiAgICBjb25zdCBhbGdvU29mdCA9IGJpcDQ0Rml4dHVyZS5lZDI1NTE5U29mdC52ZWN0b3JzLmZpbmQoKHYpID0+IHYucGF0aCA9PT0gJ20vNDQvMjgzLzIvMCcpO1xuICAgIGlmIChhbGdvU29mdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpeHR1cmUgaXMgbWlzc2luZyB0aGUgbS80NC8yODMvMi8wIHNvZnQgY28tc2lnbmVyIHZlY3RvcicpO1xuICAgIH1cbiAgICByZXN1bHQua2V5cy5iYWNrdXAua0wuc2hvdWxkLmVxdWFsKGFsZ29Tb2Z0LmNoaWxkS0xIZXgpO1xuICAgIHJlc3VsdC5rZXlzLmJhY2t1cC5rUi5zaG91bGQuZXF1YWwoYWxnb1NvZnQuY2hpbGRLUkhleCk7XG4gICAgLy8gV2l0aCBkaXN0aW5jdCByb290cyB0aGUgdGhyZWUgY2hpbGRyZW4gYXJlIHByb3ZhYmx5IGRpc3RpbmN0LCBzbyBhIHNsb3Qgc3dhcCBjYW5ub3Qgc25lYWsgdGhyb3VnaC5cbiAgICByZXN1bHQua2V5cy51c2VyLnB1Yi5zaG91bGQubm90LmVxdWFsKHJlc3VsdC5rZXlzLmJhY2t1cC5wdWIpO1xuICAgIHJlc3VsdC5rZXlzLmJhY2t1cC5wdWIuc2hvdWxkLm5vdC5lcXVhbChyZXN1bHQua2V5cy5iaXRnby5wdWIpO1xuICAgIHJlc3VsdC5rZXlzLmJpdGdvLnB1Yi5zaG91bGQuZXF1YWwoYml0Z29QdWIpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIG5vbi1pbnRlZ2VyIGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnYnRjJywgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgYWNjb3VudDogMS41LCByb290cyB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgL2ludmFsaWQgYWNjb3VudC9cbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcycsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHVzZXJSb290ID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oJzAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmJywgJ2hleCcpKTtcbiAgY29uc3QgYmFja3VwUm9vdCA9IGJpcDMyLmZyb21TZWVkKFxuICAgIEJ1ZmZlci5mcm9tKCcxZjFlMWQxYzFiMWExOTE4MTcxNjE1MTQxMzEyMTExMDBmMGUwZDBjMGIwYTA5MDgwNzA2MDUwNDAzMDIwMTAwJywgJ2hleCcpXG4gICk7XG4gIGNvbnN0IGJpdGdvUm9vdCA9IGJpcDMyXG4gICAgLmZyb21TZWVkKEJ1ZmZlci5mcm9tKCcyZjJlMmQyYzJiMmEyOTI4MjcyNjI1MjQyMzIyMjEyMDFmMWUxZDFjMWIxYTE5MTgxNzE2MTUxNDEzMTIxMTEwJywgJ2hleCcpKVxuICAgIC5uZXV0ZXJlZCgpO1xuXG4gIGNvbnN0IGtleXMgPSB7XG4gICAgdXNlcjogeyBwcnY6IHVzZXJSb290LnRvQmFzZTU4KCksIHB1YjogdXNlclJvb3QubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgYmFja3VwOiB7IHBydjogYmFja3VwUm9vdC50b0Jhc2U1OCgpLCBwdWI6IGJhY2t1cFJvb3QubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgYml0Z286IHsgcHViOiBiaXRnb1Jvb3QudG9CYXNlNTgoKSB9LFxuICB9O1xuXG4gIGl0KCdzaWduZWQgbW9kZSByZS1lbmNyeXB0cyBjaGlsZCB4cHJ2cyB1bmRlciBhIHNpbmdsZSBlcGhlbWVyYWwgcGFzc3BocmFzZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXNzcGhyYXNlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbmNyeXB0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoeyBpbnB1dCwgcGFzc3dvcmQsIGVuY3J5cHRpb25WZXJzaW9uIH0pID0+IHtcbiAgICAgIHBhc3NwaHJhc2VzLnB1c2gocGFzc3dvcmQpO1xuICAgICAgZW5jcnlwdGlvblZlcnNpb24uc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmV0dXJuIGBlbmMoJHtpbnB1dH0pYDtcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdCB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgIGtleXMsXG4gICAgICBtb2RlOiAnc2lnbmVkJyxcbiAgICB9KTtcblxuICAgIHJlc3VsdC51c2VyS2V5LnNob3VsZC5lcXVhbChgZW5jKCR7a2V5cy51c2VyLnBydn0pYCk7XG4gICAgcmVzdWx0LmJhY2t1cEtleS5zaG91bGQuZXF1YWwoYGVuYygke2tleXMuYmFja3VwLnBydn0pYCk7XG4gICAgcmVzdWx0LmJpdGdvS2V5LnNob3VsZC5lcXVhbChrZXlzLmJpdGdvLnB1Yik7XG4gICAgKHJlc3VsdC53YWxsZXRQYXNzcGhyYXNlIGFzIHN0cmluZykuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgcGFzc3BocmFzZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIHBhc3NwaHJhc2VzWzBdLnNob3VsZC5lcXVhbChwYXNzcGhyYXNlc1sxXSk7XG4gICAgcGFzc3BocmFzZXNbMF0uc2hvdWxkLmVxdWFsKHJlc3VsdC53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBlbmNyeXB0LmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMik7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIG5vbi1wcml2YXRlIGNoaWxkIGtleXMgaW4gc2lnbmVkIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQ6IHNpbm9uLnN0dWIoKSB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgYml0Z28sXG4gICAgICBjb2luOiAnYnRjJyxcbiAgICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsXG4gICAgICBrZXlzOiB7IHVzZXI6IHsgcHJ2OiBrZXlzLnVzZXIucHViLCBwdWI6IGtleXMudXNlci5wdWIgfSwgYmFja3VwOiBrZXlzLmJhY2t1cCwgYml0Z286IGtleXMuYml0Z28gfSxcbiAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL211c3QgYmUgcHJpdmF0ZSB4cHJ2cy8pO1xuICB9KTtcblxuICBpdCgndW5zaWduZWQgbW9kZSByZXR1cm5zIHB1YnMgYW5kIG5ldmVyIGVuY3J5cHRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVuY3J5cHQgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdCBzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvID0geyBlbmNyeXB0IH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLFxuICAgICAga2V5cyxcbiAgICAgIG1vZGU6ICd1bnNpZ25lZCcsXG4gICAgfSk7XG5cbiAgICByZXN1bHQudXNlcktleS5zaG91bGQuZXF1YWwoa2V5cy51c2VyLnB1Yik7XG4gICAgcmVzdWx0LmJhY2t1cEtleS5zaG91bGQuZXF1YWwoa2V5cy5iYWNrdXAucHViKTtcbiAgICByZXN1bHQuYml0Z29LZXkuc2hvdWxkLmVxdWFsKGtleXMuYml0Z28ucHViKTtcbiAgICByZXN1bHQuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJyk7XG4gICAgZW5jcnlwdC5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyB1bnN1cHBvcnRlZCBzbG90cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdDogc2lub24uc3R1YigpIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgc2xvdDogJ2VkZHNhTXBjJyxcbiAgICAgIGtleXM6IHsgY29tbW9uS2V5Y2hhaW46ICdjaycsIHVzZXI6ICd1JywgYmFja3VwOiAnYicgfSxcbiAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCBzdXBwb3J0ZWQgeWV0Lyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlZDI1NTE5TXVsdGlzaWcnLCAoKSA9PiB7XG4gICAgLy8gR29sZGVuIHZlY3RvcnMgZ2VuZXJhdGVkIHdpdGggYWxnb3NkazogZW5jb2RlQWRkcmVzcyhCdWZmZXIuYWxsb2MoMzIsIG4pKSBhbmRcbiAgICAvLyBtdWx0aXNpZ0FkZHJlc3MoeyB2ZXJzaW9uOiAxLCB0aHJlc2hvbGQ6IDIsIGFkZHJzOiBbLi4uXSB9KSBvdmVyIHRoZSBzYW1lIHB1YnMuXG4gICAgY29uc3QgZWRLZXlzID0ge1xuICAgICAgdXNlcjogeyBraW5kOiAnc2VlZCcsIHNlZWQ6ICcxMScucmVwZWF0KDMyKSwgcHViOiAnMjEnLnJlcGVhdCgzMikgfSxcbiAgICAgIGJhY2t1cDogeyBraW5kOiAnZXh0ZW5kZWQnLCBrTDogJzMxJy5yZXBlYXQoMzIpLCBrUjogJzQxJy5yZXBlYXQoMzIpLCBwdWI6ICc1MScucmVwZWF0KDMyKSB9LFxuICAgICAgYml0Z286IHsgcHViOiAnNjEnLnJlcGVhdCgzMikgfSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgaXQoJ3Vuc2lnbmVkIG1vZGUgcmV0dXJucyBBTEdPIGFkZHJlc3NlcyBhbmQgdGhlIG11bHRpc2lnIHJvb3RBZGRyZXNzLCBhbmQgbmV2ZXIgZW5jcnlwdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbmNyeXB0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdCBzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdCB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgICAgYml0Z28sXG4gICAgICAgIGNvaW46ICdhbGdvJyxcbiAgICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICAgIGtleXM6IGVkS2V5cyxcbiAgICAgICAgbW9kZTogJ3Vuc2lnbmVkJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5zbG90ICE9PSAnZWQyNTUxOU11bHRpc2lnJyB8fCByZXN1bHQubW9kZSAhPT0gJ3Vuc2lnbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHVuc2lnbmVkIGVkMjU1MTlNdWx0aXNpZyBrZXkgcGFyYW1zJyk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC51c2VyS2V5LnNob3VsZC5lcXVhbCgnRUVRU0NJSkJFRVFTQ0lKQkVFUVNDSUpCRUVRU0NJSkJFRVFTQ0lKQkVFUVNDSUpCRUVRWU5JNTNITScpO1xuICAgICAgcmVzdWx0LmJhY2t1cEtleS5zaG91bGQuZXF1YWwoJ0tGSVZDVUtSS0ZJVkNVS1JLRklWQ1VLUktGSVZDVUtSS0ZJVkNVS1JLRklWQ1VLUktGSTMzQjNBT1knKTtcbiAgICAgIHJlc3VsdC5iaXRnb0tleS5zaG91bGQuZXF1YWwoJ01GUVdDWUxCTUZRV0NZTEJNRlFXQ1lMQk1GUVdDWUxCTUZRV0NZTEJNRlFXQ1lMQk1GUVMzS0hFSE0nKTtcbiAgICAgIGFzc2VydChyZXN1bHQucm9vdEFkZHJlc3MpO1xuICAgICAgcmVzdWx0LnJvb3RBZGRyZXNzLnNob3VsZC5lcXVhbCgnTEhXRUlPVTJVSVBTS0NaM1hNS1FVS1JZWTNGTTZYVFpLQkhETUlVNzM3T1FRRVhRVFlTR0RGT0hETScpO1xuICAgICAgcmVzdWx0LnVzZXJLZXkuc2hvdWxkLm1hdGNoKC9eW0EtWjItN117NTh9JC8pO1xuICAgICAgcmVzdWx0LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnd2FsbGV0UGFzc3BocmFzZScpO1xuICAgICAgcmVzdWx0LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnZXh0ZXJuYWxCYWNrdXBTaWduZXInKTtcbiAgICAgIGVuY3J5cHQuY2FsbENvdW50LnNob3VsZC5lcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaWduZWQgbW9kZSBlbmNyeXB0cyB0aGUgNTgtY2hhciBzZWVkIGFuZCByZXR1cm5zIGEgbGF6eSBleHRlcm5hbCBiYWNrdXAgc2lnbmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gUmVhbCBkZXJpdmF0aW9uIG91dHB1dCwgd2l0aCBhIGRpc3RpbmN0IEJpdEdvIHJvb3Qgc28gdGhlIGJhY2t1cCBjaGlsZCBhbmQgdGhlIEJpdEdvIGNoaWxkXG4gICAgICAvLyBhcmUgZGlmZmVyZW50IGtleXMg4oCUIGEgc2xvdCBzd2FwIGJldHdlZW4gdGhlbSBtdXN0IGNoYW5nZSB0aGUgb3V0cHV0cy5cbiAgICAgIGNvbnN0IFNUUktFWV9TRUVEID0gJ1NBQUFDQVFEQVFDUU1CWUlCRUZBV0RBTkJZSFJBRUlTQ01LQktGUVhEQU1SVUdZNERVUEI2TktJJztcbiAgICAgIGNvbnN0IGJhY2t1cENoYWluQ29kZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHhhYik7XG4gICAgICBjb25zdCBiaXRnb1NlZWQgPSBCdWZmZXIuYWxsb2MoMzIsIDB4MjIpO1xuICAgICAgY29uc3QgYml0Z29Sb290UHViID0gQnVmZmVyLmZyb20oZWQyNTUxOS5nZXRQdWJsaWNLZXkoYml0Z29TZWVkKSk7XG4gICAgICBjb25zdCBiaXRnb0NoYWluQ29kZSA9IEJ1ZmZlci5hbGxvYygzMiwgMHhjZCk7XG4gICAgICBjb25zdCBlZDI1NTE5Um9vdHM6IERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgICAgICAgLi4ubWFrZVJvb3RzKHsgdXNlcjogJ3gnLCBiYWNrdXA6ICd5JywgYml0Z286ICd6JyB9KSxcbiAgICAgICAgZWQyNTUxOU11bHRpc2lnOiB7XG4gICAgICAgICAgdXNlcjogU1RSS0VZX1NFRUQsXG4gICAgICAgICAgYmFja3VwOiB7IHBydjogU1RSS0VZX1NFRUQsIGNoYWluQ29kZTogZW5jb2RlRWQyNTUxOUNoYWluQ29kZShiYWNrdXBDaGFpbkNvZGUpIH0sXG4gICAgICAgICAgYml0Z286IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoYml0Z29Sb290UHViLCBiaXRnb0NoYWluQ29kZSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHtcbiAgICAgICAgY29pbjogJ2FsZ28nLFxuICAgICAgICBzbG90OiAnZWQyNTUxOU11bHRpc2lnJyxcbiAgICAgICAgYWNjb3VudDogMCxcbiAgICAgICAgcm9vdHM6IGVkMjU1MTlSb290cyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGRlcml2ZWQuc2xvdCAhPT0gJ2VkMjU1MTlNdWx0aXNpZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBlZDI1NTE5TXVsdGlzaWcgc2xvdCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXNzcGhyYXNlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGVuY3J5cHQgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICh7IGlucHV0LCBwYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24gfSkgPT4ge1xuICAgICAgICBwYXNzcGhyYXNlcy5wdXNoKHBhc3N3b3JkKTtcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb24uc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICByZXR1cm4gYGVuYygke2lucHV0fSlgO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdCB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgICAgYml0Z28sXG4gICAgICAgIGNvaW46ICd0YWxnbycsXG4gICAgICAgIHNsb3Q6ICdlZDI1NTE5TXVsdGlzaWcnLFxuICAgICAgICBrZXlzOiBkZXJpdmVkLmtleXMsXG4gICAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdWx0LnNsb3QgIT09ICdlZDI1NTE5TXVsdGlzaWcnIHx8IHJlc3VsdC5tb2RlICE9PSAnc2lnbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHNpZ25lZCBlZDI1NTE5TXVsdGlzaWcga2V5IHBhcmFtcycpO1xuICAgICAgfVxuXG4gICAgICBkZXJpdmVkLmtleXMudXNlci5wdWIuc2hvdWxkLm5vdC5lcXVhbChkZXJpdmVkLmtleXMuYmFja3VwLnB1Yik7XG4gICAgICBkZXJpdmVkLmtleXMuYmFja3VwLnB1Yi5zaG91bGQubm90LmVxdWFsKGRlcml2ZWQua2V5cy5iaXRnby5wdWIpO1xuXG4gICAgICAvLyB1c2VyIHNlZWQgcmUtZW5jb2RlZCBhcyB0aGUgNTgtY2hhciBBTEdPIHNlZWQgYmVmb3JlIGVuY3J5cHRpb247IG5vIGJhY2t1cEtleSDigJQgdGhlXG4gICAgICAvLyBzZWVkbGVzcyBiYWNrdXAgY2hpbGQgb25seSBleGlzdHMgYXMgdGhlIGxhenkgc2lnbmVyLlxuICAgICAgcmVzdWx0LnVzZXJLZXkuc2hvdWxkLmVxdWFsKGBlbmMoJHtlbmNvZGVBbGdvS2V5KEJ1ZmZlci5mcm9tKGRlcml2ZWQua2V5cy51c2VyLnNlZWQsICdoZXgnKSl9KWApO1xuICAgICAgcmVzdWx0LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnYmFja3VwS2V5Jyk7XG4gICAgICByZXN1bHQuYml0Z29LZXkuc2hvdWxkLmVxdWFsKGVuY29kZUFsZ29LZXkoQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLmJpdGdvLnB1YiwgJ2hleCcpKSk7XG4gICAgICByZXN1bHQuYml0Z29LZXkuc2hvdWxkLm1hdGNoKC9eW0EtWjItN117NTh9JC8pO1xuICAgICAgLy8gVGhlIHdhbGxldCdzIG9uLWNoYWluIGFkZHJlc3Mgb3ZlciB0aGUgdGhyZWUgZGlzdGluY3QgY2hpbGRyZW4sIGluIHdhbGxldC1jcmVhdGlvbiBvcmRlci5cbiAgICAgIGFzc2VydChyZXN1bHQucm9vdEFkZHJlc3MpO1xuICAgICAgcmVzdWx0LnJvb3RBZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgYWxnb011bHRpc2lnQWRkcmVzcygxLCAyLCBbXG4gICAgICAgICAgQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLnVzZXIucHViLCAnaGV4JyksXG4gICAgICAgICAgQnVmZmVyLmZyb20oZGVyaXZlZC5rZXlzLmJhY2t1cC5wdWIsICdoZXgnKSxcbiAgICAgICAgICBCdWZmZXIuZnJvbShkZXJpdmVkLmtleXMuYml0Z28ucHViLCAnaGV4JyksXG4gICAgICAgIF0pXG4gICAgICApO1xuICAgICAgcmVzdWx0LnJvb3RBZGRyZXNzLnNob3VsZC5tYXRjaCgvXltBLVoyLTddezU4fSQvKTtcbiAgICAgIHJlc3VsdC53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgcGFzc3BocmFzZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcGFzc3BocmFzZXNbMF0uc2hvdWxkLmVxdWFsKHJlc3VsdC53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIGVuY3J5cHQuY2FsbENvdW50LnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgLy8gdGhlIGxhenkgc2lnbmVyIHNpZ25zIHdpdGggdGhlIHJlYWwgZXh0ZW5kZWQga2V5IGhhbHZlcyBhbmQgaXRzIHB1YiBtYXRjaGVzIHRoZSBiYWNrdXAgY2hpbGRcbiAgICAgIHJlc3VsdC5leHRlcm5hbEJhY2t1cFNpZ25lci5wdWJsaWNLZXkuc2hvdWxkLmVxdWFsKGRlcml2ZWQua2V5cy5iYWNrdXAucHViKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbSgnZGVhZGJlZWYnLCAnaGV4Jyk7XG4gICAgICBjb25zdCB7IHNpZ25hdHVyZSB9ID0gYXdhaXQgcmVzdWx0LmV4dGVybmFsQmFja3VwU2lnbmVyLnNpZ24obWVzc2FnZSk7XG4gICAgICBzaWduYXR1cmUuc2hvdWxkLm1hdGNoKC9eWzAtOWEtZl17MTI4fSQvKTtcbiAgICAgIGVkMjU1MTlcbiAgICAgICAgLnZlcmlmeShcbiAgICAgICAgICBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShzaWduYXR1cmUsICdoZXgnKSksXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSksXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocmVzdWx0LmV4dGVybmFsQmFja3VwU2lnbmVyLnB1YmxpY0tleSwgJ2hleCcpKVxuICAgICAgICApXG4gICAgICAgIC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvaW4gb2YgWydoYmFyJywgJ3RoYmFyJ10pIHtcbiAgICAgIGZvciAoY29uc3QgbW9kZSBvZiBbJ3NpZ25lZCcsICd1bnNpZ25lZCddIGFzIGNvbnN0KSB7XG4gICAgICAgIGl0KGAke2NvaW59ICR7bW9kZX0gbW9kZSBlbmNvZGVzIEhlZGVyYSBrZXlzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlIGNhbGxlcidzIHJvb3RBZGRyZXNzYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVuY3J5cHQgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICh7IGlucHV0IH0pID0+IGBlbmMoJHtpbnB1dH0pYCk7XG4gICAgICAgICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgICAgICAgYml0Z28sXG4gICAgICAgICAgICBjb2luLFxuICAgICAgICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICAgICAgICBrZXlzOiBlZEtleXMsXG4gICAgICAgICAgICBtb2RlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXNzZXJ0KCEoJ3Jvb3RBZGRyZXNzJyBpbiByZXN1bHQpKTtcbiAgICAgICAgICBjb25zdCByb290QWRkcmVzcyA9ICcwLjAuMTIzNDUnO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh7IHJvb3RBZGRyZXNzLCAuLi5yZXN1bHQgfS5yb290QWRkcmVzcywgcm9vdEFkZHJlc3MpO1xuICAgICAgICAgIHJlc3VsdC5iaXRnb0tleS5zaG91bGQuZXF1YWwoJzMwMmEzMDA1MDYwMzJiNjU3MDAzMjEwMCcgKyBlZEtleXMuYml0Z28ucHViKTtcblxuICAgICAgICAgIGlmIChyZXN1bHQubW9kZSA9PT0gJ3Vuc2lnbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LnVzZXJLZXkuc2hvdWxkLmVxdWFsKCczMDJhMzAwNTA2MDMyYjY1NzAwMzIxMDAnICsgZWRLZXlzLnVzZXIucHViKTtcbiAgICAgICAgICAgIHJlc3VsdC5iYWNrdXBLZXkuc2hvdWxkLmVxdWFsKCczMDJhMzAwNTA2MDMyYjY1NzAwMzIxMDAnICsgZWRLZXlzLmJhY2t1cC5wdWIpO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnd2FsbGV0UGFzc3BocmFzZScpO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnZXh0ZXJuYWxCYWNrdXBTaWduZXInKTtcbiAgICAgICAgICAgIHNpbm9uLmFzc2VydC5ub3RDYWxsZWQoZW5jcnlwdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRTZWVkID0gJzMwMmUwMjAxMDAzMDA1MDYwMzJiNjU3MDA0MjIwNDIwJyArIGVkS2V5cy51c2VyLnNlZWQ7XG4gICAgICAgICAgICByZXN1bHQudXNlcktleS5zaG91bGQuZXF1YWwoYGVuYygke2VuY29kZWRTZWVkfSlgKTtcbiAgICAgICAgICAgIHJlc3VsdC5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2JhY2t1cEtleScpO1xuICAgICAgICAgICAgcmVzdWx0LmV4dGVybmFsQmFja3VwU2lnbmVyLnB1YmxpY0tleS5zaG91bGQuZXF1YWwoZWRLZXlzLmJhY2t1cC5wdWIpO1xuICAgICAgICAgICAgcmVzdWx0LndhbGxldFBhc3NwaHJhc2Uuc2hvdWxkLm1hdGNoKC9eWzAtOWEtZl17NjR9JC8pO1xuICAgICAgICAgICAgc2lub24uYXNzZXJ0LmNhbGxlZE9uY2UoZW5jcnlwdCk7XG4gICAgICAgICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkV2l0aEV4YWN0bHkoZW5jcnlwdCwge1xuICAgICAgICAgICAgICBpbnB1dDogZW5jb2RlZFNlZWQsXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiByZXN1bHQud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGl0KCdyZWplY3RzIHNsb3QtMiBjb2lucyB0aGF0IGhhdmUgbm8gcmVnaXN0cnkgZW50cnkgeWV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQ6IHNpbm9uLnN0dWIoKSB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgICAgYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICAgIGJpdGdvLFxuICAgICAgICBjb2luOiAneGxtJyxcbiAgICAgICAgc2xvdDogJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgICAgIGtleXM6IGVkS2V5cyxcbiAgICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9jb2luICd4bG0nIGVkMjU1MTlNdWx0aXNpZyBpcyBub3Qgc3VwcG9ydGVkIHlldC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZWQyNTUxOSBjaGlsZHJlbiB3aXRoIG1hbGZvcm1lZCBwdWJsaWMga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJpdGdvID0geyBlbmNyeXB0OiBzaW5vbi5zdHViKCkgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgICAgIGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgICBiaXRnbyxcbiAgICAgICAgY29pbjogJ2FsZ28nLFxuICAgICAgICBzbG90OiAnZWQyNTUxOU11bHRpc2lnJyxcbiAgICAgICAga2V5czogeyAuLi5lZEtleXMsIGJpdGdvOiB7IHB1YjogJzEyMzQnIH0gfSxcbiAgICAgICAgbW9kZTogJ3Vuc2lnbmVkJyxcbiAgICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2VkMjU1MTkgY2hpbGQgcHVibGljIGtleXMgbXVzdCBiZSAzMiBieXRlcy8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnU2FmZSBlY2RzYU1wYyBkZXJpdmUg4oaSIHNpZ24gKGdhdGUpJywgZnVuY3Rpb24gKCkge1xuICBpdCgnZGVyaXZlcyBhIGNoaWxkLCByZWJ1aWxkcyAyLW9mLTIgc2hhcmVzLCBhbmQgc2lnbnMgYSBtZXNzYWdlIHZlcmlmaWVkIGF0IG0vMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBbdXNlckRrZywgYmFja3VwRGtnXSA9IGF3YWl0IERrbHNVdGlscy5nZW5lcmF0ZURLR0tleVNoYXJlcygpO1xuICAgIGNvbnN0IFt2cmZVc2VyLCB2cmZCYWNrdXBdID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKCk7XG5cbiAgICBjb25zdCByb290Q29tbW9uS2V5Y2hhaW4gPSBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4odXNlckRrZy5nZXRLZXlTaGFyZSgpKTtcblxuICAgIGNvbnN0IHsgY29tbW9uS2V5Y2hhaW4sIHVzZXJDaGlsZCwgYmFja3VwQ2hpbGQgfSA9IGF3YWl0IERrbHNWcmZVdGlscy5kZXJpdmVTYWZlRWNkc2FNcGNDaGlsZCh7XG4gICAgICB1c2VyUm9vdDogeyBzaWduaW5nOiB1c2VyRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLCB2cmY6IHZyZlVzZXIuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgYmFja3VwUm9vdDogeyBzaWduaW5nOiBiYWNrdXBEa2cuZ2V0UmVkdWNlZEtleVNoYXJlKCksIHZyZjogdnJmQmFja3VwLmdldEtleVNoYXJlKCkgfSxcbiAgICAgIGFjY291bnQ6IDAsXG4gICAgICBjb2luVHlwZTogNjAsXG4gICAgICBzYWZlU2xvdE9yZGluYWw6IDMsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgZGVyaXZlZCBjaGlsZCBtdXN0IG5ldmVyIGJlIHRoZSByb290ICh0aGUgXCJyb290IGVudmVsb3BlIGluIHRoZSBjaGlsZCBwb3NpdGlvblwiIGZvb3RndW4pLlxuICAgIGNvbW1vbktleWNoYWluLnNob3VsZC5ub3QuZXF1YWwocm9vdENvbW1vbktleWNoYWluKTtcblxuICAgIC8vIFJlYnVpbGQgMi1vZi0yIGtleXNoYXJlcyBmcm9tIHRoZSBkZXJpdmVkIHJlZHVjZWQgQ0JPUiwgZXhhY3RseSBhcyB0aGUgc2lnbmVyJ3MgcmV0cm9maXQgZG9lcy5cbiAgICBjb25zdCB0b1JldHJvZml0ID0gKGI2NDogc3RyaW5nKTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSA9PiB7XG4gICAgICBjb25zdCByZWR1Y2VkID0gRGtsc1R5cGVzLmdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUoQnVmZmVyLmZyb20oYjY0LCAnYmFzZTY0JykpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeFNoYXJlOiB7XG4gICAgICAgICAgeDogQnVmZmVyLmZyb20ocmVkdWNlZC5wcnYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB5OiBCdWZmZXIuZnJvbShyZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGNoYWluY29kZTogQnVmZmVyLmZyb20ocmVkdWNlZC5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICAgIHhpTGlzdDogcmVkdWNlZC54TGlzdC5zbGljZSgwLCAyKSxcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBbdXNlcjJvZjIsIGJhY2t1cDJvZjJdID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlMm9mMktleVNoYXJlcyhcbiAgICAgIHRvUmV0cm9maXQodXNlckNoaWxkKSxcbiAgICAgIHRvUmV0cm9maXQoYmFja3VwQ2hpbGQpXG4gICAgKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gQnVmZmVyLmZyb20oJzAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYnLCAnaGV4Jyk7XG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyMm9mMi5nZXRLZXlTaGFyZSgpLCAwLCAnbS8wJywgbWVzc2FnZUhhc2gpO1xuICAgIGNvbnN0IGJhY2t1cERzZyA9IG5ldyBEa2xzRHNnLkRzZyhiYWNrdXAyb2YyLmdldEtleVNoYXJlKCksIDEsICdtLzAnLCBtZXNzYWdlSGFzaCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3RyaW5nID0gRGtsc1V0aWxzLnZlcmlmeUFuZENvbnZlcnREa2xzU2lnbmF0dXJlKFxuICAgICAgbWVzc2FnZUhhc2gsXG4gICAgICAoYXdhaXQgRGtsc1V0aWxzLmV4ZWN1dGVUaWxsUm91bmQoNSwgdXNlckRzZywgYmFja3VwRHNnKSkgYXMgRGtsc1R5cGVzLkRlc2VyaWFsaXplZERrbHNTaWduYXR1cmUsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgICdtLzAnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZmFsc2VcbiAgICApO1xuXG4gICAgLy8gdmVyaWZ5QW5kQ29udmVydERrbHNTaWduYXR1cmUgcmVjb3ZlcnMgdGhlIHB1YmtleSBmcm9tIHRoZSBzaWduYXR1cmUgYW5kIGNoZWNrcyBpdCBhZ2FpbnN0XG4gICAgLy8gZGVyaXZlVW5oYXJkZW5lZChjaGlsZENLLCAnbS8wJyk7IGl0IHRocm93cyBvbiBtaXNtYXRjaCwgc28gYSByZXR1cm5lZCBzdHJpbmcgaXMgcHJvb2YuXG4gICAgc2lnbmF0dXJlU3RyaW5nLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgIHNpZ25hdHVyZVN0cmluZy5zaG91bGQubWF0Y2goL15cXGQrOlswLTlhLWZdKzpbMC05YS1mXSs6WzAtOWEtZl0rJC8pO1xuICB9KTtcbn0pO1xuIl19
|