@bitgo-beta/sdk-core 8.2.1-beta.2092 → 8.2.1-beta.2094

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.
@@ -33,9 +33,19 @@ export type Secp256k1MultisigChildKeys = {
33
33
  pub: string;
34
34
  };
35
35
  };
36
+ export type EcdsaMpcChildKeys = {
37
+ commonKeychain: string;
38
+ user: string;
39
+ backup: string;
40
+ };
36
41
  export type DerivedSafeWalletKeys = {
42
+ slot: 'secp256k1Multisig';
37
43
  path: string;
38
44
  keys: Secp256k1MultisigChildKeys;
45
+ } | {
46
+ slot: 'ecdsaMpc';
47
+ path: string;
48
+ keys: EcdsaMpcChildKeys;
39
49
  };
40
50
  export type SafeRecoverKeyParams = {
41
51
  userKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/recovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,0BAA0B,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6C9B;AAUD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,kBAAkB,CAAC;CAC3B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAmCjC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,0BAA0B,CAAC;IACjC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC7B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgChC"}
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/recovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,0BAA0B,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6C9B;AAUD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,kBAAkB,CAAC;CAC3B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAmDjC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,0BAA0B,CAAC;IACjC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC7B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgChC"}
@@ -7,6 +7,7 @@ const crypto_1 = require("crypto");
7
7
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
8
8
  const statics_1 = require("@bitgo-beta/statics");
9
9
  const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
10
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
10
11
  const errors_1 = require("../errors");
11
12
  const keyShareEnvelope_1 = require("../utils/tss/keyShareEnvelope");
12
13
  async function decryptSafeKeycard(params) {
@@ -65,9 +66,6 @@ function buildSafeCosignerPath(coinType, slotOrdinal, account) {
65
66
  * until their derivation arms land (WCN-2736/WCN-2737/WCN-2894).
66
67
  */
67
68
  async function deriveSafeWalletKeys(params) {
68
- if (params.slot !== 'secp256k1Multisig') {
69
- throw new Error(`deriveSafeWalletKeys: slot '${params.slot}' is not supported yet`);
70
- }
71
69
  if (!Number.isInteger(params.account) || params.account < 0 || params.account > statics_1.MAX_BIP32_INDEX) {
72
70
  throw new Error(`deriveSafeWalletKeys: invalid account '${params.account}'`);
73
71
  }
@@ -77,24 +75,41 @@ async function deriveSafeWalletKeys(params) {
77
75
  }
78
76
  const slotOrdinal = statics_1.SAFE_ROOT_SLOT_ORDINALS[params.slot];
79
77
  const { account, roots } = params;
80
- const root = roots.secp256k1Multisig;
81
- const user = utxo_lib_1.bip32.fromBase58(root.user).derivePath(buildSafeUserPath(coinType, slotOrdinal, account));
82
- const backup = utxo_lib_1.bip32.fromBase58(root.backup).derivePath(buildSafeCosignerPath(coinType, slotOrdinal, account));
83
- const bitgo = utxo_lib_1.bip32.fromBase58(root.bitgo).derivePath(buildSafeCosignerPath(coinType, slotOrdinal, account));
84
- if (!user.privateKey || !backup.privateKey) {
85
- throw new Error('deriveSafeWalletKeys: user and backup roots must be private (xprv)');
78
+ if (params.slot === 'secp256k1Multisig') {
79
+ const root = roots.secp256k1Multisig;
80
+ const user = utxo_lib_1.bip32.fromBase58(root.user).derivePath(buildSafeUserPath(coinType, slotOrdinal, account));
81
+ const backup = utxo_lib_1.bip32.fromBase58(root.backup).derivePath(buildSafeCosignerPath(coinType, slotOrdinal, account));
82
+ const bitgo = utxo_lib_1.bip32.fromBase58(root.bitgo).derivePath(buildSafeCosignerPath(coinType, slotOrdinal, account));
83
+ if (!user.privateKey || !backup.privateKey) {
84
+ throw new Error('deriveSafeWalletKeys: user and backup roots must be private (xprv)');
85
+ }
86
+ if (bitgo.privateKey) {
87
+ throw new Error('deriveSafeWalletKeys: bitgo root must be public (xpub)');
88
+ }
89
+ return {
90
+ slot: 'secp256k1Multisig',
91
+ path: buildSafeUserPath(coinType, slotOrdinal, account),
92
+ keys: {
93
+ user: { prv: user.toBase58(), pub: user.neutered().toBase58() },
94
+ backup: { prv: backup.toBase58(), pub: backup.neutered().toBase58() },
95
+ bitgo: { pub: bitgo.neutered().toBase58() },
96
+ },
97
+ };
86
98
  }
87
- if (bitgo.privateKey) {
88
- throw new Error('deriveSafeWalletKeys: bitgo root must be public (xpub)');
99
+ if (params.slot === 'ecdsaMpc') {
100
+ const { commonKeychain, userChild, backupChild } = await sdk_lib_mpc_1.DklsVrfUtils.deriveSafeEcdsaMpcChild({
101
+ userRoot: roots.ecdsaMpc.user,
102
+ backupRoot: roots.ecdsaMpc.backup,
103
+ account,
104
+ coinType,
105
+ });
106
+ return {
107
+ slot: 'ecdsaMpc',
108
+ path: buildSafeUserPath(coinType, slotOrdinal, account),
109
+ keys: { commonKeychain, user: userChild, backup: backupChild },
110
+ };
89
111
  }
90
- return {
91
- path: buildSafeUserPath(coinType, slotOrdinal, account),
92
- keys: {
93
- user: { prv: user.toBase58(), pub: user.neutered().toBase58() },
94
- backup: { prv: backup.toBase58(), pub: backup.neutered().toBase58() },
95
- bitgo: { pub: bitgo.neutered().toBase58() },
96
- },
97
- };
112
+ throw new Error(`deriveSafeWalletKeys: slot '${params.slot}' is not supported yet`);
98
113
  }
99
114
  /**
100
115
  * Builds the key fields `coin.recover()` expects from derived Safe child keys.
@@ -130,4 +145,4 @@ async function buildSafeRecoverKeyParams(params) {
130
145
  walletPassphrase,
131
146
  };
132
147
  }
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZDQSxnREFtREM7QUFlRCxvREF3Q0M7QUFPRCw4REFzQ0M7QUE5TEQsbUNBQXFDO0FBQ3JDLG1EQUE2QztBQUM3QyxpREFBc0Y7QUFFdEYsNkRBQWdFO0FBRWhFLHNDQUFtRDtBQUNuRCxvRUFBeUU7QUFnQ2xFLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxNQU14QztJQUNDLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFFLE1BQU0sU0FBUyxHQUFHLElBQUEsbUNBQW1CLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxtQ0FBbUIsRUFBQyxZQUFZLENBQUMsQ0FBQztJQUN0RCxNQUFNLFVBQVUsR0FBRyxJQUFBLG1DQUFtQixFQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXBELE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFZLEVBQW1CLEVBQUU7UUFDMUQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksK0JBQXNCLENBQUMsK0RBQStELEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkcsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBaUIsRUFBd0IsRUFBRTtRQUNoRSxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUEsMkNBQXdCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUFDLE9BQU8sQ0FB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QUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pGLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO0tBQzVGLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7UUFDeEIsZ0JBQWdCO0tBQ2pCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFdSVy1mYWNpbmcgc2FmZSByZWNvdmVyeSBlbnRyeSBwb2ludHMuXG4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGNvaW5zLCBNQVhfQklQMzJfSU5ERVgsIFNBRkVfUk9PVF9TTE9UX09SRElOQUxTIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgdHlwZSB7IFJvb3RLZXlUeXBlIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVNhZmVLZXljYXJkQm94IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1zYWZlcyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZVNhZmVNcGNLZXlFbnZlbG9wZXMgfSBmcm9tICcuLi91dGlscy90c3Mva2V5U2hhcmVFbnZlbG9wZSc7XG5cbmV4cG9ydCB0eXBlIERlY3J5cHRlZE1wY1NhZmVSb290ID0geyBzaWduaW5nOiBCdWZmZXI7IHZyZjogQnVmZmVyIH07XG5cbmV4cG9ydCB0eXBlIE9uY2hhaW5TYWZlUm9vdCA9IHsgdXNlcjogc3RyaW5nOyBiYWNrdXA6IHN0cmluZzsgYml0Z286IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgTXBjU2FmZVJvb3QgPSB7IHVzZXI6IERlY3J5cHRlZE1wY1NhZmVSb290OyBiYWNrdXA6IERlY3J5cHRlZE1wY1NhZmVSb290OyBiaXRnbzogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFNlY3AyNTZrMU11bHRpc2lnQ2hpbGRLZXlzID0ge1xuICB1c2VyOiB7IHBydjogc3RyaW5nOyBwdWI6IHN0cmluZyB9O1xuICBiYWNrdXA6IHsgcHJ2OiBzdHJpbmc7IHB1Yjogc3RyaW5nIH07XG4gIGJpdGdvOiB7IHB1Yjogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBEZXJpdmVkU2FmZVdhbGxldEtleXMgPSB7XG4gIHBhdGg6IHN0cmluZztcbiAga2V5czogU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXM7XG59O1xuXG5leHBvcnQgdHlwZSBTYWZlUmVjb3ZlcktleVBhcmFtcyA9IHtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IE9uY2hhaW5TYWZlUm9vdDtcbiAgZWQyNTUxOU11bHRpc2lnOiBPbmNoYWluU2FmZVJvb3Q7XG4gIGVjZHNhTXBjOiBNcGNTYWZlUm9vdDtcbiAgZWRkc2FNcGM6IE1wY1NhZmVSb290O1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRTYWZlS2V5Y2FyZChwYXJhbXM6IHtcbiAgYml0Z286IEJpdEdvQmFzZTtcbiAgdXNlcktleUJveDogc3RyaW5nO1xuICBiYWNrdXBLZXlCb3g6IHN0cmluZztcbiAgYml0Z29LZXlCb3g6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbn0pOiBQcm9taXNlPERlY3J5cHRlZFNhZmVSb290cz4ge1xuICBjb25zdCB7IGJpdGdvLCB1c2VyS2V5Qm94LCBiYWNrdXBLZXlCb3gsIGJpdGdvS2V5Qm94LCBwYXNzd29yZCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHVzZXJSb290cyA9IHBhcnNlU2FmZUtleWNhcmRCb3godXNlcktleUJveCk7XG4gIGNvbnN0IGJhY2t1cFJvb3RzID0gcGFyc2VTYWZlS2V5Y2FyZEJveChiYWNrdXBLZXlCb3gpO1xuICBjb25zdCBiaXRnb1Jvb3RzID0gcGFyc2VTYWZlS2V5Y2FyZEJveChiaXRnb0tleUJveCk7XG5cbiAgY29uc3QgZGVjcnlwdFJvb3QgPSBhc3luYyAocm9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJpdGdvLmRlY3J5cHQoeyBpbnB1dDogcm9vdCwgcGFzc3dvcmQgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ3VuYWJsZSB0byBkZWNyeXB0IHRoZSBzYWZlIGtleWNhcmQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3dvcmQnLCBlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdW53cmFwTXBjUm9vdCA9IChkZWNyeXB0ZWQ6IHN0cmluZyk6IERlY3J5cHRlZE1wY1NhZmVSb290ID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhcnNlU2FmZU1wY0tleUVudmVsb3BlcyhkZWNyeXB0ZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCd1bmFibGUgdG8gZGVjcnlwdCB0aGUgc2FmZSBrZXljYXJkIHdpdGggdGhlIHByb3ZpZGVkIHBhc3N3b3JkJywgZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2VjcDI1NmsxTXVsdGlzaWc6IHtcbiAgICAgIHVzZXI6IGF3YWl0IGRlY3J5cHRSb290KHVzZXJSb290cy5zZWNwMjU2azFNdWx0aXNpZyksXG4gICAgICBiYWNrdXA6IGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLnNlY3AyNTZrMU11bHRpc2lnKSxcbiAgICAgIGJpdGdvOiBiaXRnb1Jvb3RzLnNlY3AyNTZrMU11bHRpc2lnLFxuICAgIH0sXG4gICAgZWQyNTUxOU11bHRpc2lnOiB7XG4gICAgICB1c2VyOiBhd2FpdCBkZWNyeXB0Um9vdCh1c2VyUm9vdHMuZWQyNTUxOU11bHRpc2lnKSxcbiAgICAgIGJhY2t1cDogYXdhaXQgZGVjcnlwdFJvb3QoYmFja3VwUm9vdHMuZWQyNTUxOU11bHRpc2lnKSxcbiAgICAgIGJpdGdvOiBiaXRnb1Jvb3RzLmVkMjU1MTlNdWx0aXNpZyxcbiAgICB9LFxuICAgIGVjZHNhTXBjOiB7XG4gICAgICB1c2VyOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KHVzZXJSb290cy5lY2RzYU1wYykpLFxuICAgICAgYmFja3VwOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLmVjZHNhTXBjKSksXG4gICAgICBiaXRnbzogYml0Z29Sb290cy5lY2RzYU1wYyxcbiAgICB9LFxuICAgIGVkZHNhTXBjOiB7XG4gICAgICB1c2VyOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KHVzZXJSb290cy5lZGRzYU1wYykpLFxuICAgICAgYmFja3VwOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLmVkZHNhTXBjKSksXG4gICAgICBiaXRnbzogYml0Z29Sb290cy5lZGRzYU1wYyxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFNhZmVVc2VyUGF0aChjb2luVHlwZTogbnVtYmVyLCBzbG90T3JkaW5hbDogbnVtYmVyLCBhY2NvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYG0vNDQnLyR7Y29pblR5cGV9Jy8ke3Nsb3RPcmRpbmFsfScvJHthY2NvdW50fSdgO1xufVxuXG5mdW5jdGlvbiBidWlsZFNhZmVDb3NpZ25lclBhdGgoY29pblR5cGU6IG51bWJlciwgc2xvdE9yZGluYWw6IG51bWJlciwgYWNjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLzQ0LyR7Y29pblR5cGV9LyR7c2xvdE9yZGluYWx9LyR7YWNjb3VudH1gO1xufVxuXG4vKipcbiAqIERlcml2ZXMgYSBTYWZlIHdhbGxldCdzIGNoaWxkIGtleXMgYXQgdGhlIEJJUDQ0IHBhdGggZm9yIGEgZ2l2ZW4gc2xvdCBhbmQgYWNjb3VudC5cbiAqIE9ubHkgYHNlY3AyNTZrMU11bHRpc2lnYCAoc2xvdCAxKSBpcyBzdXBwb3J0ZWQgZm9yIG5vdzsgdGhlIHJlbWFpbmluZyBzbG90cyB0aHJvd1xuICogdW50aWwgdGhlaXIgZGVyaXZhdGlvbiBhcm1zIGxhbmQgKFdDTi0yNzM2L1dDTi0yNzM3L1dDTi0yODk0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVNhZmVXYWxsZXRLZXlzKHBhcmFtczoge1xuICBjb2luOiBzdHJpbmc7XG4gIHNsb3Q6IFJvb3RLZXlUeXBlO1xuICBhY2NvdW50OiBudW1iZXI7XG4gIHJvb3RzOiBEZWNyeXB0ZWRTYWZlUm9vdHM7XG59KTogUHJvbWlzZTxEZXJpdmVkU2FmZVdhbGxldEtleXM+IHtcbiAgaWYgKHBhcmFtcy5zbG90ICE9PSAnc2VjcDI1NmsxTXVsdGlzaWcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZXJpdmVTYWZlV2FsbGV0S2V5czogc2xvdCAnJHtwYXJhbXMuc2xvdH0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0YCk7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcmFtcy5hY2NvdW50KSB8fCBwYXJhbXMuYWNjb3VudCA8IDAgfHwgcGFyYW1zLmFjY291bnQgPiBNQVhfQklQMzJfSU5ERVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlcml2ZVNhZmVXYWxsZXRLZXlzOiBpbnZhbGlkIGFjY291bnQgJyR7cGFyYW1zLmFjY291bnR9J2ApO1xuICB9XG5cbiAgY29uc3QgY29pblR5cGUgPSBjb2lucy5nZXQocGFyYW1zLmNvaW4pLmJpcDQ0Q29pblR5cGU7XG4gIGlmIChjb2luVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb2luICcke3BhcmFtcy5jb2lufScgaGFzIG5vIEJJUDQ0IGNvaW4gdHlwZSBhbmQgY2Fubm90IGRlcml2ZSBhIHNhZmUgY2hpbGRgKTtcbiAgfVxuICBjb25zdCBzbG90T3JkaW5hbCA9IFNBRkVfUk9PVF9TTE9UX09SRElOQUxTW3BhcmFtcy5zbG90XTtcbiAgY29uc3QgeyBhY2NvdW50LCByb290cyB9ID0gcGFyYW1zO1xuICBjb25zdCByb290ID0gcm9vdHMuc2VjcDI1NmsxTXVsdGlzaWc7XG5cbiAgY29uc3QgdXNlciA9IGJpcDMyLmZyb21CYXNlNTgocm9vdC51c2VyKS5kZXJpdmVQYXRoKGJ1aWxkU2FmZVVzZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCkpO1xuICBjb25zdCBiYWNrdXAgPSBiaXAzMi5mcm9tQmFzZTU4KHJvb3QuYmFja3VwKS5kZXJpdmVQYXRoKGJ1aWxkU2FmZUNvc2lnbmVyUGF0aChjb2luVHlwZSwgc2xvdE9yZGluYWwsIGFjY291bnQpKTtcbiAgY29uc3QgYml0Z28gPSBiaXAzMi5mcm9tQmFzZTU4KHJvb3QuYml0Z28pLmRlcml2ZVBhdGgoYnVpbGRTYWZlQ29zaWduZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCkpO1xuXG4gIGlmICghdXNlci5wcml2YXRlS2V5IHx8ICFiYWNrdXAucHJpdmF0ZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlU2FmZVdhbGxldEtleXM6IHVzZXIgYW5kIGJhY2t1cCByb290cyBtdXN0IGJlIHByaXZhdGUgKHhwcnYpJyk7XG4gIH1cbiAgaWYgKGJpdGdvLnByaXZhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZVNhZmVXYWxsZXRLZXlzOiBiaXRnbyByb290IG11c3QgYmUgcHVibGljICh4cHViKScpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBidWlsZFNhZmVVc2VyUGF0aChjb2luVHlwZSwgc2xvdE9yZGluYWwsIGFjY291bnQpLFxuICAgIGtleXM6IHtcbiAgICAgIHVzZXI6IHsgcHJ2OiB1c2VyLnRvQmFzZTU4KCksIHB1YjogdXNlci5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICAgIGJhY2t1cDogeyBwcnY6IGJhY2t1cC50b0Jhc2U1OCgpLCBwdWI6IGJhY2t1cC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICAgIGJpdGdvOiB7IHB1YjogYml0Z28ubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSBmaWVsZHMgYGNvaW4ucmVjb3ZlcigpYCBleHBlY3RzIGZyb20gZGVyaXZlZCBTYWZlIGNoaWxkIGtleXMuXG4gKiBPbmx5IGBzZWNwMjU2azFNdWx0aXNpZ2AgKHNsb3QgMSkgaXMgc3VwcG9ydGVkIGZvciBub3cuIFNpZ25lZCBtb2RlIHJlLWVuY3J5cHRzIHRoZVxuICogY2hpbGQgeHBydnMgdW5kZXIgYSBmcmVzaCBlcGhlbWVyYWwgcGFzc3BocmFzZSAodjEvU0pDTCk7IHVuc2lnbmVkIG1vZGUgcmV0dXJucyBwdWJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyhwYXJhbXM6IHtcbiAgYml0Z286IEJpdEdvQmFzZTtcbiAgY29pbjogc3RyaW5nO1xuICBzbG90OiBSb290S2V5VHlwZTtcbiAga2V5czogU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXM7XG4gIG1vZGU6ICdzaWduZWQnIHwgJ3Vuc2lnbmVkJztcbn0pOiBQcm9taXNlPFNhZmVSZWNvdmVyS2V5UGFyYW1zPiB7XG4gIGlmIChwYXJhbXMuc2xvdCAhPT0gJ3NlY3AyNTZrMU11bHRpc2lnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtczogc2xvdCAnJHtwYXJhbXMuc2xvdH0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0YCk7XG4gIH1cbiAgY29uc3QgeyBiaXRnbywga2V5cywgbW9kZSB9ID0gcGFyYW1zO1xuXG4gIGlmIChtb2RlID09PSAndW5zaWduZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXk6IGtleXMudXNlci5wdWIsXG4gICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwLnB1YixcbiAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvLnB1YixcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdXNlclBydiA9IGJpcDMyLmZyb21CYXNlNTgoa2V5cy51c2VyLnBydik7XG4gIGNvbnN0IGJhY2t1cFBydiA9IGJpcDMyLmZyb21CYXNlNTgoa2V5cy5iYWNrdXAucHJ2KTtcbiAgaWYgKCF1c2VyUHJ2LnByaXZhdGVLZXkgfHwgIWJhY2t1cFBydi5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zOiBrZXlzLnVzZXIucHJ2IGFuZCBrZXlzLmJhY2t1cC5wcnYgbXVzdCBiZSBwcml2YXRlIHhwcnZzJyk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gcmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgW3VzZXJLZXksIGJhY2t1cEtleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgYml0Z28uZW5jcnlwdCh7IGlucHV0OiBrZXlzLnVzZXIucHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb246IDEgfSksXG4gICAgYml0Z28uZW5jcnlwdCh7IGlucHV0OiBrZXlzLmJhY2t1cC5wcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KSxcbiAgXSk7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5LFxuICAgIGJhY2t1cEtleSxcbiAgICBiaXRnb0tleToga2V5cy5iaXRnby5wdWIsXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgfTtcbn1cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1EQSxnREFtREM7QUFlRCxvREF3REM7QUFPRCw4REFzQ0M7QUFwTkQsbUNBQXFDO0FBQ3JDLG1EQUE2QztBQUM3QyxpREFBc0Y7QUFFdEYsNkRBQWdFO0FBQ2hFLHlEQUF1RDtBQUV2RCxzQ0FBbUQ7QUFDbkQsb0VBQXlFO0FBcUNsRSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsTUFNeEM7SUFDQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUUxRSxNQUFNLFNBQVMsR0FBRyxJQUFBLG1DQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sV0FBVyxHQUFHLElBQUEsbUNBQW1CLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBQSxtQ0FBbUIsRUFBQyxXQUFXLENBQUMsQ0FBQztJQUVwRCxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFtQixFQUFFO1FBQzFELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLCtCQUFzQixDQUFDLCtEQUErRCxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQWlCLEVBQXdCLEVBQUU7UUFDaEUsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFBLDJDQUF3QixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7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RCxNQUFNLE9BQU8sR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLGdCQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRkFBb0YsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekQsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDN0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDekYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FDNUYsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLE9BQU87UUFDUCxTQUFTO1FBQ1QsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztRQUN4QixnQkFBZ0I7S0FDakIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgV1JXLWZhY2luZyBzYWZlIHJlY292ZXJ5IGVudHJ5IHBvaW50cy5cbiAqL1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgY29pbnMsIE1BWF9CSVAzMl9JTkRFWCwgU0FGRV9ST09UX1NMT1RfT1JESU5BTFMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB0eXBlIHsgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IHBhcnNlU2FmZUtleWNhcmRCb3ggfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLXNhZmVzJztcbmltcG9ydCB7IERrbHNWcmZVdGlscyB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlU2FmZU1wY0tleUVudmVsb3BlcyB9IGZyb20gJy4uL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcblxuZXhwb3J0IHR5cGUgRGVjcnlwdGVkTXBjU2FmZVJvb3QgPSB7IHNpZ25pbmc6IEJ1ZmZlcjsgdnJmOiBCdWZmZXIgfTtcblxuZXhwb3J0IHR5cGUgT25jaGFpblNhZmVSb290ID0geyB1c2VyOiBzdHJpbmc7IGJhY2t1cDogc3RyaW5nOyBiaXRnbzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBNcGNTYWZlUm9vdCA9IHsgdXNlcjogRGVjcnlwdGVkTXBjU2FmZVJvb3Q7IGJhY2t1cDogRGVjcnlwdGVkTXBjU2FmZVJvb3Q7IGJpdGdvOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXMgPSB7XG4gIHVzZXI6IHsgcHJ2OiBzdHJpbmc7IHB1Yjogc3RyaW5nIH07XG4gIGJhY2t1cDogeyBwcnY6IHN0cmluZzsgcHViOiBzdHJpbmcgfTtcbiAgYml0Z286IHsgcHViOiBzdHJpbmcgfTtcbn07XG5cbmV4cG9ydCB0eXBlIEVjZHNhTXBjQ2hpbGRLZXlzID0ge1xuICBjb21tb25LZXljaGFpbjogc3RyaW5nO1xuICB1c2VyOiBzdHJpbmc7XG4gIGJhY2t1cDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRGVyaXZlZFNhZmVXYWxsZXRLZXlzID1cbiAgfCB7IHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZyc7IHBhdGg6IHN0cmluZzsga2V5czogU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXMgfVxuICB8IHsgc2xvdDogJ2VjZHNhTXBjJzsgcGF0aDogc3RyaW5nOyBrZXlzOiBFY2RzYU1wY0NoaWxkS2V5cyB9O1xuXG5leHBvcnQgdHlwZSBTYWZlUmVjb3ZlcktleVBhcmFtcyA9IHtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERlY3J5cHRlZFNhZmVSb290cyA9IHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IE9uY2hhaW5TYWZlUm9vdDtcbiAgZWQyNTUxOU11bHRpc2lnOiBPbmNoYWluU2FmZVJvb3Q7XG4gIGVjZHNhTXBjOiBNcGNTYWZlUm9vdDtcbiAgZWRkc2FNcGM6IE1wY1NhZmVSb290O1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRTYWZlS2V5Y2FyZChwYXJhbXM6IHtcbiAgYml0Z286IEJpdEdvQmFzZTtcbiAgdXNlcktleUJveDogc3RyaW5nO1xuICBiYWNrdXBLZXlCb3g6IHN0cmluZztcbiAgYml0Z29LZXlCb3g6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbn0pOiBQcm9taXNlPERlY3J5cHRlZFNhZmVSb290cz4ge1xuICBjb25zdCB7IGJpdGdvLCB1c2VyS2V5Qm94LCBiYWNrdXBLZXlCb3gsIGJpdGdvS2V5Qm94LCBwYXNzd29yZCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHVzZXJSb290cyA9IHBhcnNlU2FmZUtleWNhcmRCb3godXNlcktleUJveCk7XG4gIGNvbnN0IGJhY2t1cFJvb3RzID0gcGFyc2VTYWZlS2V5Y2FyZEJveChiYWNrdXBLZXlCb3gpO1xuICBjb25zdCBiaXRnb1Jvb3RzID0gcGFyc2VTYWZlS2V5Y2FyZEJveChiaXRnb0tleUJveCk7XG5cbiAgY29uc3QgZGVjcnlwdFJvb3QgPSBhc3luYyAocm9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJpdGdvLmRlY3J5cHQoeyBpbnB1dDogcm9vdCwgcGFzc3dvcmQgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ3VuYWJsZSB0byBkZWNyeXB0IHRoZSBzYWZlIGtleWNhcmQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3dvcmQnLCBlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdW53cmFwTXBjUm9vdCA9IChkZWNyeXB0ZWQ6IHN0cmluZyk6IERlY3J5cHRlZE1wY1NhZmVSb290ID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhcnNlU2FmZU1wY0tleUVudmVsb3BlcyhkZWNyeXB0ZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCd1bmFibGUgdG8gZGVjcnlwdCB0aGUgc2FmZSBrZXljYXJkIHdpdGggdGhlIHByb3ZpZGVkIHBhc3N3b3JkJywgZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc2VjcDI1NmsxTXVsdGlzaWc6IHtcbiAgICAgIHVzZXI6IGF3YWl0IGRlY3J5cHRSb290KHVzZXJSb290cy5zZWNwMjU2azFNdWx0aXNpZyksXG4gICAgICBiYWNrdXA6IGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLnNlY3AyNTZrMU11bHRpc2lnKSxcbiAgICAgIGJpdGdvOiBiaXRnb1Jvb3RzLnNlY3AyNTZrMU11bHRpc2lnLFxuICAgIH0sXG4gICAgZWQyNTUxOU11bHRpc2lnOiB7XG4gICAgICB1c2VyOiBhd2FpdCBkZWNyeXB0Um9vdCh1c2VyUm9vdHMuZWQyNTUxOU11bHRpc2lnKSxcbiAgICAgIGJhY2t1cDogYXdhaXQgZGVjcnlwdFJvb3QoYmFja3VwUm9vdHMuZWQyNTUxOU11bHRpc2lnKSxcbiAgICAgIGJpdGdvOiBiaXRnb1Jvb3RzLmVkMjU1MTlNdWx0aXNpZyxcbiAgICB9LFxuICAgIGVjZHNhTXBjOiB7XG4gICAgICB1c2VyOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KHVzZXJSb290cy5lY2RzYU1wYykpLFxuICAgICAgYmFja3VwOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLmVjZHNhTXBjKSksXG4gICAgICBiaXRnbzogYml0Z29Sb290cy5lY2RzYU1wYyxcbiAgICB9LFxuICAgIGVkZHNhTXBjOiB7XG4gICAgICB1c2VyOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KHVzZXJSb290cy5lZGRzYU1wYykpLFxuICAgICAgYmFja3VwOiB1bndyYXBNcGNSb290KGF3YWl0IGRlY3J5cHRSb290KGJhY2t1cFJvb3RzLmVkZHNhTXBjKSksXG4gICAgICBiaXRnbzogYml0Z29Sb290cy5lZGRzYU1wYyxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFNhZmVVc2VyUGF0aChjb2luVHlwZTogbnVtYmVyLCBzbG90T3JkaW5hbDogbnVtYmVyLCBhY2NvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYG0vNDQnLyR7Y29pblR5cGV9Jy8ke3Nsb3RPcmRpbmFsfScvJHthY2NvdW50fSdgO1xufVxuXG5mdW5jdGlvbiBidWlsZFNhZmVDb3NpZ25lclBhdGgoY29pblR5cGU6IG51bWJlciwgc2xvdE9yZGluYWw6IG51bWJlciwgYWNjb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLzQ0LyR7Y29pblR5cGV9LyR7c2xvdE9yZGluYWx9LyR7YWNjb3VudH1gO1xufVxuXG4vKipcbiAqIERlcml2ZXMgYSBTYWZlIHdhbGxldCdzIGNoaWxkIGtleXMgYXQgdGhlIEJJUDQ0IHBhdGggZm9yIGEgZ2l2ZW4gc2xvdCBhbmQgYWNjb3VudC5cbiAqIE9ubHkgYHNlY3AyNTZrMU11bHRpc2lnYCAoc2xvdCAxKSBpcyBzdXBwb3J0ZWQgZm9yIG5vdzsgdGhlIHJlbWFpbmluZyBzbG90cyB0aHJvd1xuICogdW50aWwgdGhlaXIgZGVyaXZhdGlvbiBhcm1zIGxhbmQgKFdDTi0yNzM2L1dDTi0yNzM3L1dDTi0yODk0KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVNhZmVXYWxsZXRLZXlzKHBhcmFtczoge1xuICBjb2luOiBzdHJpbmc7XG4gIHNsb3Q6IFJvb3RLZXlUeXBlO1xuICBhY2NvdW50OiBudW1iZXI7XG4gIHJvb3RzOiBEZWNyeXB0ZWRTYWZlUm9vdHM7XG59KTogUHJvbWlzZTxEZXJpdmVkU2FmZVdhbGxldEtleXM+IHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcmFtcy5hY2NvdW50KSB8fCBwYXJhbXMuYWNjb3VudCA8IDAgfHwgcGFyYW1zLmFjY291bnQgPiBNQVhfQklQMzJfSU5ERVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlcml2ZVNhZmVXYWxsZXRLZXlzOiBpbnZhbGlkIGFjY291bnQgJyR7cGFyYW1zLmFjY291bnR9J2ApO1xuICB9XG5cbiAgY29uc3QgY29pblR5cGUgPSBjb2lucy5nZXQocGFyYW1zLmNvaW4pLmJpcDQ0Q29pblR5cGU7XG4gIGlmIChjb2luVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb2luICcke3BhcmFtcy5jb2lufScgaGFzIG5vIEJJUDQ0IGNvaW4gdHlwZSBhbmQgY2Fubm90IGRlcml2ZSBhIHNhZmUgY2hpbGRgKTtcbiAgfVxuICBjb25zdCBzbG90T3JkaW5hbCA9IFNBRkVfUk9PVF9TTE9UX09SRElOQUxTW3BhcmFtcy5zbG90XTtcbiAgY29uc3QgeyBhY2NvdW50LCByb290cyB9ID0gcGFyYW1zO1xuXG4gIGlmIChwYXJhbXMuc2xvdCA9PT0gJ3NlY3AyNTZrMU11bHRpc2lnJykge1xuICAgIGNvbnN0IHJvb3QgPSByb290cy5zZWNwMjU2azFNdWx0aXNpZztcbiAgICBjb25zdCB1c2VyID0gYmlwMzIuZnJvbUJhc2U1OChyb290LnVzZXIpLmRlcml2ZVBhdGgoYnVpbGRTYWZlVXNlclBhdGgoY29pblR5cGUsIHNsb3RPcmRpbmFsLCBhY2NvdW50KSk7XG4gICAgY29uc3QgYmFja3VwID0gYmlwMzIuZnJvbUJhc2U1OChyb290LmJhY2t1cCkuZGVyaXZlUGF0aChidWlsZFNhZmVDb3NpZ25lclBhdGgoY29pblR5cGUsIHNsb3RPcmRpbmFsLCBhY2NvdW50KSk7XG4gICAgY29uc3QgYml0Z28gPSBiaXAzMi5mcm9tQmFzZTU4KHJvb3QuYml0Z28pLmRlcml2ZVBhdGgoYnVpbGRTYWZlQ29zaWduZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCkpO1xuXG4gICAgaWYgKCF1c2VyLnByaXZhdGVLZXkgfHwgIWJhY2t1cC5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZVNhZmVXYWxsZXRLZXlzOiB1c2VyIGFuZCBiYWNrdXAgcm9vdHMgbXVzdCBiZSBwcml2YXRlICh4cHJ2KScpO1xuICAgIH1cbiAgICBpZiAoYml0Z28ucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVTYWZlV2FsbGV0S2V5czogYml0Z28gcm9vdCBtdXN0IGJlIHB1YmxpYyAoeHB1YiknKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgIHBhdGg6IGJ1aWxkU2FmZVVzZXJQYXRoKGNvaW5UeXBlLCBzbG90T3JkaW5hbCwgYWNjb3VudCksXG4gICAgICBrZXlzOiB7XG4gICAgICAgIHVzZXI6IHsgcHJ2OiB1c2VyLnRvQmFzZTU4KCksIHB1YjogdXNlci5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICAgICAgYmFja3VwOiB7IHBydjogYmFja3VwLnRvQmFzZTU4KCksIHB1YjogYmFja3VwLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9LFxuICAgICAgICBiaXRnbzogeyBwdWI6IGJpdGdvLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHBhcmFtcy5zbG90ID09PSAnZWNkc2FNcGMnKSB7XG4gICAgY29uc3QgeyBjb21tb25LZXljaGFpbiwgdXNlckNoaWxkLCBiYWNrdXBDaGlsZCB9ID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmRlcml2ZVNhZmVFY2RzYU1wY0NoaWxkKHtcbiAgICAgIHVzZXJSb290OiByb290cy5lY2RzYU1wYy51c2VyLFxuICAgICAgYmFja3VwUm9vdDogcm9vdHMuZWNkc2FNcGMuYmFja3VwLFxuICAgICAgYWNjb3VudCxcbiAgICAgIGNvaW5UeXBlLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzbG90OiAnZWNkc2FNcGMnLFxuICAgICAgcGF0aDogYnVpbGRTYWZlVXNlclBhdGgoY29pblR5cGUsIHNsb3RPcmRpbmFsLCBhY2NvdW50KSxcbiAgICAgIGtleXM6IHsgY29tbW9uS2V5Y2hhaW4sIHVzZXI6IHVzZXJDaGlsZCwgYmFja3VwOiBiYWNrdXBDaGlsZCB9LFxuICAgIH07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYGRlcml2ZVNhZmVXYWxsZXRLZXlzOiBzbG90ICcke3BhcmFtcy5zbG90fScgaXMgbm90IHN1cHBvcnRlZCB5ZXRgKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSBmaWVsZHMgYGNvaW4ucmVjb3ZlcigpYCBleHBlY3RzIGZyb20gZGVyaXZlZCBTYWZlIGNoaWxkIGtleXMuXG4gKiBPbmx5IGBzZWNwMjU2azFNdWx0aXNpZ2AgKHNsb3QgMSkgaXMgc3VwcG9ydGVkIGZvciBub3cuIFNpZ25lZCBtb2RlIHJlLWVuY3J5cHRzIHRoZVxuICogY2hpbGQgeHBydnMgdW5kZXIgYSBmcmVzaCBlcGhlbWVyYWwgcGFzc3BocmFzZSAodjEvU0pDTCk7IHVuc2lnbmVkIG1vZGUgcmV0dXJucyBwdWJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyhwYXJhbXM6IHtcbiAgYml0Z286IEJpdEdvQmFzZTtcbiAgY29pbjogc3RyaW5nO1xuICBzbG90OiBSb290S2V5VHlwZTtcbiAga2V5czogU2VjcDI1NmsxTXVsdGlzaWdDaGlsZEtleXM7XG4gIG1vZGU6ICdzaWduZWQnIHwgJ3Vuc2lnbmVkJztcbn0pOiBQcm9taXNlPFNhZmVSZWNvdmVyS2V5UGFyYW1zPiB7XG4gIGlmIChwYXJhbXMuc2xvdCAhPT0gJ3NlY3AyNTZrMU11bHRpc2lnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtczogc2xvdCAnJHtwYXJhbXMuc2xvdH0nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0YCk7XG4gIH1cbiAgY29uc3QgeyBiaXRnbywga2V5cywgbW9kZSB9ID0gcGFyYW1zO1xuXG4gIGlmIChtb2RlID09PSAndW5zaWduZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXk6IGtleXMudXNlci5wdWIsXG4gICAgICBiYWNrdXBLZXk6IGtleXMuYmFja3VwLnB1YixcbiAgICAgIGJpdGdvS2V5OiBrZXlzLmJpdGdvLnB1YixcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdXNlclBydiA9IGJpcDMyLmZyb21CYXNlNTgoa2V5cy51c2VyLnBydik7XG4gIGNvbnN0IGJhY2t1cFBydiA9IGJpcDMyLmZyb21CYXNlNTgoa2V5cy5iYWNrdXAucHJ2KTtcbiAgaWYgKCF1c2VyUHJ2LnByaXZhdGVLZXkgfHwgIWJhY2t1cFBydi5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zOiBrZXlzLnVzZXIucHJ2IGFuZCBrZXlzLmJhY2t1cC5wcnYgbXVzdCBiZSBwcml2YXRlIHhwcnZzJyk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gcmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgW3VzZXJLZXksIGJhY2t1cEtleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgYml0Z28uZW5jcnlwdCh7IGlucHV0OiBrZXlzLnVzZXIucHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb246IDEgfSksXG4gICAgYml0Z28uZW5jcnlwdCh7IGlucHV0OiBrZXlzLmJhY2t1cC5wcnYsIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KSxcbiAgXSk7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5LFxuICAgIGJhY2t1cEtleSxcbiAgICBiaXRnb0tleToga2V5cy5iaXRnby5wdWIsXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgfTtcbn1cbiJdfQ==
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  require("should");
37
37
  const sinon = __importStar(require("sinon"));
38
38
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
39
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
39
40
  const keyShareEnvelope_1 = require("../../../../src/bitgo/utils/tss/keyShareEnvelope");
40
41
  const errors_1 = require("../../../../src/bitgo/errors");
41
42
  const recovery_1 = require("../../../../src/bitgo/safe/recovery");
@@ -156,6 +157,9 @@ describe('deriveSafeWalletKeys', () => {
156
157
  });
157
158
  it('derives the BIP44 child triplet for slot 1', async () => {
158
159
  const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 0, roots });
160
+ if (result.slot !== 'secp256k1Multisig') {
161
+ throw new Error('expected secp256k1Multisig slot');
162
+ }
159
163
  result.path.should.equal("m/44'/0'/1'/0'");
160
164
  result.keys.user.prv.should.equal(userRoot.derivePath("m/44'/0'/1'/0'").toBase58());
161
165
  result.keys.user.pub.should.equal(userRoot.derivePath("m/44'/0'/1'/0'").neutered().toBase58());
@@ -166,6 +170,26 @@ describe('deriveSafeWalletKeys', () => {
166
170
  const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'secp256k1Multisig', account: 2, roots });
167
171
  result.path.should.equal("m/44'/0'/1'/2'");
168
172
  });
173
+ it('derives the ecdsaMpc child via the DKLs ceremony', async () => {
174
+ const [userDkg, backupDkg] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
175
+ const [vrfUser, vrfBackup] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
176
+ const mpcRoots = {
177
+ ...roots,
178
+ ecdsaMpc: {
179
+ user: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
180
+ backup: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
181
+ bitgo: 'g',
182
+ },
183
+ };
184
+ const result = await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'eth', slot: 'ecdsaMpc', account: 0, roots: mpcRoots });
185
+ if (result.slot !== 'ecdsaMpc') {
186
+ throw new Error('expected ecdsaMpc slot');
187
+ }
188
+ result.path.should.equal("m/44'/60'/3'/0'");
189
+ result.keys.commonKeychain.should.be.a.String();
190
+ result.keys.user.should.be.a.String();
191
+ result.keys.backup.should.be.a.String();
192
+ });
169
193
  it('rejects unsupported slots', async () => {
170
194
  await (0, recovery_1.deriveSafeWalletKeys)({ coin: 'btc', slot: 'eddsaMpc', account: 0, roots }).should.be.rejectedWith(/not supported yet/);
171
195
  });
@@ -250,4 +274,40 @@ describe('buildSafeRecoverKeyParams', () => {
250
274
  }).should.be.rejectedWith(/not supported yet/);
251
275
  });
252
276
  });
253
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQiw2Q0FBK0I7QUFDL0IsbURBQTZDO0FBQzdDLHVGQUE0RjtBQUM1Rix5REFBc0U7QUFDdEUsa0VBSzZDO0FBRzdDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQztBQUVqQyxTQUFTLGFBQWEsQ0FBQyxXQUFvRTtJQUN6RixPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQTJDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwRixDQUFDO0FBQzVCLENBQUM7QUFFRCxnSEFBZ0g7QUFDaEgsU0FBUyxjQUFjLENBQUMsT0FBK0I7SUFDckQsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDN0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLE1BS1o7SUFDQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsU0FBUyxDQUFDLEdBQUcs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O0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3Mva2V5U2hhcmVFbnZlbG9wZSc7XG5pbXBvcnQgeyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2Vycm9ycyc7XG5pbXBvcnQge1xuICBEZWNyeXB0ZWRTYWZlUm9vdHMsXG4gIGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMsXG4gIGRlY3J5cHRTYWZlS2V5Y2FyZCxcbiAgZGVyaXZlU2FmZVdhbGxldEtleXMsXG59IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3JlY292ZXJ5JztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby9iaXRnb0Jhc2UnO1xuXG5jb25zdCBQQVNTV09SRCA9ICdzYWZlLXBhc3N3b3JkJztcblxuZnVuY3Rpb24gbWFrZU1vY2tCaXRHbyhkZWNyeXB0SW1wbDogKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHN0cmluZyk6IEJpdEdvQmFzZSB7XG4gIHJldHVybiB7XG4gICAgZGVjcnlwdDogc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAocGFyYW1zOiB7IHBhc3N3b3JkOiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gZGVjcnlwdEltcGwocGFyYW1zKSksXG4gIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG59XG5cbi8qKiBBIGZha2UgZGVjcnlwdCB0aGF0IG9ubHkgcmVjb2duaXplcyB0aGUgdXNlci9iYWNrdXAgdG9rZW5zOyBhbnkgb3RoZXIgaW5wdXQgKGUuZy4gYSBCb3ggQyBwdWJsaWMpIHRocm93cy4gKi9cbmZ1bmN0aW9uIG1ha2VEZWNyeXB0TWFwKGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiAocGFyYW1zOiB7IHBhc3N3b3JkOiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gc3RyaW5nIHtcbiAgcmV0dXJuICh7IHBhc3N3b3JkLCBpbnB1dCB9KSA9PiB7XG4gICAgcGFzc3dvcmQuc2hvdWxkLmVxdWFsKFBBU1NXT1JEKTtcbiAgICBpZiAoIShpbnB1dCBpbiBlbnRyaWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGRlY3J5cHQgaW5wdXQ6ICR7aW5wdXR9YCk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzW2lucHV0XTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYm94KHZhbHVlczoge1xuICBzZWNwMjU2azFNdWx0aXNpZzogc3RyaW5nO1xuICBlZDI1NTE5TXVsdGlzaWc6IHN0cmluZztcbiAgZWNkc2FNcGM6IHN0cmluZztcbiAgZWRkc2FNcGM6IHN0cmluZztcbn0pOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWVzKTtcbn1cblxuZGVzY3JpYmUoJ2RlY3J5cHRTYWZlS2V5Y2FyZCcsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdkZWNyeXB0cyBvbmNoYWluIHJvb3RzIHRvIHN0cmluZ3MgYW5kIHJldHVybnMgQm94IEMgdmVyYmF0aW0nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXNlckJveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2VuYy11c2VyLXNlY3AnLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAnZW5jLXVzZXItZWQyNTUxOScsXG4gICAgICBlY2RzYU1wYzogJ2VuYy11c2VyLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLXVzZXItZWRkc2EnLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEJveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2VuYy1iYWNrdXAtc2VjcCcsXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6ICdlbmMtYmFja3VwLWVkMjU1MTknLFxuICAgICAgZWNkc2FNcGM6ICdlbmMtYmFja3VwLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLWJhY2t1cC1lZGRzYScsXG4gICAgfSk7XG4gICAgY29uc3QgYml0Z29Cb3ggPSBib3goe1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICd4cHViLXNlY3AtYml0Z28nLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAncHViLWVkMjU1MTktYml0Z28nLFxuICAgICAgZWNkc2FNcGM6ICdjb21tb24tZWNkc2EtYml0Z28nLFxuICAgICAgZWRkc2FNcGM6ICdjb21tb24tZWRkc2EtYml0Z28nLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbXBjVXNlciA9IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyhcbiAgICAgIEJ1ZmZlci5mcm9tKCd1c2VyLXNpZ25pbmcnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCd1c2VyLXJlZHVjZWQnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCd1c2VyLXZyZicpXG4gICAgKTtcbiAgICBjb25zdCBtcGNCYWNrdXAgPSBidWlsZFNhZmVNcGNLZXlFbnZlbG9wZXMoXG4gICAgICBCdWZmZXIuZnJvbSgnYmFja3VwLXNpZ25pbmcnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKCdiYWNrdXAtcmVkdWNlZCcpLFxuICAgICAgQnVmZmVyLmZyb20oJ2JhY2t1cC12cmYnKVxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oXG4gICAgICBtYWtlRGVjcnlwdE1hcCh7XG4gICAgICAgICdlbmMtdXNlci1zZWNwJzogJ3hwcnYtdXNlcicsXG4gICAgICAgICdlbmMtYmFja3VwLXNlY3AnOiAneHBydi1iYWNrdXAnLFxuICAgICAgICAnZW5jLXVzZXItZWQyNTUxOSc6ICdTLXVzZXItc2VlZCcsXG4gICAgICAgICdlbmMtYmFja3VwLWVkMjU1MTknOiAnUy1iYWNrdXAtc2VlZCcsXG4gICAgICAgICdlbmMtdXNlci1lY2RzYSc6IG1wY1VzZXIucmVkdWNlZEVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgJ2VuYy1iYWNrdXAtZWNkc2EnOiBtcGNCYWNrdXAucmVkdWNlZEVudmVsb3BlLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgJ2VuYy11c2VyLWVkZHNhJzogbXBjVXNlci5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAnZW5jLWJhY2t1cC1lZGRzYSc6IG1wY0JhY2t1cC5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdFNhZmVLZXljYXJkKHtcbiAgICAgIGJpdGdvLFxuICAgICAgdXNlcktleUJveDogdXNlckJveCxcbiAgICAgIGJhY2t1cEtleUJveDogYmFja3VwQm94LFxuICAgICAgYml0Z29LZXlCb3g6IGJpdGdvQm94LFxuICAgICAgcGFzc3dvcmQ6IFBBU1NXT1JELFxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnNlY3AyNTZrMU11bHRpc2lnLnVzZXIuc2hvdWxkLmVxdWFsKCd4cHJ2LXVzZXInKTtcbiAgICByZXN1bHQuc2VjcDI1NmsxTXVsdGlzaWcuYmFja3VwLnNob3VsZC5lcXVhbCgneHBydi1iYWNrdXAnKTtcbiAgICByZXN1bHQuc2VjcDI1NmsxTXVsdGlzaWcuYml0Z28uc2hvdWxkLmVxdWFsKCd4cHViLXNlY3AtYml0Z28nKTtcblxuICAgIHJlc3VsdC5lZDI1NTE5TXVsdGlzaWcudXNlci5zaG91bGQuZXF1YWwoJ1MtdXNlci1zZWVkJyk7XG4gICAgcmVzdWx0LmVkMjU1MTlNdWx0aXNpZy5iYWNrdXAuc2hvdWxkLmVxdWFsKCdTLWJhY2t1cC1zZWVkJyk7XG4gICAgcmVzdWx0LmVkMjU1MTlNdWx0aXNpZy5iaXRnby5zaG91bGQuZXF1YWwoJ3B1Yi1lZDI1NTE5LWJpdGdvJyk7XG5cbiAgICByZXN1bHQuZWNkc2FNcGMudXNlci5zaWduaW5nLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oJ3VzZXItcmVkdWNlZCcpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgcmVzdWx0LmVjZHNhTXBjLnVzZXIudnJmLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oJ3VzZXItdnJmJykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICByZXN1bHQuZWNkc2FNcGMuYmFja3VwLnNpZ25pbmcudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChCdWZmZXIuZnJvbSgnYmFja3VwLXJlZHVjZWQnKS50b1N0cmluZygnaGV4JykpO1xuICAgIHJlc3VsdC5lY2RzYU1wYy5iYWNrdXAudnJmLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoQnVmZmVyLmZyb20oJ2JhY2t1cC12cmYnKS50b1N0cmluZygnaGV4JykpO1xuICAgIHJlc3VsdC5lY2RzYU1wYy5iaXRnby5zaG91bGQuZXF1YWwoJ2NvbW1vbi1lY2RzYS1iaXRnbycpO1xuXG4gICAgcmVzdWx0LmVkZHNhTXBjLmJpdGdvLnNob3VsZC5lcXVhbCgnY29tbW9uLWVkZHNhLWJpdGdvJyk7XG5cbiAgICAvLyA0IHNsb3RzIMOXICh1c2VyICsgYmFja3VwKSA9IDggZGVjcnlwdHM7IEJpdEdvIChCb3ggQykgaXMgbmV2ZXIgZGVjcnlwdGVkLlxuICAgIChiaXRnby5kZWNyeXB0IGFzIHNpbm9uLlNpbm9uU3R1YikuY2FsbENvdW50LnNob3VsZC5lcXVhbCg4KTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBJbmNvcnJlY3RQYXNzd29yZEVycm9yIHdoZW4gZGVjcnlwdGlvbiBmYWlscyAod3JvbmcgcGFzc3dvcmQpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVzZXJCb3ggPSBib3goe1xuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICdlbmMtdXNlci1zZWNwJyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogJ2VuYy11c2VyLWVkMjU1MTknLFxuICAgICAgZWNkc2FNcGM6ICdlbmMtdXNlci1lY2RzYScsXG4gICAgICBlZGRzYU1wYzogJ2VuYy11c2VyLWVkZHNhJyxcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnbyA9IG1ha2VNb2NrQml0R28oKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcmdvbjI6IHRhZyBkb2VzIG5vdCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgZGVjcnlwdFNhZmVLZXljYXJkKHtcbiAgICAgIGJpdGdvLFxuICAgICAgdXNlcktleUJveDogdXNlckJveCxcbiAgICAgIGJhY2t1cEtleUJveDogdXNlckJveCxcbiAgICAgIGJpdGdvS2V5Qm94OiB1c2VyQm94LFxuICAgICAgcGFzc3dvcmQ6ICd3cm9uZy1wYXNzd29yZCcsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChJbmNvcnJlY3RQYXNzd29yZEVycm9yKTtcbiAgfSk7XG59KTtcblxuY29uc3QgTVBDX1JPT1QgPSB7IHNpZ25pbmc6IEJ1ZmZlci5hbGxvYygwKSwgdnJmOiBCdWZmZXIuYWxsb2MoMCkgfTtcblxuZnVuY3Rpb24gbWFrZVJvb3RzKHNlY3A6IHsgdXNlcjogc3RyaW5nOyBiYWNrdXA6IHN0cmluZzsgYml0Z286IHN0cmluZyB9KTogRGVjcnlwdGVkU2FmZVJvb3RzIHtcbiAgcmV0dXJuIHtcbiAgICBzZWNwMjU2azFNdWx0aXNpZzogc2VjcCxcbiAgICBlZDI1NTE5TXVsdGlzaWc6IHsgdXNlcjogJ3UnLCBiYWNrdXA6ICdiJywgYml0Z286ICdnJyB9LFxuICAgIGVjZHNhTXBjOiB7IHVzZXI6IE1QQ19ST09ULCBiYWNrdXA6IE1QQ19ST09ULCBiaXRnbzogJ2cnIH0sXG4gICAgZWRkc2FNcGM6IHsgdXNlcjogTVBDX1JPT1QsIGJhY2t1cDogTVBDX1JPT1QsIGJpdGdvOiAnZycgfSxcbiAgfTtcbn1cblxuZGVzY3JpYmUoJ2Rlcml2ZVNhZmVXYWxsZXRLZXlzJywgKCkgPT4ge1xuICBjb25zdCB1c2VyUm9vdCA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKCcwMDAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZicsICdoZXgnKSk7XG4gIGNvbnN0IGJhY2t1cFJvb3QgPSBiaXAzMi5mcm9tU2VlZChcbiAgICBCdWZmZXIuZnJvbSgnMWYxZTFkMWMxYjFhMTkxODE3MTYxNTE0MTMxMjExMTAwZjBlMGQwYzBiMGEwOTA4MDcwNjA1MDQwMzAyMDEwMCcsICdoZXgnKVxuICApO1xuICBjb25zdCBiaXRnb1Jvb3QgPSBiaXAzMlxuICAgIC5mcm9tU2VlZChCdWZmZXIuZnJvbSgnMmYyZTJkMmMyYjJhMjkyODI3MjYyNTI0MjMyMjIxMjAxZjFlMWQxYzFiMWExOTE4MTcxNjE1MTQxMzEyMTExMCcsICdoZXgnKSlcbiAgICAubmV1dGVyZWQoKTtcblxuICBjb25zdCByb290cyA9IG1ha2VSb290cyh7XG4gICAgdXNlcjogdXNlclJvb3QudG9CYXNlNTgoKSxcbiAgICBiYWNrdXA6IGJhY2t1cFJvb3QudG9CYXNlNTgoKSxcbiAgICBiaXRnbzogYml0Z29Sb290LnRvQmFzZTU4KCksXG4gIH0pO1xuXG4gIGl0KCdkZXJpdmVzIHRoZSBCSVA0NCBjaGlsZCB0cmlwbGV0IGZvciBzbG90IDEnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnYnRjJywgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgYWNjb3VudDogMCwgcm9vdHMgfSk7XG5cbiAgICByZXN1bHQucGF0aC5zaG91bGQuZXF1YWwoXCJtLzQ0Jy8wJy8xJy8wJ1wiKTtcbiAgICByZXN1bHQua2V5cy51c2VyLnBydi5zaG91bGQuZXF1YWwodXNlclJvb3QuZGVyaXZlUGF0aChcIm0vNDQnLzAnLzEnLzAnXCIpLnRvQmFzZTU4KCkpO1xuICAgIHJlc3VsdC5rZXlzLnVzZXIucHViLnNob3VsZC5lcXVhbCh1c2VyUm9vdC5kZXJpdmVQYXRoKFwibS80NCcvMCcvMScvMCdcIikubmV1dGVyZWQoKS50b0Jhc2U1OCgpKTtcbiAgICByZXN1bHQua2V5cy5iYWNrdXAucHJ2LnNob3VsZC5lcXVhbChiYWNrdXBSb290LmRlcml2ZVBhdGgoJ20vNDQvMC8xLzAnKS50b0Jhc2U1OCgpKTtcbiAgICByZXN1bHQua2V5cy5iaXRnby5wdWIuc2hvdWxkLmVxdWFsKGJpdGdvUm9vdC5kZXJpdmVQYXRoKCdtLzQ0LzAvMS8wJykudG9CYXNlNTgoKSk7XG4gIH0pO1xuXG4gIGl0KCd2YXJpZXMgdGhlIHBhdGggd2l0aCB0aGUgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7IGNvaW46ICdidGMnLCBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLCBhY2NvdW50OiAyLCByb290cyB9KTtcbiAgICByZXN1bHQucGF0aC5zaG91bGQuZXF1YWwoXCJtLzQ0Jy8wJy8xJy8yJ1wiKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgdW5zdXBwb3J0ZWQgc2xvdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnYnRjJywgc2xvdDogJ2VkZHNhTXBjJywgYWNjb3VudDogMCwgcm9vdHMgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgIC9ub3Qgc3VwcG9ydGVkIHlldC9cbiAgICApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBhIG5vbi1pbnRlZ2VyIGFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnYnRjJywgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJywgYWNjb3VudDogMS41LCByb290cyB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgL2ludmFsaWQgYWNjb3VudC9cbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcycsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHVzZXJSb290ID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oJzAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmJywgJ2hleCcpKTtcbiAgY29uc3QgYmFja3VwUm9vdCA9IGJpcDMyLmZyb21TZWVkKFxuICAgIEJ1ZmZlci5mcm9tKCcxZjFlMWQxYzFiMWExOTE4MTcxNjE1MTQxMzEyMTExMDBmMGUwZDBjMGIwYTA5MDgwNzA2MDUwNDAzMDIwMTAwJywgJ2hleCcpXG4gICk7XG4gIGNvbnN0IGJpdGdvUm9vdCA9IGJpcDMyXG4gICAgLmZyb21TZWVkKEJ1ZmZlci5mcm9tKCcyZjJlMmQyYzJiMmEyOTI4MjcyNjI1MjQyMzIyMjEyMDFmMWUxZDFjMWIxYTE5MTgxNzE2MTUxNDEzMTIxMTEwJywgJ2hleCcpKVxuICAgIC5uZXV0ZXJlZCgpO1xuXG4gIGNvbnN0IGtleXMgPSB7XG4gICAgdXNlcjogeyBwcnY6IHVzZXJSb290LnRvQmFzZTU4KCksIHB1YjogdXNlclJvb3QubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgYmFja3VwOiB7IHBydjogYmFja3VwUm9vdC50b0Jhc2U1OCgpLCBwdWI6IGJhY2t1cFJvb3QubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0sXG4gICAgYml0Z286IHsgcHViOiBiaXRnb1Jvb3QudG9CYXNlNTgoKSB9LFxuICB9O1xuXG4gIGl0KCdzaWduZWQgbW9kZSByZS1lbmNyeXB0cyBjaGlsZCB4cHJ2cyB1bmRlciBhIHNpbmdsZSBlcGhlbWVyYWwgcGFzc3BocmFzZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYXNzcGhyYXNlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbmNyeXB0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoeyBpbnB1dCwgcGFzc3dvcmQsIGVuY3J5cHRpb25WZXJzaW9uIH0pID0+IHtcbiAgICAgIHBhc3NwaHJhc2VzLnB1c2gocGFzc3dvcmQpO1xuICAgICAgZW5jcnlwdGlvblZlcnNpb24uc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmV0dXJuIGBlbmMoJHtpbnB1dH0pYDtcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdCB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgIGtleXMsXG4gICAgICBtb2RlOiAnc2lnbmVkJyxcbiAgICB9KTtcblxuICAgIHJlc3VsdC51c2VyS2V5LnNob3VsZC5lcXVhbChgZW5jKCR7a2V5cy51c2VyLnBydn0pYCk7XG4gICAgcmVzdWx0LmJhY2t1cEtleS5zaG91bGQuZXF1YWwoYGVuYygke2tleXMuYmFja3VwLnBydn0pYCk7XG4gICAgcmVzdWx0LmJpdGdvS2V5LnNob3VsZC5lcXVhbChrZXlzLmJpdGdvLnB1Yik7XG4gICAgKHJlc3VsdC53YWxsZXRQYXNzcGhyYXNlIGFzIHN0cmluZykuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgcGFzc3BocmFzZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgIHBhc3NwaHJhc2VzWzBdLnNob3VsZC5lcXVhbChwYXNzcGhyYXNlc1sxXSk7XG4gICAgcGFzc3BocmFzZXNbMF0uc2hvdWxkLmVxdWFsKHJlc3VsdC53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBlbmNyeXB0LmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMik7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIG5vbi1wcml2YXRlIGNoaWxkIGtleXMgaW4gc2lnbmVkIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQ6IHNpbm9uLnN0dWIoKSB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgYml0Z28sXG4gICAgICBjb2luOiAnYnRjJyxcbiAgICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsXG4gICAgICBrZXlzOiB7IHVzZXI6IHsgcHJ2OiBrZXlzLnVzZXIucHViLCBwdWI6IGtleXMudXNlci5wdWIgfSwgYmFja3VwOiBrZXlzLmJhY2t1cCwgYml0Z286IGtleXMuYml0Z28gfSxcbiAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL211c3QgYmUgcHJpdmF0ZSB4cHJ2cy8pO1xuICB9KTtcblxuICBpdCgndW5zaWduZWQgbW9kZSByZXR1cm5zIHB1YnMgYW5kIG5ldmVyIGVuY3J5cHRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVuY3J5cHQgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdCBzaG91bGQgbm90IGJlIGNhbGxlZCcpO1xuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvID0geyBlbmNyeXB0IH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLFxuICAgICAga2V5cyxcbiAgICAgIG1vZGU6ICd1bnNpZ25lZCcsXG4gICAgfSk7XG5cbiAgICByZXN1bHQudXNlcktleS5zaG91bGQuZXF1YWwoa2V5cy51c2VyLnB1Yik7XG4gICAgcmVzdWx0LmJhY2t1cEtleS5zaG91bGQuZXF1YWwoa2V5cy5iYWNrdXAucHViKTtcbiAgICByZXN1bHQuYml0Z29LZXkuc2hvdWxkLmVxdWFsKGtleXMuYml0Z28ucHViKTtcbiAgICByZXN1bHQuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3YWxsZXRQYXNzcGhyYXNlJyk7XG4gICAgZW5jcnlwdC5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyB1bnN1cHBvcnRlZCBzbG90cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdDogc2lub24uc3R1YigpIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgc2xvdDogJ2VkZHNhTXBjJyxcbiAgICAgIGtleXMsXG4gICAgICBtb2RlOiAnc2lnbmVkJyxcbiAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub3Qgc3VwcG9ydGVkIHlldC8pO1xuICB9KTtcbn0pO1xuIl19
277
+ describe('Safe ecdsaMpc derive → sign (gate)', function () {
278
+ it('derives a child, rebuilds 2-of-2 shares, and signs a message verified at m/0', async function () {
279
+ const [userDkg, backupDkg] = await sdk_lib_mpc_1.DklsUtils.generateDKGKeyShares();
280
+ const [vrfUser, vrfBackup] = await sdk_lib_mpc_1.DklsVrfUtils.generateVrfDKGKeyShares();
281
+ const rootCommonKeychain = sdk_lib_mpc_1.DklsTypes.getCommonKeychain(userDkg.getKeyShare());
282
+ const { commonKeychain, userChild, backupChild } = await sdk_lib_mpc_1.DklsVrfUtils.deriveSafeEcdsaMpcChild({
283
+ userRoot: { signing: userDkg.getReducedKeyShare(), vrf: vrfUser.getKeyShare() },
284
+ backupRoot: { signing: backupDkg.getReducedKeyShare(), vrf: vrfBackup.getKeyShare() },
285
+ account: 0,
286
+ coinType: 60,
287
+ });
288
+ // The derived child must never be the root (the "root envelope in the child position" footgun).
289
+ commonKeychain.should.not.equal(rootCommonKeychain);
290
+ // Rebuild 2-of-2 keyshares from the derived reduced CBOR, exactly as the signer's retrofit does.
291
+ const toRetrofit = (b64) => {
292
+ const reduced = sdk_lib_mpc_1.DklsTypes.getDecodedReducedKeyShare(Buffer.from(b64, 'base64'));
293
+ return {
294
+ xShare: {
295
+ x: Buffer.from(reduced.prv).toString('hex'),
296
+ y: Buffer.from(reduced.pub).toString('hex'),
297
+ chaincode: Buffer.from(reduced.rootChainCode).toString('hex'),
298
+ },
299
+ xiList: reduced.xList.slice(0, 2),
300
+ };
301
+ };
302
+ const [user2of2, backup2of2] = await sdk_lib_mpc_1.DklsUtils.generate2of2KeyShares(toRetrofit(userChild), toRetrofit(backupChild));
303
+ const messageHash = Buffer.from('0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', 'hex');
304
+ const userDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(user2of2.getKeyShare(), 0, 'm/0', messageHash);
305
+ const backupDsg = new sdk_lib_mpc_1.DklsDsg.Dsg(backup2of2.getKeyShare(), 1, 'm/0', messageHash);
306
+ const signatureString = sdk_lib_mpc_1.DklsUtils.verifyAndConvertDklsSignature(messageHash, (await sdk_lib_mpc_1.DklsUtils.executeTillRound(5, userDsg, backupDsg)), commonKeychain, 'm/0', undefined, false);
307
+ // verifyAndConvertDklsSignature recovers the pubkey from the signature and checks it against
308
+ // deriveUnhardened(childCK, 'm/0'); it throws on mismatch, so a returned string is proof.
309
+ signatureString.should.be.a.String();
310
+ signatureString.should.match(/^\d+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+$/);
311
+ });
312
+ });
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vc2FmZS9yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtCQUFnQjtBQUNoQiw2Q0FBK0I7QUFDL0IsbURBQTZDO0FBQzdDLHlEQUFzRjtBQUN0Rix1RkFBNEY7QUFDNUYseURBQXNFO0FBQ3RFLGtFQUs2QztBQUc3QyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUM7QUFFakMsU0FBUyxhQUFhLENBQUMsV0FBb0U7SUFDekYsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUEyQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDcEYsQ0FBQztBQUM1QixDQUFDO0FBRUQsZ0hBQWdIO0FBQ2hILFNBQVMsY0FBYyxDQUFDLE9BQStCO0lBQ3JELE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzdCLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxNQUtaO0lBQ0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLFNB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QyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkYsTUFBTSxlQUFlLEdBQUcsdUJBQVMsQ0FBQyw2QkFBNkIsQ0FDN0QsV0FBVyxFQUNYLENBQUMsTUFBTSx1QkFBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQXdDLEVBQ2hHLGNBQWMsRUFDZCxLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFDO1FBRUYsNkZBQTZGO1FBQzdGLDBGQUEwRjtRQUMxRixlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBEa2xzRHNnLCBEa2xzVHlwZXMsIERrbHNVdGlscywgRGtsc1ZyZlV0aWxzIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9rZXlTaGFyZUVudmVsb3BlJztcbmltcG9ydCB7IEluY29ycmVjdFBhc3N3b3JkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vZXJyb3JzJztcbmltcG9ydCB7XG4gIERlY3J5cHRlZFNhZmVSb290cyxcbiAgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyxcbiAgZGVjcnlwdFNhZmVLZXljYXJkLFxuICBkZXJpdmVTYWZlV2FsbGV0S2V5cyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3NhZmUvcmVjb3ZlcnknO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2JpdGdvQmFzZSc7XG5cbmNvbnN0IFBBU1NXT1JEID0gJ3NhZmUtcGFzc3dvcmQnO1xuXG5mdW5jdGlvbiBtYWtlTW9ja0JpdEdvKGRlY3J5cHRJbXBsOiAocGFyYW1zOiB7IHBhc3N3b3JkOiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gc3RyaW5nKTogQml0R29CYXNlIHtcbiAgcmV0dXJuIHtcbiAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jIChwYXJhbXM6IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBkZWNyeXB0SW1wbChwYXJhbXMpKSxcbiAgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbn1cblxuLyoqIEEgZmFrZSBkZWNyeXB0IHRoYXQgb25seSByZWNvZ25pemVzIHRoZSB1c2VyL2JhY2t1cCB0b2tlbnM7IGFueSBvdGhlciBpbnB1dCAoZS5nLiBhIEJveCBDIHB1YmxpYykgdGhyb3dzLiAqL1xuZnVuY3Rpb24gbWFrZURlY3J5cHRNYXAoZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IChwYXJhbXM6IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBzdHJpbmcge1xuICByZXR1cm4gKHsgcGFzc3dvcmQsIGlucHV0IH0pID0+IHtcbiAgICBwYXNzd29yZC5zaG91bGQuZXF1YWwoUEFTU1dPUkQpO1xuICAgIGlmICghKGlucHV0IGluIGVudHJpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgZGVjcnlwdCBpbnB1dDogJHtpbnB1dH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXNbaW5wdXRdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBib3godmFsdWVzOiB7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBzdHJpbmc7XG4gIGVkMjU1MTlNdWx0aXNpZzogc3RyaW5nO1xuICBlY2RzYU1wYzogc3RyaW5nO1xuICBlZGRzYU1wYzogc3RyaW5nO1xufSk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xufVxuXG5kZXNjcmliZSgnZGVjcnlwdFNhZmVLZXljYXJkJywgKCkgPT4ge1xuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY3J5cHRzIG9uY2hhaW4gcm9vdHMgdG8gc3RyaW5ncyBhbmQgcmV0dXJucyBCb3ggQyB2ZXJiYXRpbScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1c2VyQm94ID0gYm94KHtcbiAgICAgIHNlY3AyNTZrMU11bHRpc2lnOiAnZW5jLXVzZXItc2VjcCcsXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6ICdlbmMtdXNlci1lZDI1NTE5JyxcbiAgICAgIGVjZHNhTXBjOiAnZW5jLXVzZXItZWNkc2EnLFxuICAgICAgZWRkc2FNcGM6ICdlbmMtdXNlci1lZGRzYScsXG4gICAgfSk7XG4gICAgY29uc3QgYmFja3VwQm94ID0gYm94KHtcbiAgICAgIHNlY3AyNTZrMU11bHRpc2lnOiAnZW5jLWJhY2t1cC1zZWNwJyxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogJ2VuYy1iYWNrdXAtZWQyNTUxOScsXG4gICAgICBlY2RzYU1wYzogJ2VuYy1iYWNrdXAtZWNkc2EnLFxuICAgICAgZWRkc2FNcGM6ICdlbmMtYmFja3VwLWVkZHNhJyxcbiAgICB9KTtcbiAgICBjb25zdCBiaXRnb0JveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ3hwdWItc2VjcC1iaXRnbycsXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6ICdwdWItZWQyNTUxOS1iaXRnbycsXG4gICAgICBlY2RzYU1wYzogJ2NvbW1vbi1lY2RzYS1iaXRnbycsXG4gICAgICBlZGRzYU1wYzogJ2NvbW1vbi1lZGRzYS1iaXRnbycsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtcGNVc2VyID0gYnVpbGRTYWZlTXBjS2V5RW52ZWxvcGVzKFxuICAgICAgQnVmZmVyLmZyb20oJ3VzZXItc2lnbmluZycpLFxuICAgICAgQnVmZmVyLmZyb20oJ3VzZXItcmVkdWNlZCcpLFxuICAgICAgQnVmZmVyLmZyb20oJ3VzZXItdnJmJylcbiAgICApO1xuICAgIGNvbnN0IG1wY0JhY2t1cCA9IGJ1aWxkU2FmZU1wY0tleUVudmVsb3BlcyhcbiAgICAgIEJ1ZmZlci5mcm9tKCdiYWNrdXAtc2lnbmluZycpLFxuICAgICAgQnVmZmVyLmZyb20oJ2JhY2t1cC1yZWR1Y2VkJyksXG4gICAgICBCdWZmZXIuZnJvbSgnYmFja3VwLXZyZicpXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbyhcbiAgICAgIG1ha2VEZWNyeXB0TWFwKHtcbiAgICAgICAgJ2VuYy11c2VyLXNlY3AnOiAneHBydi11c2VyJyxcbiAgICAgICAgJ2VuYy1iYWNrdXAtc2VjcCc6ICd4cHJ2LWJhY2t1cCcsXG4gICAgICAgICdlbmMtdXNlci1lZDI1NTE5JzogJ1MtdXNlci1zZWVkJyxcbiAgICAgICAgJ2VuYy1iYWNrdXAtZWQyNTUxOSc6ICdTLWJhY2t1cC1zZWVkJyxcbiAgICAgICAgJ2VuYy11c2VyLWVjZHNhJzogbXBjVXNlci5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAnZW5jLWJhY2t1cC1lY2RzYSc6IG1wY0JhY2t1cC5yZWR1Y2VkRW52ZWxvcGUudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAnZW5jLXVzZXItZWRkc2EnOiBtcGNVc2VyLnJlZHVjZWRFbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICdlbmMtYmFja3VwLWVkZHNhJzogbXBjQmFja3VwLnJlZHVjZWRFbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWNyeXB0U2FmZUtleWNhcmQoe1xuICAgICAgYml0Z28sXG4gICAgICB1c2VyS2V5Qm94OiB1c2VyQm94LFxuICAgICAgYmFja3VwS2V5Qm94OiBiYWNrdXBCb3gsXG4gICAgICBiaXRnb0tleUJveDogYml0Z29Cb3gsXG4gICAgICBwYXNzd29yZDogUEFTU1dPUkQsXG4gICAgfSk7XG5cbiAgICByZXN1bHQuc2VjcDI1NmsxTXVsdGlzaWcudXNlci5zaG91bGQuZXF1YWwoJ3hwcnYtdXNlcicpO1xuICAgIHJlc3VsdC5zZWNwMjU2azFNdWx0aXNpZy5iYWNrdXAuc2hvdWxkLmVxdWFsKCd4cHJ2LWJhY2t1cCcpO1xuICAgIHJlc3VsdC5zZWNwMjU2azFNdWx0aXNpZy5iaXRnby5zaG91bGQuZXF1YWwoJ3hwdWItc2VjcC1iaXRnbycpO1xuXG4gICAgcmVzdWx0LmVkMjU1MTlNdWx0aXNpZy51c2VyLnNob3VsZC5lcXVhbCgnUy11c2VyLXNlZWQnKTtcbiAgICByZXN1bHQuZWQyNTUxOU11bHRpc2lnLmJhY2t1cC5zaG91bGQuZXF1YWwoJ1MtYmFja3VwLXNlZWQnKTtcbiAgICByZXN1bHQuZWQyNTUxOU11bHRpc2lnLmJpdGdvLnNob3VsZC5lcXVhbCgncHViLWVkMjU1MTktYml0Z28nKTtcblxuICAgIHJlc3VsdC5lY2RzYU1wYy51c2VyLnNpZ25pbmcudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChCdWZmZXIuZnJvbSgndXNlci1yZWR1Y2VkJykudG9TdHJpbmcoJ2hleCcpKTtcbiAgICByZXN1bHQuZWNkc2FNcGMudXNlci52cmYudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChCdWZmZXIuZnJvbSgndXNlci12cmYnKS50b1N0cmluZygnaGV4JykpO1xuICAgIHJlc3VsdC5lY2RzYU1wYy5iYWNrdXAuc2lnbmluZy50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKCdiYWNrdXAtcmVkdWNlZCcpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgcmVzdWx0LmVjZHNhTXBjLmJhY2t1cC52cmYudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbChCdWZmZXIuZnJvbSgnYmFja3VwLXZyZicpLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgcmVzdWx0LmVjZHNhTXBjLmJpdGdvLnNob3VsZC5lcXVhbCgnY29tbW9uLWVjZHNhLWJpdGdvJyk7XG5cbiAgICByZXN1bHQuZWRkc2FNcGMuYml0Z28uc2hvdWxkLmVxdWFsKCdjb21tb24tZWRkc2EtYml0Z28nKTtcblxuICAgIC8vIDQgc2xvdHMgw5cgKHVzZXIgKyBiYWNrdXApID0gOCBkZWNyeXB0czsgQml0R28gKEJveCBDKSBpcyBuZXZlciBkZWNyeXB0ZWQuXG4gICAgKGJpdGdvLmRlY3J5cHQgYXMgc2lub24uU2lub25TdHViKS5jYWxsQ291bnQuc2hvdWxkLmVxdWFsKDgpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIEluY29ycmVjdFBhc3N3b3JkRXJyb3Igd2hlbiBkZWNyeXB0aW9uIGZhaWxzICh3cm9uZyBwYXNzd29yZCknLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXNlckJveCA9IGJveCh7XG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2VuYy11c2VyLXNlY3AnLFxuICAgICAgZWQyNTUxOU11bHRpc2lnOiAnZW5jLXVzZXItZWQyNTUxOScsXG4gICAgICBlY2RzYU1wYzogJ2VuYy11c2VyLWVjZHNhJyxcbiAgICAgIGVkZHNhTXBjOiAnZW5jLXVzZXItZWRkc2EnLFxuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvID0gbWFrZU1vY2tCaXRHbygoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FyZ29uMjogdGFnIGRvZXMgbm90IG1hdGNoJyk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBkZWNyeXB0U2FmZUtleWNhcmQoe1xuICAgICAgYml0Z28sXG4gICAgICB1c2VyS2V5Qm94OiB1c2VyQm94LFxuICAgICAgYmFja3VwS2V5Qm94OiB1c2VyQm94LFxuICAgICAgYml0Z29LZXlCb3g6IHVzZXJCb3gsXG4gICAgICBwYXNzd29yZDogJ3dyb25nLXBhc3N3b3JkJyxcbiAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKEluY29ycmVjdFBhc3N3b3JkRXJyb3IpO1xuICB9KTtcbn0pO1xuXG5jb25zdCBNUENfUk9PVCA9IHsgc2lnbmluZzogQnVmZmVyLmFsbG9jKDApLCB2cmY6IEJ1ZmZlci5hbGxvYygwKSB9O1xuXG5mdW5jdGlvbiBtYWtlUm9vdHMoc2VjcDogeyB1c2VyOiBzdHJpbmc7IGJhY2t1cDogc3RyaW5nOyBiaXRnbzogc3RyaW5nIH0pOiBEZWNyeXB0ZWRTYWZlUm9vdHMge1xuICByZXR1cm4ge1xuICAgIHNlY3AyNTZrMU11bHRpc2lnOiBzZWNwLFxuICAgIGVkMjU1MTlNdWx0aXNpZzogeyB1c2VyOiAndScsIGJhY2t1cDogJ2InLCBiaXRnbzogJ2cnIH0sXG4gICAgZWNkc2FNcGM6IHsgdXNlcjogTVBDX1JPT1QsIGJhY2t1cDogTVBDX1JPT1QsIGJpdGdvOiAnZycgfSxcbiAgICBlZGRzYU1wYzogeyB1c2VyOiBNUENfUk9PVCwgYmFja3VwOiBNUENfUk9PVCwgYml0Z286ICdnJyB9LFxuICB9O1xufVxuXG5kZXNjcmliZSgnZGVyaXZlU2FmZVdhbGxldEtleXMnLCAoKSA9PiB7XG4gIGNvbnN0IHVzZXJSb290ID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oJzAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmJywgJ2hleCcpKTtcbiAgY29uc3QgYmFja3VwUm9vdCA9IGJpcDMyLmZyb21TZWVkKFxuICAgIEJ1ZmZlci5mcm9tKCcxZjFlMWQxYzFiMWExOTE4MTcxNjE1MTQxMzEyMTExMDBmMGUwZDBjMGIwYTA5MDgwNzA2MDUwNDAzMDIwMTAwJywgJ2hleCcpXG4gICk7XG4gIGNvbnN0IGJpdGdvUm9vdCA9IGJpcDMyXG4gICAgLmZyb21TZWVkKEJ1ZmZlci5mcm9tKCcyZjJlMmQyYzJiMmEyOTI4MjcyNjI1MjQyMzIyMjEyMDFmMWUxZDFjMWIxYTE5MTgxNzE2MTUxNDEzMTIxMTEwJywgJ2hleCcpKVxuICAgIC5uZXV0ZXJlZCgpO1xuXG4gIGNvbnN0IHJvb3RzID0gbWFrZVJvb3RzKHtcbiAgICB1c2VyOiB1c2VyUm9vdC50b0Jhc2U1OCgpLFxuICAgIGJhY2t1cDogYmFja3VwUm9vdC50b0Jhc2U1OCgpLFxuICAgIGJpdGdvOiBiaXRnb1Jvb3QudG9CYXNlNTgoKSxcbiAgfSk7XG5cbiAgaXQoJ2Rlcml2ZXMgdGhlIEJJUDQ0IGNoaWxkIHRyaXBsZXQgZm9yIHNsb3QgMScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7IGNvaW46ICdidGMnLCBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLCBhY2NvdW50OiAwLCByb290cyB9KTtcbiAgICBpZiAocmVzdWx0LnNsb3QgIT09ICdzZWNwMjU2azFNdWx0aXNpZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc2VjcDI1NmsxTXVsdGlzaWcgc2xvdCcpO1xuICAgIH1cblxuICAgIHJlc3VsdC5wYXRoLnNob3VsZC5lcXVhbChcIm0vNDQnLzAnLzEnLzAnXCIpO1xuICAgIHJlc3VsdC5rZXlzLnVzZXIucHJ2LnNob3VsZC5lcXVhbCh1c2VyUm9vdC5kZXJpdmVQYXRoKFwibS80NCcvMCcvMScvMCdcIikudG9CYXNlNTgoKSk7XG4gICAgcmVzdWx0LmtleXMudXNlci5wdWIuc2hvdWxkLmVxdWFsKHVzZXJSb290LmRlcml2ZVBhdGgoXCJtLzQ0Jy8wJy8xJy8wJ1wiKS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpO1xuICAgIHJlc3VsdC5rZXlzLmJhY2t1cC5wcnYuc2hvdWxkLmVxdWFsKGJhY2t1cFJvb3QuZGVyaXZlUGF0aCgnbS80NC8wLzEvMCcpLnRvQmFzZTU4KCkpO1xuICAgIHJlc3VsdC5rZXlzLmJpdGdvLnB1Yi5zaG91bGQuZXF1YWwoYml0Z29Sb290LmRlcml2ZVBhdGgoJ20vNDQvMC8xLzAnKS50b0Jhc2U1OCgpKTtcbiAgfSk7XG5cbiAgaXQoJ3ZhcmllcyB0aGUgcGF0aCB3aXRoIHRoZSBhY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcml2ZVNhZmVXYWxsZXRLZXlzKHsgY29pbjogJ2J0YycsIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsIGFjY291bnQ6IDIsIHJvb3RzIH0pO1xuICAgIHJlc3VsdC5wYXRoLnNob3VsZC5lcXVhbChcIm0vNDQnLzAnLzEnLzInXCIpO1xuICB9KTtcblxuICBpdCgnZGVyaXZlcyB0aGUgZWNkc2FNcGMgY2hpbGQgdmlhIHRoZSBES0xzIGNlcmVtb255JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFt1c2VyRGtnLCBiYWNrdXBEa2ddID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgW3ZyZlVzZXIsIHZyZkJhY2t1cF0gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcblxuICAgIGNvbnN0IG1wY1Jvb3RzOiBEZWNyeXB0ZWRTYWZlUm9vdHMgPSB7XG4gICAgICAuLi5yb290cyxcbiAgICAgIGVjZHNhTXBjOiB7XG4gICAgICAgIHVzZXI6IHsgc2lnbmluZzogdXNlckRrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKSwgdnJmOiB2cmZVc2VyLmdldEtleVNoYXJlKCkgfSxcbiAgICAgICAgYmFja3VwOiB7IHNpZ25pbmc6IGJhY2t1cERrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKSwgdnJmOiB2cmZCYWNrdXAuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgICBiaXRnbzogJ2cnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVyaXZlU2FmZVdhbGxldEtleXMoeyBjb2luOiAnZXRoJywgc2xvdDogJ2VjZHNhTXBjJywgYWNjb3VudDogMCwgcm9vdHM6IG1wY1Jvb3RzIH0pO1xuICAgIGlmIChyZXN1bHQuc2xvdCAhPT0gJ2VjZHNhTXBjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBlY2RzYU1wYyBzbG90Jyk7XG4gICAgfVxuXG4gICAgcmVzdWx0LnBhdGguc2hvdWxkLmVxdWFsKFwibS80NCcvNjAnLzMnLzAnXCIpO1xuICAgIHJlc3VsdC5rZXlzLmNvbW1vbktleWNoYWluLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgIHJlc3VsdC5rZXlzLnVzZXIuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgcmVzdWx0LmtleXMuYmFja3VwLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyB1bnN1cHBvcnRlZCBzbG90cycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7IGNvaW46ICdidGMnLCBzbG90OiAnZWRkc2FNcGMnLCBhY2NvdW50OiAwLCByb290cyB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgL25vdCBzdXBwb3J0ZWQgeWV0L1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgbm9uLWludGVnZXIgYWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXJpdmVTYWZlV2FsbGV0S2V5cyh7IGNvaW46ICdidGMnLCBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLCBhY2NvdW50OiAxLjUsIHJvb3RzIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAvaW52YWxpZCBhY2NvdW50L1xuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zJywgKCkgPT4ge1xuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgY29uc3QgdXNlclJvb3QgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbSgnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnLCAnaGV4JykpO1xuICBjb25zdCBiYWNrdXBSb290ID0gYmlwMzIuZnJvbVNlZWQoXG4gICAgQnVmZmVyLmZyb20oJzFmMWUxZDFjMWIxYTE5MTgxNzE2MTUxNDEzMTIxMTEwMGYwZTBkMGMwYjBhMDkwODA3MDYwNTA0MDMwMjAxMDAnLCAnaGV4JylcbiAgKTtcbiAgY29uc3QgYml0Z29Sb290ID0gYmlwMzJcbiAgICAuZnJvbVNlZWQoQnVmZmVyLmZyb20oJzJmMmUyZDJjMmIyYTI5MjgyNzI2MjUyNDIzMjIyMTIwMWYxZTFkMWMxYjFhMTkxODE3MTYxNTE0MTMxMjExMTAnLCAnaGV4JykpXG4gICAgLm5ldXRlcmVkKCk7XG5cbiAgY29uc3Qga2V5cyA9IHtcbiAgICB1c2VyOiB7IHBydjogdXNlclJvb3QudG9CYXNlNTgoKSwgcHViOiB1c2VyUm9vdC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICBiYWNrdXA6IHsgcHJ2OiBiYWNrdXBSb290LnRvQmFzZTU4KCksIHB1YjogYmFja3VwUm9vdC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSxcbiAgICBiaXRnbzogeyBwdWI6IGJpdGdvUm9vdC50b0Jhc2U1OCgpIH0sXG4gIH07XG5cbiAgaXQoJ3NpZ25lZCBtb2RlIHJlLWVuY3J5cHRzIGNoaWxkIHhwcnZzIHVuZGVyIGEgc2luZ2xlIGVwaGVtZXJhbCBwYXNzcGhyYXNlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3NwaHJhc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVuY3J5cHQgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICh7IGlucHV0LCBwYXNzd29yZCwgZW5jcnlwdGlvblZlcnNpb24gfSkgPT4ge1xuICAgICAgcGFzc3BocmFzZXMucHVzaChwYXNzd29yZCk7XG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbi5zaG91bGQuZXF1YWwoMSk7XG4gICAgICByZXR1cm4gYGVuYygke2lucHV0fSlgO1xuICAgIH0pO1xuICAgIGNvbnN0IGJpdGdvID0geyBlbmNyeXB0IH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnLFxuICAgICAga2V5cyxcbiAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnVzZXJLZXkuc2hvdWxkLmVxdWFsKGBlbmMoJHtrZXlzLnVzZXIucHJ2fSlgKTtcbiAgICByZXN1bHQuYmFja3VwS2V5LnNob3VsZC5lcXVhbChgZW5jKCR7a2V5cy5iYWNrdXAucHJ2fSlgKTtcbiAgICByZXN1bHQuYml0Z29LZXkuc2hvdWxkLmVxdWFsKGtleXMuYml0Z28ucHViKTtcbiAgICAocmVzdWx0LndhbGxldFBhc3NwaHJhc2UgYXMgc3RyaW5nKS5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICBwYXNzcGhyYXNlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgcGFzc3BocmFzZXNbMF0uc2hvdWxkLmVxdWFsKHBhc3NwaHJhc2VzWzFdKTtcbiAgICBwYXNzcGhyYXNlc1swXS5zaG91bGQuZXF1YWwocmVzdWx0LndhbGxldFBhc3NwaHJhc2UpO1xuICAgIGVuY3J5cHQuY2FsbENvdW50LnNob3VsZC5lcXVhbCgyKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbm9uLXByaXZhdGUgY2hpbGQga2V5cyBpbiBzaWduZWQgbW9kZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaXRnbyA9IHsgZW5jcnlwdDogc2lub24uc3R1YigpIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgYXdhaXQgYnVpbGRTYWZlUmVjb3ZlcktleVBhcmFtcyh7XG4gICAgICBiaXRnbyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgc2xvdDogJ3NlY3AyNTZrMU11bHRpc2lnJyxcbiAgICAgIGtleXM6IHsgdXNlcjogeyBwcnY6IGtleXMudXNlci5wdWIsIHB1Yjoga2V5cy51c2VyLnB1YiB9LCBiYWNrdXA6IGtleXMuYmFja3VwLCBiaXRnbzoga2V5cy5iaXRnbyB9LFxuICAgICAgbW9kZTogJ3NpZ25lZCcsXG4gICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbXVzdCBiZSBwcml2YXRlIHhwcnZzLyk7XG4gIH0pO1xuXG4gIGl0KCd1bnNpZ25lZCBtb2RlIHJldHVybnMgcHVicyBhbmQgbmV2ZXIgZW5jcnlwdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW5jcnlwdCA9IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0IHNob3VsZCBub3QgYmUgY2FsbGVkJyk7XG4gICAgfSk7XG4gICAgY29uc3QgYml0Z28gPSB7IGVuY3J5cHQgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU2FmZVJlY292ZXJLZXlQYXJhbXMoe1xuICAgICAgYml0Z28sXG4gICAgICBjb2luOiAnYnRjJyxcbiAgICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycsXG4gICAgICBrZXlzLFxuICAgICAgbW9kZTogJ3Vuc2lnbmVkJyxcbiAgICB9KTtcblxuICAgIHJlc3VsdC51c2VyS2V5LnNob3VsZC5lcXVhbChrZXlzLnVzZXIucHViKTtcbiAgICByZXN1bHQuYmFja3VwS2V5LnNob3VsZC5lcXVhbChrZXlzLmJhY2t1cC5wdWIpO1xuICAgIHJlc3VsdC5iaXRnb0tleS5zaG91bGQuZXF1YWwoa2V5cy5iaXRnby5wdWIpO1xuICAgIHJlc3VsdC5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3dhbGxldFBhc3NwaHJhc2UnKTtcbiAgICBlbmNyeXB0LmNhbGxDb3VudC5zaG91bGQuZXF1YWwoMCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIHVuc3VwcG9ydGVkIHNsb3RzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJpdGdvID0geyBlbmNyeXB0OiBzaW5vbi5zdHViKCkgfSBhcyB1bmtub3duIGFzIEJpdEdvQmFzZTtcbiAgICBhd2FpdCBidWlsZFNhZmVSZWNvdmVyS2V5UGFyYW1zKHtcbiAgICAgIGJpdGdvLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBzbG90OiAnZWRkc2FNcGMnLFxuICAgICAga2V5cyxcbiAgICAgIG1vZGU6ICdzaWduZWQnLFxuICAgIH0pLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCBzdXBwb3J0ZWQgeWV0Lyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdTYWZlIGVjZHNhTXBjIGRlcml2ZSDihpIgc2lnbiAoZ2F0ZSknLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdkZXJpdmVzIGEgY2hpbGQsIHJlYnVpbGRzIDItb2YtMiBzaGFyZXMsIGFuZCBzaWducyBhIG1lc3NhZ2UgdmVyaWZpZWQgYXQgbS8wJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IFt1c2VyRGtnLCBiYWNrdXBEa2ddID0gYXdhaXQgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzKCk7XG4gICAgY29uc3QgW3ZyZlVzZXIsIHZyZkJhY2t1cF0gPSBhd2FpdCBEa2xzVnJmVXRpbHMuZ2VuZXJhdGVWcmZES0dLZXlTaGFyZXMoKTtcblxuICAgIGNvbnN0IHJvb3RDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyRGtnLmdldEtleVNoYXJlKCkpO1xuXG4gICAgY29uc3QgeyBjb21tb25LZXljaGFpbiwgdXNlckNoaWxkLCBiYWNrdXBDaGlsZCB9ID0gYXdhaXQgRGtsc1ZyZlV0aWxzLmRlcml2ZVNhZmVFY2RzYU1wY0NoaWxkKHtcbiAgICAgIHVzZXJSb290OiB7IHNpZ25pbmc6IHVzZXJEa2cuZ2V0UmVkdWNlZEtleVNoYXJlKCksIHZyZjogdnJmVXNlci5nZXRLZXlTaGFyZSgpIH0sXG4gICAgICBiYWNrdXBSb290OiB7IHNpZ25pbmc6IGJhY2t1cERrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKSwgdnJmOiB2cmZCYWNrdXAuZ2V0S2V5U2hhcmUoKSB9LFxuICAgICAgYWNjb3VudDogMCxcbiAgICAgIGNvaW5UeXBlOiA2MCxcbiAgICB9KTtcblxuICAgIC8vIFRoZSBkZXJpdmVkIGNoaWxkIG11c3QgbmV2ZXIgYmUgdGhlIHJvb3QgKHRoZSBcInJvb3QgZW52ZWxvcGUgaW4gdGhlIGNoaWxkIHBvc2l0aW9uXCIgZm9vdGd1bikuXG4gICAgY29tbW9uS2V5Y2hhaW4uc2hvdWxkLm5vdC5lcXVhbChyb290Q29tbW9uS2V5Y2hhaW4pO1xuXG4gICAgLy8gUmVidWlsZCAyLW9mLTIga2V5c2hhcmVzIGZyb20gdGhlIGRlcml2ZWQgcmVkdWNlZCBDQk9SLCBleGFjdGx5IGFzIHRoZSBzaWduZXIncyByZXRyb2ZpdCBkb2VzLlxuICAgIGNvbnN0IHRvUmV0cm9maXQgPSAoYjY0OiBzdHJpbmcpOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhID0+IHtcbiAgICAgIGNvbnN0IHJlZHVjZWQgPSBEa2xzVHlwZXMuZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShCdWZmZXIuZnJvbShiNjQsICdiYXNlNjQnKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4U2hhcmU6IHtcbiAgICAgICAgICB4OiBCdWZmZXIuZnJvbShyZWR1Y2VkLnBydikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHk6IEJ1ZmZlci5mcm9tKHJlZHVjZWQucHViKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgY2hhaW5jb2RlOiBCdWZmZXIuZnJvbShyZWR1Y2VkLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgICAgeGlMaXN0OiByZWR1Y2VkLnhMaXN0LnNsaWNlKDAsIDIpLFxuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IFt1c2VyMm9mMiwgYmFja3VwMm9mMl0gPSBhd2FpdCBEa2xzVXRpbHMuZ2VuZXJhdGUyb2YyS2V5U2hhcmVzKFxuICAgICAgdG9SZXRyb2ZpdCh1c2VyQ2hpbGQpLFxuICAgICAgdG9SZXRyb2ZpdChiYWNrdXBDaGlsZClcbiAgICApO1xuXG4gICAgY29uc3QgbWVzc2FnZUhhc2ggPSBCdWZmZXIuZnJvbSgnMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZicsICdoZXgnKTtcbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IERrbHNEc2cuRHNnKHVzZXIyb2YyLmdldEtleVNoYXJlKCksIDAsICdtLzAnLCBtZXNzYWdlSGFzaCk7XG4gICAgY29uc3QgYmFja3VwRHNnID0gbmV3IERrbHNEc2cuRHNnKGJhY2t1cDJvZjIuZ2V0S2V5U2hhcmUoKSwgMSwgJ20vMCcsIG1lc3NhZ2VIYXNoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTdHJpbmcgPSBEa2xzVXRpbHMudmVyaWZ5QW5kQ29udmVydERrbHNTaWduYXR1cmUoXG4gICAgICBtZXNzYWdlSGFzaCxcbiAgICAgIChhd2FpdCBEa2xzVXRpbHMuZXhlY3V0ZVRpbGxSb3VuZCg1LCB1c2VyRHNnLCBiYWNrdXBEc2cpKSBhcyBEa2xzVHlwZXMuRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZSxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgJ20vMCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBmYWxzZVxuICAgICk7XG5cbiAgICAvLyB2ZXJpZnlBbmRDb252ZXJ0RGtsc1NpZ25hdHVyZSByZWNvdmVycyB0aGUgcHVia2V5IGZyb20gdGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzIGl0IGFnYWluc3RcbiAgICAvLyBkZXJpdmVVbmhhcmRlbmVkKGNoaWxkQ0ssICdtLzAnKTsgaXQgdGhyb3dzIG9uIG1pc21hdGNoLCBzbyBhIHJldHVybmVkIHN0cmluZyBpcyBwcm9vZi5cbiAgICBzaWduYXR1cmVTdHJpbmcuc2hvdWxkLmJlLmEuU3RyaW5nKCk7XG4gICAgc2lnbmF0dXJlU3RyaW5nLnNob3VsZC5tYXRjaCgvXlxcZCs6WzAtOWEtZl0rOlswLTlhLWZdKzpbMC05YS1mXSskLyk7XG4gIH0pO1xufSk7XG4iXX0=