@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.465 → 8.2.1-alpha.467

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.
@@ -14,7 +14,7 @@ import { DeserializedMessage, DeserializedMessages, DsgState } from './types';
14
14
  * @example
15
15
  * ```typescript
16
16
  * const dsg = new DSG(0); // partyIdx 0
17
- * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
17
+ * await dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
18
18
  * const msg1 = dsg.getFirstMessage();
19
19
  * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
20
20
  * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
@@ -35,11 +35,15 @@ export declare class DSG {
35
35
  private dsgStateBytes;
36
36
  /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
37
37
  private signature;
38
+ /** Lazily loaded WASM module */
39
+ private wasmMps;
38
40
  protected dsgState: DsgState;
39
41
  constructor(partyIdx: number);
40
42
  getState(): DsgState;
41
43
  getPartyIdx(): number;
42
44
  getOtherPartyIdx(): number | null;
45
+ private loadWasmMps;
46
+ private getWasmMps;
43
47
  /**
44
48
  * Initialises the DSG session. The keyshare must come from a prior DKG run, and
45
49
  * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
@@ -50,7 +54,7 @@ export declare class DSG {
50
54
  * @param otherPartyIdx - Party index of the single counterpart in this signing session.
51
55
  * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
52
56
  */
53
- initDsg(keyShare: Buffer, message: Buffer, derivationPath: string, otherPartyIdx: number): void;
57
+ initDsg(keyShare: Buffer, message: Buffer, derivationPath: string, otherPartyIdx: number): Promise<void>;
54
58
  /**
55
59
  * Runs round 0 of the DSG protocol. Returns this party's broadcast message
56
60
  * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
@@ -87,6 +91,6 @@ export declare class DSG {
87
91
  * Restores a previously exported session. Allows the protocol to continue from
88
92
  * where it left off, as if the round state was loaded from a database.
89
93
  */
90
- restoreSession(session: string): void;
94
+ restoreSession(session: string): Promise<void>;
91
95
  }
92
96
  //# sourceMappingURL=dsg.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dsg.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAAuB;IACtC,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAuB;IAE7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAuB;IAExC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,QAAQ;IAIpB,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAqB/F;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAqEvF;;;OAGG;IACH,YAAY,IAAI,MAAM;IAOtB;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAqBpB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2DtC"}
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dsg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAAuB;IACtC,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAuB;IAE7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAuB;IACxC,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,QAAQ;IAIpB,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;YAInB,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;OASG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9G;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAqBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAsEvF;;;OAGG;IACH,YAAY,IAAI,MAAM;IAOtB;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAqBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA4DrD"}
@@ -1,11 +1,43 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.DSG = void 0;
7
40
  const assert_1 = __importDefault(require("assert"));
8
- const wasm_mps_1 = require("@bitgo/wasm-mps");
9
41
  const types_1 = require("./types");
10
42
  /**
11
43
  * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
@@ -22,7 +54,7 @@ const types_1 = require("./types");
22
54
  * @example
23
55
  * ```typescript
24
56
  * const dsg = new DSG(0); // partyIdx 0
25
- * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
57
+ * await dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
26
58
  * const msg1 = dsg.getFirstMessage();
27
59
  * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
28
60
  * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
@@ -43,6 +75,8 @@ class DSG {
43
75
  this.dsgStateBytes = null;
44
76
  /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
45
77
  this.signature = null;
78
+ /** Lazily loaded WASM module */
79
+ this.wasmMps = null;
46
80
  this.dsgState = types_1.DsgState.Uninitialized;
47
81
  this.partyIdx = partyIdx;
48
82
  }
