@bitgo-beta/utxo-lib 8.0.3-beta.9 → 8.0.3-beta.900
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/README.md +19 -16
- package/dist/src/address.d.ts +0 -1
- package/dist/src/address.d.ts.map +1 -1
- package/dist/src/address.js +10 -10
- package/dist/src/addressFormat.d.ts +1 -2
- package/dist/src/addressFormat.d.ts.map +1 -1
- package/dist/src/addressFormat.js +21 -26
- package/dist/src/bitgo/Musig2.d.ts +5 -11
- package/dist/src/bitgo/Musig2.d.ts.map +1 -1
- package/dist/src/bitgo/Musig2.js +63 -88
- package/dist/src/bitgo/PsbtUtil.d.ts +70 -0
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
- package/dist/src/bitgo/PsbtUtil.js +132 -0
- package/dist/src/bitgo/Unspent.d.ts +2 -3
- package/dist/src/bitgo/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/Unspent.js +14 -15
- package/dist/src/bitgo/UtxoPsbt.d.ts +26 -40
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +221 -206
- package/dist/src/bitgo/UtxoTransaction.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransaction.js +12 -12
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.js +1 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts +0 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoincash/address.js +11 -12
- package/dist/src/bitgo/bitcoincash/index.js +6 -2
- package/dist/src/bitgo/dash/DashPsbt.d.ts +1 -1
- package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashPsbt.js +4 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransaction.js +3 -3
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.js +1 -1
- package/dist/src/bitgo/dash/index.js +6 -2
- package/dist/src/bitgo/index.d.ts +10 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +10 -3
- package/dist/src/bitgo/keyutil.d.ts +9 -1
- package/dist/src/bitgo/keyutil.d.ts.map +1 -1
- package/dist/src/bitgo/keyutil.js +25 -4
- package/dist/src/bitgo/legacysafe/index.d.ts +14 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +60 -0
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.js +4 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -2
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
- package/dist/src/bitgo/litecoin/index.js +6 -2
- package/dist/src/bitgo/nonStandardHalfSigned.js +2 -3
- package/dist/src/bitgo/outputScripts.d.ts +8 -8
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +56 -39
- package/dist/src/bitgo/parseInput.d.ts +7 -8
- package/dist/src/bitgo/parseInput.d.ts.map +1 -1
- package/dist/src/bitgo/parseInput.js +15 -16
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.js +7 -8
- package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -1
- package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/scriptTypes.js +7 -8
- package/dist/src/bitgo/signature.d.ts +4 -5
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +32 -18
- package/dist/src/bitgo/tnumber.js +2 -3
- package/dist/src/bitgo/transaction.d.ts +31 -4
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +55 -27
- package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
- package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
- package/dist/src/bitgo/transactionAmounts.js +32 -0
- package/dist/src/bitgo/types.d.ts +8 -2
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/types.js +12 -4
- package/dist/src/bitgo/wallet/Psbt.d.ts +90 -27
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +246 -108
- package/dist/src/bitgo/wallet/ScriptId.d.ts +14 -0
- package/dist/src/bitgo/wallet/ScriptId.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/ScriptId.js +28 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts +43 -10
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +174 -81
- package/dist/src/bitgo/wallet/WalletKeys.d.ts +1 -2
- package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletKeys.js +3 -3
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +70 -2
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +179 -43
- package/dist/src/bitgo/wallet/WalletScripts.js +4 -5
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
- package/dist/src/bitgo/wallet/chains.d.ts +2 -2
- package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/chains.js +10 -10
- package/dist/src/bitgo/wallet/index.d.ts +3 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/index.js +9 -2
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +85 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.js +123 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +1 -2
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashBufferutils.js +15 -15
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +1 -2
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +15 -19
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +3 -2
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransaction.js +31 -21
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +6 -4
- package/dist/src/bitgo/zcash/address.d.ts +0 -1
- package/dist/src/bitgo/zcash/address.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/address.js +7 -8
- package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -2
- package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/hashZip0244.js +9 -10
- package/dist/src/bitgo/zcash/index.js +6 -2
- package/dist/src/classify.d.ts +0 -1
- package/dist/src/classify.d.ts.map +1 -1
- package/dist/src/classify.js +5 -5
- package/dist/src/index.js +6 -2
- package/dist/src/networks.d.ts +2 -2
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +67 -21
- package/dist/src/noble_ecc.d.ts +7 -7
- package/dist/src/noble_ecc.d.ts.map +1 -1
- package/dist/src/noble_ecc.js +5 -5
- package/dist/src/payments/p2tr.js +13 -18
- package/dist/src/payments/p2tr_ns.js +3 -5
- package/dist/src/taproot.d.ts +1 -2
- package/dist/src/taproot.d.ts.map +1 -1
- package/dist/src/taproot.js +21 -22
- package/dist/src/templates/multisig/input.d.ts +0 -1
- package/dist/src/templates/multisig/input.d.ts.map +1 -1
- package/dist/src/templates/multisig/input.js +2 -3
- package/dist/src/templates/multisig/output.d.ts +0 -1
- package/dist/src/templates/multisig/output.d.ts.map +1 -1
- package/dist/src/templates/multisig/output.js +2 -3
- package/dist/src/templates/nulldata.d.ts +0 -1
- package/dist/src/templates/nulldata.d.ts.map +1 -1
- package/dist/src/templates/nulldata.js +3 -3
- package/dist/src/templates/pubkey/input.d.ts +0 -1
- package/dist/src/templates/pubkey/input.d.ts.map +1 -1
- package/dist/src/templates/pubkey/input.js +2 -3
- package/dist/src/templates/pubkey/output.d.ts +0 -1
- package/dist/src/templates/pubkey/output.d.ts.map +1 -1
- package/dist/src/templates/pubkey/output.js +2 -3
- package/dist/src/templates/pubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/input.js +2 -3
- package/dist/src/templates/pubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/output.js +2 -3
- package/dist/src/templates/scripthash/input.d.ts +0 -1
- package/dist/src/templates/scripthash/input.d.ts.map +1 -1
- package/dist/src/templates/scripthash/input.js +2 -3
- package/dist/src/templates/scripthash/output.d.ts +0 -1
- package/dist/src/templates/scripthash/output.d.ts.map +1 -1
- package/dist/src/templates/scripthash/output.js +2 -3
- package/dist/src/templates/taproot/input.d.ts +0 -1
- package/dist/src/templates/taproot/input.d.ts.map +1 -1
- package/dist/src/templates/taproot/input.js +2 -3
- package/dist/src/templates/taproot/output.d.ts +0 -1
- package/dist/src/templates/taproot/output.d.ts.map +1 -1
- package/dist/src/templates/taproot/output.js +2 -3
- package/dist/src/templates/taprootnofn/input.d.ts +0 -1
- package/dist/src/templates/taprootnofn/input.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/input.js +2 -3
- package/dist/src/templates/taprootnofn/output.d.ts +0 -1
- package/dist/src/templates/taprootnofn/output.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/output.js +2 -3
- package/dist/src/templates/witnesscommitment/output.d.ts +0 -1
- package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -1
- package/dist/src/templates/witnesscommitment/output.js +4 -5
- package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/input.js +2 -3
- package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/output.js +2 -3
- package/dist/src/templates/witnessscripthash/input.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/input.js +2 -3
- package/dist/src/templates/witnessscripthash/output.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/output.js +2 -3
- package/dist/src/testutil/index.d.ts +1 -0
- package/dist/src/testutil/index.d.ts.map +1 -1
- package/dist/src/testutil/index.js +7 -2
- package/dist/src/testutil/keys.d.ts +6 -3
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +24 -10
- package/dist/src/testutil/mock.d.ts +2 -3
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +31 -23
- package/dist/src/testutil/psbt.d.ts +40 -16
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +54 -39
- package/dist/src/testutil/transaction.d.ts +18 -7
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +33 -26
- package/dist/src/transaction_builder.d.ts +0 -1
- package/dist/src/transaction_builder.d.ts.map +1 -1
- package/dist/src/transaction_builder.js +13 -18
- package/package.json +10 -12
package/dist/src/bitgo/Musig2.js
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
3
|
+
exports.Musig2NonceStore = void 0;
|
|
4
|
+
exports.encodePsbtMusig2Participants = encodePsbtMusig2Participants;
|
|
5
|
+
exports.encodePsbtMusig2PubNonce = encodePsbtMusig2PubNonce;
|
|
6
|
+
exports.encodePsbtMusig2PartialSig = encodePsbtMusig2PartialSig;
|
|
7
|
+
exports.decodePsbtMusig2Participants = decodePsbtMusig2Participants;
|
|
8
|
+
exports.decodePsbtMusig2Nonce = decodePsbtMusig2Nonce;
|
|
9
|
+
exports.decodePsbtMusig2PartialSig = decodePsbtMusig2PartialSig;
|
|
10
|
+
exports.createTapInternalKey = createTapInternalKey;
|
|
11
|
+
exports.createTapOutputKey = createTapOutputKey;
|
|
12
|
+
exports.createAggregateNonce = createAggregateNonce;
|
|
13
|
+
exports.createTapTweak = createTapTweak;
|
|
14
|
+
exports.musig2PartialSign = musig2PartialSign;
|
|
15
|
+
exports.musig2PartialSigVerify = musig2PartialSigVerify;
|
|
16
|
+
exports.musig2AggregateSigs = musig2AggregateSigs;
|
|
17
|
+
exports.createMusig2SigningSession = createMusig2SigningSession;
|
|
18
|
+
exports.parsePsbtMusig2Participants = parsePsbtMusig2Participants;
|
|
19
|
+
exports.parsePsbtMusig2Nonces = parsePsbtMusig2Nonces;
|
|
20
|
+
exports.parsePsbtMusig2PartialSigs = parsePsbtMusig2PartialSigs;
|
|
21
|
+
exports.assertPsbtMusig2Participants = assertPsbtMusig2Participants;
|
|
22
|
+
exports.assertPsbtMusig2Nonces = assertPsbtMusig2Nonces;
|
|
23
|
+
exports.getSigHashTypeFromSigs = getSigHashTypeFromSigs;
|
|
24
|
+
exports.createMusig2DeterministicNonce = createMusig2DeterministicNonce;
|
|
25
|
+
exports.musig2DeterministicSign = musig2DeterministicSign;
|
|
5
26
|
const outputScripts_1 = require("./outputScripts");
|
|
6
27
|
const noble_ecc_1 = require("../noble_ecc");
|
|
7
28
|
const taproot_1 = require("../taproot");
|
|
8
29
|
const index_1 = require("../index");
|
|
9
|
-
const
|
|
10
|
-
const wallet_1 = require("./wallet");
|
|
11
|
-
const parseInput_1 = require("./parseInput");
|
|
30
|
+
const PsbtUtil_1 = require("./PsbtUtil");
|
|
12
31
|
/**
|
|
13
32
|
* Because musig uses reference-equal buffers to cache nonces, we wrap it here to allow using
|
|
14
33
|
* nonces that are byte-equal but not reference-equal.
|
|
@@ -56,16 +75,15 @@ exports.Musig2NonceStore = Musig2NonceStore;
|
|
|
56
75
|
* @return x-only tapOutputKey||tapInternalKey as sub keydata, plain sigining participant keys as valuedata
|
|
57
76
|
*/
|
|
58
77
|
function encodePsbtMusig2Participants(participants) {
|
|
59
|
-
const keydata = [participants.tapOutputKey, participants.tapInternalKey].map((pubkey) => outputScripts_1.checkXOnlyPublicKey(pubkey));
|
|
60
|
-
const value = participants.participantPubKeys.map((pubkey) => outputScripts_1.checkPlainPublicKey(pubkey));
|
|
78
|
+
const keydata = [participants.tapOutputKey, participants.tapInternalKey].map((pubkey) => (0, outputScripts_1.checkXOnlyPublicKey)(pubkey));
|
|
79
|
+
const value = participants.participantPubKeys.map((pubkey) => (0, outputScripts_1.checkPlainPublicKey)(pubkey));
|
|
61
80
|
const key = {
|
|
62
|
-
identifier:
|
|
63
|
-
subtype:
|
|
81
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
82
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
64
83
|
keydata: Buffer.concat(keydata),
|
|
65
84
|
};
|
|
66
85
|
return { key, value: Buffer.concat(value) };
|
|
67
86
|
}
|
|
68
|
-
exports.encodePsbtMusig2Participants = encodePsbtMusig2Participants;
|
|
69
87
|
/**
|
|
70
88
|
* Psbt proprietary key val util function for pub nonce. SubType is 0x02
|
|
71
89
|
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
@@ -76,40 +94,38 @@ function encodePsbtMusig2PubNonce(nonce) {
|
|
|
76
94
|
throw new Error(`Invalid pubNonces length ${nonce.pubNonce.length}`);
|
|
77
95
|
}
|
|
78
96
|
const keydata = Buffer.concat([
|
|
79
|
-
outputScripts_1.checkPlainPublicKey(nonce.participantPubKey),
|
|
80
|
-
outputScripts_1.checkXOnlyPublicKey(nonce.tapOutputKey),
|
|
97
|
+
(0, outputScripts_1.checkPlainPublicKey)(nonce.participantPubKey),
|
|
98
|
+
(0, outputScripts_1.checkXOnlyPublicKey)(nonce.tapOutputKey),
|
|
81
99
|
]);
|
|
82
100
|
const key = {
|
|
83
|
-
identifier:
|
|
84
|
-
subtype:
|
|
101
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
102
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
85
103
|
keydata,
|
|
86
104
|
};
|
|
87
105
|
return { key, value: nonce.pubNonce };
|
|
88
106
|
}
|
|
89
|
-
exports.encodePsbtMusig2PubNonce = encodePsbtMusig2PubNonce;
|
|
90
107
|
function encodePsbtMusig2PartialSig(partialSig) {
|
|
91
108
|
if (partialSig.partialSig.length !== 32 && partialSig.partialSig.length !== 33) {
|
|
92
109
|
throw new Error(`Invalid partialSig length ${partialSig.partialSig.length}`);
|
|
93
110
|
}
|
|
94
111
|
const keydata = Buffer.concat([
|
|
95
|
-
outputScripts_1.checkPlainPublicKey(partialSig.participantPubKey),
|
|
96
|
-
outputScripts_1.checkXOnlyPublicKey(partialSig.tapOutputKey),
|
|
112
|
+
(0, outputScripts_1.checkPlainPublicKey)(partialSig.participantPubKey),
|
|
113
|
+
(0, outputScripts_1.checkXOnlyPublicKey)(partialSig.tapOutputKey),
|
|
97
114
|
]);
|
|
98
115
|
const key = {
|
|
99
|
-
identifier:
|
|
100
|
-
subtype:
|
|
116
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
117
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
|
|
101
118
|
keydata,
|
|
102
119
|
};
|
|
103
120
|
return { key, value: partialSig.partialSig };
|
|
104
121
|
}
|
|
105
|
-
exports.encodePsbtMusig2PartialSig = encodePsbtMusig2PartialSig;
|
|
106
122
|
/**
|
|
107
123
|
* Decodes proprietary key value data for participant pub keys
|
|
108
124
|
* @param kv
|
|
109
125
|
*/
|
|
110
126
|
function decodePsbtMusig2Participants(kv) {
|
|
111
|
-
if (kv.key.identifier !==
|
|
112
|
-
kv.key.subtype !==
|
|
127
|
+
if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
|
|
128
|
+
kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
|
|
113
129
|
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for participants pub keys`);
|
|
114
130
|
}
|
|
115
131
|
const key = kv.key.keydata;
|
|
@@ -126,13 +142,12 @@ function decodePsbtMusig2Participants(kv) {
|
|
|
126
142
|
}
|
|
127
143
|
return { tapOutputKey: key.subarray(0, 32), tapInternalKey: key.subarray(32), participantPubKeys };
|
|
128
144
|
}
|
|
129
|
-
exports.decodePsbtMusig2Participants = decodePsbtMusig2Participants;
|
|
130
145
|
/**
|
|
131
146
|
* Decodes proprietary key value data for musig2 nonce
|
|
132
147
|
* @param kv
|
|
133
148
|
*/
|
|
134
149
|
function decodePsbtMusig2Nonce(kv) {
|
|
135
|
-
if (kv.key.identifier !==
|
|
150
|
+
if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER || kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE) {
|
|
136
151
|
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for nonce`);
|
|
137
152
|
}
|
|
138
153
|
const key = kv.key.keydata;
|
|
@@ -145,14 +160,13 @@ function decodePsbtMusig2Nonce(kv) {
|
|
|
145
160
|
}
|
|
146
161
|
return { participantPubKey: key.subarray(0, 33), tapOutputKey: key.subarray(33), pubNonce: value };
|
|
147
162
|
}
|
|
148
|
-
exports.decodePsbtMusig2Nonce = decodePsbtMusig2Nonce;
|
|
149
163
|
/**
|
|
150
164
|
* Decodes proprietary key value data for musig2 partial sig
|
|
151
165
|
* @param kv
|
|
152
166
|
*/
|
|
153
167
|
function decodePsbtMusig2PartialSig(kv) {
|
|
154
|
-
if (kv.key.identifier !==
|
|
155
|
-
kv.key.subtype !==
|
|
168
|
+
if (kv.key.identifier !== PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER ||
|
|
169
|
+
kv.key.subtype !== PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG) {
|
|
156
170
|
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for partial sig`);
|
|
157
171
|
}
|
|
158
172
|
const key = kv.key.keydata;
|
|
@@ -165,60 +179,51 @@ function decodePsbtMusig2PartialSig(kv) {
|
|
|
165
179
|
}
|
|
166
180
|
return { participantPubKey: key.subarray(0, 33), tapOutputKey: key.subarray(33), partialSig: value };
|
|
167
181
|
}
|
|
168
|
-
exports.decodePsbtMusig2PartialSig = decodePsbtMusig2PartialSig;
|
|
169
182
|
function createTapInternalKey(plainPubKeys) {
|
|
170
183
|
return Buffer.from(noble_ecc_1.musig.getXOnlyPubkey(noble_ecc_1.musig.keyAgg(plainPubKeys)));
|
|
171
184
|
}
|
|
172
|
-
exports.createTapInternalKey = createTapInternalKey;
|
|
173
185
|
function createTapOutputKey(internalPubKey, tapTreeRoot) {
|
|
174
|
-
return Buffer.from(taproot_1.tapTweakPubkey(noble_ecc_1.ecc, outputScripts_1.toXOnlyPublicKey(internalPubKey), outputScripts_1.checkTapMerkleRoot(tapTreeRoot)).xOnlyPubkey);
|
|
186
|
+
return Buffer.from((0, taproot_1.tapTweakPubkey)(noble_ecc_1.ecc, (0, outputScripts_1.toXOnlyPublicKey)(internalPubKey), (0, outputScripts_1.checkTapMerkleRoot)(tapTreeRoot)).xOnlyPubkey);
|
|
175
187
|
}
|
|
176
|
-
exports.createTapOutputKey = createTapOutputKey;
|
|
177
188
|
function createAggregateNonce(pubNonces) {
|
|
178
189
|
return Buffer.from(noble_ecc_1.musig.nonceAgg(pubNonces));
|
|
179
190
|
}
|
|
180
|
-
exports.createAggregateNonce = createAggregateNonce;
|
|
181
191
|
function createTapTweak(tapInternalKey, tapMerkleRoot) {
|
|
182
|
-
return Buffer.from(taproot_1.calculateTapTweak(outputScripts_1.checkXOnlyPublicKey(tapInternalKey), outputScripts_1.checkTapMerkleRoot(tapMerkleRoot)));
|
|
192
|
+
return Buffer.from((0, taproot_1.calculateTapTweak)((0, outputScripts_1.checkXOnlyPublicKey)(tapInternalKey), (0, outputScripts_1.checkTapMerkleRoot)(tapMerkleRoot)));
|
|
183
193
|
}
|
|
184
|
-
exports.createTapTweak = createTapTweak;
|
|
185
194
|
function startMusig2SigningSession(aggNonce, hash, publicKeys, tweak) {
|
|
186
195
|
return noble_ecc_1.musig.startSigningSession(aggNonce, hash, publicKeys, { tweak, xOnly: true });
|
|
187
196
|
}
|
|
188
197
|
function musig2PartialSign(privateKey, publicNonce, sessionKey, nonceStore) {
|
|
189
|
-
outputScripts_1.checkTxHash(Buffer.from(sessionKey.msg));
|
|
198
|
+
(0, outputScripts_1.checkTxHash)(Buffer.from(sessionKey.msg));
|
|
190
199
|
return Buffer.from(noble_ecc_1.musig.partialSign({
|
|
191
200
|
secretKey: privateKey,
|
|
192
201
|
publicNonce: nonceStore.getRef(publicNonce),
|
|
193
202
|
sessionKey,
|
|
194
203
|
}));
|
|
195
204
|
}
|
|
196
|
-
exports.musig2PartialSign = musig2PartialSign;
|
|
197
205
|
function musig2PartialSigVerify(sig, publicKey, publicNonce, sessionKey) {
|
|
198
|
-
outputScripts_1.checkTxHash(Buffer.from(sessionKey.msg));
|
|
206
|
+
(0, outputScripts_1.checkTxHash)(Buffer.from(sessionKey.msg));
|
|
199
207
|
return noble_ecc_1.musig.partialVerify({ sig, publicKey, publicNonce, sessionKey });
|
|
200
208
|
}
|
|
201
|
-
exports.musig2PartialSigVerify = musig2PartialSigVerify;
|
|
202
209
|
function musig2AggregateSigs(sigs, sessionKey) {
|
|
203
210
|
return Buffer.from(noble_ecc_1.musig.signAgg(sigs, sessionKey));
|
|
204
211
|
}
|
|
205
|
-
exports.musig2AggregateSigs = musig2AggregateSigs;
|
|
206
212
|
/** @return session key that can be used to reference the session later */
|
|
207
213
|
function createMusig2SigningSession(sessionArgs) {
|
|
208
|
-
outputScripts_1.checkTxHash(sessionArgs.txHash);
|
|
214
|
+
(0, outputScripts_1.checkTxHash)(sessionArgs.txHash);
|
|
209
215
|
const aggNonce = createAggregateNonce(sessionArgs.pubNonces);
|
|
210
216
|
const tweak = createTapTweak(sessionArgs.internalPubKey, sessionArgs.tapTreeRoot);
|
|
211
217
|
return startMusig2SigningSession(aggNonce, sessionArgs.txHash, sessionArgs.pubKeys, tweak);
|
|
212
218
|
}
|
|
213
|
-
exports.createMusig2SigningSession = createMusig2SigningSession;
|
|
214
219
|
/**
|
|
215
220
|
* @returns psbt proprietary key for musig2 participant key value data
|
|
216
221
|
* If no key value exists, undefined is returned.
|
|
217
222
|
*/
|
|
218
|
-
function parsePsbtMusig2Participants(
|
|
219
|
-
const participantsKeyVals =
|
|
220
|
-
identifier:
|
|
221
|
-
subtype:
|
|
223
|
+
function parsePsbtMusig2Participants(input) {
|
|
224
|
+
const participantsKeyVals = (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, {
|
|
225
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
226
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
222
227
|
});
|
|
223
228
|
if (!participantsKeyVals.length) {
|
|
224
229
|
return undefined;
|
|
@@ -228,15 +233,14 @@ function parsePsbtMusig2Participants(psbt, inputIndex) {
|
|
|
228
233
|
}
|
|
229
234
|
return decodePsbtMusig2Participants(participantsKeyVals[0]);
|
|
230
235
|
}
|
|
231
|
-
exports.parsePsbtMusig2Participants = parsePsbtMusig2Participants;
|
|
232
236
|
/**
|
|
233
237
|
* @returns psbt proprietary key for musig2 public nonce key value data
|
|
234
238
|
* If no key value exists, undefined is returned.
|
|
235
239
|
*/
|
|
236
|
-
function parsePsbtMusig2Nonces(
|
|
237
|
-
const nonceKeyVals =
|
|
238
|
-
identifier:
|
|
239
|
-
subtype:
|
|
240
|
+
function parsePsbtMusig2Nonces(input) {
|
|
241
|
+
const nonceKeyVals = (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, {
|
|
242
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
243
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
240
244
|
});
|
|
241
245
|
if (!nonceKeyVals.length) {
|
|
242
246
|
return undefined;
|
|
@@ -246,15 +250,14 @@ function parsePsbtMusig2Nonces(psbt, inputIndex) {
|
|
|
246
250
|
}
|
|
247
251
|
return nonceKeyVals.map((kv) => decodePsbtMusig2Nonce(kv));
|
|
248
252
|
}
|
|
249
|
-
exports.parsePsbtMusig2Nonces = parsePsbtMusig2Nonces;
|
|
250
253
|
/**
|
|
251
254
|
* @returns psbt proprietary key for musig2 partial sig key value data
|
|
252
255
|
* If no key value exists, undefined is returned.
|
|
253
256
|
*/
|
|
254
|
-
function parsePsbtMusig2PartialSigs(
|
|
255
|
-
const sigKeyVals =
|
|
256
|
-
identifier:
|
|
257
|
-
subtype:
|
|
257
|
+
function parsePsbtMusig2PartialSigs(input) {
|
|
258
|
+
const sigKeyVals = (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, {
|
|
259
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
260
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
|
|
258
261
|
});
|
|
259
262
|
if (!sigKeyVals.length) {
|
|
260
263
|
return undefined;
|
|
@@ -264,7 +267,6 @@ function parsePsbtMusig2PartialSigs(psbt, inputIndex) {
|
|
|
264
267
|
}
|
|
265
268
|
return sigKeyVals.map((kv) => decodePsbtMusig2PartialSig(kv));
|
|
266
269
|
}
|
|
267
|
-
exports.parsePsbtMusig2PartialSigs = parsePsbtMusig2PartialSigs;
|
|
268
270
|
/**
|
|
269
271
|
* Assert musig2 participant key value data with tapInternalKey and tapMerkleRoot.
|
|
270
272
|
* <tapOutputKey><tapInputKey> => <participantKey1><participantKey2>
|
|
@@ -272,8 +274,8 @@ exports.parsePsbtMusig2PartialSigs = parsePsbtMusig2PartialSigs;
|
|
|
272
274
|
* the tapOutputKey is validated.
|
|
273
275
|
*/
|
|
274
276
|
function assertPsbtMusig2Participants(participantKeyValData, tapInternalKey, tapMerkleRoot) {
|
|
275
|
-
outputScripts_1.checkXOnlyPublicKey(tapInternalKey);
|
|
276
|
-
outputScripts_1.checkTapMerkleRoot(tapMerkleRoot);
|
|
277
|
+
(0, outputScripts_1.checkXOnlyPublicKey)(tapInternalKey);
|
|
278
|
+
(0, outputScripts_1.checkTapMerkleRoot)(tapMerkleRoot);
|
|
277
279
|
const participantPubKeys = participantKeyValData.participantPubKeys;
|
|
278
280
|
const internalKey = createTapInternalKey(participantPubKeys);
|
|
279
281
|
if (!internalKey.equals(participantKeyValData.tapInternalKey)) {
|
|
@@ -287,7 +289,6 @@ function assertPsbtMusig2Participants(participantKeyValData, tapInternalKey, tap
|
|
|
287
289
|
throw new Error('tapInternalKey and aggregated participant pub keys does not match');
|
|
288
290
|
}
|
|
289
291
|
}
|
|
290
|
-
exports.assertPsbtMusig2Participants = assertPsbtMusig2Participants;
|
|
291
292
|
/**
|
|
292
293
|
* Assert musig2 public nonce key value data with participant key value data
|
|
293
294
|
* (refer assertPsbtMusig2ParticipantsKeyValData).
|
|
@@ -296,8 +297,8 @@ exports.assertPsbtMusig2Participants = assertPsbtMusig2Participants;
|
|
|
296
297
|
* Checks against participant keys and tapOutputKey
|
|
297
298
|
*/
|
|
298
299
|
function assertPsbtMusig2Nonces(noncesKeyValData, participantKeyValData) {
|
|
299
|
-
outputScripts_1.checkXOnlyPublicKey(participantKeyValData.tapOutputKey);
|
|
300
|
-
participantKeyValData.participantPubKeys.forEach((kv) => outputScripts_1.checkPlainPublicKey(kv));
|
|
300
|
+
(0, outputScripts_1.checkXOnlyPublicKey)(participantKeyValData.tapOutputKey);
|
|
301
|
+
participantKeyValData.participantPubKeys.forEach((kv) => (0, outputScripts_1.checkPlainPublicKey)(kv));
|
|
301
302
|
if (participantKeyValData.participantPubKeys[0].equals(participantKeyValData.participantPubKeys[1])) {
|
|
302
303
|
throw new Error(`Duplicate participant pub keys found`);
|
|
303
304
|
}
|
|
@@ -314,7 +315,6 @@ function assertPsbtMusig2Nonces(noncesKeyValData, participantKeyValData) {
|
|
|
314
315
|
}
|
|
315
316
|
});
|
|
316
317
|
}
|
|
317
|
-
exports.assertPsbtMusig2Nonces = assertPsbtMusig2Nonces;
|
|
318
318
|
/**
|
|
319
319
|
* @returns Input object but sig hash type data is taken out from partialSig field.
|
|
320
320
|
* If sig hash type is not common for all sigs, error out, otherwise returns the modified object and single hash type.
|
|
@@ -335,7 +335,6 @@ function getSigHashTypeFromSigs(partialSigs) {
|
|
|
335
335
|
}
|
|
336
336
|
return { partialSigs: pSigsWithHashType.map(({ pSig }) => pSig), sigHashType };
|
|
337
337
|
}
|
|
338
|
-
exports.getSigHashTypeFromSigs = getSigHashTypeFromSigs;
|
|
339
338
|
function createMusig2DeterministicNonce(params) {
|
|
340
339
|
return Buffer.from(noble_ecc_1.musig.deterministicNonceGen({
|
|
341
340
|
secretKey: params.privateKey,
|
|
@@ -345,7 +344,6 @@ function createMusig2DeterministicNonce(params) {
|
|
|
345
344
|
msg: params.hash,
|
|
346
345
|
}).publicNonce);
|
|
347
346
|
}
|
|
348
|
-
exports.createMusig2DeterministicNonce = createMusig2DeterministicNonce;
|
|
349
347
|
function musig2DeterministicSign(params) {
|
|
350
348
|
const { sig, sessionKey, publicNonce } = noble_ecc_1.musig.deterministicSign({
|
|
351
349
|
secretKey: params.privateKey,
|
|
@@ -356,27 +354,4 @@ function musig2DeterministicSign(params) {
|
|
|
356
354
|
});
|
|
357
355
|
return { sig: Buffer.from(sig), sessionKey, publicNonce: Buffer.from(publicNonce) };
|
|
358
356
|
}
|
|
359
|
-
exports.musig2DeterministicSign = musig2DeterministicSign;
|
|
360
|
-
/**
|
|
361
|
-
* @returns true iff given psbt/transaction/tx-input-array contains at least one taproot key path spend input
|
|
362
|
-
*/
|
|
363
|
-
function isTransactionWithKeyPathSpendInput(data) {
|
|
364
|
-
if (data instanceof UtxoPsbt_1.UtxoPsbt) {
|
|
365
|
-
return data.data.inputs.some((_, inputIndex) => {
|
|
366
|
-
const parsedInput = wallet_1.parsePsbtInput(data, inputIndex);
|
|
367
|
-
return (parsedInput === null || parsedInput === void 0 ? void 0 : parsedInput.scriptType) === 'taprootKeyPathSpend';
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
const inputs = data instanceof UtxoTransaction_1.UtxoTransaction ? data.ins : data;
|
|
371
|
-
return inputs.some((input, inputIndex) => {
|
|
372
|
-
// If the input is not signed, it cannot be a taprootKeyPathSpend input because you can only
|
|
373
|
-
// extract a fully signed psbt into a transaction with taprootKeyPathSpend inputs.
|
|
374
|
-
if (wallet_1.getSignatureCount(data, inputIndex) === 0) {
|
|
375
|
-
return false;
|
|
376
|
-
}
|
|
377
|
-
const parsedInput = parseInput_1.parseSignatureScript(input);
|
|
378
|
-
return (parsedInput === null || parsedInput === void 0 ? void 0 : parsedInput.scriptType) === 'taprootKeyPathSpend';
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx5Q0FBK0c7QUFDL0csbURBTXlCO0FBQ3pCLDRDQUEwQztBQUUxQyx3Q0FBK0Q7QUFDL0Qsb0NBQXVDO0FBQ3ZDLHVEQUFvRDtBQUNwRCxxQ0FBNkQ7QUFDN0QsNkNBQW9EO0FBc0NwRDs7O0dBR0c7QUFDSCxNQUFhLGdCQUFnQjtJQUE3QjtRQUNVLFdBQU0sR0FBaUIsRUFBRSxDQUFDO0lBd0NwQyxDQUFDO0lBdENDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxLQUFpQjtRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDVjtTQUNGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sR0FBRyxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0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QUFDLENBQUM7WUFDckQsT0FBTyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLE1BQUsscUJBQXFCLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxpQ0FBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQ3ZDLDRGQUE0RjtRQUM1RixrRkFBa0Y7UUFDbEYsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLFdBQVcsR0FBRyxpQ0FBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFVBQVUsTUFBSyxxQkFBcUIsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFuQkQsZ0ZBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHhJbnB1dCB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgU2Vzc2lvbktleSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuXG5pbXBvcnQgeyBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsIFByb3ByaWV0YXJ5S2V5VmFsdWUsIFV0eG9Qc2J0LCBQcm9wcmlldGFyeUtleVN1YnR5cGUgfSBmcm9tICcuL1V0eG9Qc2J0JztcbmltcG9ydCB7XG4gIGNoZWNrUGxhaW5QdWJsaWNLZXksXG4gIGNoZWNrVGFwTWVya2xlUm9vdCxcbiAgY2hlY2tUeEhhc2gsXG4gIGNoZWNrWE9ubHlQdWJsaWNLZXksXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBlY2MsIG11c2lnIH0gZnJvbSAnLi4vbm9ibGVfZWNjJztcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVUYXBUd2VhaywgdGFwVHdlYWtQdWJrZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0U2lnbmF0dXJlQ291bnQsIHBhcnNlUHNidElucHV0IH0gZnJvbSAnLi93YWxsZXQnO1xuaW1wb3J0IHsgcGFyc2VTaWduYXR1cmVTY3JpcHQgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuXG4vKipcbiAqICBQYXJ0aWNpcGFudCBrZXkgdmFsdWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcjtcbiAgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zIHtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuICBvdGhlck5vbmNlOiBCdWZmZXI7XG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj47XG4gIGludGVybmFsUHViS2V5OiBCdWZmZXI7XG4gIHRhcFRyZWVSb290OiBCdWZmZXI7XG4gIGhhc2g6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgTm9uY2Uga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcHViTm9uY2U6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiAgUGFydGlhbCBzaWduYXR1cmUga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUGFydGlhbFNpZyB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwYXJ0aWFsU2lnOiBCdWZmZXI7XG59XG5cbi8qKlxuICogQmVjYXVzZSBtdXNpZyB1c2VzIHJlZmVyZW5jZS1lcXVhbCBidWZmZXJzIHRvIGNhY2hlIG5vbmNlcywgd2Ugd3JhcCBpdCBoZXJlIHRvIGFsbG93IHVzaW5nXG4gKiBub25jZXMgdGhhdCBhcmUgYnl0ZS1lcXVhbCBidXQgbm90IHJlZmVyZW5jZS1lcXVhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11c2lnMk5vbmNlU3RvcmUge1xuICBwcml2YXRlIG5vbmNlczogVWludDhBcnJheVtdID0gW107XG5cbiAgLyoqXG4gICAqIEdldCBvcmlnaW5hbCBCdWZmZXIgaW5zdGFuY2UgZm9yIG5vbmNlICh3aGljaCBtYXkgYmUgYSBjb3B5KS5cbiAgICogQHJldHVybiBieXRlLWVxdWFsIGJ1ZmZlciB0aGF0IGlzIHJlZmVyZW5jZS1lcXVhbCB0byB3aGF0IHdhcyBzdG9yZWQgZWFybGllciBpbiBjcmVhdGVNdXNpZzJOb25jZVxuICAgKi9cbiAgZ2V0UmVmKG5vbmNlOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMubm9uY2VzKSB7XG4gICAgICBpZiAoQnVmZmVyLmZyb20oYikuZXF1YWxzKG5vbmNlKSkge1xuICAgICAgICByZXR1cm4gYjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG5vbmNlYCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBtdXNpZzIgbm9uY2UgYW5kIHN0b3JlcyBidWZmZXIgcmVmZXJlbmNlLlxuICAgKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAgICogQWxzbyBwYXJ0aWNpcGFudCBrZXlzIGFyZSByZXF1aXJlZCBmcm9tIHBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gICAqIEBwYXJhbSBwcml2YXRlS2V5IC0gc2lnbmVyIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgLSBzaWduZXIgeHkgcHVibGljIGtleVxuICAgKiBAcGFyYW0geE9ubHlQdWJsaWNLZXkgLSB0d2Vha2VkIGFnZ3JlZ2F0ZWQga2V5ICh0YXBPdXRwdXRLZXkpXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQWRkaXRpb25hbCBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBjcmVhdGVNdXNpZzJOb25jZShcbiAgICBwcml2YXRlS2V5OiBVaW50OEFycmF5LFxuICAgIHB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB4T25seVB1YmxpY0tleTogVWludDhBcnJheSxcbiAgICB0eEhhc2g6IFVpbnQ4QXJyYXksXG4gICAgc2Vzc2lvbklkPzogQnVmZmVyXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGlmICh0eEhhc2gubGVuZ3RoICE9IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHhIYXNoIHNpemUgJHt0eEhhc2h9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZiA9IG11c2lnLm5vbmNlR2VuKHsgc2VjcmV0S2V5OiBwcml2YXRlS2V5LCBwdWJsaWNLZXksIHhPbmx5UHVibGljS2V5LCBtc2c6IHR4SGFzaCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMubm9uY2VzLnB1c2goYnVmKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5cy4gU3ViVHlwZSBpcyAweDAxXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4geC1vbmx5IHRhcE91dHB1dEtleXx8dGFwSW50ZXJuYWxLZXkgYXMgc3ViIGtleWRhdGEsIHBsYWluIHNpZ2luaW5nIHBhcnRpY2lwYW50IGtleXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cyk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBjb25zdCBrZXlkYXRhID0gW3BhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50cy50YXBJbnRlcm5hbEtleV0ubWFwKChwdWJrZXkpID0+IGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KSk7XG4gIGNvbnN0IHZhbHVlID0gcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cy5tYXAoKHB1YmtleSkgPT4gY2hlY2tQbGFpblB1YmxpY0tleShwdWJrZXkpKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgIGtleWRhdGE6IEJ1ZmZlci5jb25jYXQoa2V5ZGF0YSksXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IEJ1ZmZlci5jb25jYXQodmFsdWUpIH07XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXkgdmFsIHV0aWwgZnVuY3Rpb24gZm9yIHB1YiBub25jZS4gU3ViVHlwZSBpcyAweDAyXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEByZXR1cm4gcGxhaW4tcGFydGljaXBhbnRQdWJLZXl8fHgtb25seS10YXBPdXRwdXRLZXkgYXMgc3ViIGtleWRhdGEsIDY2IGJ5dGVzIG9mIDIgcHViIG5vbmNlcyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZShub25jZTogUHNidE11c2lnMlB1Yk5vbmNlKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChub25jZS5wdWJOb25jZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1Yk5vbmNlcyBsZW5ndGggJHtub25jZS5wdWJOb25jZS5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkobm9uY2UucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkobm9uY2UudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2UucHViTm9uY2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHBhcnRpYWxTaWc6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnKTogUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGlmIChwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMiAmJiBwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RoICE9PSAzMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJ0aWFsU2lnIGxlbmd0aCAke3BhcnRpYWxTaWcucGFydGlhbFNpZy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkocGFydGlhbFNpZy5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWFsU2lnLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcGFydGlhbFNpZy5wYXJ0aWFsU2lnIH07XG59XG5cbi8qKlxuICogRGVjb2RlcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgZGF0YSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBub25jZVxuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyTm9uY2Uoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICBpZiAoa3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fCBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBub25jZWApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpY2lwYW50UHViS2V5OiBrZXkuc3ViYXJyYXkoMCwgMzMpLCB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgzMyksIHB1Yk5vbmNlOiB2YWx1ZSB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZ1xuICogQHBhcmFtIGt2XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJR1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDMyICYmIHZhbHVlLmxlbmd0aCAhPT0gMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVkYXRhIHNpemUgJHt2YWx1ZS5sZW5ndGh9IGZvciBwYXJ0aWFsIHNpZ2ApO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGljaXBhbnRQdWJLZXk6IGtleS5zdWJhcnJheSgwLCAzMyksIHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDMzKSwgcGFydGlhbFNpZzogdmFsdWUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcEludGVybmFsS2V5KHBsYWluUHViS2V5czogQnVmZmVyW10pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuZ2V0WE9ubHlQdWJrZXkobXVzaWcua2V5QWdnKHBsYWluUHViS2V5cykpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcE91dHB1dEtleShpbnRlcm5hbFB1YktleTogQnVmZmVyLCB0YXBUcmVlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIHRhcFR3ZWFrUHVia2V5KGVjYywgdG9YT25seVB1YmxpY0tleShpbnRlcm5hbFB1YktleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBUcmVlUm9vdCkpLnhPbmx5UHVia2V5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGVOb25jZShwdWJOb25jZXM6IFR1cGxlPEJ1ZmZlcj4pOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcubm9uY2VBZ2cocHViTm9uY2VzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBUd2Vhayh0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oY2FsY3VsYXRlVGFwVHdlYWsoY2hlY2tYT25seVB1YmxpY0tleSh0YXBJbnRlcm5hbEtleSksIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBNZXJrbGVSb290KSkpO1xufVxuXG5mdW5jdGlvbiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKFxuICBhZ2dOb25jZTogQnVmZmVyLFxuICBoYXNoOiBCdWZmZXIsXG4gIHB1YmxpY0tleXM6IFR1cGxlPEJ1ZmZlcj4sXG4gIHR3ZWFrOiBCdWZmZXJcbik6IFNlc3Npb25LZXkge1xuICByZXR1cm4gbXVzaWcuc3RhcnRTaWduaW5nU2Vzc2lvbihhZ2dOb25jZSwgaGFzaCwgcHVibGljS2V5cywgeyB0d2VhaywgeE9ubHk6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnbihcbiAgcHJpdmF0ZUtleTogQnVmZmVyLFxuICBwdWJsaWNOb25jZTogVWludDhBcnJheSxcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleSxcbiAgbm9uY2VTdG9yZTogTXVzaWcyTm9uY2VTdG9yZVxuKTogQnVmZmVyIHtcbiAgY2hlY2tUeEhhc2goQnVmZmVyLmZyb20oc2Vzc2lvbktleS5tc2cpKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIG11c2lnLnBhcnRpYWxTaWduKHtcbiAgICAgIHNlY3JldEtleTogcHJpdmF0ZUtleSxcbiAgICAgIHB1YmxpY05vbmNlOiBub25jZVN0b3JlLmdldFJlZihwdWJsaWNOb25jZSksXG4gICAgICBzZXNzaW9uS2V5LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5KFxuICBzaWc6IEJ1ZmZlcixcbiAgcHVibGljS2V5OiBCdWZmZXIsXG4gIHB1YmxpY05vbmNlOiBCdWZmZXIsXG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXlcbik6IGJvb2xlYW4ge1xuICBjaGVja1R4SGFzaChCdWZmZXIuZnJvbShzZXNzaW9uS2V5Lm1zZykpO1xuICByZXR1cm4gbXVzaWcucGFydGlhbFZlcmlmeSh7IHNpZywgcHVibGljS2V5LCBwdWJsaWNOb25jZSwgc2Vzc2lvbktleSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkFnZ3JlZ2F0ZVNpZ3Moc2lnczogQnVmZmVyW10sIHNlc3Npb25LZXk6IFNlc3Npb25LZXkpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20obXVzaWcuc2lnbkFnZyhzaWdzLCBzZXNzaW9uS2V5KSk7XG59XG5cbi8qKiBAcmV0dXJuIHNlc3Npb24ga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBzZXNzaW9uIGxhdGVyICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oc2Vzc2lvbkFyZ3M6IHtcbiAgcHViTm9uY2VzOiBUdXBsZTxCdWZmZXI+O1xuICB0eEhhc2g6IEJ1ZmZlcjtcbiAgcHViS2V5czogVHVwbGU8QnVmZmVyPjtcbiAgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwVHJlZVJvb3Q6IEJ1ZmZlcjtcbn0pOiBTZXNzaW9uS2V5IHtcbiAgY2hlY2tUeEhhc2goc2Vzc2lvbkFyZ3MudHhIYXNoKTtcbiAgY29uc3QgYWdnTm9uY2UgPSBjcmVhdGVBZ2dyZWdhdGVOb25jZShzZXNzaW9uQXJncy5wdWJOb25jZXMpO1xuICBjb25zdCB0d2VhayA9IGNyZWF0ZVRhcFR3ZWFrKHNlc3Npb25BcmdzLmludGVybmFsUHViS2V5LCBzZXNzaW9uQXJncy50YXBUcmVlUm9vdCk7XG4gIHJldHVybiBzdGFydE11c2lnMlNpZ25pbmdTZXNzaW9uKGFnZ05vbmNlLCBzZXNzaW9uQXJncy50eEhhc2gsIHNlc3Npb25BcmdzLnB1YktleXMsIHR3ZWFrKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICB9KTtcblxuICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7cGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50c0tleVZhbHNbMF0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcHVibGljIG5vbmNlIGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJOb25jZXMocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQdWJOb25jZVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9uY2VLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgfSk7XG5cbiAgaWYgKCFub25jZUtleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChub25jZUtleVZhbHMubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtub25jZUtleVZhbHMubGVuZ3RofSBtYXRjaGluZyBub25jZSBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxIG9yIDJgKTtcbiAgfVxuXG4gIHJldHVybiBub25jZUtleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMk5vbmNlKGt2KSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwYXJ0aWFsIHNpZyBrZXkgdmFsdWUgZGF0YVxuICogSWYgbm8ga2V5IHZhbHVlIGV4aXN0cywgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MocHNidDogVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcik6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBzaWdLZXlWYWxzID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICB9KTtcblxuICBpZiAoIXNpZ0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzaWdLZXlWYWxzLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7c2lnS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpYWwgc2lnbmF0dXJlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDEgb3IgMmApO1xuICB9XG5cbiAgcmV0dXJuIHNpZ0tleVZhbHMubWFwKChrdikgPT4gZGVjb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoa3YpKTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhIHdpdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QuXG4gKiA8dGFwT3V0cHV0S2V5Pjx0YXBJbnB1dEtleT4gPT4gPHBhcnRpY2lwYW50S2V5MT48cGFydGljaXBhbnRLZXkyPlxuICogVXNpbmcgdGFwTWVya2xlUm9vdCBhbmQgMiBwYXJ0aWNpcGFudCBrZXlzLCB0aGUgdGFwSW5wdXRLZXkgaXMgdmFsaWRhdGVkIGFuZCB1c2luZyB0YXBNZXJrbGVSb290IGFuZCB0YXBJbnB1dEtleSxcbiAqIHRoZSB0YXBPdXRwdXRLZXkgaXMgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyLFxuICB0YXBNZXJrbGVSb290OiBCdWZmZXJcbik6IHZvaWQge1xuICBjaGVja1hPbmx5UHVibGljS2V5KHRhcEludGVybmFsS2V5KTtcbiAgY2hlY2tUYXBNZXJrbGVSb290KHRhcE1lcmtsZVJvb3QpO1xuXG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgaW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlkYXRhIHRhcEludGVybmFsS2V5Jyk7XG4gIH1cblxuICBjb25zdCBvdXRwdXRLZXkgPSBjcmVhdGVUYXBPdXRwdXRLZXkoaW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICBpZiAoIW91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnRzIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gIH1cblxuICBpZiAoIWludGVybmFsS2V5LmVxdWFscyh0YXBJbnRlcm5hbEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGFuZCBhZ2dyZWdhdGVkIHBhcnRpY2lwYW50IHB1YiBrZXlzIGRvZXMgbm90IG1hdGNoJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgbXVzaWcyIHB1YmxpYyBub25jZSBrZXkgdmFsdWUgZGF0YSB3aXRoIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBkYXRhXG4gKiAocmVmZXIgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEpLlxuICogPHBhcnRpY2lwYW50S2V5MT48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UxPlxuICogPHBhcnRpY2lwYW50S2V5Mj48dGFwT3V0cHV0S2V5PiA9PiA8cHViTm9uY2UyPlxuICogQ2hlY2tzIGFnYWluc3QgcGFydGljaXBhbnQga2V5cyBhbmQgdGFwT3V0cHV0S2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKFxuICBub25jZXNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUHViTm9uY2VbXSxcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzXG4pOiB2b2lkIHtcbiAgY2hlY2tYT25seVB1YmxpY0tleShwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KTtcbiAgcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5mb3JFYWNoKChrdikgPT4gY2hlY2tQbGFpblB1YmxpY0tleShrdikpO1xuICBpZiAocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBwYXJ0aWNpcGFudCBwdWIga2V5cyBmb3VuZGApO1xuICB9XG5cbiAgaWYgKG5vbmNlc0tleVZhbERhdGEubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub25jZSBrZXkgdmFsdWUgY291bnQgJHtub25jZXNLZXlWYWxEYXRhLmxlbmd0aH1gKTtcbiAgfVxuXG4gIG5vbmNlc0tleVZhbERhdGEuZm9yRWFjaCgobm9uY2VLdikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcGFydGljaXBhbnRLZXlWYWxEYXRhLnBhcnRpY2lwYW50UHViS2V5cy5maW5kSW5kZXgoKHB1YktleSkgPT5cbiAgICAgIG5vbmNlS3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YktleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBub25jZSBrZXlkYXRhIHBhcnRpY2lwYW50IHB1YiBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIW5vbmNlS3YudGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG5vbmNlIGtleWRhdGEgdGFwT3V0cHV0S2V5Jyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBJbnB1dCBvYmplY3QgYnV0IHNpZyBoYXNoIHR5cGUgZGF0YSBpcyB0YWtlbiBvdXQgZnJvbSBwYXJ0aWFsU2lnIGZpZWxkLlxuICogSWYgc2lnIGhhc2ggdHlwZSBpcyBub3QgY29tbW9uIGZvciBhbGwgc2lncywgZXJyb3Igb3V0LCBvdGhlcndpc2UgcmV0dXJucyB0aGUgbW9kaWZpZWQgb2JqZWN0IGFuZCBzaW5nbGUgaGFzaCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lnczogUHNidE11c2lnMlBhcnRpYWxTaWdbXSk6IHtcbiAgcGFydGlhbFNpZ3M6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW107XG4gIHNpZ0hhc2hUeXBlOiBudW1iZXI7XG59IHtcbiAgaWYgKCFwYXJ0aWFsU2lncy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpYWxTaWdzIGFycmF5IGNhbiBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBjb25zdCBwU2lnc1dpdGhIYXNoVHlwZSA9IHBhcnRpYWxTaWdzLm1hcCgoa3YpID0+IHtcbiAgICBjb25zdCB7IHBhcnRpYWxTaWcsIHBhcnRpY2lwYW50UHViS2V5LCB0YXBPdXRwdXRLZXkgfSA9IGt2O1xuICAgIHJldHVybiBwYXJ0aWFsU2lnLmxlbmd0aCA9PT0gMzNcbiAgICAgID8geyBwU2lnOiB7IHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcuc2xpY2UoMCwgMzIpLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBwYXJ0aWFsU2lnWzMyXSB9XG4gICAgICA6IHsgcFNpZzogeyBwYXJ0aWFsU2lnLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0sIHNpZ0hhc2hUeXBlOiBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgfTtcbiAgfSk7XG5cbiAgY29uc3Qgc2lnSGFzaFR5cGUgPSBwU2lnc1dpdGhIYXNoVHlwZVswXS5zaWdIYXNoVHlwZTtcbiAgaWYgKCFwU2lnc1dpdGhIYXNoVHlwZS5ldmVyeSgocFNpZykgPT4gcFNpZy5zaWdIYXNoVHlwZSA9PT0gc2lnSGFzaFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG11c3QgdXNlIHNhbWUgc2lnIGhhc2ggdHlwZScpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFydGlhbFNpZ3M6IHBTaWdzV2l0aEhhc2hUeXBlLm1hcCgoeyBwU2lnIH0pID0+IHBTaWcpLCBzaWdIYXNoVHlwZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiBCdWZmZXIge1xuICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgbXVzaWcuZGV0ZXJtaW5pc3RpY05vbmNlR2VuKHtcbiAgICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgICBhZ2dPdGhlck5vbmNlOiBtdXNpZy5ub25jZUFnZyhbcGFyYW1zLm90aGVyTm9uY2VdKSxcbiAgICAgIHB1YmxpY0tleXM6IHBhcmFtcy5wdWJsaWNLZXlzLFxuICAgICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICAgIG1zZzogcGFyYW1zLmhhc2gsXG4gICAgfSkucHVibGljTm9uY2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11c2lnMkRldGVybWluaXN0aWNTaWduKHBhcmFtczogUHNidE11c2lnMkRldGVybWluaXN0aWNQYXJhbXMpOiB7XG4gIHNpZzogQnVmZmVyO1xuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5O1xuICBwdWJsaWNOb25jZTogQnVmZmVyO1xufSB7XG4gIGNvbnN0IHsgc2lnLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZSB9ID0gbXVzaWcuZGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgIHNlY3JldEtleTogcGFyYW1zLnByaXZhdGVLZXksXG4gICAgYWdnT3RoZXJOb25jZTogbXVzaWcubm9uY2VBZ2coW3BhcmFtcy5vdGhlck5vbmNlXSksXG4gICAgcHVibGljS2V5czogcGFyYW1zLnB1YmxpY0tleXMsXG4gICAgdHdlYWtzOiBbeyB0d2VhazogY3JlYXRlVGFwVHdlYWsocGFyYW1zLmludGVybmFsUHViS2V5LCBwYXJhbXMudGFwVHJlZVJvb3QpLCB4T25seTogdHJ1ZSB9XSxcbiAgICBtc2c6IHBhcmFtcy5oYXNoLFxuICB9KTtcbiAgcmV0dXJuIHsgc2lnOiBCdWZmZXIuZnJvbShzaWcpLCBzZXNzaW9uS2V5LCBwdWJsaWNOb25jZTogQnVmZmVyLmZyb20ocHVibGljTm9uY2UpIH07XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZmYgZ2l2ZW4gcHNidC90cmFuc2FjdGlvbi90eC1pbnB1dC1hcnJheSBjb250YWlucyBhdCBsZWFzdCBvbmUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dChcbiAgZGF0YTogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248YmlnaW50IHwgbnVtYmVyPiB8IFR4SW5wdXRbXVxuKTogYm9vbGVhbiB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVXR4b1BzYnQpIHtcbiAgICByZXR1cm4gZGF0YS5kYXRhLmlucHV0cy5zb21lKChfLCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlUHNidElucHV0KGRhdGEsIGlucHV0SW5kZXgpO1xuICAgICAgcmV0dXJuIHBhcnNlZElucHV0Py5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgaW5wdXRzID0gZGF0YSBpbnN0YW5jZW9mIFV0eG9UcmFuc2FjdGlvbiA/IGRhdGEuaW5zIDogZGF0YTtcbiAgcmV0dXJuIGlucHV0cy5zb21lKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBub3Qgc2lnbmVkLCBpdCBjYW5ub3QgYmUgYSB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0IGJlY2F1c2UgeW91IGNhbiBvbmx5XG4gICAgLy8gZXh0cmFjdCBhIGZ1bGx5IHNpZ25lZCBwc2J0IGludG8gYSB0cmFuc2FjdGlvbiB3aXRoIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzLlxuICAgIGlmIChnZXRTaWduYXR1cmVDb3VudChkYXRhLCBpbnB1dEluZGV4KSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KGlucHV0KTtcbiAgICByZXR1cm4gcGFyc2VkSW5wdXQ/LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJztcbiAgfSk7XG59XG4iXX0=
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2R0Esb0VBU0M7QUFPRCw0REFjQztBQUVELGdFQWNDO0FBTUQsb0VBdUJDO0FBTUQsc0RBZ0JDO0FBTUQsZ0VBbUJDO0FBRUQsb0RBRUM7QUFFRCxnREFJQztBQUVELG9EQUVDO0FBRUQsd0NBRUM7QUFXRCw4Q0FjQztBQUVELHdEQVFDO0FBRUQsa0RBRUM7QUFHRCxnRUFXQztBQU1ELGtFQWVDO0FBTUQsc0RBZUM7QUFNRCxnRUFlQztBQVFELG9FQXVCQztBQVNELHdEQTBCQztBQU1ELHdEQW9CQztBQUVELHdFQVVDO0FBRUQsMERBYUM7QUFsZUQsbURBTXlCO0FBQ3pCLDRDQUEwQztBQUUxQyx3Q0FBK0Q7QUFDL0Qsb0NBQXVDO0FBRXZDLHlDQUtvQjtBQXNDcEI7OztHQUdHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFBN0I7UUFDVSxXQUFNLEdBQWlCLEVBQUUsQ0FBQztJQXdDcEMsQ0FBQztJQXRDQzs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBaUI7UUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILGlCQUFpQixDQUNmLFVBQXNCLEVBQ3RCLFNBQXFCLEVBQ3JCLGNBQTBCLEVBQzFCLE1BQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN4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QUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXNzaW9uS2V5IH0gZnJvbSAnQGJyYW5kb25ibGFjay9tdXNpZyc7XG5cbmltcG9ydCB7XG4gIGNoZWNrUGxhaW5QdWJsaWNLZXksXG4gIGNoZWNrVGFwTWVya2xlUm9vdCxcbiAgY2hlY2tUeEhhc2gsXG4gIGNoZWNrWE9ubHlQdWJsaWNLZXksXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBlY2MsIG11c2lnIH0gZnJvbSAnLi4vbm9ibGVfZWNjJztcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVUYXBUd2VhaywgdGFwVHdlYWtQdWJrZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgUHNidElucHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMsXG4gIFByb3ByaWV0YXJ5S2V5U3VidHlwZSxcbiAgUHJvcHJpZXRhcnlLZXlWYWx1ZSxcbiAgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxufSBmcm9tICcuL1BzYnRVdGlsJztcblxuLyoqXG4gKiAgUGFydGljaXBhbnQga2V5IHZhbHVlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyUGFydGljaXBhbnRzIHtcbiAgdGFwT3V0cHV0S2V5OiBCdWZmZXI7XG4gIHRhcEludGVybmFsS2V5OiBCdWZmZXI7XG4gIHBhcnRpY2lwYW50UHViS2V5czogVHVwbGU8QnVmZmVyPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQc2J0TXVzaWcyRGV0ZXJtaW5pc3RpY1BhcmFtcyB7XG4gIHByaXZhdGVLZXk6IEJ1ZmZlcjtcbiAgb3RoZXJOb25jZTogQnVmZmVyO1xuICBwdWJsaWNLZXlzOiBUdXBsZTxCdWZmZXI+O1xuICBpbnRlcm5hbFB1YktleTogQnVmZmVyO1xuICB0YXBUcmVlUm9vdDogQnVmZmVyO1xuICBoYXNoOiBCdWZmZXI7XG59XG5cbi8qKlxuICogIE5vbmNlIGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMlB1Yk5vbmNlIHtcbiAgcGFydGljaXBhbnRQdWJLZXk6IEJ1ZmZlcjtcbiAgdGFwT3V0cHV0S2V5OiBCdWZmZXI7XG4gIHB1Yk5vbmNlOiBCdWZmZXI7XG59XG5cbi8qKlxuICogIFBhcnRpYWwgc2lnbmF0dXJlIGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMlBhcnRpYWxTaWcge1xuICBwYXJ0aWNpcGFudFB1YktleTogQnVmZmVyO1xuICB0YXBPdXRwdXRLZXk6IEJ1ZmZlcjtcbiAgcGFydGlhbFNpZzogQnVmZmVyO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgbXVzaWcgdXNlcyByZWZlcmVuY2UtZXF1YWwgYnVmZmVycyB0byBjYWNoZSBub25jZXMsIHdlIHdyYXAgaXQgaGVyZSB0byBhbGxvdyB1c2luZ1xuICogbm9uY2VzIHRoYXQgYXJlIGJ5dGUtZXF1YWwgYnV0IG5vdCByZWZlcmVuY2UtZXF1YWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdXNpZzJOb25jZVN0b3JlIHtcbiAgcHJpdmF0ZSBub25jZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBHZXQgb3JpZ2luYWwgQnVmZmVyIGluc3RhbmNlIGZvciBub25jZSAod2hpY2ggbWF5IGJlIGEgY29weSkuXG4gICAqIEByZXR1cm4gYnl0ZS1lcXVhbCBidWZmZXIgdGhhdCBpcyByZWZlcmVuY2UtZXF1YWwgdG8gd2hhdCB3YXMgc3RvcmVkIGVhcmxpZXIgaW4gY3JlYXRlTXVzaWcyTm9uY2VcbiAgICovXG4gIGdldFJlZihub25jZTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLm5vbmNlcykge1xuICAgICAgaWYgKEJ1ZmZlci5mcm9tKGIpLmVxdWFscyhub25jZSkpIHtcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBub25jZWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbXVzaWcyIG5vbmNlIGFuZCBzdG9yZXMgYnVmZmVyIHJlZmVyZW5jZS5cbiAgICogdGFwSW50ZXJuYWxrZXksIHRhcE1lcmtsZVJvb3QsIHRhcEJpcDMyRGVyaXZhdGlvbiBmb3Igcm9vdFdhbGxldEtleSBhcmUgcmVxdWlyZWQgcGVyIHAydHJNdXNpZzIga2V5IHBhdGggaW5wdXQuXG4gICAqIEFsc28gcGFydGljaXBhbnQga2V5cyBhcmUgcmVxdWlyZWQgZnJvbSBwc2J0IHByb3ByaWV0YXJ5IGtleSB2YWx1ZXMuXG4gICAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICAgKiBAcGFyYW0gcHJpdmF0ZUtleSAtIHNpZ25lciBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0gcHVibGljS2V5IC0gc2lnbmVyIHh5IHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHhPbmx5UHVibGljS2V5IC0gdHdlYWtlZCBhZ2dyZWdhdGVkIGtleSAodGFwT3V0cHV0S2V5KVxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEFkZGl0aW9uYWwgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKi9cbiAgY3JlYXRlTXVzaWcyTm9uY2UoXG4gICAgcHJpdmF0ZUtleTogVWludDhBcnJheSxcbiAgICBwdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gICAgeE9ubHlQdWJsaWNLZXk6IFVpbnQ4QXJyYXksXG4gICAgdHhIYXNoOiBVaW50OEFycmF5LFxuICAgIHNlc3Npb25JZD86IEJ1ZmZlclxuICApOiBVaW50OEFycmF5IHtcbiAgICBpZiAodHhIYXNoLmxlbmd0aCAhPSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR4SGFzaCBzaXplICR7dHhIYXNofWApO1xuICAgIH1cbiAgICBjb25zdCBidWYgPSBtdXNpZy5ub25jZUdlbih7IHNlY3JldEtleTogcHJpdmF0ZUtleSwgcHVibGljS2V5LCB4T25seVB1YmxpY0tleSwgbXNnOiB0eEhhc2gsIHNlc3Npb25JZCB9KTtcbiAgICB0aGlzLm5vbmNlcy5wdXNoKGJ1Zik7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbCB1dGlsIGZ1bmN0aW9uIGZvciBwYXJ0aWNpcGFudHMgcHViIGtleXMuIFN1YlR5cGUgaXMgMHgwMVxuICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gKiBAcmV0dXJuIHgtb25seSB0YXBPdXRwdXRLZXl8fHRhcEludGVybmFsS2V5IGFzIHN1YiBrZXlkYXRhLCBwbGFpbiBzaWdpbmluZyBwYXJ0aWNpcGFudCBrZXlzIGFzIHZhbHVlZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHM6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMpOiBQcm9wcmlldGFyeUtleVZhbHVlIHtcbiAgY29uc3Qga2V5ZGF0YSA9IFtwYXJ0aWNpcGFudHMudGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudHMudGFwSW50ZXJuYWxLZXldLm1hcCgocHVia2V5KSA9PiBjaGVja1hPbmx5UHVibGljS2V5KHB1YmtleSkpO1xuICBjb25zdCB2YWx1ZSA9IHBhcnRpY2lwYW50cy5wYXJ0aWNpcGFudFB1YktleXMubWFwKChwdWJrZXkpID0+IGNoZWNrUGxhaW5QdWJsaWNLZXkocHVia2V5KSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICBrZXlkYXRhOiBCdWZmZXIuY29uY2F0KGtleWRhdGEpLFxuICB9O1xuICByZXR1cm4geyBrZXksIHZhbHVlOiBCdWZmZXIuY29uY2F0KHZhbHVlKSB9O1xufVxuXG4vKipcbiAqIFBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbCB1dGlsIGZ1bmN0aW9uIGZvciBwdWIgbm9uY2UuIFN1YlR5cGUgaXMgMHgwMlxuICogUmVmOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zYW5rZXQxNzI5LzRiNTI1YzYwNDlmNGQ5ZTAzNGQyNzM2OGM0OWYyOGE2XG4gKiBAcmV0dXJuIHBsYWluLXBhcnRpY2lwYW50UHViS2V5fHx4LW9ubHktdGFwT3V0cHV0S2V5IGFzIHN1YiBrZXlkYXRhLCA2NiBieXRlcyBvZiAyIHB1YiBub25jZXMgYXMgdmFsdWVkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2Uobm9uY2U6IFBzYnRNdXNpZzJQdWJOb25jZSk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBpZiAobm9uY2UucHViTm9uY2UubGVuZ3RoICE9PSA2Nikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwdWJOb25jZXMgbGVuZ3RoICR7bm9uY2UucHViTm9uY2UubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IGtleWRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBjaGVja1BsYWluUHVibGljS2V5KG5vbmNlLnBhcnRpY2lwYW50UHViS2V5KSxcbiAgICBjaGVja1hPbmx5UHVibGljS2V5KG5vbmNlLnRhcE91dHB1dEtleSksXG4gIF0pO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgIGtleWRhdGEsXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IG5vbmNlLnB1Yk5vbmNlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyhwYXJ0aWFsU2lnOiBQc2J0TXVzaWcyUGFydGlhbFNpZyk6IFByb3ByaWV0YXJ5S2V5VmFsdWUge1xuICBpZiAocGFydGlhbFNpZy5wYXJ0aWFsU2lnLmxlbmd0aCAhPT0gMzIgJiYgcGFydGlhbFNpZy5wYXJ0aWFsU2lnLmxlbmd0aCAhPT0gMzMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFydGlhbFNpZyBsZW5ndGggJHtwYXJ0aWFsU2lnLnBhcnRpYWxTaWcubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IGtleWRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBjaGVja1BsYWluUHVibGljS2V5KHBhcnRpYWxTaWcucGFydGljaXBhbnRQdWJLZXkpLFxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkocGFydGlhbFNpZy50YXBPdXRwdXRLZXkpLFxuICBdKTtcbiAgY29uc3Qga2V5ID0ge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICAgIGtleWRhdGEsXG4gIH07XG4gIHJldHVybiB7IGtleSwgdmFsdWU6IHBhcnRpYWxTaWcucGFydGlhbFNpZyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzXG4gKiBAcGFyYW0ga3ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzIHtcbiAgaWYgKFxuICAgIGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHxcbiAgICBrdi5rZXkuc3VidHlwZSAhPT0gUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZU1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciAke2t2LmtleS5pZGVudGlmaWVyfSBvciBzdWJ0eXBlICR7a3Yua2V5LnN1YnR5cGV9IGZvciBwYXJ0aWNpcGFudHMgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IGt2LmtleS5rZXlkYXRhO1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5ZGF0YSBzaXplICR7a2V5Lmxlbmd0aH0gZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzYCk7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IGt2LnZhbHVlO1xuICBpZiAodmFsdWUubGVuZ3RoICE9PSA2Nikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZWRhdGEgc2l6ZSAke3ZhbHVlLmxlbmd0aH0gZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzYCk7XG4gIH1cbiAgY29uc3QgcGFydGljaXBhbnRQdWJLZXlzOiBUdXBsZTxCdWZmZXI+ID0gW3ZhbHVlLnN1YmFycmF5KDAsIDMzKSwgdmFsdWUuc3ViYXJyYXkoMzMpXTtcbiAgaWYgKHBhcnRpY2lwYW50UHViS2V5c1swXS5lcXVhbHMocGFydGljaXBhbnRQdWJLZXlzWzFdKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHBhcnRpY2lwYW50IHB1YiBrZXlzIGZvdW5kYCk7XG4gIH1cblxuICByZXR1cm4geyB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgwLCAzMiksIHRhcEludGVybmFsS2V5OiBrZXkuc3ViYXJyYXkoMzIpLCBwYXJ0aWNpcGFudFB1YktleXMgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBkYXRhIGZvciBtdXNpZzIgbm9uY2VcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMk5vbmNlKGt2OiBQcm9wcmlldGFyeUtleVZhbHVlKTogUHNidE11c2lnMlB1Yk5vbmNlIHtcbiAgaWYgKGt2LmtleS5pZGVudGlmaWVyICE9PSBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfHwga3Yua2V5LnN1YnR5cGUgIT09IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkZW50aWZpZXIgJHtrdi5rZXkuaWRlbnRpZmllcn0gb3Igc3VidHlwZSAke2t2LmtleS5zdWJ0eXBlfSBmb3Igbm9uY2VgKTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IGt2LmtleS5rZXlkYXRhO1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gNjUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5ZGF0YSBzaXplICR7a2V5Lmxlbmd0aH0gZm9yIG5vbmNlYCk7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IGt2LnZhbHVlO1xuICBpZiAodmFsdWUubGVuZ3RoICE9PSA2Nikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZWRhdGEgc2l6ZSAke3ZhbHVlLmxlbmd0aH0gZm9yIG5vbmNlYCk7XG4gIH1cblxuICByZXR1cm4geyBwYXJ0aWNpcGFudFB1YktleToga2V5LnN1YmFycmF5KDAsIDMzKSwgdGFwT3V0cHV0S2V5OiBrZXkuc3ViYXJyYXkoMzMpLCBwdWJOb25jZTogdmFsdWUgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBkYXRhIGZvciBtdXNpZzIgcGFydGlhbCBzaWdcbiAqIEBwYXJhbSBrdlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoa3Y6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiBQc2J0TXVzaWcyUGFydGlhbFNpZyB7XG4gIGlmIChcbiAgICBrdi5rZXkuaWRlbnRpZmllciAhPT0gUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSIHx8XG4gICAga3Yua2V5LnN1YnR5cGUgIT09IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlkZW50aWZpZXIgJHtrdi5rZXkuaWRlbnRpZmllcn0gb3Igc3VidHlwZSAke2t2LmtleS5zdWJ0eXBlfSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIGNvbnN0IGtleSA9IGt2LmtleS5rZXlkYXRhO1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gNjUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5ZGF0YSBzaXplICR7a2V5Lmxlbmd0aH0gZm9yIHBhcnRpYWwgc2lnYCk7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IGt2LnZhbHVlO1xuICBpZiAodmFsdWUubGVuZ3RoICE9PSAzMiAmJiB2YWx1ZS5sZW5ndGggIT09IDMzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGlhbCBzaWdgKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpY2lwYW50UHViS2V5OiBrZXkuc3ViYXJyYXkoMCwgMzMpLCB0YXBPdXRwdXRLZXk6IGtleS5zdWJhcnJheSgzMyksIHBhcnRpYWxTaWc6IHZhbHVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBJbnRlcm5hbEtleShwbGFpblB1YktleXM6IEJ1ZmZlcltdKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG11c2lnLmdldFhPbmx5UHVia2V5KG11c2lnLmtleUFnZyhwbGFpblB1YktleXMpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXBPdXRwdXRLZXkoaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlciwgdGFwVHJlZVJvb3Q6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICB0YXBUd2Vha1B1YmtleShlY2MsIHRvWE9ubHlQdWJsaWNLZXkoaW50ZXJuYWxQdWJLZXkpLCBjaGVja1RhcE1lcmtsZVJvb3QodGFwVHJlZVJvb3QpKS54T25seVB1YmtleVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdncmVnYXRlTm9uY2UocHViTm9uY2VzOiBUdXBsZTxCdWZmZXI+KTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG11c2lnLm5vbmNlQWdnKHB1Yk5vbmNlcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwVHdlYWsodGFwSW50ZXJuYWxLZXk6IEJ1ZmZlciwgdGFwTWVya2xlUm9vdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNhbGN1bGF0ZVRhcFR3ZWFrKGNoZWNrWE9ubHlQdWJsaWNLZXkodGFwSW50ZXJuYWxLZXkpLCBjaGVja1RhcE1lcmtsZVJvb3QodGFwTWVya2xlUm9vdCkpKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRNdXNpZzJTaWduaW5nU2Vzc2lvbihcbiAgYWdnTm9uY2U6IEJ1ZmZlcixcbiAgaGFzaDogQnVmZmVyLFxuICBwdWJsaWNLZXlzOiBUdXBsZTxCdWZmZXI+LFxuICB0d2VhazogQnVmZmVyXG4pOiBTZXNzaW9uS2V5IHtcbiAgcmV0dXJuIG11c2lnLnN0YXJ0U2lnbmluZ1Nlc3Npb24oYWdnTm9uY2UsIGhhc2gsIHB1YmxpY0tleXMsIHsgdHdlYWssIHhPbmx5OiB0cnVlIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXVzaWcyUGFydGlhbFNpZ24oXG4gIHByaXZhdGVLZXk6IEJ1ZmZlcixcbiAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXksXG4gIHNlc3Npb25LZXk6IFNlc3Npb25LZXksXG4gIG5vbmNlU3RvcmU6IE11c2lnMk5vbmNlU3RvcmVcbik6IEJ1ZmZlciB7XG4gIGNoZWNrVHhIYXNoKEJ1ZmZlci5mcm9tKHNlc3Npb25LZXkubXNnKSk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICBtdXNpZy5wYXJ0aWFsU2lnbih7XG4gICAgICBzZWNyZXRLZXk6IHByaXZhdGVLZXksXG4gICAgICBwdWJsaWNOb25jZTogbm9uY2VTdG9yZS5nZXRSZWYocHVibGljTm9uY2UpLFxuICAgICAgc2Vzc2lvbktleSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeShcbiAgc2lnOiBCdWZmZXIsXG4gIHB1YmxpY0tleTogQnVmZmVyLFxuICBwdWJsaWNOb25jZTogQnVmZmVyLFxuICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5XG4pOiBib29sZWFuIHtcbiAgY2hlY2tUeEhhc2goQnVmZmVyLmZyb20oc2Vzc2lvbktleS5tc2cpKTtcbiAgcmV0dXJuIG11c2lnLnBhcnRpYWxWZXJpZnkoeyBzaWcsIHB1YmxpY0tleSwgcHVibGljTm9uY2UsIHNlc3Npb25LZXkgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJBZ2dyZWdhdGVTaWdzKHNpZ3M6IEJ1ZmZlcltdLCBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5KTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG11c2lnLnNpZ25BZ2coc2lncywgc2Vzc2lvbktleSkpO1xufVxuXG4vKiogQHJldHVybiBzZXNzaW9uIGtleSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgc2Vzc2lvbiBsYXRlciAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU11c2lnMlNpZ25pbmdTZXNzaW9uKHNlc3Npb25BcmdzOiB7XG4gIHB1Yk5vbmNlczogVHVwbGU8QnVmZmVyPjtcbiAgdHhIYXNoOiBCdWZmZXI7XG4gIHB1YktleXM6IFR1cGxlPEJ1ZmZlcj47XG4gIGludGVybmFsUHViS2V5OiBCdWZmZXI7XG4gIHRhcFRyZWVSb290OiBCdWZmZXI7XG59KTogU2Vzc2lvbktleSB7XG4gIGNoZWNrVHhIYXNoKHNlc3Npb25BcmdzLnR4SGFzaCk7XG4gIGNvbnN0IGFnZ05vbmNlID0gY3JlYXRlQWdncmVnYXRlTm9uY2Uoc2Vzc2lvbkFyZ3MucHViTm9uY2VzKTtcbiAgY29uc3QgdHdlYWsgPSBjcmVhdGVUYXBUd2VhayhzZXNzaW9uQXJncy5pbnRlcm5hbFB1YktleSwgc2Vzc2lvbkFyZ3MudGFwVHJlZVJvb3QpO1xuICByZXR1cm4gc3RhcnRNdXNpZzJTaWduaW5nU2Vzc2lvbihhZ2dOb25jZSwgc2Vzc2lvbkFyZ3MudHhIYXNoLCBzZXNzaW9uQXJncy5wdWJLZXlzLCB0d2Vhayk7XG59XG5cbi8qKlxuICogQHJldHVybnMgcHNidCBwcm9wcmlldGFyeSBrZXkgZm9yIG11c2lnMiBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgZGF0YVxuICogSWYgbm8ga2V5IHZhbHVlIGV4aXN0cywgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0OiBQc2J0SW5wdXQpOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFscyA9IGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICB9KTtcblxuICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kICR7cGFydGljaXBhbnRzS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50c0tleVZhbHNbMF0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHBzYnQgcHJvcHJpZXRhcnkga2V5IGZvciBtdXNpZzIgcHVibGljIG5vbmNlIGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJOb25jZXMoaW5wdXQ6IFBzYnRJbnB1dCk6IFBzYnRNdXNpZzJQdWJOb25jZVtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9uY2VLZXlWYWxzID0gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICB9KTtcblxuICBpZiAoIW5vbmNlS2V5VmFscy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG5vbmNlS2V5VmFscy5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAke25vbmNlS2V5VmFscy5sZW5ndGh9IG1hdGNoaW5nIG5vbmNlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDEgb3IgMmApO1xuICB9XG5cbiAgcmV0dXJuIG5vbmNlS2V5VmFscy5tYXAoKGt2KSA9PiBkZWNvZGVQc2J0TXVzaWcyTm9uY2Uoa3YpKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBwc2J0IHByb3ByaWV0YXJ5IGtleSBmb3IgbXVzaWcyIHBhcnRpYWwgc2lnIGtleSB2YWx1ZSBkYXRhXG4gKiBJZiBubyBrZXkgdmFsdWUgZXhpc3RzLCB1bmRlZmluZWQgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dDogUHNidElucHV0KTogUHNidE11c2lnMlBhcnRpYWxTaWdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNpZ0tleVZhbHMgPSBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXQsIHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgfSk7XG5cbiAgaWYgKCFzaWdLZXlWYWxzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoc2lnS2V5VmFscy5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAke3NpZ0tleVZhbHMubGVuZ3RofSBtYXRjaGluZyBwYXJ0aWFsIHNpZ25hdHVyZSBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxIG9yIDJgKTtcbiAgfVxuXG4gIHJldHVybiBzaWdLZXlWYWxzLm1hcCgoa3YpID0+IGRlY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKGt2KSk7XG59XG5cbi8qKlxuICogQXNzZXJ0IG11c2lnMiBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgZGF0YSB3aXRoIHRhcEludGVybmFsS2V5IGFuZCB0YXBNZXJrbGVSb290LlxuICogPHRhcE91dHB1dEtleT48dGFwSW5wdXRLZXk+ID0+IDxwYXJ0aWNpcGFudEtleTE+PHBhcnRpY2lwYW50S2V5Mj5cbiAqIFVzaW5nIHRhcE1lcmtsZVJvb3QgYW5kIDIgcGFydGljaXBhbnQga2V5cywgdGhlIHRhcElucHV0S2V5IGlzIHZhbGlkYXRlZCBhbmQgdXNpbmcgdGFwTWVya2xlUm9vdCBhbmQgdGFwSW5wdXRLZXksXG4gKiB0aGUgdGFwT3V0cHV0S2V5IGlzIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoXG4gIHBhcnRpY2lwYW50S2V5VmFsRGF0YTogUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlcixcbiAgdGFwTWVya2xlUm9vdDogQnVmZmVyXG4pOiB2b2lkIHtcbiAgY2hlY2tYT25seVB1YmxpY0tleSh0YXBJbnRlcm5hbEtleSk7XG4gIGNoZWNrVGFwTWVya2xlUm9vdCh0YXBNZXJrbGVSb290KTtcblxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXMgPSBwYXJ0aWNpcGFudEtleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzO1xuXG4gIGNvbnN0IGludGVybmFsS2V5ID0gY3JlYXRlVGFwSW50ZXJuYWxLZXkocGFydGljaXBhbnRQdWJLZXlzKTtcbiAgaWYgKCFpbnRlcm5hbEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcEludGVybmFsS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudHMga2V5ZGF0YSB0YXBJbnRlcm5hbEtleScpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0S2V5ID0gY3JlYXRlVGFwT3V0cHV0S2V5KGludGVybmFsS2V5LCB0YXBNZXJrbGVSb290KTtcbiAgaWYgKCFvdXRwdXRLZXkuZXF1YWxzKHBhcnRpY2lwYW50S2V5VmFsRGF0YS50YXBPdXRwdXRLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlkYXRhIHRhcE91dHB1dEtleScpO1xuICB9XG5cbiAgaWYgKCFpbnRlcm5hbEtleS5lcXVhbHModGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBJbnRlcm5hbEtleSBhbmQgYWdncmVnYXRlZCBwYXJ0aWNpcGFudCBwdWIga2V5cyBkb2VzIG5vdCBtYXRjaCcpO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0IG11c2lnMiBwdWJsaWMgbm9uY2Uga2V5IHZhbHVlIGRhdGEgd2l0aCBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgZGF0YVxuICogKHJlZmVyIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKS5cbiAqIDxwYXJ0aWNpcGFudEtleTE+PHRhcE91dHB1dEtleT4gPT4gPHB1Yk5vbmNlMT5cbiAqIDxwYXJ0aWNpcGFudEtleTI+PHRhcE91dHB1dEtleT4gPT4gPHB1Yk5vbmNlMj5cbiAqIENoZWNrcyBhZ2FpbnN0IHBhcnRpY2lwYW50IGtleXMgYW5kIHRhcE91dHB1dEtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UHNidE11c2lnMk5vbmNlcyhcbiAgbm9uY2VzS2V5VmFsRGF0YTogUHNidE11c2lnMlB1Yk5vbmNlW10sXG4gIHBhcnRpY2lwYW50S2V5VmFsRGF0YTogUHNidE11c2lnMlBhcnRpY2lwYW50c1xuKTogdm9pZCB7XG4gIGNoZWNrWE9ubHlQdWJsaWNLZXkocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSk7XG4gIHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXMuZm9yRWFjaCgoa3YpID0+IGNoZWNrUGxhaW5QdWJsaWNLZXkoa3YpKTtcbiAgaWYgKHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXNbMF0uZXF1YWxzKHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIGlmIChub25jZXNLZXlWYWxEYXRhLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbm9uY2Uga2V5IHZhbHVlIGNvdW50ICR7bm9uY2VzS2V5VmFsRGF0YS5sZW5ndGh9YCk7XG4gIH1cblxuICBub25jZXNLZXlWYWxEYXRhLmZvckVhY2goKG5vbmNlS3YpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXMuZmluZEluZGV4KChwdWJLZXkpID0+XG4gICAgICBub25jZUt2LnBhcnRpY2lwYW50UHViS2V5LmVxdWFscyhwdWJLZXkpXG4gICAgKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbm9uY2Uga2V5ZGF0YSBwYXJ0aWNpcGFudCBwdWIga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFub25jZUt2LnRhcE91dHB1dEtleS5lcXVhbHMocGFydGljaXBhbnRLZXlWYWxEYXRhLnRhcE91dHB1dEtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBub25jZSBrZXlkYXRhIHRhcE91dHB1dEtleScpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgSW5wdXQgb2JqZWN0IGJ1dCBzaWcgaGFzaCB0eXBlIGRhdGEgaXMgdGFrZW4gb3V0IGZyb20gcGFydGlhbFNpZyBmaWVsZC5cbiAqIElmIHNpZyBoYXNoIHR5cGUgaXMgbm90IGNvbW1vbiBmb3IgYWxsIHNpZ3MsIGVycm9yIG91dCwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIG1vZGlmaWVkIG9iamVjdCBhbmQgc2luZ2xlIGhhc2ggdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MocGFydGlhbFNpZ3M6IFBzYnRNdXNpZzJQYXJ0aWFsU2lnW10pOiB7XG4gIHBhcnRpYWxTaWdzOiBQc2J0TXVzaWcyUGFydGlhbFNpZ1tdO1xuICBzaWdIYXNoVHlwZTogbnVtYmVyO1xufSB7XG4gIGlmICghcGFydGlhbFNpZ3MubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0aWFsU2lncyBhcnJheSBjYW4gbm90IGJlIGVtcHR5Jyk7XG4gIH1cbiAgY29uc3QgcFNpZ3NXaXRoSGFzaFR5cGUgPSBwYXJ0aWFsU2lncy5tYXAoKGt2KSA9PiB7XG4gICAgY29uc3QgeyBwYXJ0aWFsU2lnLCBwYXJ0aWNpcGFudFB1YktleSwgdGFwT3V0cHV0S2V5IH0gPSBrdjtcbiAgICByZXR1cm4gcGFydGlhbFNpZy5sZW5ndGggPT09IDMzXG4gICAgICA/IHsgcFNpZzogeyBwYXJ0aWFsU2lnOiBwYXJ0aWFsU2lnLnNsaWNlKDAsIDMyKSwgcGFydGljaXBhbnRQdWJLZXksIHRhcE91dHB1dEtleSB9LCBzaWdIYXNoVHlwZTogcGFydGlhbFNpZ1szMl0gfVxuICAgICAgOiB7IHBTaWc6IHsgcGFydGlhbFNpZywgcGFydGljaXBhbnRQdWJLZXksIHRhcE91dHB1dEtleSB9LCBzaWdIYXNoVHlwZTogVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUIH07XG4gIH0pO1xuXG4gIGNvbnN0IHNpZ0hhc2hUeXBlID0gcFNpZ3NXaXRoSGFzaFR5cGVbMF0uc2lnSGFzaFR5cGU7XG4gIGlmICghcFNpZ3NXaXRoSGFzaFR5cGUuZXZlcnkoKHBTaWcpID0+IHBTaWcuc2lnSGFzaFR5cGUgPT09IHNpZ0hhc2hUeXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2lnbmF0dXJlcyBtdXN0IHVzZSBzYW1lIHNpZyBoYXNoIHR5cGUnKTtcbiAgfVxuXG4gIHJldHVybiB7IHBhcnRpYWxTaWdzOiBwU2lnc1dpdGhIYXNoVHlwZS5tYXAoKHsgcFNpZyB9KSA9PiBwU2lnKSwgc2lnSGFzaFR5cGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU11c2lnMkRldGVybWluaXN0aWNOb25jZShwYXJhbXM6IFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgIG11c2lnLmRldGVybWluaXN0aWNOb25jZUdlbih7XG4gICAgICBzZWNyZXRLZXk6IHBhcmFtcy5wcml2YXRlS2V5LFxuICAgICAgYWdnT3RoZXJOb25jZTogbXVzaWcubm9uY2VBZ2coW3BhcmFtcy5vdGhlck5vbmNlXSksXG4gICAgICBwdWJsaWNLZXlzOiBwYXJhbXMucHVibGljS2V5cyxcbiAgICAgIHR3ZWFrczogW3sgdHdlYWs6IGNyZWF0ZVRhcFR3ZWFrKHBhcmFtcy5pbnRlcm5hbFB1YktleSwgcGFyYW1zLnRhcFRyZWVSb290KSwgeE9ubHk6IHRydWUgfV0sXG4gICAgICBtc2c6IHBhcmFtcy5oYXNoLFxuICAgIH0pLnB1YmxpY05vbmNlXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdXNpZzJEZXRlcm1pbmlzdGljU2lnbihwYXJhbXM6IFBzYnRNdXNpZzJEZXRlcm1pbmlzdGljUGFyYW1zKToge1xuICBzaWc6IEJ1ZmZlcjtcbiAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgcHVibGljTm9uY2U6IEJ1ZmZlcjtcbn0ge1xuICBjb25zdCB7IHNpZywgc2Vzc2lvbktleSwgcHVibGljTm9uY2UgfSA9IG11c2lnLmRldGVybWluaXN0aWNTaWduKHtcbiAgICBzZWNyZXRLZXk6IHBhcmFtcy5wcml2YXRlS2V5LFxuICAgIGFnZ090aGVyTm9uY2U6IG11c2lnLm5vbmNlQWdnKFtwYXJhbXMub3RoZXJOb25jZV0pLFxuICAgIHB1YmxpY0tleXM6IHBhcmFtcy5wdWJsaWNLZXlzLFxuICAgIHR3ZWFrczogW3sgdHdlYWs6IGNyZWF0ZVRhcFR3ZWFrKHBhcmFtcy5pbnRlcm5hbFB1YktleSwgcGFyYW1zLnRhcFRyZWVSb290KSwgeE9ubHk6IHRydWUgfV0sXG4gICAgbXNnOiBwYXJhbXMuaGFzaCxcbiAgfSk7XG4gIHJldHVybiB7IHNpZzogQnVmZmVyLmZyb20oc2lnKSwgc2Vzc2lvbktleSwgcHVibGljTm9uY2U6IEJ1ZmZlci5mcm9tKHB1YmxpY05vbmNlKSB9O1xufVxuIl19
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ProprietaryKey } from 'bip174/src/lib/proprietaryKeyVal';
|
|
2
|
+
import { PsbtInput } from 'bip174/src/lib/interfaces';
|
|
3
|
+
import { Psbt } from 'bitcoinjs-lib/src/psbt';
|
|
4
|
+
/**
|
|
5
|
+
* bitgo proprietary key identifier
|
|
6
|
+
*/
|
|
7
|
+
export declare const PSBT_PROPRIETARY_IDENTIFIER = "BITGO";
|
|
8
|
+
/**
|
|
9
|
+
* subtype for proprietary keys that bitgo uses
|
|
10
|
+
*/
|
|
11
|
+
export declare enum ProprietaryKeySubtype {
|
|
12
|
+
ZEC_CONSENSUS_BRANCH_ID = 0,
|
|
13
|
+
MUSIG2_PARTICIPANT_PUB_KEYS = 1,
|
|
14
|
+
MUSIG2_PUB_NONCE = 2,
|
|
15
|
+
MUSIG2_PARTIAL_SIG = 3
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Psbt proprietary keydata object.
|
|
19
|
+
* <compact size uint identifier length> <bytes identifier> <compact size uint subtype> <bytes subkeydata>
|
|
20
|
+
* => <bytes valuedata>
|
|
21
|
+
*/
|
|
22
|
+
export interface ProprietaryKeyValue {
|
|
23
|
+
key: ProprietaryKey;
|
|
24
|
+
value: Buffer;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Psbt proprietary keydata object search fields.
|
|
28
|
+
* <compact size uint identifier length> <bytes identifier> <compact size uint subtype> <bytes subkeydata>
|
|
29
|
+
*/
|
|
30
|
+
export interface ProprietaryKeySearch {
|
|
31
|
+
identifier: string;
|
|
32
|
+
subtype?: number;
|
|
33
|
+
keydata?: Buffer;
|
|
34
|
+
identifierEncoding?: BufferEncoding;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Search any data from psbt proprietary key value against keydata.
|
|
38
|
+
* Default identifierEncoding is utf-8 for identifier.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getPsbtInputProprietaryKeyVals(input: PsbtInput, keySearch?: ProprietaryKeySearch): ProprietaryKeyValue[];
|
|
41
|
+
/**
|
|
42
|
+
* @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
|
|
43
|
+
*/
|
|
44
|
+
export declare function getPsbtInputSignatureCount(input: PsbtInput): number;
|
|
45
|
+
/**
|
|
46
|
+
* @return true iff PSBT input is finalized
|
|
47
|
+
*/
|
|
48
|
+
export declare function isPsbtInputFinalized(input: PsbtInput): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* @return true iff data starts with magic PSBT byte sequence
|
|
51
|
+
* @param data byte array or hex string
|
|
52
|
+
* */
|
|
53
|
+
export declare function isPsbt(data: Buffer | string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* First checks if the input is already a buffer that starts with the magic PSBT byte sequence.
|
|
56
|
+
* If not, it checks if the input is a base64- or hex-encoded string that starts with PSBT header.
|
|
57
|
+
*
|
|
58
|
+
* This function is useful when reading a file that could be in any of the above formats or when
|
|
59
|
+
* dealing with a request that could contain a hex or base64 encoded PSBT.
|
|
60
|
+
*
|
|
61
|
+
* @param data
|
|
62
|
+
* @return buffer that starts with the magic PSBT byte sequence
|
|
63
|
+
* @throws Error when conversion is not possible
|
|
64
|
+
*/
|
|
65
|
+
export declare function toPsbtBuffer(data: Buffer | string): Buffer;
|
|
66
|
+
/**
|
|
67
|
+
* This function allows signing or validating a psbt with non-segwit inputs those do not contain nonWitnessUtxo.
|
|
68
|
+
*/
|
|
69
|
+
export declare function withUnsafeNonSegwit<T>(psbt: Psbt, fn: () => T, unsafe?: boolean): T;
|
|
70
|
+
//# sourceMappingURL=PsbtUtil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PsbtUtil.d.ts","sourceRoot":"","sources":["../../../src/bitgo/PsbtUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,2BAA2B,UAAU,CAAC;AAEnD;;GAEG;AACH,oBAAY,qBAAqB;IAC/B,uBAAuB,IAAO;IAC9B,2BAA2B,IAAO;IAClC,gBAAgB,IAAO;IACvB,kBAAkB,IAAO;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,cAAc,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,SAAS,CAAC,EAAE,oBAAoB,GAC/B,mBAAmB,EAAE,CAmBvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE9D;AAED;;;KAGK;AACL,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAUrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA6B1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,UAAO,GAAG,CAAC,CAShF"}
|