@bitgo-beta/sdk-core 8.2.1-beta.204 → 8.2.1-beta.2041
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 +41 -29
- package/dist/src/account-lib/baseCoin/enum.d.ts +58 -5
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +109 -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.js +23 -9
- 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/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
- 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 -12
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +203 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +300 -27
- 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 +17 -3
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +26 -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 +68 -3
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +414 -34
- package/dist/src/bitgo/errors.d.ts +182 -1
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +177 -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 +5 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +31 -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 +132 -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 +55 -7
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +296 -52
- 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 +88 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +204 -0
- package/dist/src/bitgo/safe/iSafe.d.ts +90 -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 +7 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -0
- package/dist/src/bitgo/safe/index.js +23 -0
- package/dist/src/bitgo/safe/safe.d.ts +68 -0
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safe.js +306 -0
- package/dist/src/bitgo/safe/safeDerivation.d.ts +30 -0
- package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safeDerivation.js +122 -0
- package/dist/src/bitgo/safe/safes.d.ts +107 -0
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safes.js +315 -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 +165 -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 +41 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +127 -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 +50 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +112 -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 +4 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +27 -11
- package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/src/bitgo/utils/messageTypes.js +17 -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 +189 -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.d.ts.map +1 -1
- package/dist/src/bitgo/utils/postWithCodec.js +4 -38
- 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/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 +94 -17
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +305 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +432 -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 +219 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1065 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +16 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +37 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +88 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +494 -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 +125 -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 +118 -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 +38 -11
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +207 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +862 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +33 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +260 -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 +12 -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 +53 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +55 -0
- package/dist/src/bitgo/utils/tss/index.d.ts +5 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +29 -10
- 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 +41 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/recipientUtils.js +154 -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 +89 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +90 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +586 -31
- 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 +310 -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 +151 -0
- package/dist/src/bitgo/wallet/wallet.d.ts +373 -28
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +2266 -380
- 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 +1242 -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/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 +262 -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 +180 -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 +137 -0
- package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +197 -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 +308 -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 +364 -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 +77 -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 +181 -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.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 +32 -38
- 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 +1068 -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 +1918 -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 +173 -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 +311 -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 +406 -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 +141 -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 +671 -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 +303 -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 +201 -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/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 +675 -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 +24 -21
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -1712
- 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/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,494 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EcdsaVrfMPCv2Utils = void 0;
|
|
7
|
+
exports.buildVrfKeyEnvelopes = buildVrfKeyEnvelopes;
|
|
8
|
+
exports.parseVrfKeyEnvelopes = parseVrfKeyEnvelopes;
|
|
9
|
+
exports.hardenedDerivationPath = hardenedDerivationPath;
|
|
10
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
11
|
+
const cbor_x_1 = require("cbor-x");
|
|
12
|
+
const assert_1 = __importDefault(require("assert"));
|
|
13
|
+
const io_ts_types_1 = require("io-ts-types");
|
|
14
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
15
|
+
const opengpgUtils_1 = require("../../opengpgUtils");
|
|
16
|
+
const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
|
|
17
|
+
const ecdsaMPCv2_1 = require("./ecdsaMPCv2");
|
|
18
|
+
const ecdsaMPCv2KeyGenSender_1 = require("./ecdsaMPCv2KeyGenSender");
|
|
19
|
+
const typesMPCv2_1 = require("./typesMPCv2");
|
|
20
|
+
/**
|
|
21
|
+
* Version field of the `encryptedPrv` envelope used when a ceremony produces both a
|
|
22
|
+
* signing keyshare and a VRF keyshare. The plaintext handed to encrypt() is
|
|
23
|
+
* `base64(cborEncode(envelope))`, keeping it a single opaque base64 token exactly as
|
|
24
|
+
* the ordinary MPCv2 format does.
|
|
25
|
+
*/
|
|
26
|
+
const VRF_KEY_ENVELOPE_VERSION = 1;
|
|
27
|
+
function isVrfKeyEnvelope(value) {
|
|
28
|
+
return typeof value === 'object' && value !== null && 'version' in value && 'prvKeyShare' in value && 'vrf' in value;
|
|
29
|
+
}
|
|
30
|
+
function serializeVrfMessages(messages) {
|
|
31
|
+
const transfers = [
|
|
32
|
+
...messages.broadcastMessages.map((m) => ({ from: m.from, payload: Buffer.from(m.payload).toString('base64') })),
|
|
33
|
+
...messages.p2pMessages.map((m) => ({
|
|
34
|
+
from: m.from,
|
|
35
|
+
to: m.to,
|
|
36
|
+
payload: Buffer.from(m.payload).toString('base64'),
|
|
37
|
+
})),
|
|
38
|
+
];
|
|
39
|
+
return Buffer.from(JSON.stringify(transfers)).toString('base64');
|
|
40
|
+
}
|
|
41
|
+
function deserializeVrfMessages(blob, forParty) {
|
|
42
|
+
const transfers = JSON.parse(Buffer.from(blob, 'base64').toString());
|
|
43
|
+
return {
|
|
44
|
+
broadcastMessages: transfers
|
|
45
|
+
.filter((t) => t.to === undefined)
|
|
46
|
+
.map((t) => ({ from: t.from, payload: new Uint8Array(Buffer.from(t.payload, 'base64')) })),
|
|
47
|
+
p2pMessages: transfers
|
|
48
|
+
.filter((t) => t.to === forParty)
|
|
49
|
+
.map((t) => ({ from: t.from, to: t.to, payload: new Uint8Array(Buffer.from(t.payload, 'base64')) })),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Combines the signing keyshare with the VRF keyshare into the `encryptedPrv` envelope
|
|
54
|
+
* (`base64(cborEncode({version, prvKeyShare, vrf}))` once the caller base64-encodes the
|
|
55
|
+
* returned buffers). The same container wraps the reduced signing share for
|
|
56
|
+
* `reducedEncryptedPrv`.
|
|
57
|
+
*/
|
|
58
|
+
function buildVrfKeyEnvelopes(privateMaterial, reducedPrivateMaterial, vrfKeyShare) {
|
|
59
|
+
const envelope = (0, cbor_x_1.encode)({
|
|
60
|
+
version: VRF_KEY_ENVELOPE_VERSION,
|
|
61
|
+
prvKeyShare: new Uint8Array(privateMaterial),
|
|
62
|
+
vrf: new Uint8Array(vrfKeyShare),
|
|
63
|
+
});
|
|
64
|
+
const reducedEnvelope = (0, cbor_x_1.encode)({
|
|
65
|
+
version: VRF_KEY_ENVELOPE_VERSION,
|
|
66
|
+
prvKeyShare: new Uint8Array(reducedPrivateMaterial),
|
|
67
|
+
vrf: new Uint8Array(vrfKeyShare),
|
|
68
|
+
});
|
|
69
|
+
return { envelope: Buffer.from(envelope), reducedEnvelope: Buffer.from(reducedEnvelope) };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parses a decrypted root blob produced by {@link buildVrfKeyEnvelopes}: a CBOR
|
|
73
|
+
* envelope `{version: 1, prvKeyShare, vrf}`. Returns the signing and VRF keyshares
|
|
74
|
+
* as Buffers. Throws if the blob is not a valid VRF key envelope.
|
|
75
|
+
*/
|
|
76
|
+
function parseVrfKeyEnvelopes(decryptedBlob) {
|
|
77
|
+
let envelope;
|
|
78
|
+
try {
|
|
79
|
+
envelope = (0, cbor_x_1.decode)(Buffer.from(decryptedBlob, 'base64'));
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
83
|
+
throw new Error(`Failed to decode safe MPC root key envelope: ${message}`);
|
|
84
|
+
}
|
|
85
|
+
if (!isVrfKeyEnvelope(envelope)) {
|
|
86
|
+
throw new Error('Invalid safe MPC root key envelope: expected version, signing keyshare, and VRF keyshare');
|
|
87
|
+
}
|
|
88
|
+
const { version, prvKeyShare, vrf } = envelope;
|
|
89
|
+
if (version !== VRF_KEY_ENVELOPE_VERSION) {
|
|
90
|
+
throw new Error(`Unsupported safe MPC root key envelope version: ${String(version)}`);
|
|
91
|
+
}
|
|
92
|
+
if (!(prvKeyShare instanceof Uint8Array) || prvKeyShare.length === 0) {
|
|
93
|
+
throw new Error('Safe MPC root key envelope is missing a signing keyshare');
|
|
94
|
+
}
|
|
95
|
+
if (!(vrf instanceof Uint8Array) || vrf.length === 0) {
|
|
96
|
+
throw new Error('Safe MPC root key envelope is missing a VRF keyshare');
|
|
97
|
+
}
|
|
98
|
+
return { signing: Buffer.from(prvKeyShare), vrf: Buffer.from(vrf) };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Encodes a hardened derivation index as the byte path the DKLS hard-derive wasm
|
|
102
|
+
* expects: one big-endian u32 with the hardened bit (0x80000000) set — i.e. the
|
|
103
|
+
* child path `m/<index>'`. The server derives the same hardened path from the
|
|
104
|
+
* `derivationIndex` it receives on round 1.
|
|
105
|
+
*/
|
|
106
|
+
function hardenedDerivationPath(index) {
|
|
107
|
+
if (!Number.isInteger(index) || index < 0 || index > 0x7fffffff) {
|
|
108
|
+
throw new Error(`Invalid derivation index: ${index}`);
|
|
109
|
+
}
|
|
110
|
+
return new Uint8Array([0x80 | (index >>> 24), (index >>> 16) & 0xff, (index >>> 8) & 0xff, index & 0xff]);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* EcdsaMPCv2Utils variant that runs the Ristretto VRF DKG alongside the signing DKLS
|
|
114
|
+
* DKG inside the same MPCv2 keygen rounds, for safe MPC root creation.
|
|
115
|
+
*
|
|
116
|
+
* The round enum is unchanged: the VRF commitment rides MPCv2-R1, the opening rides
|
|
117
|
+
* MPCv2-R2, and the VRF DKG finalizes locally before MPCv2-R3. VRF messages travel as
|
|
118
|
+
* opaque base64 fields on the round payloads, never through the DKLS broadcast/p2p slots.
|
|
119
|
+
* At the end, the signing and VRF keyshares are combined into a single CBOR envelope
|
|
120
|
+
* before encryption.
|
|
121
|
+
*/
|
|
122
|
+
class EcdsaVrfMPCv2Utils extends ecdsaMPCv2_1.EcdsaMPCv2Utils {
|
|
123
|
+
/** @inheritdoc */
|
|
124
|
+
async createKeychains(params) {
|
|
125
|
+
const { userSession, backupSession } = this.createSigningDkgSessions(params.retrofit);
|
|
126
|
+
const userVrfSession = new sdk_lib_mpc_1.DklsVrf.VrfDkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
127
|
+
const backupVrfSession = new sdk_lib_mpc_1.DklsVrf.VrfDkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
128
|
+
const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
|
|
129
|
+
const backupGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
|
|
130
|
+
// Get the BitGo public key based on user/enterprise feature flags
|
|
131
|
+
// If it doesn't work, use the default public key from the constants
|
|
132
|
+
const { mpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
|
|
133
|
+
const mpcv2Key = mpcv2PublicKey ?? this.bitgoMPCv2PublicGpgKey;
|
|
134
|
+
(0, assert_1.default)(mpcv2Key, 'Failed to get BitGo MPCv2 GPG public key');
|
|
135
|
+
const bitgoPublicGpgKey = mpcv2Key.armor();
|
|
136
|
+
if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
|
|
137
|
+
// Ensure the public key is one of the expected BitGo public keys when in test or prod.
|
|
138
|
+
(0, assert_1.default)((0, bitgoPubKeys_1.isBitgoMpcPubKey)(bitgoPublicGpgKey, 'mpcv2'), 'Invalid BitGo GPG public key');
|
|
139
|
+
}
|
|
140
|
+
const userGpgPrvKey = {
|
|
141
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
142
|
+
gpgKey: userGpgKey.privateKey,
|
|
143
|
+
};
|
|
144
|
+
const backupGpgPrvKey = {
|
|
145
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.BACKUP,
|
|
146
|
+
gpgKey: backupGpgKey.privateKey,
|
|
147
|
+
};
|
|
148
|
+
const bitgoGpgPubKey = {
|
|
149
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
150
|
+
gpgKey: bitgoPublicGpgKey,
|
|
151
|
+
};
|
|
152
|
+
// #region round 1
|
|
153
|
+
const userRound1BroadcastMsg = await userSession.initDkg();
|
|
154
|
+
const backupRound1BroadcastMsg = await backupSession.initDkg();
|
|
155
|
+
const userVrfRound1Msg = await userVrfSession.initDkg();
|
|
156
|
+
const backupVrfRound1Msg = await backupVrfSession.initDkg();
|
|
157
|
+
const round1SerializedMessages = sdk_lib_mpc_1.DklsTypes.serializeMessages({
|
|
158
|
+
broadcastMessages: [userRound1BroadcastMsg, backupRound1BroadcastMsg],
|
|
159
|
+
p2pMessages: [],
|
|
160
|
+
});
|
|
161
|
+
const round1Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(round1SerializedMessages, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
162
|
+
const userMsg1 = round1Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER)?.payload;
|
|
163
|
+
const backupMsg1 = round1Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP)?.payload;
|
|
164
|
+
(0, assert_1.default)(userMsg1, 'User message 1 not found in broadcast messages');
|
|
165
|
+
(0, assert_1.default)(backupMsg1, 'Backup message 1 not found in broadcast messages');
|
|
166
|
+
const userGpgPublicKey = userGpgKey.publicKey;
|
|
167
|
+
const backupGpgPublicKey = backupGpgKey.publicKey;
|
|
168
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
|
|
169
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
|
|
170
|
+
// Keep VRF messages opaque on the key-generation request.
|
|
171
|
+
const round1Sender = (0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, params.enterprise, params.safeId);
|
|
172
|
+
const { sessionId, bitgoMsg1, bitgoToBackupMsg2, bitgoToUserMsg2, bitgoVrfMsg1 } = await round1Sender(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], {
|
|
173
|
+
userMsg1: { from: typesMPCv2_1.MPCv2PartiesEnum.USER, ...userMsg1 },
|
|
174
|
+
backupMsg1: { from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, ...backupMsg1 },
|
|
175
|
+
userGpgPublicKey,
|
|
176
|
+
backupGpgPublicKey,
|
|
177
|
+
userVrfMsg1: serializeVrfMessages(userVrfRound1Msg),
|
|
178
|
+
backupVrfMsg1: serializeVrfMessages(backupVrfRound1Msg),
|
|
179
|
+
walletId: params.retrofit?.walletId,
|
|
180
|
+
});
|
|
181
|
+
(0, assert_1.default)(bitgoVrfMsg1, 'BitGo VRF message 1 not found in round 1 response');
|
|
182
|
+
// #endregion
|
|
183
|
+
// #region round 2
|
|
184
|
+
const bitgoRound1BroadcastMessages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg1)] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
185
|
+
const bitgoRound1BroadcastMsg = bitgoRound1BroadcastMessages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
186
|
+
(0, assert_1.default)(bitgoRound1BroadcastMsg, 'BitGo message 1 not found in broadcast messages');
|
|
187
|
+
const userRound2P2PMessages = userSession.handleIncomingMessages({
|
|
188
|
+
p2pMessages: [],
|
|
189
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1BroadcastMsg), backupRound1BroadcastMsg],
|
|
190
|
+
});
|
|
191
|
+
const userToBitgoMsg2 = userRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
192
|
+
(0, assert_1.default)(userToBitgoMsg2, 'User message 2 not found in P2P messages');
|
|
193
|
+
const serializedUserToBitgoMsg2 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(userToBitgoMsg2);
|
|
194
|
+
const backupRound2P2PMessages = backupSession.handleIncomingMessages({
|
|
195
|
+
p2pMessages: [],
|
|
196
|
+
broadcastMessages: [userRound1BroadcastMsg, sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1BroadcastMsg)],
|
|
197
|
+
});
|
|
198
|
+
const serializedBackupToBitgoMsg2 = sdk_lib_mpc_1.DklsTypes.serializeMessages(backupRound2P2PMessages).p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
199
|
+
(0, assert_1.default)(serializedBackupToBitgoMsg2, 'Backup message 2 not found in P2P messages');
|
|
200
|
+
// VRF: consume BitGo's and the counterparty's commitments, emit this party's openings.
|
|
201
|
+
// Openings come back as p2p messages addressed to each party (including the sender).
|
|
202
|
+
const userVrfRound2Messages = await userVrfSession.handleIncomingMessages({
|
|
203
|
+
broadcastMessages: [
|
|
204
|
+
...backupVrfRound1Msg.broadcastMessages,
|
|
205
|
+
...deserializeVrfMessages(bitgoVrfMsg1, typesMPCv2_1.MPCv2PartiesEnum.USER).broadcastMessages,
|
|
206
|
+
],
|
|
207
|
+
p2pMessages: [],
|
|
208
|
+
});
|
|
209
|
+
const backupVrfRound2Messages = await backupVrfSession.handleIncomingMessages({
|
|
210
|
+
broadcastMessages: [
|
|
211
|
+
...userVrfRound1Msg.broadcastMessages,
|
|
212
|
+
...deserializeVrfMessages(bitgoVrfMsg1, typesMPCv2_1.MPCv2PartiesEnum.BACKUP).broadcastMessages,
|
|
213
|
+
],
|
|
214
|
+
p2pMessages: [],
|
|
215
|
+
});
|
|
216
|
+
const round2Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({ p2pMessages: [serializedUserToBitgoMsg2, serializedBackupToBitgoMsg2], broadcastMessages: [] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
217
|
+
const userRound2Msg = round2Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
218
|
+
const backupRound2Msg = round2Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
219
|
+
(0, assert_1.default)(userRound2Msg, 'User to Bitgo message 2 not found in P2P messages');
|
|
220
|
+
(0, assert_1.default)(userRound2Msg.commitment, 'User to Bitgo commitment not found in P2P messages');
|
|
221
|
+
(0, assert_1.default)(backupRound2Msg, 'Backup to Bitgo message 2 not found in P2P messages');
|
|
222
|
+
(0, assert_1.default)(backupRound2Msg.commitment, 'Backup to Bitgo commitment not found in P2P messages');
|
|
223
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userRound2Msg.commitment), 'User to Bitgo commitment is required');
|
|
224
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupRound2Msg.commitment), 'Backup to Bitgo commitment is required');
|
|
225
|
+
const round2Sender = (0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, params.enterprise);
|
|
226
|
+
const { sessionId: sessionIdRound2, bitgoCommitment2, bitgoToUserMsg3, bitgoToBackupMsg3, bitgoVrfMsg2, } = await round2Sender(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2'], {
|
|
227
|
+
sessionId,
|
|
228
|
+
userMsg2: {
|
|
229
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
230
|
+
to: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
231
|
+
signature: userRound2Msg.payload.signature,
|
|
232
|
+
encryptedMessage: userRound2Msg.payload.encryptedMessage,
|
|
233
|
+
},
|
|
234
|
+
userCommitment2: userRound2Msg.commitment,
|
|
235
|
+
backupMsg2: {
|
|
236
|
+
from: typesMPCv2_1.MPCv2PartiesEnum.BACKUP,
|
|
237
|
+
to: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
238
|
+
signature: backupRound2Msg.payload.signature,
|
|
239
|
+
encryptedMessage: backupRound2Msg.payload.encryptedMessage,
|
|
240
|
+
},
|
|
241
|
+
backupCommitment2: backupRound2Msg.commitment,
|
|
242
|
+
userVrfMsg2: serializeVrfMessages(userVrfRound2Messages),
|
|
243
|
+
backupVrfMsg2: serializeVrfMessages(backupVrfRound2Messages),
|
|
244
|
+
});
|
|
245
|
+
// #endregion
|
|
246
|
+
// #region round 3
|
|
247
|
+
assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and 2 Session IDs do not match');
|
|
248
|
+
(0, assert_1.default)(bitgoVrfMsg2, 'BitGo VRF message 2 not found in round 2 response');
|
|
249
|
+
// VRF: finalize both DKGs locally by consuming the opening messages addressed to each
|
|
250
|
+
// party (including each party's own) from the R2 exchanges. The VRF DKG completes here,
|
|
251
|
+
// a full round of slack before MPCv2-R3.
|
|
252
|
+
await userVrfSession.handleIncomingMessages({
|
|
253
|
+
broadcastMessages: [],
|
|
254
|
+
p2pMessages: [
|
|
255
|
+
...userVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.USER),
|
|
256
|
+
...backupVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.USER),
|
|
257
|
+
...deserializeVrfMessages(bitgoVrfMsg2, typesMPCv2_1.MPCv2PartiesEnum.USER).p2pMessages,
|
|
258
|
+
],
|
|
259
|
+
});
|
|
260
|
+
await backupVrfSession.handleIncomingMessages({
|
|
261
|
+
broadcastMessages: [],
|
|
262
|
+
p2pMessages: [
|
|
263
|
+
...userVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
|
|
264
|
+
...backupVrfRound2Messages.p2pMessages.filter((m) => m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
|
|
265
|
+
...deserializeVrfMessages(bitgoVrfMsg2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP).p2pMessages,
|
|
266
|
+
],
|
|
267
|
+
});
|
|
268
|
+
const decryptedBitgoToUserRound2Msgs = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [this.formatP2PMessage(bitgoToUserMsg2)], broadcastMessages: [] }, [bitgoGpgPubKey], [userGpgPrvKey]);
|
|
269
|
+
const serializedBitgoToUserRound2Msg = decryptedBitgoToUserRound2Msgs.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
270
|
+
(0, assert_1.default)(serializedBitgoToUserRound2Msg, 'BitGo to User message 2 not found in P2P messages');
|
|
271
|
+
const bitgoToUserRound2Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToUserRound2Msg);
|
|
272
|
+
const decryptedBitgoToBackupRound2Msg = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [this.formatP2PMessage(bitgoToBackupMsg2)], broadcastMessages: [] }, [bitgoGpgPubKey], [backupGpgPrvKey]);
|
|
273
|
+
const serializedBitgoToBackupRound2Msg = decryptedBitgoToBackupRound2Msg.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
274
|
+
(0, assert_1.default)(serializedBitgoToBackupRound2Msg, 'BitGo to Backup message 2 not found in P2P messages');
|
|
275
|
+
const bitgoToBackupRound2Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToBackupRound2Msg);
|
|
276
|
+
const userToBackupMsg2 = userRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
277
|
+
(0, assert_1.default)(userToBackupMsg2, 'User to Backup message 2 not found in P2P messages');
|
|
278
|
+
const backupToUserMsg2 = backupRound2P2PMessages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
279
|
+
(0, assert_1.default)(backupToUserMsg2, 'Backup to User message 2 not found in P2P messages');
|
|
280
|
+
const userRound3Messages = userSession.handleIncomingMessages({
|
|
281
|
+
broadcastMessages: [],
|
|
282
|
+
p2pMessages: [bitgoToUserRound2Msg, backupToUserMsg2],
|
|
283
|
+
});
|
|
284
|
+
const userToBackupMsg3 = userRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
285
|
+
(0, assert_1.default)(userToBackupMsg3, 'User to Backup message 3 not found in P2P messages');
|
|
286
|
+
const userToBitgoMsg3 = userRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
287
|
+
(0, assert_1.default)(userToBitgoMsg3, 'User to Bitgo message 3 not found in P2P messages');
|
|
288
|
+
const serializedUserToBitgoMsg3 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(userToBitgoMsg3);
|
|
289
|
+
const backupRound3Messages = backupSession.handleIncomingMessages({
|
|
290
|
+
broadcastMessages: [],
|
|
291
|
+
p2pMessages: [bitgoToBackupRound2Msg, userToBackupMsg2],
|
|
292
|
+
});
|
|
293
|
+
const backupToUserMsg3 = backupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
294
|
+
(0, assert_1.default)(backupToUserMsg3, 'Backup to User message 3 not found in P2P messages');
|
|
295
|
+
const backupToBitgoMsg3 = backupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP && m.to === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
296
|
+
(0, assert_1.default)(backupToBitgoMsg3, 'Backup to Bitgo message 3 not found in P2P messages');
|
|
297
|
+
const serializedBackupToBitgoMsg3 = sdk_lib_mpc_1.DklsTypes.serializeP2PMessage(backupToBitgoMsg3);
|
|
298
|
+
const decryptedBitgoToUserRound3Messages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ broadcastMessages: [], p2pMessages: [this.formatP2PMessage(bitgoToUserMsg3, bitgoCommitment2)] }, [bitgoGpgPubKey], [userGpgPrvKey]);
|
|
299
|
+
const serializedBitgoToUserRound3Msg = decryptedBitgoToUserRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
300
|
+
(0, assert_1.default)(serializedBitgoToUserRound3Msg, 'BitGo to User message 3 not found in P2P messages');
|
|
301
|
+
const bitgoToUserRound3Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToUserRound3Msg);
|
|
302
|
+
const decryptedBitgoToBackupRound3Messages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ broadcastMessages: [], p2pMessages: [this.formatP2PMessage(bitgoToBackupMsg3, bitgoCommitment2)] }, [bitgoGpgPubKey], [backupGpgPrvKey]);
|
|
303
|
+
const serializedBitgoToBackupRound3Msg = decryptedBitgoToBackupRound3Messages.p2pMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO && m.to === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
304
|
+
(0, assert_1.default)(serializedBitgoToBackupRound3Msg, 'BitGo to Backup message 3 not found in P2P messages');
|
|
305
|
+
const bitgoToBackupRound3Msg = sdk_lib_mpc_1.DklsTypes.deserializeP2PMessage(serializedBitgoToBackupRound3Msg);
|
|
306
|
+
const userRound4Messages = userSession.handleIncomingMessages({
|
|
307
|
+
p2pMessages: [backupToUserMsg3, bitgoToUserRound3Msg],
|
|
308
|
+
broadcastMessages: [],
|
|
309
|
+
});
|
|
310
|
+
const userRound4BroadcastMsg = userRound4Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER);
|
|
311
|
+
(0, assert_1.default)(userRound4BroadcastMsg, 'User message 4 not found in broadcast messages');
|
|
312
|
+
const serializedUserRound4BroadcastMsg = sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(userRound4BroadcastMsg);
|
|
313
|
+
const backupRound4Messages = backupSession.handleIncomingMessages({
|
|
314
|
+
p2pMessages: [userToBackupMsg3, bitgoToBackupRound3Msg],
|
|
315
|
+
broadcastMessages: [],
|
|
316
|
+
});
|
|
317
|
+
const backupRound4BroadcastMsg = backupRound4Messages.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
|
|
318
|
+
(0, assert_1.default)(backupRound4BroadcastMsg, 'Backup message 4 not found in broadcast messages');
|
|
319
|
+
const serializedBackupRound4BroadcastMsg = sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(backupRound4BroadcastMsg);
|
|
320
|
+
const round3Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
|
|
321
|
+
p2pMessages: [serializedUserToBitgoMsg3, serializedBackupToBitgoMsg3],
|
|
322
|
+
broadcastMessages: [serializedUserRound4BroadcastMsg, serializedBackupRound4BroadcastMsg],
|
|
323
|
+
}, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
|
|
324
|
+
const { sessionId: sessionIdRound3, bitgoMsg4, commonKeychain: bitgoCommonKeychain, } = await this.sendKeyGenerationRound3(params.enterprise, sessionId, round3Messages);
|
|
325
|
+
// #endregion
|
|
326
|
+
// #region keychain creation
|
|
327
|
+
assert_1.default.equal(sessionId, sessionIdRound3, 'Round 1 and 3 Session IDs do not match');
|
|
328
|
+
const bitgoRound4BroadcastMessages = sdk_lib_mpc_1.DklsTypes.deserializeMessages(await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg4)] }, [bitgoGpgPubKey], [])).broadcastMessages;
|
|
329
|
+
const bitgoRound4BroadcastMsg = bitgoRound4BroadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
330
|
+
(0, assert_1.default)(bitgoRound4BroadcastMsg, 'BitGo message 4 not found in broadcast messages');
|
|
331
|
+
userSession.handleIncomingMessages({
|
|
332
|
+
p2pMessages: [],
|
|
333
|
+
broadcastMessages: [bitgoRound4BroadcastMsg, backupRound4BroadcastMsg],
|
|
334
|
+
});
|
|
335
|
+
backupSession.handleIncomingMessages({
|
|
336
|
+
p2pMessages: [],
|
|
337
|
+
broadcastMessages: [bitgoRound4BroadcastMsg, userRound4BroadcastMsg],
|
|
338
|
+
});
|
|
339
|
+
const userPrivateMaterial = userSession.getKeyShare();
|
|
340
|
+
const backupPrivateMaterial = backupSession.getKeyShare();
|
|
341
|
+
const userReducedPrivateMaterial = userSession.getReducedKeyShare();
|
|
342
|
+
const backupReducedPrivateMaterial = backupSession.getReducedKeyShare();
|
|
343
|
+
const userVrfKeyShare = userVrfSession.getKeyShare();
|
|
344
|
+
const backupVrfKeyShare = backupVrfSession.getKeyShare();
|
|
345
|
+
const userCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userPrivateMaterial);
|
|
346
|
+
const backupCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(backupPrivateMaterial);
|
|
347
|
+
assert_1.default.equal(bitgoCommonKeychain, userCommonKeychain, 'User and Bitgo Common keychains do not match');
|
|
348
|
+
assert_1.default.equal(bitgoCommonKeychain, backupCommonKeychain, 'Backup and Bitgo Common keychains do not match');
|
|
349
|
+
const { envelope: userEnvelope, reducedEnvelope: userReducedEnvelope } = buildVrfKeyEnvelopes(userPrivateMaterial, userReducedPrivateMaterial, userVrfKeyShare);
|
|
350
|
+
const { envelope: backupEnvelope, reducedEnvelope: backupReducedEnvelope } = buildVrfKeyEnvelopes(backupPrivateMaterial, backupReducedPrivateMaterial, backupVrfKeyShare);
|
|
351
|
+
const encryptionSession = params.encryptionVersion === 2 ? await this.bitgo.createEncryptionSession(params.passphrase) : undefined;
|
|
352
|
+
try {
|
|
353
|
+
const userKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, bitgoCommonKeychain, userEnvelope, userReducedEnvelope, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, encryptionSession, params.encryptionVersion, params.enterprise, params.safeId);
|
|
354
|
+
const backupKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, bitgoCommonKeychain, backupEnvelope, backupReducedEnvelope, params.passphrase, params.originalPasscodeEncryptionCode, undefined, encryptionSession, params.encryptionVersion, undefined, params.safeId);
|
|
355
|
+
const bitgoKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, bitgoCommonKeychain, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, params.safeId);
|
|
356
|
+
const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
|
|
357
|
+
userKeychainPromise,
|
|
358
|
+
backupKeychainPromise,
|
|
359
|
+
bitgoKeychainPromise,
|
|
360
|
+
]);
|
|
361
|
+
// #endregion
|
|
362
|
+
return {
|
|
363
|
+
userKeychain,
|
|
364
|
+
backupKeychain,
|
|
365
|
+
bitgoKeychain,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
finally {
|
|
369
|
+
encryptionSession?.destroy();
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Sends round 1 for the user/BitGo hard-derive ceremony.
|
|
374
|
+
*/
|
|
375
|
+
async sendDerivationRound1BySender(senderFn, userGpgPublicKey, payload, parentKeyId, derivationIndex) {
|
|
376
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
|
|
377
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(parentKeyId), 'Parent key id is required');
|
|
378
|
+
const userMsg1 = payload.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER)?.payload;
|
|
379
|
+
(0, assert_1.default)(userMsg1, 'User message 1 not found in broadcast messages');
|
|
380
|
+
(0, assert_1.default)(public_types_1.MPCv2DeriveRound1Request.props.derivationIndex.is(derivationIndex), 'Derivation index must be a non-negative safe integer');
|
|
381
|
+
const request = {
|
|
382
|
+
userGpgPublicKey,
|
|
383
|
+
userMsg1: { from: typesMPCv2_1.MPCv2PartiesEnum.USER, ...userMsg1 },
|
|
384
|
+
parentKeyId,
|
|
385
|
+
derivationIndex,
|
|
386
|
+
};
|
|
387
|
+
return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R1'], request);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Sends round 2 for the user/BitGo hard-derive ceremony.
|
|
391
|
+
*/
|
|
392
|
+
async sendDerivationRound2BySender(senderFn, sessionId, payload) {
|
|
393
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(sessionId), 'Session ID is required');
|
|
394
|
+
const userMsg2 = payload.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.USER)?.payload;
|
|
395
|
+
(0, assert_1.default)(userMsg2, 'User message 2 not found in broadcast messages');
|
|
396
|
+
const request = {
|
|
397
|
+
sessionId,
|
|
398
|
+
userMsg2: { from: typesMPCv2_1.MPCv2PartiesEnum.USER, ...userMsg2 },
|
|
399
|
+
};
|
|
400
|
+
return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R2'], request);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Completes round 3 and returns the child common keychain.
|
|
404
|
+
*/
|
|
405
|
+
async sendDerivationRound3BySender(senderFn, sessionId) {
|
|
406
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(sessionId), 'Session ID is required');
|
|
407
|
+
return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2Derive-R3'], { sessionId });
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Runs the safe child hard-derive ceremony and registers child key documents.
|
|
411
|
+
*/
|
|
412
|
+
async createSafeChildKeychains(params) {
|
|
413
|
+
const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
|
|
414
|
+
const { mpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
|
|
415
|
+
const mpcv2Key = mpcv2PublicKey ?? this.bitgoMPCv2PublicGpgKey;
|
|
416
|
+
(0, assert_1.default)(mpcv2Key, 'Failed to get BitGo MPCv2 GPG public key');
|
|
417
|
+
const bitgoPublicGpgKey = mpcv2Key.armor();
|
|
418
|
+
if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
|
|
419
|
+
(0, assert_1.default)((0, bitgoPubKeys_1.isBitgoMpcPubKey)(bitgoPublicGpgKey, 'mpcv2'), 'Invalid BitGo GPG public key');
|
|
420
|
+
}
|
|
421
|
+
const userGpgPrvKey = {
|
|
422
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.USER,
|
|
423
|
+
gpgKey: userGpgKey.privateKey,
|
|
424
|
+
};
|
|
425
|
+
const bitgoGpgPubKey = {
|
|
426
|
+
partyId: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
|
|
427
|
+
gpgKey: bitgoPublicGpgKey,
|
|
428
|
+
};
|
|
429
|
+
const path = hardenedDerivationPath(params.derivationIndex);
|
|
430
|
+
const userDeriveSession = new sdk_lib_mpc_1.DklsDrv.Derive(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER, params.userRootKeyShare, params.userRootVrfKeyShare, path);
|
|
431
|
+
// Round 1: send the user's first message.
|
|
432
|
+
const userRound1Msg = await userDeriveSession.initDerive();
|
|
433
|
+
const round1Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages({
|
|
434
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.serializeBroadcastMessage(userRound1Msg)],
|
|
435
|
+
p2pMessages: [],
|
|
436
|
+
}, [bitgoGpgPubKey], [userGpgPrvKey]);
|
|
437
|
+
(0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgKey.publicKey), 'User GPG public key is required');
|
|
438
|
+
const { sessionId, bitgoMsg1 } = await this.sendDerivationRound1BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForSafeChild)(this.bitgo, params.enterprise, params.safeId), userGpgKey.publicKey, round1Messages, params.parentKeyId, params.derivationIndex);
|
|
439
|
+
// Round 2: process the peer's first message and return the user's second.
|
|
440
|
+
const decryptedBitgoRound1 = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg1)] }, [bitgoGpgPubKey], []);
|
|
441
|
+
const bitgoRound1Msg = decryptedBitgoRound1.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
442
|
+
(0, assert_1.default)(bitgoRound1Msg, 'BitGo derive message 1 not found in broadcast messages');
|
|
443
|
+
const userRound2Messages = userDeriveSession.handleIncomingMessages({
|
|
444
|
+
p2pMessages: [],
|
|
445
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound1Msg)],
|
|
446
|
+
});
|
|
447
|
+
const round2Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(sdk_lib_mpc_1.DklsTypes.serializeMessages(userRound2Messages), [bitgoGpgPubKey], [userGpgPrvKey]);
|
|
448
|
+
const { sessionId: sessionIdRound2, bitgoMsg2 } = await this.sendDerivationRound2BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForSafeChild)(this.bitgo, params.enterprise, params.safeId), sessionId, round2Messages);
|
|
449
|
+
assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and 2 Session IDs do not match');
|
|
450
|
+
// Process the peer response to finalize the local child share.
|
|
451
|
+
const decryptedBitgoRound2 = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg2)] }, [bitgoGpgPubKey], []);
|
|
452
|
+
const bitgoRound2Msg = decryptedBitgoRound2.broadcastMessages.find((m) => m.from === typesMPCv2_1.MPCv2PartiesEnum.BITGO);
|
|
453
|
+
(0, assert_1.default)(bitgoRound2Msg, 'BitGo derive message 2 not found in broadcast messages');
|
|
454
|
+
userDeriveSession.handleIncomingMessages({
|
|
455
|
+
p2pMessages: [],
|
|
456
|
+
broadcastMessages: [sdk_lib_mpc_1.DklsTypes.deserializeBroadcastMessage(bitgoRound2Msg)],
|
|
457
|
+
});
|
|
458
|
+
// Round 3: obtain the child common-keychain metadata.
|
|
459
|
+
const { sessionId: sessionIdRound3, commonKeychain } = await this.sendDerivationRound3BySender((0, ecdsaMPCv2KeyGenSender_1.KeyGenSenderForSafeChild)(this.bitgo, params.enterprise, params.safeId), sessionId);
|
|
460
|
+
assert_1.default.equal(sessionId, sessionIdRound3, 'Round 1 and 3 Session IDs do not match');
|
|
461
|
+
const userPrivateMaterial = userDeriveSession.getKeyShare();
|
|
462
|
+
const userReducedPrivateMaterial = userDeriveSession.getReducedKeyShare();
|
|
463
|
+
const userCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userPrivateMaterial);
|
|
464
|
+
assert_1.default.equal(commonKeychain, userCommonKeychain, 'User and BitGo common keychains do not match');
|
|
465
|
+
const encryptionSession = params.encryptionVersion === 2 ? await this.bitgo.createEncryptionSession(params.passphrase) : undefined;
|
|
466
|
+
try {
|
|
467
|
+
const userKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, userPrivateMaterial, userReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, encryptionSession, params.encryptionVersion, params.enterprise, params.safeId, { parentKeyId: params.userRootKeyId, index: params.derivationIndex });
|
|
468
|
+
const backupKeychainPromise = this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, undefined, undefined, params.passphrase, params.originalPasscodeEncryptionCode, undefined, encryptionSession, params.encryptionVersion, undefined, params.safeId, { parentKeyId: params.backupRootKeyId, index: params.derivationIndex });
|
|
469
|
+
const [userKeychain, backupKeychain] = await Promise.all([userKeychainPromise, backupKeychainPromise]);
|
|
470
|
+
return { userKeychain, backupKeychain };
|
|
471
|
+
}
|
|
472
|
+
finally {
|
|
473
|
+
encryptionSession?.destroy();
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
createSigningDkgSessions(retrofit) {
|
|
477
|
+
if (retrofit) {
|
|
478
|
+
const retrofitData = this.getMpcV2RetrofitDataFromMpcV1Keys({
|
|
479
|
+
mpcv1UserKeyShare: retrofit.decryptedUserKey,
|
|
480
|
+
mpcv1BackupKeyShare: retrofit.decryptedBackupKey,
|
|
481
|
+
});
|
|
482
|
+
return {
|
|
483
|
+
userSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER, undefined, retrofitData.mpcv2UserKeyShare),
|
|
484
|
+
backupSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, undefined, retrofitData.mpcv2BackupKeyShare),
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
return {
|
|
488
|
+
userSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER),
|
|
489
|
+
backupSession: new sdk_lib_mpc_1.DklsDkg.Dkg(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
exports.EcdsaVrfMPCv2Utils = EcdsaVrfMPCv2Utils;
|
|
494
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF3RkEsb0RBZ0JDO0FBT0Qsb0RBc0JDO0FBUUQsd0RBS0M7QUFsSkQseURBQTBGO0FBQzFGLG1DQUF3QztBQUN4QyxvREFBNEI7QUFDNUIsNkNBQTZDO0FBQzdDLHNEQVM2QjtBQUk3QixxREFBd0Q7QUFFeEQsNERBQThGO0FBQzlGLDZDQUErQztBQUMvQyxxRUFJa0M7QUFDbEMsNkNBQThFO0FBRTlFOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFPbkMsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxhQUFhLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUM7QUFDdkgsQ0FBQztBQWVELFNBQVMsb0JBQW9CLENBQUMsUUFBd0M7SUFDcEUsTUFBTSxTQUFTLEdBQXlCO1FBQ3RDLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osRUFBRSxFQUFFLENBQUMsQ0FB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QUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3BHLGFBQWEsRUFBRSxJQUFJLHFCQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsNkJBQWdCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsbUJBQW1CLENBQUM7YUFDM0csQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLElBQUkscUJBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSw2QkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDekQsYUFBYSxFQUFFLElBQUkscUJBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSw2QkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDOUQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXZwQkQsZ0RBdXBCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERrbHNDb21tcywgRGtsc0RrZywgRGtsc0RydiwgRGtsc1R5cGVzLCBEa2xzVnJmIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQge1xuICBNUEN2MkRlcml2ZVJvdW5kMVJlcXVlc3QsXG4gIE1QQ3YyRGVyaXZlUm91bmQxUmVzcG9uc2UsXG4gIE1QQ3YyRGVyaXZlUm91bmQyUmVxdWVzdCxcbiAgTVBDdjJEZXJpdmVSb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJEZXJpdmVSb3VuZDNSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5TdGF0ZUVudW0sXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluL2lLZXljaGFpbnMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblZlcnNpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9hcGknO1xuaW1wb3J0IHsgZ2VuZXJhdGVHUEdLZXlQYWlyIH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBpc0JpdGdvTXBjUHViS2V5IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2JpdGdvUHViS2V5cyc7XG5pbXBvcnQgeyBFY2RzYU1QQ3YyVXRpbHMgfSBmcm9tICcuL2VjZHNhTVBDdjInO1xuaW1wb3J0IHtcbiAgRWNkc2FNUEN2MkRlcml2ZUtleVNlbmRGbixcbiAgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSxcbiAgS2V5R2VuU2VuZGVyRm9yU2FmZUNoaWxkLFxufSBmcm9tICcuL2VjZHNhTVBDdjJLZXlHZW5TZW5kZXInO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSwgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcyB9IGZyb20gJy4vdHlwZXNNUEN2Mic7XG5cbi8qKlxuICogVmVyc2lvbiBmaWVsZCBvZiB0aGUgYGVuY3J5cHRlZFBydmAgZW52ZWxvcGUgdXNlZCB3aGVuIGEgY2VyZW1vbnkgcHJvZHVjZXMgYm90aCBhXG4gKiBzaWduaW5nIGtleXNoYXJlIGFuZCBhIFZSRiBrZXlzaGFyZS4gVGhlIHBsYWludGV4dCBoYW5kZWQgdG8gZW5jcnlwdCgpIGlzXG4gKiBgYmFzZTY0KGNib3JFbmNvZGUoZW52ZWxvcGUpKWAsIGtlZXBpbmcgaXQgYSBzaW5nbGUgb3BhcXVlIGJhc2U2NCB0b2tlbiBleGFjdGx5IGFzXG4gKiB0aGUgb3JkaW5hcnkgTVBDdjIgZm9ybWF0IGRvZXMuXG4gKi9cbmNvbnN0IFZSRl9LRVlfRU5WRUxPUEVfVkVSU0lPTiA9IDE7XG50eXBlIFZyZktleUVudmVsb3BlID0ge1xuICB2ZXJzaW9uOiB1bmtub3duO1xuICBwcnZLZXlTaGFyZTogdW5rbm93bjtcbiAgdnJmOiB1bmtub3duO1xufTtcblxuZnVuY3Rpb24gaXNWcmZLZXlFbnZlbG9wZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFZyZktleUVudmVsb3BlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ3ZlcnNpb24nIGluIHZhbHVlICYmICdwcnZLZXlTaGFyZScgaW4gdmFsdWUgJiYgJ3ZyZicgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogV2lyZSBmb3JtYXQgZm9yIFZSRiBES0cgbWVzc2FnZXMgcmlkaW5nIHRoZSBNUEN2Mi1SMS9SMiBwYXlsb2FkczogYW4gb3BhcXVlIGJsb2IsXG4gKiBgYmFzZTY0KEpTT04uc3RyaW5naWZ5KFZyZk1lc3NhZ2VUcmFuc2ZlcltdKSlgLCBjYXJyeWluZyB0aGUgcGFydHkncyBmdWxsIGJhdGNoIG9mXG4gKiBlbWl0dGVkIG1lc3NhZ2VzLiBUaGUgVlJGIERLRyBlbWl0cyBicm9hZGNhc3QgY29tbWl0bWVudHMgKFIxKSBhbmQgcGVyLXJlY2lwaWVudFxuICogb3BlbmluZyBtZXNzYWdlcyBhZGRyZXNzZWQgdG8gZWFjaCBwYXJ0eSBpbmNsdWRpbmcgdGhlIHNlbmRlciAoUjIpLCBzbyB0aGUgcmVjZWl2aW5nXG4gKiBzaWRlIHJvdXRlcyBieSBgdG9gIGFuZCBrZWVwcyBtZXNzYWdlcyBhZGRyZXNzZWQgdG8gaXRzZWxmLlxuICovXG5pbnRlcmZhY2UgVnJmTWVzc2FnZVRyYW5zZmVyIHtcbiAgZnJvbTogbnVtYmVyO1xuICB0bz86IG51bWJlcjtcbiAgcGF5bG9hZDogc3RyaW5nOyAvLyBiYXNlNjRcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplVnJmTWVzc2FnZXMobWVzc2FnZXM6IERrbHNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyYW5zZmVyczogVnJmTWVzc2FnZVRyYW5zZmVyW10gPSBbXG4gICAgLi4ubWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKChtKSA9PiAoeyBmcm9tOiBtLmZyb20sIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpIH0pKSxcbiAgICAuLi5tZXNzYWdlcy5wMnBNZXNzYWdlcy5tYXAoKG0pID0+ICh7XG4gICAgICBmcm9tOiBtLmZyb20sXG4gICAgICB0bzogbS50byxcbiAgICAgIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pKSxcbiAgXTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHRyYW5zZmVycykpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhibG9iOiBzdHJpbmcsIGZvclBhcnR5OiBudW1iZXIpOiBEa2xzVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICBjb25zdCB0cmFuc2ZlcnM6IFZyZk1lc3NhZ2VUcmFuc2ZlcltdID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShibG9iLCAnYmFzZTY0JykudG9TdHJpbmcoKSk7XG4gIHJldHVybiB7XG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IHRyYW5zZmVyc1xuICAgICAgLmZpbHRlcigodCkgPT4gdC50byA9PT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgodCkgPT4gKHsgZnJvbTogdC5mcm9tLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0LnBheWxvYWQsICdiYXNlNjQnKSkgfSkpLFxuICAgIHAycE1lc3NhZ2VzOiB0cmFuc2ZlcnNcbiAgICAgIC5maWx0ZXIoKHQpOiB0IGlzIFZyZk1lc3NhZ2VUcmFuc2ZlciAmIHsgdG86IG51bWJlciB9ID0+IHQudG8gPT09IGZvclBhcnR5KVxuICAgICAgLm1hcCgodCkgPT4gKHsgZnJvbTogdC5mcm9tLCB0bzogdC50bywgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odC5wYXlsb2FkLCAnYmFzZTY0JykpIH0pKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyB0aGUgc2lnbmluZyBrZXlzaGFyZSB3aXRoIHRoZSBWUkYga2V5c2hhcmUgaW50byB0aGUgYGVuY3J5cHRlZFBydmAgZW52ZWxvcGVcbiAqIChgYmFzZTY0KGNib3JFbmNvZGUoe3ZlcnNpb24sIHBydktleVNoYXJlLCB2cmZ9KSlgIG9uY2UgdGhlIGNhbGxlciBiYXNlNjQtZW5jb2RlcyB0aGVcbiAqIHJldHVybmVkIGJ1ZmZlcnMpLiBUaGUgc2FtZSBjb250YWluZXIgd3JhcHMgdGhlIHJlZHVjZWQgc2lnbmluZyBzaGFyZSBmb3JcbiAqIGByZWR1Y2VkRW5jcnlwdGVkUHJ2YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVnJmS2V5RW52ZWxvcGVzKFxuICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICB2cmZLZXlTaGFyZTogQnVmZmVyXG4pOiB7IGVudmVsb3BlOiBCdWZmZXI7IHJlZHVjZWRFbnZlbG9wZTogQnVmZmVyIH0ge1xuICBjb25zdCBlbnZlbG9wZSA9IGVuY29kZSh7XG4gICAgdmVyc2lvbjogVlJGX0tFWV9FTlZFTE9QRV9WRVJTSU9OLFxuICAgIHBydktleVNoYXJlOiBuZXcgVWludDhBcnJheShwcml2YXRlTWF0ZXJpYWwpLFxuICAgIHZyZjogbmV3IFVpbnQ4QXJyYXkodnJmS2V5U2hhcmUpLFxuICB9KTtcbiAgY29uc3QgcmVkdWNlZEVudmVsb3BlID0gZW5jb2RlKHtcbiAgICB2ZXJzaW9uOiBWUkZfS0VZX0VOVkVMT1BFX1ZFUlNJT04sXG4gICAgcHJ2S2V5U2hhcmU6IG5ldyBVaW50OEFycmF5KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpLFxuICAgIHZyZjogbmV3IFVpbnQ4QXJyYXkodnJmS2V5U2hhcmUpLFxuICB9KTtcbiAgcmV0dXJuIHsgZW52ZWxvcGU6IEJ1ZmZlci5mcm9tKGVudmVsb3BlKSwgcmVkdWNlZEVudmVsb3BlOiBCdWZmZXIuZnJvbShyZWR1Y2VkRW52ZWxvcGUpIH07XG59XG5cbi8qKlxuICogUGFyc2VzIGEgZGVjcnlwdGVkIHJvb3QgYmxvYiBwcm9kdWNlZCBieSB7QGxpbmsgYnVpbGRWcmZLZXlFbnZlbG9wZXN9OiBhIENCT1JcbiAqIGVudmVsb3BlIGB7dmVyc2lvbjogMSwgcHJ2S2V5U2hhcmUsIHZyZn1gLiBSZXR1cm5zIHRoZSBzaWduaW5nIGFuZCBWUkYga2V5c2hhcmVzXG4gKiBhcyBCdWZmZXJzLiBUaHJvd3MgaWYgdGhlIGJsb2IgaXMgbm90IGEgdmFsaWQgVlJGIGtleSBlbnZlbG9wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVnJmS2V5RW52ZWxvcGVzKGRlY3J5cHRlZEJsb2I6IHN0cmluZyk6IHsgc2lnbmluZzogQnVmZmVyOyB2cmY6IEJ1ZmZlciB9IHtcbiAgbGV0IGVudmVsb3BlOiB1bmtub3duO1xuICB0cnkge1xuICAgIGVudmVsb3BlID0gZGVjb2RlKEJ1ZmZlci5mcm9tKGRlY3J5cHRlZEJsb2IsICdiYXNlNjQnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY29kZSBzYWZlIE1QQyByb290IGtleSBlbnZlbG9wZTogJHttZXNzYWdlfWApO1xuICB9XG4gIGlmICghaXNWcmZLZXlFbnZlbG9wZShlbnZlbG9wZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2FmZSBNUEMgcm9vdCBrZXkgZW52ZWxvcGU6IGV4cGVjdGVkIHZlcnNpb24sIHNpZ25pbmcga2V5c2hhcmUsIGFuZCBWUkYga2V5c2hhcmUnKTtcbiAgfVxuICBjb25zdCB7IHZlcnNpb24sIHBydktleVNoYXJlLCB2cmYgfSA9IGVudmVsb3BlO1xuICBpZiAodmVyc2lvbiAhPT0gVlJGX0tFWV9FTlZFTE9QRV9WRVJTSU9OKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzYWZlIE1QQyByb290IGtleSBlbnZlbG9wZSB2ZXJzaW9uOiAke1N0cmluZyh2ZXJzaW9uKX1gKTtcbiAgfVxuICBpZiAoIShwcnZLZXlTaGFyZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IHBydktleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZSBNUEMgcm9vdCBrZXkgZW52ZWxvcGUgaXMgbWlzc2luZyBhIHNpZ25pbmcga2V5c2hhcmUnKTtcbiAgfVxuICBpZiAoISh2cmYgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCB2cmYubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlIE1QQyByb290IGtleSBlbnZlbG9wZSBpcyBtaXNzaW5nIGEgVlJGIGtleXNoYXJlJyk7XG4gIH1cbiAgcmV0dXJuIHsgc2lnbmluZzogQnVmZmVyLmZyb20ocHJ2S2V5U2hhcmUpLCB2cmY6IEJ1ZmZlci5mcm9tKHZyZikgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgaGFyZGVuZWQgZGVyaXZhdGlvbiBpbmRleCBhcyB0aGUgYnl0ZSBwYXRoIHRoZSBES0xTIGhhcmQtZGVyaXZlIHdhc21cbiAqIGV4cGVjdHM6IG9uZSBiaWctZW5kaWFuIHUzMiB3aXRoIHRoZSBoYXJkZW5lZCBiaXQgKDB4ODAwMDAwMDApIHNldCDigJQgaS5lLiB0aGVcbiAqIGNoaWxkIHBhdGggYG0vPGluZGV4PidgLiBUaGUgc2VydmVyIGRlcml2ZXMgdGhlIHNhbWUgaGFyZGVuZWQgcGF0aCBmcm9tIHRoZVxuICogYGRlcml2YXRpb25JbmRleGAgaXQgcmVjZWl2ZXMgb24gcm91bmQgMS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaW5kZXg6IG51bWJlcik6IFVpbnQ4QXJyYXkge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaW5kZXgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IDB4N2ZmZmZmZmYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGVyaXZhdGlvbiBpbmRleDogJHtpbmRleH1gKTtcbiAgfVxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4ODAgfCAoaW5kZXggPj4+IDI0KSwgKGluZGV4ID4+PiAxNikgJiAweGZmLCAoaW5kZXggPj4+IDgpICYgMHhmZiwgaW5kZXggJiAweGZmXSk7XG59XG5cbi8qKlxuICogRWNkc2FNUEN2MlV0aWxzIHZhcmlhbnQgdGhhdCBydW5zIHRoZSBSaXN0cmV0dG8gVlJGIERLRyBhbG9uZ3NpZGUgdGhlIHNpZ25pbmcgREtMU1xuICogREtHIGluc2lkZSB0aGUgc2FtZSBNUEN2MiBrZXlnZW4gcm91bmRzLCBmb3Igc2FmZSBNUEMgcm9vdCBjcmVhdGlvbi5cbiAqXG4gKiBUaGUgcm91bmQgZW51bSBpcyB1bmNoYW5nZWQ6IHRoZSBWUkYgY29tbWl0bWVudCByaWRlcyBNUEN2Mi1SMSwgdGhlIG9wZW5pbmcgcmlkZXNcbiAqIE1QQ3YyLVIyLCBhbmQgdGhlIFZSRiBES0cgZmluYWxpemVzIGxvY2FsbHkgYmVmb3JlIE1QQ3YyLVIzLiBWUkYgbWVzc2FnZXMgdHJhdmVsIGFzXG4gKiBvcGFxdWUgYmFzZTY0IGZpZWxkcyBvbiB0aGUgcm91bmQgcGF5bG9hZHMsIG5ldmVyIHRocm91Z2ggdGhlIERLTFMgYnJvYWRjYXN0L3AycCBzbG90cy5cbiAqIEF0IHRoZSBlbmQsIHRoZSBzaWduaW5nIGFuZCBWUkYga2V5c2hhcmVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIENCT1IgZW52ZWxvcGVcbiAqIGJlZm9yZSBlbmNyeXB0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRWNkc2FWcmZNUEN2MlV0aWxzIGV4dGVuZHMgRWNkc2FNUEN2MlV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZztcbiAgICByZXRyb2ZpdD86IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZDtcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG4gICAgLy8gVGFncyB0aGUgcmVzdWx0aW5nIHVzZXIvYmFja3VwL2JpdGdvIHJvb3Qga2V5cyB3aXRoIHRoaXMgc2FmZS5cbiAgICBzYWZlSWQ6IHN0cmluZztcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IHsgdXNlclNlc3Npb24sIGJhY2t1cFNlc3Npb24gfSA9IHRoaXMuY3JlYXRlU2lnbmluZ0RrZ1Nlc3Npb25zKHBhcmFtcy5yZXRyb2ZpdCk7XG4gICAgY29uc3QgdXNlclZyZlNlc3Npb24gPSBuZXcgRGtsc1ZyZi5WcmZEa2coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBjb25zdCBiYWNrdXBWcmZTZXNzaW9uID0gbmV3IERrbHNWcmYuVnJmRGtnKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICAvLyBHZXQgdGhlIEJpdEdvIHB1YmxpYyBrZXkgYmFzZWQgb24gdXNlci9lbnRlcnByaXNlIGZlYXR1cmUgZmxhZ3NcbiAgICAvLyBJZiBpdCBkb2Vzbid0IHdvcmssIHVzZSB0aGUgZGVmYXVsdCBwdWJsaWMga2V5IGZyb20gdGhlIGNvbnN0YW50c1xuICAgIGNvbnN0IHsgbXBjdjJQdWJsaWNLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29HcGdQdWJrZXlCYXNlZE9uRmVhdHVyZUZsYWdzKHBhcmFtcy5lbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBtcGN2MktleSA9IG1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQobXBjdjJLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBtcGN2MktleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIC8vIEVuc3VyZSB0aGUgcHVibGljIGtleSBpcyBvbmUgb2YgdGhlIGV4cGVjdGVkIEJpdEdvIHB1YmxpYyBrZXlzIHdoZW4gaW4gdGVzdCBvciBwcm9kLlxuICAgICAgYXNzZXJ0KGlzQml0Z29NcGNQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXksICdtcGN2MicpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGdwZ0tleTogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGdwZ0tleTogYmFja3VwR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGNvbnN0IHVzZXJSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCB1c2VyU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgYmFja3VwU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgdXNlclZyZlJvdW5kMU1zZyA9IGF3YWl0IHVzZXJWcmZTZXNzaW9uLmluaXREa2coKTtcbiAgICBjb25zdCBiYWNrdXBWcmZSb3VuZDFNc2cgPSBhd2FpdCBiYWNrdXBWcmZTZXNzaW9uLmluaXREa2coKTtcblxuICAgIGNvbnN0IHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZ10sXG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQxTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgcm91bmQxU2VyaWFsaXplZE1lc3NhZ2VzLFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHJvdW5kMU1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBjb25zdCBiYWNrdXBNc2cxID0gcm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KHVzZXJNc2cxLCAnVXNlciBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChiYWNrdXBNc2cxLCAnQmFja3VwIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCB1c2VyR3BnUHVibGljS2V5ID0gdXNlckdwZ0tleS5wdWJsaWNLZXk7XG4gICAgY29uc3QgYmFja3VwR3BnUHVibGljS2V5ID0gYmFja3VwR3BnS2V5LnB1YmxpY0tleTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICAvLyBLZWVwIFZSRiBtZXNzYWdlcyBvcGFxdWUgb24gdGhlIGtleS1nZW5lcmF0aW9uIHJlcXVlc3QuXG4gICAgY29uc3Qgcm91bmQxU2VuZGVyID0gS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZTxNUEN2MktleUdlblJvdW5kMVJlc3BvbnNlICYgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcz4oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICBwYXJhbXMuc2FmZUlkXG4gICAgKTtcbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxLCBiaXRnb1RvQmFja3VwTXNnMiwgYml0Z29Ub1VzZXJNc2cyLCBiaXRnb1ZyZk1zZzEgfSA9IGF3YWl0IHJvdW5kMVNlbmRlcihcbiAgICAgIE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLFxuICAgICAge1xuICAgICAgICB1c2VyTXNnMTogeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIC4uLnVzZXJNc2cxIH0sXG4gICAgICAgIGJhY2t1cE1zZzE6IHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsIC4uLmJhY2t1cE1zZzEgfSxcbiAgICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgICB1c2VyVnJmTXNnMTogc2VyaWFsaXplVnJmTWVzc2FnZXModXNlclZyZlJvdW5kMU1zZyksXG4gICAgICAgIGJhY2t1cFZyZk1zZzE6IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJhY2t1cFZyZlJvdW5kMU1zZyksXG4gICAgICAgIHdhbGxldElkOiBwYXJhbXMucmV0cm9maXQ/LndhbGxldElkLFxuICAgICAgfVxuICAgICk7XG4gICAgYXNzZXJ0KGJpdGdvVnJmTXNnMSwgJ0JpdEdvIFZSRiBtZXNzYWdlIDEgbm90IGZvdW5kIGluIHJvdW5kIDEgcmVzcG9uc2UnKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgICBjb25zdCBiaXRnb1JvdW5kMUJyb2FkY2FzdE1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cxKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cgPSBiaXRnb1JvdW5kMUJyb2FkY2FzdE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2csICdCaXRHbyBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kMlAyUE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW0RrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2cyID0gdXNlclJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMiwgJ1VzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2cyID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2cyKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMUJyb2FkY2FzdE1zZywgRGtsc1R5cGVzLmRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyldLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVNZXNzYWdlcyhiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcykucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIsICdCYWNrdXAgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIC8vIFZSRjogY29uc3VtZSBCaXRHbydzIGFuZCB0aGUgY291bnRlcnBhcnR5J3MgY29tbWl0bWVudHMsIGVtaXQgdGhpcyBwYXJ0eSdzIG9wZW5pbmdzLlxuICAgIC8vIE9wZW5pbmdzIGNvbWUgYmFjayBhcyBwMnAgbWVzc2FnZXMgYWRkcmVzc2VkIHRvIGVhY2ggcGFydHkgKGluY2x1ZGluZyB0aGUgc2VuZGVyKS5cbiAgICBjb25zdCB1c2VyVnJmUm91bmQyTWVzc2FnZXMgPSBhd2FpdCB1c2VyVnJmU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXG4gICAgICAgIC4uLmJhY2t1cFZyZlJvdW5kMU1zZy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICAgICAgLi4uZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiaXRnb1ZyZk1zZzEsIE1QQ3YyUGFydGllc0VudW0uVVNFUikuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgICBdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYmFja3VwVnJmUm91bmQyTWVzc2FnZXMgPSBhd2FpdCBiYWNrdXBWcmZTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtcbiAgICAgICAgLi4udXNlclZyZlJvdW5kMU1zZy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICAgICAgLi4uZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiaXRnb1ZyZk1zZzEsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKS5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICAgIF0sXG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiwgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHVzZXJSb3VuZDJNc2cgPSByb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kMk1zZyA9IHJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclJvdW5kMk1zZywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQodXNlclJvdW5kMk1zZy5jb21taXRtZW50LCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQoYmFja3VwUm91bmQyTXNnLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kMk1zZy5jb21taXRtZW50LCAnQmFja3VwIHRvIEJpdGdvIGNvbW1pdG1lbnQgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyUm91bmQyTXNnLmNvbW1pdG1lbnQpLCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cFJvdW5kMk1zZy5jb21taXRtZW50KSwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3Qgcm91bmQyU2VuZGVyID0gS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZTxNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlICYgTXBjVjJWcmZLZXlHZW5SZXNwb25zZUZpZWxkcz4oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgcGFyYW1zLmVudGVycHJpc2VcbiAgICApO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgYml0Z29Db21taXRtZW50MixcbiAgICAgIGJpdGdvVG9Vc2VyTXNnMyxcbiAgICAgIGJpdGdvVG9CYWNrdXBNc2czLFxuICAgICAgYml0Z29WcmZNc2cyLFxuICAgIH0gPSBhd2FpdCByb3VuZDJTZW5kZXIoTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogdXNlclJvdW5kMk1zZy5wYXlsb2FkLnNpZ25hdHVyZSxcbiAgICAgICAgZW5jcnlwdGVkTWVzc2FnZTogdXNlclJvdW5kMk1zZy5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgdXNlckNvbW1pdG1lbnQyOiB1c2VyUm91bmQyTXNnLmNvbW1pdG1lbnQsXG4gICAgICBiYWNrdXBNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgICB0bzogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICAgc2lnbmF0dXJlOiBiYWNrdXBSb3VuZDJNc2cucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IGJhY2t1cFJvdW5kMk1zZy5wYXlsb2FkLmVuY3J5cHRlZE1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgYmFja3VwQ29tbWl0bWVudDI6IGJhY2t1cFJvdW5kMk1zZy5jb21taXRtZW50LFxuICAgICAgdXNlclZyZk1zZzI6IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKHVzZXJWcmZSb3VuZDJNZXNzYWdlcyksXG4gICAgICBiYWNrdXBWcmZNc2cyOiBzZXJpYWxpemVWcmZNZXNzYWdlcyhiYWNrdXBWcmZSb3VuZDJNZXNzYWdlcyksXG4gICAgfSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAzXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgMiBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBhc3NlcnQoYml0Z29WcmZNc2cyLCAnQml0R28gVlJGIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gcm91bmQgMiByZXNwb25zZScpO1xuXG4gICAgLy8gVlJGOiBmaW5hbGl6ZSBib3RoIERLR3MgbG9jYWxseSBieSBjb25zdW1pbmcgdGhlIG9wZW5pbmcgbWVzc2FnZXMgYWRkcmVzc2VkIHRvIGVhY2hcbiAgICAvLyBwYXJ0eSAoaW5jbHVkaW5nIGVhY2ggcGFydHkncyBvd24pIGZyb20gdGhlIFIyIGV4Y2hhbmdlcy4gVGhlIFZSRiBES0cgY29tcGxldGVzIGhlcmUsXG4gICAgLy8gYSBmdWxsIHJvdW5kIG9mIHNsYWNrIGJlZm9yZSBNUEN2Mi1SMy5cbiAgICBhd2FpdCB1c2VyVnJmU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbXG4gICAgICAgIC4uLnVzZXJWcmZSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiksXG4gICAgICAgIC4uLmJhY2t1cFZyZlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSxcbiAgICAgICAgLi4uZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiaXRnb1ZyZk1zZzIsIE1QQ3YyUGFydGllc0VudW0uVVNFUikucDJwTWVzc2FnZXMsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IGJhY2t1cFZyZlNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW1xuICAgICAgICAuLi51c2VyVnJmUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCksXG4gICAgICAgIC4uLmJhY2t1cFZyZlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLFxuICAgICAgICAuLi5kZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKGJpdGdvVnJmTXNnMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLnAycE1lc3NhZ2VzLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQyTXNncyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kMk1zZywgJ0JpdEdvIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvVXNlclJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IHVzZXJUb0JhY2t1cE1zZzIgPSB1c2VyUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JhY2t1cE1zZzIsICdVc2VyIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTXNnMiA9IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb1VzZXJNc2cyLCAnQmFja3VwIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDNNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvVXNlclJvdW5kMk1zZywgYmFja3VwVG9Vc2VyTXNnMl0sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMyA9IHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMywgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kM01lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgdXNlclRvQmFja3VwTXNnMl0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzMsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29Nc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb0JpdGdvTXNnMywgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMyA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKGJhY2t1cFRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQzTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtiYWNrdXBUb1VzZXJNc2czLCBiaXRnb1RvVXNlclJvdW5kM01zZ10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gdXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQodXNlclJvdW5kNEJyb2FkY2FzdE1zZywgJ1VzZXIgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclJvdW5kNEJyb2FkY2FzdE1zZyA9IERrbHNUeXBlcy5zZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQ0TWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFt1c2VyVG9CYWNrdXBNc2czLCBiaXRnb1RvQmFja3VwUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2csICdCYWNrdXAgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnKTtcblxuICAgIGNvbnN0IHJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHtcbiAgICAgICAgcDJwTWVzc2FnZXM6IFtzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czLCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzNdLFxuICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnLCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnXSxcbiAgICAgIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDMsXG4gICAgICBiaXRnb01zZzQsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29Db21tb25LZXljaGFpbixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhwYXJhbXMuZW50ZXJwcmlzZSwgc2Vzc2lvbklkLCByb3VuZDNNZXNzYWdlcyk7XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIGtleWNoYWluIGNyZWF0aW9uXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQzLCAnUm91bmQgMSBhbmQgMyBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1lc3NhZ2VzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoXG4gICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnNCldIH0sXG4gICAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKS5icm9hZGNhc3RNZXNzYWdlcztcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZyA9IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcblxuICAgIGFzc2VydChiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgJ0JpdEdvIG1lc3NhZ2UgNCBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIHVzZXJSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cFNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclZyZktleVNoYXJlID0gdXNlclZyZlNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBWcmZLZXlTaGFyZSA9IGJhY2t1cFZyZlNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyUHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBQcml2YXRlTWF0ZXJpYWwpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIHVzZXJDb21tb25LZXljaGFpbiwgJ1VzZXIgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIGJhY2t1cENvbW1vbktleWNoYWluLCAnQmFja3VwIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgeyBlbnZlbG9wZTogdXNlckVudmVsb3BlLCByZWR1Y2VkRW52ZWxvcGU6IHVzZXJSZWR1Y2VkRW52ZWxvcGUgfSA9IGJ1aWxkVnJmS2V5RW52ZWxvcGVzKFxuICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgdXNlclZyZktleVNoYXJlXG4gICAgKTtcbiAgICBjb25zdCB7IGVudmVsb3BlOiBiYWNrdXBFbnZlbG9wZSwgcmVkdWNlZEVudmVsb3BlOiBiYWNrdXBSZWR1Y2VkRW52ZWxvcGUgfSA9IGJ1aWxkVnJmS2V5RW52ZWxvcGVzKFxuICAgICAgYmFja3VwUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFZyZktleVNoYXJlXG4gICAgKTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25TZXNzaW9uID1cbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMiA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLnBhc3NwaHJhc2UpIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHVzZXJFbnZlbG9wZSxcbiAgICAgICAgdXNlclJlZHVjZWRFbnZlbG9wZSxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICBwYXJhbXMuc2FmZUlkXG4gICAgICApO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgICBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgICAgYmFja3VwRW52ZWxvcGUsXG4gICAgICAgIGJhY2t1cFJlZHVjZWRFbnZlbG9wZSxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXMuc2FmZUlkXG4gICAgICApO1xuICAgICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXMuc2FmZUlkXG4gICAgICApO1xuXG4gICAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHVzZXJLZXljaGFpblByb21pc2UsXG4gICAgICAgIGJhY2t1cEtleWNoYWluUHJvbWlzZSxcbiAgICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgICBdKTtcbiAgICAgIC8vICNlbmRyZWdpb25cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuY3J5cHRpb25TZXNzaW9uPy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZW5kcyByb3VuZCAxIGZvciB0aGUgdXNlci9CaXRHbyBoYXJkLWRlcml2ZSBjZXJlbW9ueS5cbiAgICovXG4gIGFzeW5jIHNlbmREZXJpdmF0aW9uUm91bmQxQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJEZXJpdmVLZXlTZW5kRm48TVBDdjJEZXJpdmVSb3VuZDFSZXNwb25zZT4sXG4gICAgdXNlckdwZ1B1YmxpY0tleTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IERrbHNUeXBlcy5BdXRoRW5jTWVzc2FnZXMsXG4gICAgcGFyZW50S2V5SWQ6IHN0cmluZyxcbiAgICBkZXJpdmF0aW9uSW5kZXg6IG51bWJlclxuICApOiBQcm9taXNlPE1QQ3YyRGVyaXZlUm91bmQxUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHBhcmVudEtleUlkKSwgJ1BhcmVudCBrZXkgaWQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnMSwgJ1VzZXIgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIGFzc2VydChcbiAgICAgIE1QQ3YyRGVyaXZlUm91bmQxUmVxdWVzdC5wcm9wcy5kZXJpdmF0aW9uSW5kZXguaXMoZGVyaXZhdGlvbkluZGV4KSxcbiAgICAgICdEZXJpdmF0aW9uIGluZGV4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyJ1xuICAgICk7XG4gICAgY29uc3QgcmVxdWVzdDogTVBDdjJEZXJpdmVSb3VuZDFSZXF1ZXN0ID0ge1xuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJNc2cxOiB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgLi4udXNlck1zZzEgfSxcbiAgICAgIHBhcmVudEtleUlkLFxuICAgICAgZGVyaXZhdGlvbkluZGV4LFxuICAgIH07XG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2MkRlcml2ZS1SMSddLCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyByb3VuZCAyIGZvciB0aGUgdXNlci9CaXRHbyBoYXJkLWRlcml2ZSBjZXJlbW9ueS5cbiAgICovXG4gIGFzeW5jIHNlbmREZXJpdmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJEZXJpdmVLZXlTZW5kRm48TVBDdjJEZXJpdmVSb3VuZDJSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyRGVyaXZlUm91bmQyUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMiA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ1VzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHJlcXVlc3Q6IE1QQ3YyRGVyaXZlUm91bmQyUmVxdWVzdCA9IHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7IGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUiwgLi4udXNlck1zZzIgfSxcbiAgICB9O1xuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjJEZXJpdmUtUjInXSwgcmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGVzIHJvdW5kIDMgYW5kIHJldHVybnMgdGhlIGNoaWxkIGNvbW1vbiBrZXljaGFpbi5cbiAgICovXG4gIGFzeW5jIHNlbmREZXJpdmF0aW9uUm91bmQzQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVjZHNhTVBDdjJEZXJpdmVLZXlTZW5kRm48TVBDdjJEZXJpdmVSb3VuZDNSZXNwb25zZT4sXG4gICAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNUEN2MkRlcml2ZVJvdW5kM1Jlc3BvbnNlPiB7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHNlc3Npb25JZCksICdTZXNzaW9uIElEIGlzIHJlcXVpcmVkJyk7XG4gICAgcmV0dXJuIHNlbmRlckZuKE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2MkRlcml2ZS1SMyddLCB7IHNlc3Npb25JZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBzYWZlIGNoaWxkIGhhcmQtZGVyaXZlIGNlcmVtb255IGFuZCByZWdpc3RlcnMgY2hpbGQga2V5IGRvY3VtZW50cy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIHNhZmVJZDogc3RyaW5nO1xuICAgIC8qKiBSb290IGtleSBJRCB1c2VkIGZvciB0aGUgZGVyaXZlLiAqL1xuICAgIHBhcmVudEtleUlkOiBzdHJpbmc7XG4gICAgZGVyaXZhdGlvbkluZGV4OiBudW1iZXI7XG4gICAgdXNlclJvb3RLZXlJZDogc3RyaW5nO1xuICAgIGJhY2t1cFJvb3RLZXlJZDogc3RyaW5nO1xuICAgIHVzZXJSb290S2V5U2hhcmU6IEJ1ZmZlcjtcbiAgICB1c2VyUm9vdFZyZktleVNoYXJlOiBCdWZmZXI7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm87XG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbjtcbiAgfSk6IFByb21pc2U8UGljazxLZXljaGFpbnNUcmlwbGV0LCAndXNlcktleWNoYWluJyB8ICdiYWNrdXBLZXljaGFpbic+PiB7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICBjb25zdCB7IG1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhwYXJhbXMuZW50ZXJwcmlzZSwgdHJ1ZSk7XG4gICAgY29uc3QgbXBjdjJLZXkgPSBtcGN2MlB1YmxpY0tleSA/PyB0aGlzLmJpdGdvTVBDdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KG1wY3YyS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gbXBjdjJLZXkuYXJtb3IoKTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb01wY1B1YktleShiaXRnb1B1YmxpY0dwZ0tleSwgJ21wY3YyJyksICdJbnZhbGlkIEJpdEdvIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlckdwZ1BydktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLFxuICAgICAgZ3BnS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIGNvbnN0IHBhdGggPSBoYXJkZW5lZERlcml2YXRpb25QYXRoKHBhcmFtcy5kZXJpdmF0aW9uSW5kZXgpO1xuICAgIGNvbnN0IHVzZXJEZXJpdmVTZXNzaW9uID0gbmV3IERrbHNEcnYuRGVyaXZlKFxuICAgICAgMyxcbiAgICAgIDIsXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXJhbXMudXNlclJvb3RLZXlTaGFyZSxcbiAgICAgIHBhcmFtcy51c2VyUm9vdFZyZktleVNoYXJlLFxuICAgICAgcGF0aFxuICAgICk7XG5cbiAgICAvLyBSb3VuZCAxOiBzZW5kIHRoZSB1c2VyJ3MgZmlyc3QgbWVzc2FnZS5cbiAgICBjb25zdCB1c2VyUm91bmQxTXNnID0gYXdhaXQgdXNlckRlcml2ZVNlc3Npb24uaW5pdERlcml2ZSgpO1xuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHtcbiAgICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZSh1c2VyUm91bmQxTXNnKV0sXG4gICAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ0tleS5wdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBiaXRnb01zZzEgfSA9IGF3YWl0IHRoaXMuc2VuZERlcml2YXRpb25Sb3VuZDFCeVNlbmRlcihcbiAgICAgIEtleUdlblNlbmRlckZvclNhZmVDaGlsZDxNUEN2MkRlcml2ZVJvdW5kMVJlc3BvbnNlPih0aGlzLmJpdGdvLCBwYXJhbXMuZW50ZXJwcmlzZSwgcGFyYW1zLnNhZmVJZCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHJvdW5kMU1lc3NhZ2VzLFxuICAgICAgcGFyYW1zLnBhcmVudEtleUlkLFxuICAgICAgcGFyYW1zLmRlcml2YXRpb25JbmRleFxuICAgICk7XG5cbiAgICAvLyBSb3VuZCAyOiBwcm9jZXNzIHRoZSBwZWVyJ3MgZmlyc3QgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSB1c2VyJ3Mgc2Vjb25kLlxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvUm91bmQxID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cxKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbXVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Sb3VuZDFNc2cgPSBkZWNyeXB0ZWRCaXRnb1JvdW5kMS5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGFzc2VydChiaXRnb1JvdW5kMU1zZywgJ0JpdEdvIGRlcml2ZSBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHVzZXJSb3VuZDJNZXNzYWdlcyA9IHVzZXJEZXJpdmVTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxTXNnKV0sXG4gICAgfSk7XG4gICAgY29uc3Qgcm91bmQyTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKHVzZXJSb3VuZDJNZXNzYWdlcyksXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCB7IHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLCBiaXRnb01zZzIgfSA9IGF3YWl0IHRoaXMuc2VuZERlcml2YXRpb25Sb3VuZDJCeVNlbmRlcihcbiAgICAgIEtleUdlblNlbmRlckZvclNhZmVDaGlsZDxNUEN2MkRlcml2ZVJvdW5kMlJlc3BvbnNlPih0aGlzLmJpdGdvLCBwYXJhbXMuZW50ZXJwcmlzZSwgcGFyYW1zLnNhZmVJZCksXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICByb3VuZDJNZXNzYWdlc1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgMiBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIC8vIFByb2Nlc3MgdGhlIHBlZXIgcmVzcG9uc2UgdG8gZmluYWxpemUgdGhlIGxvY2FsIGNoaWxkIHNoYXJlLlxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvUm91bmQyID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2cyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbXVxuICAgICk7XG4gICAgY29uc3QgYml0Z29Sb3VuZDJNc2cgPSBkZWNyeXB0ZWRCaXRnb1JvdW5kMi5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGFzc2VydChiaXRnb1JvdW5kMk1zZywgJ0JpdEdvIGRlcml2ZSBtZXNzYWdlIDIgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIHVzZXJEZXJpdmVTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQyTXNnKV0sXG4gICAgfSk7XG5cbiAgICAvLyBSb3VuZCAzOiBvYnRhaW4gdGhlIGNoaWxkIGNvbW1vbi1rZXljaGFpbiBtZXRhZGF0YS5cbiAgICBjb25zdCB7IHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQzLCBjb21tb25LZXljaGFpbiB9ID0gYXdhaXQgdGhpcy5zZW5kRGVyaXZhdGlvblJvdW5kM0J5U2VuZGVyKFxuICAgICAgS2V5R2VuU2VuZGVyRm9yU2FmZUNoaWxkPE1QQ3YyRGVyaXZlUm91bmQzUmVzcG9uc2U+KHRoaXMuYml0Z28sIHBhcmFtcy5lbnRlcnByaXNlLCBwYXJhbXMuc2FmZUlkKSxcbiAgICAgIHNlc3Npb25JZFxuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQzLCAnUm91bmQgMSBhbmQgMyBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IHVzZXJQcml2YXRlTWF0ZXJpYWwgPSB1c2VyRGVyaXZlU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRlcml2ZVNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlckNvbW1vbktleWNoYWluID0gRGtsc1R5cGVzLmdldENvbW1vbktleWNoYWluKHVzZXJQcml2YXRlTWF0ZXJpYWwpO1xuICAgIGFzc2VydC5lcXVhbChjb21tb25LZXljaGFpbiwgdXNlckNvbW1vbktleWNoYWluLCAnVXNlciBhbmQgQml0R28gY29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25TZXNzaW9uID1cbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMiA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLnBhc3NwaHJhc2UpIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICB1c2VyUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgICBwYXJhbXMuc2FmZUlkLFxuICAgICAgICB7IHBhcmVudEtleUlkOiBwYXJhbXMudXNlclJvb3RLZXlJZCwgaW5kZXg6IHBhcmFtcy5kZXJpdmF0aW9uSW5kZXggfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBwYXJhbXMuc2FmZUlkLFxuICAgICAgICB7IHBhcmVudEtleUlkOiBwYXJhbXMuYmFja3VwUm9vdEtleUlkLCBpbmRleDogcGFyYW1zLmRlcml2YXRpb25JbmRleCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG4gICAgICByZXR1cm4geyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuY3J5cHRpb25TZXNzaW9uPy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaWduaW5nRGtnU2Vzc2lvbnMocmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQpIHtcbiAgICBpZiAocmV0cm9maXQpIHtcbiAgICAgIGNvbnN0IHJldHJvZml0RGF0YSA9IHRoaXMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHtcbiAgICAgICAgbXBjdjFVc2VyS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIG1wY3YxQmFja3VwS2V5U2hhcmU6IHJldHJvZml0LmRlY3J5cHRlZEJhY2t1cEtleSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlclNlc3Npb246IG5ldyBEa2xzRGtnLkRrZygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhLm1wY3YyVXNlcktleVNoYXJlKSxcbiAgICAgICAgYmFja3VwU2Vzc2lvbjogbmV3IERrbHNEa2cuRGtnKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCB1bmRlZmluZWQsIHJldHJvZml0RGF0YS5tcGN2MkJhY2t1cEtleVNoYXJlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1c2VyU2Vzc2lvbjogbmV3IERrbHNEa2cuRGtnKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUiksXG4gICAgICBiYWNrdXBTZXNzaW9uOiBuZXcgRGtsc0RrZy5Ea2coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|