@@ -55,6 +89,30 @@ class DSG {
55
89
  getOtherPartyIdx() {
56
90
  return this.otherPartyIdx;
57
91
  }
92
+ async loadWasmMps() {
93
+ if (!this.wasmMps) {
94
+ if (typeof window !== 'undefined' &&
95
+ /* checks for electron processes */
96
+ !window.process &&
97
+ !window.process?.['type']) {
98
+ // Browser: web build has explicit init() — guaranteed ready after await
99
+ // eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
100
+ const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
101
+ await webWasm.default();
102
+ this.wasmMps = webWasm;
103
+ }
104
+ else {
105
+ // Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
106
+ this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
107
+ }
108
+ }
109
+ }
110
+ getWasmMps() {
111
+ if (!this.wasmMps) {
112
+ throw Error('WASM module not loaded');
113
+ }
114
+ return this.wasmMps;
115
+ }
58
116
  /**
59
117
  * Initialises the DSG session. The keyshare must come from a prior DKG run, and
60
118
  * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
@@ -65,7 +123,8 @@ class DSG {
65
123
  * @param otherPartyIdx - Party index of the single counterpart in this signing session.
66
124
  * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
67
125
  */
68
- initDsg(keyShare, message, derivationPath, otherPartyIdx) {
126
+ async initDsg(keyShare, message, derivationPath, otherPartyIdx) {
127
+ await this.loadWasmMps();
69
128
  if (!keyShare || keyShare.length === 0) {
70
129
  throw Error('Missing or invalid keyShare');
71
130
  }
@@ -96,9 +155,10 @@ class DSG {
96
155
  (0, assert_1.default)(this.keyShare, 'keyShare must be set after initDsg');
97
156
  (0, assert_1.default)(this.derivationPath !== null, 'derivationPath must be set after initDsg');
98
157
  (0, assert_1.default)(this.message, 'message must be set after initDsg');
158
+ const wasm = this.getWasmMps();
99
159
  let result;
100
160
  try {
101
- result = (0, wasm_mps_1.ed25519_dsg_round0_process)(this.keyShare, this.derivationPath, this.message);
161
+ result = wasm.ed25519_dsg_round0_process(this.keyShare, this.derivationPath, this.message);
102
162
  }
103
163
  catch (err) {
104
164
  throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
@@ -143,11 +203,12 @@ class DSG {
143
203
  throw Error(`Unexpected counterpart party index: got ${peerMsg.from}, expected ${this.otherPartyIdx}`);
144
204
  }
145
205
  const peerPayload = Buffer.from(peerMsg.payload);
206
+ const wasm = this.getWasmMps();
146
207
  if (this.dsgState === types_1.DsgState.WaitMsg1) {
147
208
  (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg1');
148
209
  let result;
149
210
  try {
150
- result = (0, wasm_mps_1.ed25519_dsg_round1_process)(peerPayload, this.dsgStateBytes);
211
+ result = wasm.ed25519_dsg_round1_process(peerPayload, this.dsgStateBytes);
151
212
  }
152
213
  catch (err) {
153
214
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
@@ -160,7 +221,7 @@ class DSG {
160
221
  (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg2');
161
222
  let result;
162
223
  try {
163
- result = (0, wasm_mps_1.ed25519_dsg_round2_process)(peerPayload, this.dsgStateBytes);
224
+ result = wasm.ed25519_dsg_round2_process(peerPayload, this.dsgStateBytes);
164
225
  }
165
226
  catch (err) {
166
227
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
@@ -173,7 +234,7 @@ class DSG {
173
234
  (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg3');
174
235
  let sigBytes;
175
236
  try {
176
- sigBytes = (0, wasm_mps_1.ed25519_dsg_round3_process)(peerPayload, this.dsgStateBytes);
237
+ sigBytes = wasm.ed25519_dsg_round3_process(peerPayload, this.dsgStateBytes);
177
238
  }
178
239
  catch (err) {
179
240
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
@@ -224,7 +285,8 @@ class DSG {
224
285
  * Restores a previously exported session. Allows the protocol to continue from
225
286
  * where it left off, as if the round state was loaded from a database.
226
287
  */
227
- restoreSession(session) {
288
+ async restoreSession(session) {
289
+ await this.loadWasmMps();
228
290
  const data = JSON.parse(session);
229
291
  if (!Object.values(types_1.DsgState).includes(data.dsgRound)) {
230
292
  throw Error(`Invalid dsgRound in session: ${data.dsgRound}`);
@@ -281,4 +343,4 @@ class DSG {
281
343
  }
282
344
  }
283
345
  exports.DSG = DSG;
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4Q0FLeUI7QUFDekIsbUNBQThFO0FBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSxHQUFHO0lBa0JkLFlBQVksUUFBZ0I7UUFoQmxCLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUU5QywwREFBMEQ7UUFDbEQsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDdkMsb0ZBQW9GO1FBQzVFLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBQ3RDLG9HQUFvRztRQUM1RixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFFN0MsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1Qyw0RUFBNEU7UUFDcEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFFOUIsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE9BQU8sQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBRSxjQUFzQixFQUFFLGFBQXFCO1FBQ3RGLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxJ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RyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBalJELGtCQWlSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gIGVkMjU1MTlfZHNnX3JvdW5kMF9wcm9jZXNzLFxuICBlZDI1NTE5X2RzZ19yb3VuZDFfcHJvY2VzcyxcbiAgZWQyNTUxOV9kc2dfcm91bmQyX3Byb2Nlc3MsXG4gIGVkMjU1MTlfZHNnX3JvdW5kM19wcm9jZXNzLFxufSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERzZ1N0YXRlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRWREU0EgRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uIChEU0cpIGltcGxlbWVudGF0aW9uIHVzaW5nIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnNcbiAqIGB7IG1zZywgc3RhdGUgfWAgYnl0ZXM7IHRoZSBzdGF0ZSBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlXG4gKiBuZXh0IHJvdW5kIGZ1bmN0aW9uICh0aGlzIGlzIHdoYXQgYSBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJXG4gKiByb3VuZHMpLlxuICpcbiAqIFRoZSBwcm90b2NvbCBpcyBoYXJkLWNvZGVkIDItb2YtMzogZWFjaCBzaWduaW5nIHBhcnR5IGNvbW11bmljYXRlcyB3aXRoIGV4YWN0bHkgb25lXG4gKiBjb3VudGVycGFydC4gYGhhbmRsZUluY29taW5nTWVzc2FnZXNgIGFjY2VwdHMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpLCBhbmRcbiAqIGZpbHRlcnMgb3duIG91dCBpbnRlcm5hbGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkc2cgPSBuZXcgRFNHKDApOyAgLy8gcGFydHlJZHggMFxuICogZHNnLmluaXREc2coa2V5U2hhcmUsIG1lc3NhZ2UsICdtJywgMik7ICAvLyBjb3VudGVycGFydCBpcyBwYXJ0eSAyXG4gKiBjb25zdCBtc2cxID0gZHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICogY29uc3QgbXNnMiA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cxLCBwZWVyTXNnMV0pOyAgLy8gZW1pdHMgU2lnbk1zZzJcbiAqIGNvbnN0IG1zZzMgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMlswXSwgcGVlck1zZzJdKTsgIC8vIGVtaXRzIFNpZ25Nc2czXG4gKiBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnM1swXSwgcGVlck1zZzNdKTsgIC8vIGNvbXBsZXRlcyBEU0dcbiAqIGNvbnN0IHNpZ25hdHVyZSA9IGRzZy5nZXRTaWduYXR1cmUoKTsgIC8vIDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmVcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRFNHIHtcbiAgcHJvdGVjdGVkIHBhcnR5SWR4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBvdGhlclBhcnR5SWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBLZXlzaGFyZSBmcm9tIGEgcHJpb3IgREtHICovXG4gIHByaXZhdGUga2V5U2hhcmU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogUmF3IG1lc3NhZ2UgYnl0ZXMgdG8gc2lnbiAoRWQyNTUxOSBoYXNoZXMgaW50ZXJuYWxseTsgbm8gcHJlaGFzaGluZyByZXF1aXJlZCkgKi9cbiAgcHJpdmF0ZSBtZXNzYWdlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGgsIGUuZy4gXCJtXCIgb3IgXCJtLzAvMVwiLiBGb2xkZWQgaW4gdmlhIEtleXNoYXJlOjpkZXJpdmVfd2l0aF9vZmZzZXQgKi9cbiAgcHJpdmF0ZSBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlcmlhbGlzZWQgcm91bmQgc3RhdGUgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlIHByZXZpb3VzIHJvdW5kIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgZHNnU3RhdGVCeXRlczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLCBhdmFpbGFibGUgYWZ0ZXIgV2FpdE1zZzMgLT4gQ29tcGxldGUgKi9cbiAgcHJpdmF0ZSBzaWduYXR1cmU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBkc2dTdGF0ZTogRHNnU3RhdGUgPSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBEc2dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZHNnU3RhdGU7XG4gIH1cblxuICBnZXRQYXJ0eUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0T3RoZXJQYXJ0eUlkeCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlclBhcnR5SWR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBEU0cgc2Vzc2lvbi4gVGhlIGtleXNoYXJlIG11c3QgY29tZSBmcm9tIGEgcHJpb3IgREtHIHJ1biwgYW5kXG4gICAqIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgY28tc2lnbiB3aXRoIHRoaXMgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAtIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgYnl0ZXMgZnJvbSBgREtHLmdldEtleVNoYXJlKClgLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKG5vIHByZWhhc2hpbmcpLlxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLiBVc2UgYFwibVwiYCBmb3IgdGhlIHJvb3Qga2V5LlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLlxuICAgKi9cbiAgaW5pdERzZyhrZXlTaGFyZTogQnVmZmVyLCBtZXNzYWdlOiBCdWZmZXIsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIG90aGVyUGFydHlJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IG90aGVyUGFydHlJZHg7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZCAwIG9mIHRoZSBEU0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlXG4gICAqIChhIGBTaWduTXNnMWAgY29udGFpbmluZyB0aGUgY29tbWl0bWVudCB0byBgUl9pYCkuIFN0b3JlcyB0aGUgcm91bmQgc3RhdGVcbiAgICogYnl0ZXMgaW50ZXJuYWxseSBmb3IgdGhlIG5leHQgcm91bmQuXG4gICAqL1xuICBnZXRGaXJzdE1lc3NhZ2UoKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgIT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgYXNzZXJ0KHRoaXMua2V5U2hhcmUsICdrZXlTaGFyZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMuZGVyaXZhdGlvblBhdGggIT09IG51bGwsICdkZXJpdmF0aW9uUGF0aCBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMubWVzc2FnZSwgJ21lc3NhZ2UgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQwX3Byb2Nlc3ModGhpcy5rZXlTaGFyZSwgdGhpcy5kZXJpdmF0aW9uUGF0aCwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMTtcbiAgICByZXR1cm4geyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kIGFuZCBhZHZhbmNlcyB0aGUgcHJvdG9jb2wuXG4gICAqXG4gICAqIC0gSW4gYFdhaXRNc2cxYDogcnVucyByb3VuZCAxLCByZXR1cm5zIHRoaXMgcGFydHkncyBgU2lnbk1zZzJgIGJyb2FkY2FzdC5cbiAgICogLSBJbiBgV2FpdE1zZzJgOiBydW5zIHJvdW5kIDIgKHdoaWNoIGludGVybmFsbHkgZnVzZXMgdHdvIFNpbGVuY2UgTGFicyB0cmFuc2l0aW9ucyksXG4gICAqICAgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2czYCBicm9hZGNhc3QgKHBhcnRpYWwgc2lnbmF0dXJlKS5cbiAgICogLSBJbiBgV2FpdE1zZzNgOiBydW5zIHJvdW5kIDMsIGNvbXBsZXRlcyBEU0csIHJldHVybnMgYFtdYC5cbiAgICpcbiAgICogVGhlIGNhbGxlciBwYXNzZXMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciBzeW1tZXRyeSB3aXRoXG4gICAqIGBES0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AuIE93biBtZXNzYWdlIGlzIGZpbHRlcmVkIG91dCBpbnRlcm5hbGx5OyBvbmx5IHRoZVxuICAgKiBjb3VudGVycGFydCdzIHBheWxvYWQgaXMgZm9yd2FyZGVkIHRvIHRoZSBXQVNNIHJvdW5kIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXNGb3JJdGhSb3VuZCAtIEJvdGggbWVzc2FnZXMgZm9yIHRoaXMgcm91bmQgKG93biArIGNvdW50ZXJwYXJ0KS5cbiAgICovXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnRFNHIHNlc3Npb24gbXVzdCBjYWxsIGdldEZpcnN0TWVzc2FnZSgpIGJlZm9yZSBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcy4gQ2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBmaXJzdC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXNGb3JJdGhSb3VuZC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBtZXNzYWdlcyBmb3IgdGhlIHJvdW5kLiBFeHBlY3RlZCAyIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCkgZm9yIDItb2YtMyBEU0cnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZWVyTWVzc2FnZXMgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KTtcbiAgICBpZiAocGVlck1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBjb3VudGVycGFydCBtZXNzYWdlOyBnb3QgJHtwZWVyTWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyTXNnID0gcGVlck1lc3NhZ2VzWzBdO1xuICAgIGlmIChwZWVyTXNnLmZyb20gIT09IHRoaXMub3RoZXJQYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWQgY291bnRlcnBhcnQgcGFydHkgaW5kZXg6IGdvdCAke3BlZXJNc2cuZnJvbX0sIGV4cGVjdGVkICR7dGhpcy5vdGhlclBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBlZXJNc2cucGF5bG9hZCk7XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cxJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQxX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMjtcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzIpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cyJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgc2lnQnl0ZXM7XG4gICAgICB0cnkge1xuICAgICAgICBzaWdCeXRlcyA9IGVkMjU1MTlfZHNnX3JvdW5kM19wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlID0gQnVmZmVyLmZyb20oc2lnQnl0ZXMpO1xuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBEU0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIHByb2R1Y2VkIGJ5IHJvdW5kIDMuXG4gICAqIE9ubHkgYXZhaWxhYmxlIG9uY2UgdGhlIHByb3RvY29sIHJlYWNoZXMgYENvbXBsZXRlYC5cbiAgICovXG4gIGdldFNpZ25hdHVyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBoYXMgbm90IHByb2R1Y2VkIGEgc2lnbmF0dXJlIHlldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmU7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHBlcnNpc3RlbmNlLlxuICAgKiBJbmNsdWRlcyB0aGUgb3BhcXVlIHJvdW5kIHN0YXRlIGJ5dGVzIHBsdXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmUtZW50ZXIgdGhlXG4gICAqIHByb3RvY29sIGFmdGVyIGEgcmVzdGFydCAoa2V5c2hhcmUsIG1lc3NhZ2UsIGRlcml2YXRpb24gcGF0aCwgY291bnRlcnBhcnQpLlxuICAgKi9cbiAgZ2V0U2Vzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBFeHBvcnRpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbXVzdCBwcm9kdWNlIGl0cyBmaXJzdCBtZXNzYWdlIGJlZm9yZSBleHBvcnRpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTdGF0ZUJ5dGVzOiB0aGlzLmRzZ1N0YXRlQnl0ZXM/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZHNnUm91bmQ6IHRoaXMuZHNnU3RhdGUsXG4gICAgICBrZXlTaGFyZTogdGhpcy5rZXlTaGFyZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2U/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IHRoaXMuZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uKTtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoRHNnU3RhdGUpLmluY2x1ZGVzKGRhdGEuZHNnUm91bmQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkc2dSb3VuZCBpbiBzZXNzaW9uOiAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkIHx8IGRhdGEuZHNnUm91bmQgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgcmVzdG9yZSBEU0cgc2Vzc2lvbiBpbiBzdGF0ZSAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBSZXN0b3JpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5wYXJ0eUlkeCAhPT0gJ251bWJlcicgfHwgZGF0YS5wYXJ0eUlkeCA8IDAgfHwgZGF0YS5wYXJ0eUlkeCA+IDIpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHBhcnR5SWR4IGluIHNlc3Npb246ICR7ZGF0YS5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEub3RoZXJQYXJ0eUlkeCAhPT0gJ251bWJlcicgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA8IDAgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA+IDIgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA9PT0gZGF0YS5wYXJ0eUlkeFxuICAgICkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggIT09IGRhdGEucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBTZXNzaW9uIHBhcnR5SWR4ICR7ZGF0YS5wYXJ0eUlkeH0gZG9lcyBub3QgbWF0Y2ggaW5zdGFuY2UgJHt0aGlzLnBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEuZHNnU3RhdGVCeXRlcyAhPT0gJ3N0cmluZycgfHwgZGF0YS5kc2dTdGF0ZUJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFJvdW5kICR7ZGF0YS5kc2dSb3VuZH0gcmVxdWlyZXMgZHNnU3RhdGVCeXRlc2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEua2V5U2hhcmUgIT09ICdzdHJpbmcnIHx8IGRhdGEua2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5tZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBkYXRhLm1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRlcml2YXRpb25QYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBkZXJpdmF0aW9uUGF0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShkYXRhLmRzZ1N0YXRlQnl0ZXMsICdiYXNlNjQnKTtcbiAgICBjb25zdCBrZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKGRhdGEua2V5U2hhcmUsICdiYXNlNjQnKTtcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmZyb20oZGF0YS5tZXNzYWdlLCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRzZ1N0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLmRzZ1JvdW5kfSByZXF1aXJlcyBkc2dTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmIChrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBkc2dTdGF0ZUJ5dGVzO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBkYXRhLmRzZ1JvdW5kO1xuICAgIHRoaXMua2V5U2hhcmUgPSBrZXlTaGFyZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGVyaXZhdGlvblBhdGggPSBkYXRhLmRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMucGFydHlJZHggPSBkYXRhLnBhcnR5SWR4O1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IGRhdGEub3RoZXJQYXJ0eUlkeDtcbiAgfVxufVxuIl19
346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1QixtQ0FBOEU7QUFNOUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFhLEdBQUc7SUFvQmQsWUFBWSxRQUFnQjtRQWxCbEIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTlDLDBEQUEwRDtRQUNsRCxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2QyxvRkFBb0Y7UUFDNUUsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdEMsb0dBQW9HO1FBQzVGLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUU3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLDRFQUE0RTtRQUNwRSxjQUFTLEdBQWtCLElBQUksQ0FBQztRQUN4QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFtQixJQUFJLENBQUM7UUFFN0IsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFDRSxPQUFPLE1BQU0sS0FBSyxXQUFXO2dCQUM3QixtQ0FBbUM7Z0JBQ25DLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ2YsQ0FB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LE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFsVEQsa0JBa1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUgeyBNc2dTdGF0ZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWRNZXNzYWdlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgRHNnU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG50eXBlIFdlYldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbnR5cGUgV2FzbU1wcyA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXI7XG5cbi8qKlxuICogRWREU0EgRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uIChEU0cpIGltcGxlbWVudGF0aW9uIHVzaW5nIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnNcbiAqIGB7IG1zZywgc3RhdGUgfWAgYnl0ZXM7IHRoZSBzdGF0ZSBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlXG4gKiBuZXh0IHJvdW5kIGZ1bmN0aW9uICh0aGlzIGlzIHdoYXQgYSBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJXG4gKiByb3VuZHMpLlxuICpcbiAqIFRoZSBwcm90b2NvbCBpcyBoYXJkLWNvZGVkIDItb2YtMzogZWFjaCBzaWduaW5nIHBhcnR5IGNvbW11bmljYXRlcyB3aXRoIGV4YWN0bHkgb25lXG4gKiBjb3VudGVycGFydC4gYGhhbmRsZUluY29taW5nTWVzc2FnZXNgIGFjY2VwdHMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpLCBhbmRcbiAqIGZpbHRlcnMgb3duIG91dCBpbnRlcm5hbGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkc2cgPSBuZXcgRFNHKDApOyAgLy8gcGFydHlJZHggMFxuICogYXdhaXQgZHNnLmluaXREc2coa2V5U2hhcmUsIG1lc3NhZ2UsICdtJywgMik7ICAvLyBjb3VudGVycGFydCBpcyBwYXJ0eSAyXG4gKiBjb25zdCBtc2cxID0gZHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICogY29uc3QgbXNnMiA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cxLCBwZWVyTXNnMV0pOyAgLy8gZW1pdHMgU2lnbk1zZzJcbiAqIGNvbnN0IG1zZzMgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMlswXSwgcGVlck1zZzJdKTsgIC8vIGVtaXRzIFNpZ25Nc2czXG4gKiBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnM1swXSwgcGVlck1zZzNdKTsgIC8vIGNvbXBsZXRlcyBEU0dcbiAqIGNvbnN0IHNpZ25hdHVyZSA9IGRzZy5nZXRTaWduYXR1cmUoKTsgIC8vIDY0LWJ5dGUgRWQyNTUxOSBzaWduYXR1cmVcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRFNHIHtcbiAgcHJvdGVjdGVkIHBhcnR5SWR4OiBudW1iZXI7XG4gIHByb3RlY3RlZCBvdGhlclBhcnR5SWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBLZXlzaGFyZSBmcm9tIGEgcHJpb3IgREtHICovXG4gIHByaXZhdGUga2V5U2hhcmU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogUmF3IG1lc3NhZ2UgYnl0ZXMgdG8gc2lnbiAoRWQyNTUxOSBoYXNoZXMgaW50ZXJuYWxseTsgbm8gcHJlaGFzaGluZyByZXF1aXJlZCkgKi9cbiAgcHJpdmF0ZSBtZXNzYWdlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGgsIGUuZy4gXCJtXCIgb3IgXCJtLzAvMVwiLiBGb2xkZWQgaW4gdmlhIEtleXNoYXJlOjpkZXJpdmVfd2l0aF9vZmZzZXQgKi9cbiAgcHJpdmF0ZSBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlcmlhbGlzZWQgcm91bmQgc3RhdGUgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlIHByZXZpb3VzIHJvdW5kIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgZHNnU3RhdGVCeXRlczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLCBhdmFpbGFibGUgYWZ0ZXIgV2FpdE1zZzMgLT4gQ29tcGxldGUgKi9cbiAgcHJpdmF0ZSBzaWduYXR1cmU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZHNnU3RhdGU6IERzZ1N0YXRlID0gRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogRHNnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRzZ1N0YXRlO1xuICB9XG5cbiAgZ2V0UGFydHlJZHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0eUlkeDtcbiAgfVxuXG4gIGdldE90aGVyUGFydHlJZHgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJQYXJ0eUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFdhc21NcHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzICYmXG4gICAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICAgICkge1xuICAgICAgICAvLyBCcm93c2VyOiB3ZWIgYnVpbGQgaGFzIGV4cGxpY2l0IGluaXQoKSDigJQgZ3VhcmFudGVlZCByZWFkeSBhZnRlciBhd2FpdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgLS0gQGJpdGdvL3dhc20tbXBzIGV4cG9zZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgc3VicGF0aCBleHBvcnRzLlxuICAgICAgICBjb25zdCB3ZWJXYXNtID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMvd2ViJyk7XG4gICAgICAgIGF3YWl0IHdlYldhc20uZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLndhc21NcHMgPSB3ZWJXYXNtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZS5qczogZHluYW1pYyBpbXBvcnQoKSByZXdyaXR0ZW4gdG8gcmVxdWlyZSgpIGJ5IHRzYyDihpIgQ0pTIGJ1aWxkIOKGkiByZWFkRmlsZVN5bmNcbiAgICAgICAgdGhpcy53YXNtTXBzID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhc21NcHMoKTogV2FzbU1wcyB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdXQVNNIG1vZHVsZSBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhc21NcHM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZXMgdGhlIERTRyBzZXNzaW9uLiBUaGUga2V5c2hhcmUgbXVzdCBjb21lIGZyb20gYSBwcmlvciBES0cgcnVuLCBhbmRcbiAgICogYG90aGVyUGFydHlJZHhgIG11c3QgYmUgdGhlIHNpbmdsZSBjb3VudGVycGFydCB3aG8gd2lsbCBjby1zaWduIHdpdGggdGhpcyBwYXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIGtleVNoYXJlIC0gT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBLZXlzaGFyZSBieXRlcyBmcm9tIGBES0cuZ2V0S2V5U2hhcmUoKWAuXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gUmF3IG1lc3NhZ2UgYnl0ZXMgdG8gc2lnbiAobm8gcHJlaGFzaGluZykuXG4gICAqIEBwYXJhbSBkZXJpdmF0aW9uUGF0aCAtIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGguIFVzZSBgXCJtXCJgIGZvciB0aGUgcm9vdCBrZXkuXG4gICAqIEBwYXJhbSBvdGhlclBhcnR5SWR4IC0gUGFydHkgaW5kZXggb2YgdGhlIHNpbmdsZSBjb3VudGVycGFydCBpbiB0aGlzIHNpZ25pbmcgc2Vzc2lvbi5cbiAgICogICBNdXN0IGRpZmZlciBmcm9tIHRoaXMgcGFydHkncyBvd24gYHBhcnR5SWR4YCBhbmQgYmUgaW4gYFswLCAyXWAuXG4gICAqL1xuICBhc3luYyBpbml0RHNnKGtleVNoYXJlOiBCdWZmZXIsIG1lc3NhZ2U6IEJ1ZmZlciwgZGVyaXZhdGlvblBhdGg6IHN0cmluZywgb3RoZXJQYXJ0eUlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IG90aGVyUGFydHlJZHg7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZCAwIG9mIHRoZSBEU0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlXG4gICAqIChhIGBTaWduTXNnMWAgY29udGFpbmluZyB0aGUgY29tbWl0bWVudCB0byBgUl9pYCkuIFN0b3JlcyB0aGUgcm91bmQgc3RhdGVcbiAgICogYnl0ZXMgaW50ZXJuYWxseSBmb3IgdGhlIG5leHQgcm91bmQuXG4gICAqL1xuICBnZXRGaXJzdE1lc3NhZ2UoKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgIT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgYXNzZXJ0KHRoaXMua2V5U2hhcmUsICdrZXlTaGFyZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMuZGVyaXZhdGlvblBhdGggIT09IG51bGwsICdkZXJpdmF0aW9uUGF0aCBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMubWVzc2FnZSwgJ21lc3NhZ2UgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuXG4gICAgY29uc3Qgd2FzbSA9IHRoaXMuZ2V0V2FzbU1wcygpO1xuICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB3YXNtLmVkMjU1MTlfZHNnX3JvdW5kMF9wcm9jZXNzKHRoaXMua2V5U2hhcmUsIHRoaXMuZGVyaXZhdGlvblBhdGgsIHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICB0aGlzLmRzZ1N0YXRlID0gRHNnU3RhdGUuV2FpdE1zZzE7XG4gICAgcmV0dXJuIHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCByb3VuZCBhbmQgYWR2YW5jZXMgdGhlIHByb3RvY29sLlxuICAgKlxuICAgKiAtIEluIGBXYWl0TXNnMWA6IHJ1bnMgcm91bmQgMSwgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2cyYCBicm9hZGNhc3QuXG4gICAqIC0gSW4gYFdhaXRNc2cyYDogcnVucyByb3VuZCAyICh3aGljaCBpbnRlcm5hbGx5IGZ1c2VzIHR3byBTaWxlbmNlIExhYnMgdHJhbnNpdGlvbnMpLFxuICAgKiAgIHJldHVybnMgdGhpcyBwYXJ0eSdzIGBTaWduTXNnM2AgYnJvYWRjYXN0IChwYXJ0aWFsIHNpZ25hdHVyZSkuXG4gICAqIC0gSW4gYFdhaXRNc2czYDogcnVucyByb3VuZCAzLCBjb21wbGV0ZXMgRFNHLCByZXR1cm5zIGBbXWAuXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3Igc3ltbWV0cnkgd2l0aFxuICAgKiBgREtHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLiBPd24gbWVzc2FnZSBpcyBmaWx0ZXJlZCBvdXQgaW50ZXJuYWxseTsgb25seSB0aGVcbiAgICogY291bnRlcnBhcnQncyBwYXlsb2FkIGlzIGZvcndhcmRlZCB0byB0aGUgV0FTTSByb3VuZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBCb3RoIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChvd24gKyBjb3VudGVycGFydCkuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0RTRyBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSByb3VuZC4gRXhwZWN0ZWQgMiBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciAyLW9mLTMgRFNHJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVlck1lc3NhZ2VzID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeCk7XG4gICAgaWYgKHBlZXJNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IDEgY291bnRlcnBhcnQgbWVzc2FnZTsgZ290ICR7cGVlck1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlck1zZyA9IHBlZXJNZXNzYWdlc1swXTtcbiAgICBpZiAocGVlck1zZy5mcm9tICE9PSB0aGlzLm90aGVyUGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkIGNvdW50ZXJwYXJ0IHBhcnR5IGluZGV4OiBnb3QgJHtwZWVyTXNnLmZyb219LCBleHBlY3RlZCAke3RoaXMub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlclBheWxvYWQgPSBCdWZmZXIuZnJvbShwZWVyTXNnLnBheWxvYWQpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzEnKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5lZDI1NTE5X2RzZ19yb3VuZDFfcHJvY2VzcyhwZWVyUGF5bG9hZCwgdGhpcy5kc2dTdGF0ZUJ5dGVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRzZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLldhaXRNc2cyO1xuICAgICAgcmV0dXJuIFt7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5XYWl0TXNnMikge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzInKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5lZDI1NTE5X2RzZ19yb3VuZDJfcHJvY2VzcyhwZWVyUGF5bG9hZCwgdGhpcy5kc2dTdGF0ZUJ5dGVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRzZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLldhaXRNc2czO1xuICAgICAgcmV0dXJuIFt7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5XYWl0TXNnMykge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzMnKTtcbiAgICAgIGxldCBzaWdCeXRlcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHNpZ0J5dGVzID0gd2FzbS5lZDI1NTE5X2RzZ19yb3VuZDNfcHJvY2VzcyhwZWVyUGF5bG9hZCwgdGhpcy5kc2dTdGF0ZUJ5dGVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRzZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKHNpZ0J5dGVzKTtcbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IG51bGw7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gRHNnU3RhdGUuQ29tcGxldGU7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgRFNHIHN0YXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmluYWwgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSBwcm9kdWNlZCBieSByb3VuZCAzLlxuICAgKiBPbmx5IGF2YWlsYWJsZSBvbmNlIHRoZSBwcm90b2NvbCByZWFjaGVzIGBDb21wbGV0ZWAuXG4gICAqL1xuICBnZXRTaWduYXR1cmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaGFzIG5vdCBwcm9kdWNlZCBhIHNpZ25hdHVyZSB5ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXMgdGhlIG9wYXF1ZSByb3VuZCBzdGF0ZSBieXRlcyBwbHVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlLWVudGVyIHRoZVxuICAgKiBwcm90b2NvbCBhZnRlciBhIHJlc3RhcnQgKGtleXNoYXJlLCBtZXNzYWdlLCBkZXJpdmF0aW9uIHBhdGgsIGNvdW50ZXJwYXJ0KS5cbiAgICovXG4gIGdldFNlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gRXhwb3J0aW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIG11c3QgcHJvZHVjZSBpdHMgZmlyc3QgbWVzc2FnZSBiZWZvcmUgZXhwb3J0aW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU3RhdGVCeXRlczogdGhpcy5kc2dTdGF0ZUJ5dGVzPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIGRzZ1JvdW5kOiB0aGlzLmRzZ1N0YXRlLFxuICAgICAga2V5U2hhcmU6IHRoaXMua2V5U2hhcmU/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIGRlcml2YXRpb25QYXRoOiB0aGlzLmRlcml2YXRpb25QYXRoLFxuICAgICAgcGFydHlJZHg6IHRoaXMucGFydHlJZHgsXG4gICAgICBvdGhlclBhcnR5SWR4OiB0aGlzLm90aGVyUGFydHlJZHgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIHNlc3Npb24uIEFsbG93cyB0aGUgcHJvdG9jb2wgdG8gY29udGludWUgZnJvbVxuICAgKiB3aGVyZSBpdCBsZWZ0IG9mZiwgYXMgaWYgdGhlIHJvdW5kIHN0YXRlIHdhcyBsb2FkZWQgZnJvbSBhIGRhdGFiYXNlLlxuICAgKi9cbiAgYXN5bmMgcmVzdG9yZVNlc3Npb24oc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNlc3Npb24pO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyhEc2dTdGF0ZSkuaW5jbHVkZXMoZGF0YS5kc2dSb3VuZCkpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRzZ1JvdW5kIGluIHNlc3Npb246ICR7ZGF0YS5kc2dSb3VuZH1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuZHNnUm91bmQgPT09IERzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQgfHwgZGF0YS5kc2dSb3VuZCA9PT0gRHNnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCByZXN0b3JlIERTRyBzZXNzaW9uIGluIHN0YXRlICR7ZGF0YS5kc2dSb3VuZH1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuZHNnUm91bmQgPT09IERzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaXMgY29tcGxldGUuIFJlc3RvcmluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLnBhcnR5SWR4ICE9PSAnbnVtYmVyJyB8fCBkYXRhLnBhcnR5SWR4IDwgMCB8fCBkYXRhLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLnBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YS5vdGhlclBhcnR5SWR4ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgZGF0YS5vdGhlclBhcnR5SWR4IDwgMCB8fFxuICAgICAgZGF0YS5vdGhlclBhcnR5SWR4ID4gMiB8fFxuICAgICAgZGF0YS5vdGhlclBhcnR5SWR4ID09PSBkYXRhLnBhcnR5SWR4XG4gICAgKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBvdGhlclBhcnR5SWR4IGluIHNlc3Npb246ICR7ZGF0YS5vdGhlclBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJ0eUlkeCAhPT0gZGF0YS5wYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNlc3Npb24gcGFydHlJZHggJHtkYXRhLnBhcnR5SWR4fSBkb2VzIG5vdCBtYXRjaCBpbnN0YW5jZSAke3RoaXMucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5kc2dTdGF0ZUJ5dGVzICE9PSAnc3RyaW5nJyB8fCBkYXRhLmRzZ1N0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLmRzZ1JvdW5kfSByZXF1aXJlcyBkc2dTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5rZXlTaGFyZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5rZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLm1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8IGRhdGEubWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEuZGVyaXZhdGlvblBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIGRlcml2YXRpb25QYXRoJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZHNnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGtleVNoYXJlID0gQnVmZmVyLmZyb20oZGF0YS5rZXlTaGFyZSwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShkYXRhLm1lc3NhZ2UsICdiYXNlNjQnKTtcbiAgICBpZiAoZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKGtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IGRzZ1N0YXRlQnl0ZXM7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IGRhdGEuZHNnUm91bmQ7XG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kZXJpdmF0aW9uUGF0aCA9IGRhdGEuZGVyaXZhdGlvblBhdGg7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IGRhdGEucGFydHlJZHg7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gZGF0YS5vdGhlclBhcnR5SWR4O1xuICB9XG59XG4iXX0=
@@ -3,5 +3,4 @@ export * as EddsaMPSDsg from './dsg';
3
3
  export * as MPSUtil from './util';
4
4
  export * as MPSTypes from './types';
5
5
  export * as MPSComms from './commsLayer';
6
- export { deriveUnhardenedMps } from './derive';
7
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC"}
@@ -33,12 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.deriveUnhardenedMps = exports.MPSComms = exports.MPSTypes = exports.MPSUtil = exports.EddsaMPSDsg = exports.EddsaMPSDkg = void 0;
36
+ exports.MPSComms = exports.MPSTypes = exports.MPSUtil = exports.EddsaMPSDsg = exports.EddsaMPSDkg = void 0;
37
37
  exports.EddsaMPSDkg = __importStar(require("./dkg"));
38
38
  exports.EddsaMPSDsg = __importStar(require("./dsg"));
39
39
  exports.MPSUtil = __importStar(require("./util"));
40
40
  exports.MPSTypes = __importStar(require("./types"));
41
41
  exports.MPSComms = __importStar(require("./commsLayer"));
42
- var derive_1 = require("./derive");
43
- Object.defineProperty(exports, "deriveUnhardenedMps", { enumerable: true, get: function () { return derive_1.deriveUnhardenedMps; } });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUM7QUFDckMscURBQXFDO0FBQ3JDLGtEQUFrQztBQUNsQyxvREFBb0M7QUFDcEMseURBQXlDO0FBQ3pDLG1DQUErQztBQUF0Qyw2R0FBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIEVkZHNhTVBTRGtnIGZyb20gJy4vZGtnJztcbmV4cG9ydCAqIGFzIEVkZHNhTVBTRHNnIGZyb20gJy4vZHNnJztcbmV4cG9ydCAqIGFzIE1QU1V0aWwgZnJvbSAnLi91dGlsJztcbmV4cG9ydCAqIGFzIE1QU1R5cGVzIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogYXMgTVBTQ29tbXMgZnJvbSAnLi9jb21tc0xheWVyJztcbmV4cG9ydCB7IGRlcml2ZVVuaGFyZGVuZWRNcHMgfSBmcm9tICcuL2Rlcml2ZSc7XG4iXX0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUM7QUFDckMscURBQXFDO0FBQ3JDLGtEQUFrQztBQUNsQyxvREFBb0M7QUFDcEMseURBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgRWRkc2FNUFNEa2cgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgRWRkc2FNUFNEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0ICogYXMgTVBTVXRpbCBmcm9tICcuL3V0aWwnO1xuZXhwb3J0ICogYXMgTVBTVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBhcyBNUFNDb21tcyBmcm9tICcuL2NvbW1zTGF5ZXInO1xuIl19
@@ -29,5 +29,5 @@ export declare function generateEdDsaDKGKeyShares(seedUser?: EdDsaDKGPartySeed,
29
29
  * @param message - Raw message bytes to sign.
30
30
  * @param derivationPath - BIP-32-style derivation path, e.g. `"m"` or `"m/0/0"`.
31
31
  */
32
- export declare function executeTillRound(round: number, party1Dsg: DSG, party2Dsg: DSG, keyShare1: Buffer, keyShare2: Buffer, message: Buffer, derivationPath: string): DeserializedMessages[] | Buffer;
32
+ export declare function executeTillRound(round: number, party1Dsg: DSG, party2Dsg: DSG, keyShare1: Buffer, keyShare2: Buffer, message: Buffer, derivationPath: string): Promise<DeserializedMessages[] | Buffer>;
33
33
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/util.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAG5D;AAQD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,wFAAwF;AACxF,wBAAsB,yBAAyB,CAC7C,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,UAAU,CAAC,EAAE,iBAAiB,EAC9B,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAkC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,oBAAoB,EAAE,GAAG,MAAM,CAsBjC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/util.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAG5D;AAQD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,wFAAwF;AACxF,wBAAsB,yBAAyB,CAC7C,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,UAAU,CAAC,EAAE,iBAAiB,EAC9B,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAkC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,oBAAoB,EAAE,GAAG,MAAM,CAAC,CAsB1C"}
@@ -70,12 +70,12 @@ async function generateEdDsaDKGKeyShares(seedUser, seedBackup, seedBitgo) {
70
70
  * @param message - Raw message bytes to sign.
71
71
  * @param derivationPath - BIP-32-style derivation path, e.g. `"m"` or `"m/0/0"`.
72
72
  */
73
- function executeTillRound(round, party1Dsg, party2Dsg, keyShare1, keyShare2, message, derivationPath) {
73
+ async function executeTillRound(round, party1Dsg, party2Dsg, keyShare1, keyShare2, message, derivationPath) {
74
74
  if (round < 1 || round > 3) {
75
75
  throw Error('Invalid round number');
76
76
  }
77
- party1Dsg.initDsg(keyShare1, message, derivationPath, party2Dsg.getPartyIdx());
78
- party2Dsg.initDsg(keyShare2, message, derivationPath, party1Dsg.getPartyIdx());
77
+ await party1Dsg.initDsg(keyShare1, message, derivationPath, party2Dsg.getPartyIdx());
78
+ await party2Dsg.initDsg(keyShare2, message, derivationPath, party1Dsg.getPartyIdx());
79
79
  const party1Round0Message = party1Dsg.getFirstMessage();
80
80
  const party2Round0Message = party2Dsg.getFirstMessage();
81
81
  const [party2Round1Messages] = party2Dsg.handleIncomingMessages([party1Round0Message, party2Round0Message]);
@@ -91,4 +91,4 @@ function executeTillRound(round, party1Dsg, party2Dsg, keyShare1, keyShare2, mes
91
91
  (0, assert_1.default)(party1Dsg.getSignature().toString('hex') === party2Dsg.getSignature().toString('hex'));
92
92
  return party1Dsg.getSignature();
93
93
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWRkc2EtbXBzL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFZQSxrQ0FHQztBQXdCRCw4REFzQ0M7QUFjRCw0Q0E4QkM7QUF6SEQsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixtREFBK0M7QUFDL0MsK0JBQTRCO0FBSTVCOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsTUFBb0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQWE7SUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBV0QsU0FBUyxZQUFZLENBQUMsSUFBd0I7SUFDNUMsSUFBQSxnQkFBTSxFQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUN0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LENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDL0UsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBRS9FLElBQUEsZ0JBQU0sRUFBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RixPQUFPLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgeDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbmltcG9ydCB7IERLRyB9IGZyb20gJy4vZGtnJztcbmltcG9ydCB7IERTRyB9IGZyb20gJy4vZHNnJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2VzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIG11bHRpcGxlIFVpbnQ4QXJyYXkgaW5zdGFuY2VzIGludG8gYSBzaW5nbGUgVWludDhBcnJheVxuICogQHBhcmFtIGNodW5rcyAtIEFycmF5IG9mIFVpbnQ4QXJyYXkgaW5zdGFuY2VzIHRvIGNvbmNhdGVuYXRlXG4gKiBAcmV0dXJucyBDb25jYXRlbmF0ZWQgVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0Qnl0ZXMoY2h1bmtzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYnVmZmVycyA9IGNodW5rcy5tYXAoKGNodW5rKSA9PiBCdWZmZXIuZnJvbShjaHVuaykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmNvbmNhdChidWZmZXJzKSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlWDI1NTE5S2V5cGFpcihzZWVkPzogQnVmZmVyKTogeyBwcml2S2V5OiBCdWZmZXI7IHB1YktleTogQnVmZmVyIH0ge1xuICBjb25zdCBwcml2S2V5ID0gc2VlZCA/IHNlZWQuc3ViYXJyYXkoMCwgMzIpIDogY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKTtcbiAgY29uc3QgcHViS2V5ID0gQnVmZmVyLmZyb20oeDI1NTE5LmdldFB1YmxpY0tleShwcml2S2V5KSk7XG4gIHJldHVybiB7IHByaXZLZXk6IEJ1ZmZlci5mcm9tKHByaXZLZXkpLCBwdWJLZXkgfTtcbn1cblxuLyoqXG4gKiBQZXItcGFydHkgZGV0ZXJtaW5pc3RpYyBzZWVkIG1hdGVyaWFsLiBUbyB1c2UgdGhlIHNhbWUgc2VlZCBmb3IgYm90aCwgcGFzcyBpdCBhcyBib3RoIGZpZWxkcy5cbiAqIGBlbmNLZXlgIHNlZWRzIHRoZSBYMjU1MTkgZW5jcnlwdGlvbiBrZXk7IGBka2dTZWVkYCBzZWVkcyBES0cgcm91bmQgMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZERzYURLR1BhcnR5U2VlZCB7XG4gIGVuY0tleT86IEJ1ZmZlcjtcbiAgZGtnU2VlZD86IEJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTZWVkKHNlZWQ/OiBFZERzYURLR1BhcnR5U2VlZCk6IEVkRHNhREtHUGFydHlTZWVkIHtcbiAgYXNzZXJ0KCFzZWVkPy5lbmNLZXkgfHwgc2VlZC5lbmNLZXkubGVuZ3RoID49IDMyLCAnZW5jS2V5IG11c3QgYmUgYXQgbGVhc3QgMzIgYnl0ZXMnKTtcbiAgYXNzZXJ0KCFzZWVkPy5ka2dTZWVkIHx8IHNlZWQuZGtnU2VlZC5sZW5ndGggPj0gMzIsICdka2dTZWVkIG11c3QgYmUgYXQgbGVhc3QgMzIgYnl0ZXMnKTtcbiAgcmV0dXJuIHNlZWQgPz8ge307XG59XG5cbi8qKiBTZWUgYEVkRHNhREtHUGFydHlTZWVkYC4gTWlycm9ycyBgRGtsc1V0aWxzLmdlbmVyYXRlREtHS2V5U2hhcmVzYCBmb3IgRUNEU0EgREtMUy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkRHNhREtHS2V5U2hhcmVzKFxuICBzZWVkVXNlcj86IEVkRHNhREtHUGFydHlTZWVkLFxuICBzZWVkQmFja3VwPzogRWREc2FES0dQYXJ0eVNlZWQsXG4gIHNlZWRCaXRnbz86IEVkRHNhREtHUGFydHlTZWVkXG4pOiBQcm9taXNlPFtES0csIERLRywgREtHXT4ge1xuICBjb25zdCB7IGVuY0tleTogdXNlckVuY0tleSwgZGtnU2VlZDogdXNlckRrZ1NlZWQgfSA9IHZhbGlkYXRlU2VlZChzZWVkVXNlcik7XG4gIGNvbnN0IHsgZW5jS2V5OiBiYWNrdXBFbmNLZXksIGRrZ1NlZWQ6IGJhY2t1cERrZ1NlZWQgfSA9IHZhbGlkYXRlU2VlZChzZWVkQmFja3VwKTtcbiAgY29uc3QgeyBlbmNLZXk6IGJpdGdvRW5jS2V5LCBka2dTZWVkOiBiaXRnb0RrZ1NlZWQgfSA9IHZhbGlkYXRlU2VlZChzZWVkQml0Z28pO1xuXG4gIGNvbnN0IHVzZXIgPSBuZXcgREtHKDMsIDIsIDApO1xuICBjb25zdCBiYWNrdXAgPSBuZXcgREtHKDMsIDIsIDEpO1xuICBjb25zdCBiaXRnbyA9IG5ldyBES0coMywgMiwgMik7XG5cbiAgY29uc3QgdXNlcktQID0gZ2VuZXJhdGVYMjU1MTlLZXlwYWlyKHVzZXJFbmNLZXkpO1xuICBjb25zdCBiYWNrdXBLUCA9IGdlbmVyYXRlWDI1NTE5S2V5cGFpcihiYWNrdXBFbmNLZXkpO1xuICBjb25zdCBiaXRnb0tQID0gZ2VuZXJhdGVYMjU1MTlLZXlwYWlyKGJpdGdvRW5jS2V5KTtcblxuICBhd2FpdCB1c2VyLmluaXREa2codXNlcktQLnByaXZLZXksIFtiYWNrdXBLUC5wdWJLZXksIGJpdGdvS1AucHViS2V5XSk7XG4gIGF3YWl0IGJhY2t1cC5pbml0RGtnKGJhY2t1cEtQLnByaXZLZXksIFt1c2VyS1AucHViS2V5LCBiaXRnb0tQLnB1YktleV0pO1xuICBhd2FpdCBiaXRnby5pbml0RGtnKGJpdGdvS1AucHJpdktleSwgW3VzZXJLUC5wdWJLZXksIGJhY2t1cEtQLnB1YktleV0pO1xuXG4gIGNvbnN0IHIxTWVzc2FnZXMgPSBbXG4gICAgdXNlci5nZXRGaXJzdE1lc3NhZ2UodXNlckRrZ1NlZWQpLFxuICAgIGJhY2t1cC5nZXRGaXJzdE1lc3NhZ2UoYmFja3VwRGtnU2VlZCksXG4gICAgYml0Z28uZ2V0Rmlyc3RNZXNzYWdlKGJpdGdvRGtnU2VlZCksXG4gIF07XG5cbiAgY29uc3QgcjJNZXNzYWdlcyA9IFtcbiAgICAuLi51c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjFNZXNzYWdlcyksXG4gICAgLi4uYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjFNZXNzYWdlcyksXG4gICAgLi4uYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMU1lc3NhZ2VzKSxcbiAgXTtcblxuICB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjJNZXNzYWdlcyk7XG4gIGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIyTWVzc2FnZXMpO1xuICBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIyTWVzc2FnZXMpO1xuXG4gIHJldHVybiBbdXNlciwgYmFja3VwLCBiaXRnb107XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdHdvIERTRyBwYXJ0aWVzIGFuZCBkcml2ZXMgdGhlbSB0aHJvdWdoIHRoZSBwcm90b2NvbCB1bnRpbCB0aGUgc3BlY2lmaWVkIHJvdW5kLlxuICpcbiAqIEBwYXJhbSByb3VuZCAtIFJvdW5kIHRvIGV4ZWN1dGUgdW50aWwgKDHigJMzKS4gUmV0dXJucyBpbnRlcm1lZGlhdGUgbWVzc2FnZSBhcnJheXMgZm9yIDHigJMyLFxuICogICBvciB0aGUgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSBCdWZmZXIgZm9yIDMuXG4gKiBAcGFyYW0gcGFydHkxRHNnIC0gRmlyc3QgRFNHIHBhcnR5IChgbmV3IERTRyhwYXJ0eUlkeClgKSwgbm90IHlldCBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSBwYXJ0eTJEc2cgLSBTZWNvbmQgRFNHIHBhcnR5IChgbmV3IERTRyhwYXJ0eUlkeClgKSwgbm90IHlldCBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSBrZXlTaGFyZTEgLSBLZXkgc2hhcmUgZm9yIHRoZSBmaXJzdCBwYXJ0eS5cbiAqIEBwYXJhbSBrZXlTaGFyZTIgLSBLZXkgc2hhcmUgZm9yIHRoZSBzZWNvbmQgcGFydHkuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24uXG4gKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLCBlLmcuIGBcIm1cImAgb3IgYFwibS8wLzBcImAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlVGlsbFJvdW5kKFxuICByb3VuZDogbnVtYmVyLFxuICBwYXJ0eTFEc2c6IERTRyxcbiAgcGFydHkyRHNnOiBEU0csXG4gIGtleVNoYXJlMTogQnVmZmVyLFxuICBrZXlTaGFyZTI6IEJ1ZmZlcixcbiAgbWVzc2FnZTogQnVmZmVyLFxuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nXG4pOiBEZXNlcmlhbGl6ZWRNZXNzYWdlc1tdIHwgQnVmZmVyIHtcbiAgaWYgKHJvdW5kIDwgMSB8fCByb3VuZCA+IDMpIHtcbiAgICB0aHJvdyBFcnJvcignSW52YWxpZCByb3VuZCBudW1iZXInKTtcbiAgfVxuICBwYXJ0eTFEc2cuaW5pdERzZyhrZXlTaGFyZTEsIG1lc3NhZ2UsIGRlcml2YXRpb25QYXRoLCBwYXJ0eTJEc2cuZ2V0UGFydHlJZHgoKSk7XG4gIHBhcnR5MkRzZy5pbml0RHNnKGtleVNoYXJlMiwgbWVzc2FnZSwgZGVyaXZhdGlvblBhdGgsIHBhcnR5MURzZy5nZXRQYXJ0eUlkeCgpKTtcbiAgY29uc3QgcGFydHkxUm91bmQwTWVzc2FnZSA9IHBhcnR5MURzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgY29uc3QgcGFydHkyUm91bmQwTWVzc2FnZSA9IHBhcnR5MkRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICBjb25zdCBbcGFydHkyUm91bmQxTWVzc2FnZXNdID0gcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kME1lc3NhZ2UsIHBhcnR5MlJvdW5kME1lc3NhZ2VdKTtcbiAgY29uc3QgW3BhcnR5MVJvdW5kMU1lc3NhZ2VzXSA9IHBhcnR5MURzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtwYXJ0eTFSb3VuZDBNZXNzYWdlLCBwYXJ0eTJSb3VuZDBNZXNzYWdlXSk7XG4gIGlmIChyb3VuZCA9PT0gMSkgcmV0dXJuIFtbcGFydHkxUm91bmQxTWVzc2FnZXNdLCBbcGFydHkyUm91bmQxTWVzc2FnZXNdXTtcblxuICBjb25zdCBbcGFydHkxUm91bmQyTWVzc2FnZXNdID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kMU1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDFNZXNzYWdlc10pO1xuICBjb25zdCBbcGFydHkyUm91bmQyTWVzc2FnZXNdID0gcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kMU1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDFNZXNzYWdlc10pO1xuICBpZiAocm91bmQgPT09IDIpIHJldHVybiBbW3BhcnR5MVJvdW5kMk1lc3NhZ2VzXSwgW3BhcnR5MlJvdW5kMk1lc3NhZ2VzXV07XG5cbiAgcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kMk1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDJNZXNzYWdlc10pO1xuICBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQyTWVzc2FnZXMsIHBhcnR5MlJvdW5kMk1lc3NhZ2VzXSk7XG5cbiAgYXNzZXJ0KHBhcnR5MURzZy5nZXRTaWduYXR1cmUoKS50b1N0cmluZygnaGV4JykgPT09IHBhcnR5MkRzZy5nZXRTaWduYXR1cmUoKS50b1N0cmluZygnaGV4JykpO1xuICByZXR1cm4gcGFydHkxRHNnLmdldFNpZ25hdHVyZSgpO1xufVxuIl19
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWRkc2EtbXBzL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFZQSxrQ0FHQztBQXdCRCw4REFzQ0M7QUFjRCw0Q0E4QkM7QUF6SEQsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixtREFBK0M7QUFDL0MsK0JBQTRCO0FBSTVCOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsTUFBb0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFELE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQWE7SUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBV0QsU0FBUyxZQUFZLENBQUMsSUFBd0I7SUFDNUMsSUFBQSxnQkFBTSxFQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUN0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QVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUMvRSxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFFL0UsSUFBQSxnQkFBTSxFQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlGLE9BQU8sU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyB4MjU1MTkgfSBmcm9tICdAbm9ibGUvY3VydmVzL2VkMjU1MTknO1xuaW1wb3J0IHsgREtHIH0gZnJvbSAnLi9ka2cnO1xuaW1wb3J0IHsgRFNHIH0gZnJvbSAnLi9kc2cnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZXMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgbXVsdGlwbGUgVWludDhBcnJheSBpbnN0YW5jZXMgaW50byBhIHNpbmdsZSBVaW50OEFycmF5XG4gKiBAcGFyYW0gY2h1bmtzIC0gQXJyYXkgb2YgVWludDhBcnJheSBpbnN0YW5jZXMgdG8gY29uY2F0ZW5hdGVcbiAqIEByZXR1cm5zIENvbmNhdGVuYXRlZCBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRCeXRlcyhjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBidWZmZXJzID0gY2h1bmtzLm1hcCgoY2h1bmspID0+IEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVYMjU1MTlLZXlwYWlyKHNlZWQ/OiBCdWZmZXIpOiB7IHByaXZLZXk6IEJ1ZmZlcjsgcHViS2V5OiBCdWZmZXIgfSB7XG4gIGNvbnN0IHByaXZLZXkgPSBzZWVkID8gc2VlZC5zdWJhcnJheSgwLCAzMikgOiBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpO1xuICBjb25zdCBwdWJLZXkgPSBCdWZmZXIuZnJvbSh4MjU1MTkuZ2V0UHVibGljS2V5KHByaXZLZXkpKTtcbiAgcmV0dXJuIHsgcHJpdktleTogQnVmZmVyLmZyb20ocHJpdktleSksIHB1YktleSB9O1xufVxuXG4vKipcbiAqIFBlci1wYXJ0eSBkZXRlcm1pbmlzdGljIHNlZWQgbWF0ZXJpYWwuIFRvIHVzZSB0aGUgc2FtZSBzZWVkIGZvciBib3RoLCBwYXNzIGl0IGFzIGJvdGggZmllbGRzLlxuICogYGVuY0tleWAgc2VlZHMgdGhlIFgyNTUxOSBlbmNyeXB0aW9uIGtleTsgYGRrZ1NlZWRgIHNlZWRzIERLRyByb3VuZCAwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkRHNhREtHUGFydHlTZWVkIHtcbiAgZW5jS2V5PzogQnVmZmVyO1xuICBka2dTZWVkPzogQnVmZmVyO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNlZWQoc2VlZD86IEVkRHNhREtHUGFydHlTZWVkKTogRWREc2FES0dQYXJ0eVNlZWQge1xuICBhc3NlcnQoIXNlZWQ/LmVuY0tleSB8fCBzZWVkLmVuY0tleS5sZW5ndGggPj0gMzIsICdlbmNLZXkgbXVzdCBiZSBhdCBsZWFzdCAzMiBieXRlcycpO1xuICBhc3NlcnQoIXNlZWQ/LmRrZ1NlZWQgfHwgc2VlZC5ka2dTZWVkLmxlbmd0aCA+PSAzMiwgJ2RrZ1NlZWQgbXVzdCBiZSBhdCBsZWFzdCAzMiBieXRlcycpO1xuICByZXR1cm4gc2VlZCA/PyB7fTtcbn1cblxuLyoqIFNlZSBgRWREc2FES0dQYXJ0eVNlZWRgLiBNaXJyb3JzIGBEa2xzVXRpbHMuZ2VuZXJhdGVES0dLZXlTaGFyZXNgIGZvciBFQ0RTQSBES0xTLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWREc2FES0dLZXlTaGFyZXMoXG4gIHNlZWRVc2VyPzogRWREc2FES0dQYXJ0eVNlZWQsXG4gIHNlZWRCYWNrdXA/OiBFZERzYURLR1BhcnR5U2VlZCxcbiAgc2VlZEJpdGdvPzogRWREc2FES0dQYXJ0eVNlZWRcbik6IFByb21pc2U8W0RLRywgREtHLCBES0ddPiB7XG4gIGNvbnN0IHsgZW5jS2V5OiB1c2VyRW5jS2V5LCBka2dTZWVkOiB1c2VyRGtnU2VlZCB9ID0gdmFsaWRhdGVTZWVkKHNlZWRVc2VyKTtcbiAgY29uc3QgeyBlbmNLZXk6IGJhY2t1cEVuY0tleSwgZGtnU2VlZDogYmFja3VwRGtnU2VlZCB9ID0gdmFsaWRhdGVTZWVkKHNlZWRCYWNrdXApO1xuICBjb25zdCB7IGVuY0tleTogYml0Z29FbmNLZXksIGRrZ1NlZWQ6IGJpdGdvRGtnU2VlZCB9ID0gdmFsaWRhdGVTZWVkKHNlZWRCaXRnbyk7XG5cbiAgY29uc3QgdXNlciA9IG5ldyBES0coMywgMiwgMCk7XG4gIGNvbnN0IGJhY2t1cCA9IG5ldyBES0coMywgMiwgMSk7XG4gIGNvbnN0IGJpdGdvID0gbmV3IERLRygzLCAyLCAyKTtcblxuICBjb25zdCB1c2VyS1AgPSBnZW5lcmF0ZVgyNTUxOUtleXBhaXIodXNlckVuY0tleSk7XG4gIGNvbnN0IGJhY2t1cEtQID0gZ2VuZXJhdGVYMjU1MTlLZXlwYWlyKGJhY2t1cEVuY0tleSk7XG4gIGNvbnN0IGJpdGdvS1AgPSBnZW5lcmF0ZVgyNTUxOUtleXBhaXIoYml0Z29FbmNLZXkpO1xuXG4gIGF3YWl0IHVzZXIuaW5pdERrZyh1c2VyS1AucHJpdktleSwgW2JhY2t1cEtQLnB1YktleSwgYml0Z29LUC5wdWJLZXldKTtcbiAgYXdhaXQgYmFja3VwLmluaXREa2coYmFja3VwS1AucHJpdktleSwgW3VzZXJLUC5wdWJLZXksIGJpdGdvS1AucHViS2V5XSk7XG4gIGF3YWl0IGJpdGdvLmluaXREa2coYml0Z29LUC5wcml2S2V5LCBbdXNlcktQLnB1YktleSwgYmFja3VwS1AucHViS2V5XSk7XG5cbiAgY29uc3QgcjFNZXNzYWdlcyA9IFtcbiAgICB1c2VyLmdldEZpcnN0TWVzc2FnZSh1c2VyRGtnU2VlZCksXG4gICAgYmFja3VwLmdldEZpcnN0TWVzc2FnZShiYWNrdXBEa2dTZWVkKSxcbiAgICBiaXRnby5nZXRGaXJzdE1lc3NhZ2UoYml0Z29Ea2dTZWVkKSxcbiAgXTtcblxuICBjb25zdCByMk1lc3NhZ2VzID0gW1xuICAgIC4uLnVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMU1lc3NhZ2VzKSxcbiAgICAuLi5iYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMU1lc3NhZ2VzKSxcbiAgICAuLi5iaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHIxTWVzc2FnZXMpLFxuICBdO1xuXG4gIHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyMk1lc3NhZ2VzKTtcbiAgYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjJNZXNzYWdlcyk7XG4gIGJpdGdvLmhhbmRsZUluY29taW5nTWVzc2FnZXMocjJNZXNzYWdlcyk7XG5cbiAgcmV0dXJuIFt1c2VyLCBiYWNrdXAsIGJpdGdvXTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0d28gRFNHIHBhcnRpZXMgYW5kIGRyaXZlcyB0aGVtIHRocm91Z2ggdGhlIHByb3RvY29sIHVudGlsIHRoZSBzcGVjaWZpZWQgcm91bmQuXG4gKlxuICogQHBhcmFtIHJvdW5kIC0gUm91bmQgdG8gZXhlY3V0ZSB1bnRpbCAoMeKAkzMpLiBSZXR1cm5zIGludGVybWVkaWF0ZSBtZXNzYWdlIGFycmF5cyBmb3IgMeKAkzIsXG4gKiAgIG9yIHRoZSA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIEJ1ZmZlciBmb3IgMy5cbiAqIEBwYXJhbSBwYXJ0eTFEc2cgLSBGaXJzdCBEU0cgcGFydHkgKGBuZXcgRFNHKHBhcnR5SWR4KWApLCBub3QgeWV0IGluaXRpYWxpemVkLlxuICogQHBhcmFtIHBhcnR5MkRzZyAtIFNlY29uZCBEU0cgcGFydHkgKGBuZXcgRFNHKHBhcnR5SWR4KWApLCBub3QgeWV0IGluaXRpYWxpemVkLlxuICogQHBhcmFtIGtleVNoYXJlMSAtIEtleSBzaGFyZSBmb3IgdGhlIGZpcnN0IHBhcnR5LlxuICogQHBhcmFtIGtleVNoYXJlMiAtIEtleSBzaGFyZSBmb3IgdGhlIHNlY29uZCBwYXJ0eS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gUmF3IG1lc3NhZ2UgYnl0ZXMgdG8gc2lnbi5cbiAqIEBwYXJhbSBkZXJpdmF0aW9uUGF0aCAtIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGgsIGUuZy4gYFwibVwiYCBvciBgXCJtLzAvMFwiYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVUaWxsUm91bmQoXG4gIHJvdW5kOiBudW1iZXIsXG4gIHBhcnR5MURzZzogRFNHLFxuICBwYXJ0eTJEc2c6IERTRyxcbiAga2V5U2hhcmUxOiBCdWZmZXIsXG4gIGtleVNoYXJlMjogQnVmZmVyLFxuICBtZXNzYWdlOiBCdWZmZXIsXG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmdcbik6IFByb21pc2U8RGVzZXJpYWxpemVkTWVzc2FnZXNbXSB8IEJ1ZmZlcj4ge1xuICBpZiAocm91bmQgPCAxIHx8IHJvdW5kID4gMykge1xuICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHJvdW5kIG51bWJlcicpO1xuICB9XG4gIGF3YWl0IHBhcnR5MURzZy5pbml0RHNnKGtleVNoYXJlMSwgbWVzc2FnZSwgZGVyaXZhdGlvblBhdGgsIHBhcnR5MkRzZy5nZXRQYXJ0eUlkeCgpKTtcbiAgYXdhaXQgcGFydHkyRHNnLmluaXREc2coa2V5U2hhcmUyLCBtZXNzYWdlLCBkZXJpdmF0aW9uUGF0aCwgcGFydHkxRHNnLmdldFBhcnR5SWR4KCkpO1xuICBjb25zdCBwYXJ0eTFSb3VuZDBNZXNzYWdlID0gcGFydHkxRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICBjb25zdCBwYXJ0eTJSb3VuZDBNZXNzYWdlID0gcGFydHkyRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gIGNvbnN0IFtwYXJ0eTJSb3VuZDFNZXNzYWdlc10gPSBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQwTWVzc2FnZSwgcGFydHkyUm91bmQwTWVzc2FnZV0pO1xuICBjb25zdCBbcGFydHkxUm91bmQxTWVzc2FnZXNdID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3BhcnR5MVJvdW5kME1lc3NhZ2UsIHBhcnR5MlJvdW5kME1lc3NhZ2VdKTtcbiAgaWYgKHJvdW5kID09PSAxKSByZXR1cm4gW1twYXJ0eTFSb3VuZDFNZXNzYWdlc10sIFtwYXJ0eTJSb3VuZDFNZXNzYWdlc11dO1xuXG4gIGNvbnN0IFtwYXJ0eTFSb3VuZDJNZXNzYWdlc10gPSBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQxTWVzc2FnZXMsIHBhcnR5MlJvdW5kMU1lc3NhZ2VzXSk7XG4gIGNvbnN0IFtwYXJ0eTJSb3VuZDJNZXNzYWdlc10gPSBwYXJ0eTJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQxTWVzc2FnZXMsIHBhcnR5MlJvdW5kMU1lc3NhZ2VzXSk7XG4gIGlmIChyb3VuZCA9PT0gMikgcmV0dXJuIFtbcGFydHkxUm91bmQyTWVzc2FnZXNdLCBbcGFydHkyUm91bmQyTWVzc2FnZXNdXTtcblxuICBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcGFydHkxUm91bmQyTWVzc2FnZXMsIHBhcnR5MlJvdW5kMk1lc3NhZ2VzXSk7XG4gIHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtwYXJ0eTFSb3VuZDJNZXNzYWdlcywgcGFydHkyUm91bmQyTWVzc2FnZXNdKTtcblxuICBhc3NlcnQocGFydHkxRHNnLmdldFNpZ25hdHVyZSgpLnRvU3RyaW5nKCdoZXgnKSA9PT0gcGFydHkyRHNnLmdldFNpZ25hdHVyZSgpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIHJldHVybiBwYXJ0eTFEc2cuZ2V0U2lnbmF0dXJlKCk7XG59XG4iXX0=