@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.451 → 8.2.1-alpha.453

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.
@@ -10,7 +10,7 @@ import { DeserializedMessage, DeserializedMessages, DkgState } from './types';
10
10
  * ```typescript
11
11
  * const dkg = new DKG(3, 2, 0);
12
12
  * // X25519 keys come from GPG encryption subkeys (extracted by the orchestrator)
13
- * dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
13
+ * await dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
14
14
  * const msg1 = dkg.getFirstMessage();
15
15
  * const msg2s = dkg.handleIncomingMessages(allThreeMsg1s);
16
16
  * dkg.handleIncomingMessages(allThreeMsg2s); // completes DKG
@@ -33,8 +33,12 @@ export declare class DKG {
33
33
  private sharePk;
34
34
  /** 32-byte chain code from round2 */
35
35
  private shareChaincode;
36
+ /** Lazily loaded WASM module */
37
+ private wasmMps;
36
38
  protected dkgState: DkgState;
37
39
  constructor(n: number, t: number, partyIdx: number);
40
+ private loadWasmMps;
41
+ private getWasmMps;
38
42
  getState(): DkgState;
39
43
  /**
40
44
  * Initialises the DKG session with this party's X25519 private key and the other parties'
@@ -44,7 +48,7 @@ export declare class DKG {
44
48
  * @param otherEncPublicKeys - Other parties' 32-byte X25519 public keys, sorted by ascending
45
49
  * party index (excluding own). For a 3-party setup, this is [party_A_pub, party_B_pub].
46
50
  */
47
- initDkg(decryptionKey: Buffer, otherEncPublicKeys: Buffer[]): void;
51
+ initDkg(decryptionKey: Buffer, otherEncPublicKeys: Buffer[]): Promise<void>;
48
52
  /**
49
53
  * Runs round0 of the DKG protocol. Returns this party's broadcast message.
50
54
  * Stores the round state bytes internally for the next round.
@@ -1 +1 @@
1
- {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dkg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAEpG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAuB;IAC5C,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAyB;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAuB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAuB;IAE7C,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMlD,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,IAAI;IAgBlE;;;;;OAKG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAkBtD;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAqDvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAU5B;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOtC"}
1
+ {"version":3,"file":"dkg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dkg.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAwB,MAAM,SAAS,CAAC;AAMpG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAAuB;IAC5C,mGAAmG;IACnG,OAAO,CAAC,YAAY,CAAyB;IAC7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAuB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAuB;IAC7C,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;YAMpC,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;OAOG;IACG,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjF;;;;;OAKG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAmBtD;;;;;;;;;;;OAWG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAuDvF;;;OAGG;IACH,WAAW,IAAI,MAAM;IAOrB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAO3B;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAU5B;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAOtC"}
@@ -1,10 +1,42 @@
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.DKG = void 0;
7
- const wasm_mps_1 = require("@bitgo/wasm-mps");
8
40
  const cbor_x_1 = require("cbor-x");
9
41
  const crypto_1 = __importDefault(require("crypto"));
10
42
  const types_1 = require("./types");
@@ -19,7 +51,7 @@ const types_1 = require("./types");
19
51
  * ```typescript
20
52
  * const dkg = new DKG(3, 2, 0);
21
53
  * // X25519 keys come from GPG encryption subkeys (extracted by the orchestrator)
22
- * dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
54
+ * await dkg.initDkg(myX25519PrivKey, [otherParty1X25519PubKey, otherParty2X25519PubKey]);
23
55
  * const msg1 = dkg.getFirstMessage();
24
56
  * const msg2s = dkg.handleIncomingMessages(allThreeMsg1s);
25
57
  * dkg.handleIncomingMessages(allThreeMsg2s); // completes DKG
@@ -40,11 +72,37 @@ class DKG {
40
72
  this.sharePk = null;
41
73
  /** 32-byte chain code from round2 */
42
74
  this.shareChaincode = null;
75
+ /** Lazily loaded WASM module */
76
+ this.wasmMps = null;
43
77
  this.dkgState = types_1.DkgState.Uninitialized;
44
78
  this.n = n;
45
79
  this.t = t;
46
80
  this.partyIdx = partyIdx;
47
81
  }
82
+ async loadWasmMps() {
83
+ if (!this.wasmMps) {
84
+ if (typeof window !== 'undefined' &&
85
+ /* checks for electron processes */
86
+ !window.process &&
87
+ !window.process?.['type']) {
88
+ // Browser: web build has explicit init() — guaranteed ready after await
89
+ // eslint-disable-next-line import/no-internal-modules -- @bitgo/wasm-mps exposes environment-specific subpath exports.
90
+ const webWasm = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps/web')));
91
+ await webWasm.default();
92
+ this.wasmMps = webWasm;
93
+ }
94
+ else {
95
+ // Node.js: dynamic import() rewritten to require() by tsc → CJS build → readFileSync
96
+ this.wasmMps = await Promise.resolve().then(() => __importStar(require('@bitgo/wasm-mps')));
97
+ }
98
+ }
99
+ }
100
+ getWasmMps() {
101
+ if (!this.wasmMps) {
102
+ throw Error('WASM module not loaded');
103
+ }
104
+ return this.wasmMps;
105
+ }
48
106
  getState() {
49
107
  return this.dkgState;
50
108
  }
@@ -56,7 +114,8 @@ class DKG {
56
114
  * @param otherEncPublicKeys - Other parties' 32-byte X25519 public keys, sorted by ascending
57
115
  * party index (excluding own). For a 3-party setup, this is [party_A_pub, party_B_pub].
58
116
  */
59
- initDkg(decryptionKey, otherEncPublicKeys) {
117
+ async initDkg(decryptionKey, otherEncPublicKeys) {
118
+ await this.loadWasmMps();
60
119
  if (!decryptionKey || decryptionKey.length !== 32) {
61
120
  throw Error('Missing or invalid decryption key: must be 32 bytes');
62
121
  }
@@ -81,9 +140,10 @@ class DKG {
81
140
  throw Error('DKG session not initialized');
82
141
  }
83
142
  const seed = dkgSeed ?? crypto_1.default.randomBytes(32);
143
+ const wasm = this.getWasmMps();
84
144
  let result;
85
145
  try {
86
- result = (0, wasm_mps_1.ed25519_dkg_round0_process)(this.partyIdx, this.decryptionKey, this.otherPubKeys, seed);
146
+ result = wasm.ed25519_dkg_round0_process(this.partyIdx, this.decryptionKey, this.otherPubKeys, seed);
87
147
  }
88
148
  catch (err) {
89
149
  throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
@@ -122,10 +182,11 @@ class DKG {
122
182
  .filter((m) => m.from !== this.partyIdx)
123
183
  .sort((a, b) => a.from - b.from)
124
184
  .map((m) => m.payload);
185
+ const wasm = this.getWasmMps();
125
186
  if (this.dkgState === types_1.DkgState.WaitMsg1) {
126
187
  let result;
127
188
  try {
128
- result = (0, wasm_mps_1.ed25519_dkg_round1_process)(otherMsgs, this.dkgStateBytes);
189
+ result = wasm.ed25519_dkg_round1_process(otherMsgs, this.dkgStateBytes);
129
190
  }
130
191
  catch (err) {
131
192
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${err}`);
@@ -138,7 +199,7 @@ class DKG {
138
199
  if (this.dkgState === types_1.DkgState.WaitMsg2) {
139
200
  let share;
140
201
  try {
141
- share = (0, wasm_mps_1.ed25519_dkg_round2_process)(otherMsgs, this.dkgStateBytes);
202
+ share = wasm.ed25519_dkg_round2_process(otherMsgs, this.dkgStateBytes);
142
203
  }
143
204
  catch (err) {
144
205
  throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dkgState}: ${err}`);
@@ -225,4 +286,4 @@ class DKG {
225
286
  }
226
287
  }
227
288
  exports.DKG = DKG;
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZGtnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhDQUFxSDtBQUNySCxtQ0FBZ0M7QUFDaEMsb0RBQTRCO0FBQzVCLG1DQUFvRztBQUVwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLEdBQUc7SUFvQmQsWUFBWSxDQUFTLEVBQUUsQ0FBUyxFQUFFLFFBQWdCO1FBZmxELHNEQUFzRDtRQUM5QyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDNUMsbUdBQW1HO1FBQzNGLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUM3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHFEQUFxRDtRQUM3QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2Q0FBNkM7UUFDckMsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdEMscUNBQXFDO1FBQzdCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUVuQyxhQUFRLEdBQWEsZ0JBQVEsQ0FBQyxhQUFhLENBQUM7UUFHcEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLGFBQXFCLEVBQUUsa0JBQTRCO1FBQ3pELElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLElBQUksa0JBQWtCLENB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ZTtRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsWUFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0SCxDQUFDO0NBQ0Y7QUEzTkQsa0JBMk5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZWQyNTUxOV9ka2dfcm91bmQwX3Byb2Nlc3MsIGVkMjU1MTlfZGtnX3JvdW5kMV9wcm9jZXNzLCBlZDI1NTE5X2RrZ19yb3VuZDJfcHJvY2VzcyB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERrZ1N0YXRlLCBFZGRzYVJlZHVjZWRLZXlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVkRFNBIERpc3RyaWJ1dGVkIEtleSBHZW5lcmF0aW9uIChES0cpIGltcGxlbWVudGF0aW9uIHVzaW5nIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCByb3VuZCBmdW5jdGlvbiByZXR1cm5zIGB7IG1zZywgc3RhdGUgfWAgYnl0ZXMuXG4gKiBUaGUgc3RhdGUgYnl0ZXMgYXJlIHN0b3JlZCBiZXR3ZWVuIHJvdW5kcyBhbmQgcGFzc2VkIHRvIHRoZSBuZXh0IHJvdW5kIGZ1bmN0aW9uLFxuICogbWlycm9yaW5nIHRoZSBzZXJ2ZXItc2lkZSBwZXJzaXN0ZW5jZSBwYXR0ZXJuIChzdGF0ZSB3b3VsZCBiZSBzZXJpYWxpc2VkIHRvIERCKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGtnID0gbmV3IERLRygzLCAyLCAwKTtcbiAqIC8vIFgyNTUxOSBrZXlzIGNvbWUgZnJvbSBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzIChleHRyYWN0ZWQgYnkgdGhlIG9yY2hlc3RyYXRvcilcbiAqIGRrZy5pbml0RGtnKG15WDI1NTE5UHJpdktleSwgW290aGVyUGFydHkxWDI1NTE5UHViS2V5LCBvdGhlclBhcnR5MlgyNTUxOVB1YktleV0pO1xuICogY29uc3QgbXNnMSA9IGRrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAqIGNvbnN0IG1zZzJzID0gZGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoYWxsVGhyZWVNc2cxcyk7XG4gKiBka2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhhbGxUaHJlZU1zZzJzKTsgIC8vIGNvbXBsZXRlcyBES0dcbiAqIGNvbnN0IGtleVNoYXJlID0gZGtnLmdldEtleVNoYXJlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERLRyB7XG4gIHByb3RlY3RlZCBuOiBudW1iZXI7XG4gIHByb3RlY3RlZCB0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuXG4gIC8qKiBQcml2YXRlIFgyNTUxOSBrZXkgKGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5KSAqL1xuICBwcml2YXRlIGRlY3J5cHRpb25LZXk6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogT3RoZXIgcGFydGllcycgWDI1NTE5IHB1YmxpYyBrZXlzIChmcm9tIHRoZWlyIEdQRyBlbmNyeXB0aW9uIHN1YmtleXMpLCBzb3J0ZWQgYnkgcGFydHkgaW5kZXggKi9cbiAgcHJpdmF0ZSBvdGhlclB1YktleXM6IEJ1ZmZlcltdIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTZXJpYWxpc2VkIHJvdW5kIHN0YXRlIGJ5dGVzIHJldHVybmVkIGJ5IHRoZSBwcmV2aW91cyByb3VuZCBmdW5jdGlvbiAqL1xuICBwcml2YXRlIGRrZ1N0YXRlQnl0ZXM6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogT3BhcXVlIGJpbmNvZGUtc2VyaWFsaXNlZCBrZXlzaGFyZSBmcm9tIHJvdW5kMiAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIDMyLWJ5dGUgRWQyNTUxOSBwdWJsaWMga2V5IGZyb20gcm91bmQyICovXG4gIHByaXZhdGUgc2hhcmVQazogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiAzMi1ieXRlIGNoYWluIGNvZGUgZnJvbSByb3VuZDIgKi9cbiAgcHJpdmF0ZSBzaGFyZUNoYWluY29kZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGRrZ1N0YXRlOiBEa2dTdGF0ZSA9IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQ7XG5cbiAgY29uc3RydWN0b3IobjogbnVtYmVyLCB0OiBudW1iZXIsIHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMudCA9IHQ7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogRGtnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRrZ1N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBES0cgc2Vzc2lvbiB3aXRoIHRoaXMgcGFydHkncyBYMjU1MTkgcHJpdmF0ZSBrZXkgYW5kIHRoZSBvdGhlciBwYXJ0aWVzJ1xuICAgKiBYMjU1MTkgcHVibGljIGtleXMuIEtleXMgYXJlIGV4dHJhY3RlZCBmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleXMgYnkgdGhlIG9yY2hlc3RyYXRvci5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRpb25LZXkgLSBUaGlzIHBhcnR5J3MgMzItYnl0ZSBYMjU1MTkgcHJpdmF0ZSBrZXkgKEdQRyBlbmMgc3Via2V5IHByaXZhdGUgcGFydCkuXG4gICAqIEBwYXJhbSBvdGhlckVuY1B1YmxpY0tleXMgLSBPdGhlciBwYXJ0aWVzJyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5cywgc29ydGVkIGJ5IGFzY2VuZGluZ1xuICAgKiAgIHBhcnR5IGluZGV4IChleGNsdWRpbmcgb3duKS4gRm9yIGEgMy1wYXJ0eSBzZXR1cCwgdGhpcyBpcyBbcGFydHlfQV9wdWIsIHBhcnR5X0JfcHViXS5cbiAgICovXG4gIGluaXREa2coZGVjcnlwdGlvbktleTogQnVmZmVyLCBvdGhlckVuY1B1YmxpY0tleXM6IEJ1ZmZlcltdKTogdm9pZCB7XG4gICAgaWYgKCFkZWNyeXB0aW9uS2V5IHx8IGRlY3J5cHRpb25LZXkubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBkZWNyeXB0aW9uIGtleTogbXVzdCBiZSAzMiBieXRlcycpO1xuICAgIH1cbiAgICBpZiAoIW90aGVyRW5jUHVibGljS2V5cyB8fCBvdGhlckVuY1B1YmxpY0tleXMubGVuZ3RoICE9PSB0aGlzLm4gLSAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRXhwZWN0ZWQgJHt0aGlzLm4gLSAxfSBvdGhlciBwYXJ0aWVzJyBwdWJsaWMga2V5c2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy50ID4gdGhpcy5uIHx8IHRoaXMucGFydHlJZHggPj0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBwYXJhbWV0ZXJzIGZvciBES0cnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlY3J5cHRpb25LZXkgPSBkZWNyeXB0aW9uS2V5O1xuICAgIHRoaXMub3RoZXJQdWJLZXlzID0gb3RoZXJFbmNQdWJsaWNLZXlzO1xuICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Jbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm91bmQwIG9mIHRoZSBES0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlLlxuICAgKiBTdG9yZXMgdGhlIHJvdW5kIHN0YXRlIGJ5dGVzIGludGVybmFsbHkgZm9yIHRoZSBuZXh0IHJvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0gZGtnU2VlZCAtIE9wdGlvbmFsIDMyLWJ5dGUgc2VlZCBmb3IgZGV0ZXJtaW5pc3RpYyBES0cgb3V0cHV0ICh0ZXN0aW5nIG9ubHkpLlxuICAgKi9cbiAgZ2V0Rmlyc3RNZXNzYWdlKGRrZ1NlZWQ/OiBCdWZmZXIpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5ka2dTdGF0ZSAhPT0gRGtnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZWQgPSBka2dTZWVkID8/IGNyeXB0by5yYW5kb21CeXRlcygzMik7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZWQyNTUxOV9ka2dfcm91bmQwX3Byb2Nlc3ModGhpcy5wYXJ0eUlkeCwgdGhpcy5kZWNyeXB0aW9uS2V5ISwgdGhpcy5vdGhlclB1YktleXMhLCBzZWVkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5XYWl0TXNnMTtcbiAgICByZXR1cm4geyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbWVzc2FnZXMgZnJvbSBhbGwgcGFydGllcyBhbmQgYWR2YW5jZXMgdGhlIHByb3RvY29sLlxuICAgKlxuICAgKiAtIEluIFdhaXRNc2cxOiBydW5zIHJvdW5kMSwgcmV0dXJucyB0aGlzIHBhcnR5J3Mgcm91bmQxIGJyb2FkY2FzdCBtZXNzYWdlLlxuICAgKiAtIEluIFdhaXRNc2cyOiBydW5zIHJvdW5kMiwgY29tcGxldGVzIERLRywgcmV0dXJucyBbXS5cbiAgICpcbiAgICogVGhlIGNhbGxlciBwYXNzZXMgYWxsIG4gbWVzc2FnZXMgKGluY2x1ZGluZyBvd24pOyBvd24gbWVzc2FnZSBpcyBmaWx0ZXJlZFxuICAgKiBvdXQgaW50ZXJuYWxseS4gT3RoZXIgcGFydGllcycgbWVzc2FnZXMgYXJlIHNvcnRlZCBieSBhc2NlbmRpbmcgcGFydHkgaW5kZXgsXG4gICAqIG1hdGNoaW5nIHRoZSBvcmRlcmluZyBleHBlY3RlZCBieSBAYml0Z28vd2FzbS1tcHMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlc0Zvckl0aFJvdW5kIC0gQWxsIG4gbWVzc2FnZXMgZm9yIHRoaXMgcm91bmQgKGluY2x1ZGluZyBvd24pLlxuICAgKi9cbiAgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlc0Zvckl0aFJvdW5kOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBhbHJlYWR5IGNvbXBsZXRlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdES0cgc2Vzc2lvbiBtdXN0IGNhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgYmVmb3JlIGhhbmRsaW5nIGluY29taW5nIG1lc3NhZ2VzLiBDYWxsIGdldEZpcnN0TWVzc2FnZSgpIGZpcnN0LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlc0Zvckl0aFJvdW5kLmxlbmd0aCAhPT0gdGhpcy5uKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSByb3VuZC4gTnVtYmVyIG9mIG1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbCB0byBOJyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBvdGhlciBwYXJ0aWVzJyBtZXNzYWdlcywgc29ydGVkIGJ5IHBhcnR5IGluZGV4IChhc2NlbmRpbmcpXG4gICAgY29uc3Qgb3RoZXJNc2dzID0gbWVzc2FnZXNGb3JJdGhSb3VuZFxuICAgICAgLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSlcbiAgICAgIC5tYXAoKG0pID0+IG0ucGF5bG9hZCk7XG5cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBlZDI1NTE5X2RrZ19yb3VuZDFfcHJvY2VzcyhvdGhlck1zZ3MsIHRoaXMuZGtnU3RhdGVCeXRlcyEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZGtnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIG5ldyBzdGF0ZTsgdGhpcyBpcyB3aGF0IHdvdWxkIGJlIHBlcnNpc3RlZCB0byBEQiBiZXR3ZWVuIEFQSSByb3VuZHNcbiAgICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuV2FpdE1zZzI7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLldhaXRNc2cyKSB7XG4gICAgICBsZXQgc2hhcmU7XG4gICAgICB0cnkge1xuICAgICAgICBzaGFyZSA9IGVkMjU1MTlfZGtnX3JvdW5kMl9wcm9jZXNzKG90aGVyTXNncywgdGhpcy5ka2dTdGF0ZUJ5dGVzISk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5ka2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHNoYXJlLnNoYXJlKTtcbiAgICAgIHRoaXMuc2hhcmVQayA9IEJ1ZmZlci5mcm9tKHNoYXJlLnBrKTtcbiAgICAgIHRoaXMuc2hhcmVDaGFpbmNvZGUgPSBCdWZmZXIuZnJvbShzaGFyZS5jaGFpbmNvZGUpO1xuICAgICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBES0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIGtleXNoYXJlIHByb2R1Y2VkIGJ5IHJvdW5kMi5cbiAgICogVGhpcyBpcyB1c2VkIGFzIGlucHV0IHRvIHRoZSBzaWduaW5nIHByb3RvY29sLlxuICAgKi9cbiAgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMua2V5U2hhcmUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgMzItYnl0ZSBFZDI1NTE5IHB1YmxpYyBrZXkgYWdyZWVkIGJ5IGFsbCBwYXJ0aWVzIGR1cmluZyBES0cuXG4gICAqL1xuICBnZXRTaGFyZVB1YmxpY0tleSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaGFyZVBrKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYXJlUGs7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgMTI4LWNoYXIgaGV4IGNvbW1vbiBrZXljaGFpbjogNjQtY2hhciBwdWJsaWMga2V5ICsgNjQtY2hhciBjaGFpbiBjb2RlLlxuICAgKiBUaGlzIG1hdGNoZXMgdGhlIGZvcm1hdCBleHBlY3RlZCBieSBhZGRyZXNzIGRlcml2YXRpb24gKEVkZHNhLmRlcml2ZVVuaGFyZGVuZWQpLlxuICAgKi9cbiAgZ2V0Q29tbW9uS2V5Y2hhaW4oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVQayB8fCAhdGhpcy5zaGFyZUNoYWluY29kZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaGFyZVBrLnRvU3RyaW5nKCdoZXgnKSArIHRoaXMuc2hhcmVDaGFpbmNvZGUudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBDQk9SLWVuY29kZWQgcmVkdWNlZCByZXByZXNlbnRhdGlvbiBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5LlxuICAgKi9cbiAgZ2V0UmVkdWNlZEtleVNoYXJlKCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnNoYXJlUGspIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgcmVkdWNlZEtleVNoYXJlOiBFZGRzYVJlZHVjZWRLZXlTaGFyZSA9IHtcbiAgICAgIHB1YjogQXJyYXkuZnJvbSh0aGlzLnNoYXJlUGspLFxuICAgIH07XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGVuY29kZShyZWR1Y2VkS2V5U2hhcmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBjdXJyZW50IHNlc3Npb24gc3RhdGUgYXMgYSBKU09OIHN0cmluZyBmb3IgcGVyc2lzdGVuY2UuXG4gICAqIEluY2x1ZGVzOiByb3VuZCBzdGF0ZSBieXRlcywgY3VycmVudCBES0cgcm91bmQsIGRlY3J5cHRpb24ga2V5LCBvdGhlciBwYXJ0aWVzJyBwdWIga2V5cy5cbiAgICogVGhpcyBtaXJyb3JzIHdoYXQgYSBzZXJ2ZXIgd291bGQgc3RvcmUgaW4gYSBkYXRhYmFzZSBiZXR3ZWVuIEFQSSByb3VuZHMuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgPT09IERrZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRrZ1N0YXRlQnl0ZXM6IHRoaXMuZGtnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBka2dSb3VuZDogdGhpcy5ka2dTdGF0ZSxcbiAgICAgIGRlY3J5cHRpb25LZXk6IHRoaXMuZGVjcnlwdGlvbktleT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBvdGhlclB1YktleXM6IHRoaXMub3RoZXJQdWJLZXlzPy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2Jhc2U2NCcpKSA/PyBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIGEgcHJldmlvdXNseSBleHBvcnRlZCBzZXNzaW9uLiBBbGxvd3MgdGhlIHByb3RvY29sIHRvIGNvbnRpbnVlXG4gICAqIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYsIGFzIGlmIHRoZSByb3VuZCBzdGF0ZSB3YXMgbG9hZGVkIGZyb20gYSBkYXRhYmFzZS5cbiAgICovXG4gIHJlc3RvcmVTZXNzaW9uKHNlc3Npb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHNlc3Npb24pO1xuICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IGRhdGEuZGtnU3RhdGVCeXRlcyA/IEJ1ZmZlci5mcm9tKGRhdGEuZGtnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB0aGlzLmRrZ1N0YXRlID0gZGF0YS5ka2dSb3VuZDtcbiAgICB0aGlzLmRlY3J5cHRpb25LZXkgPSBkYXRhLmRlY3J5cHRpb25LZXkgPyBCdWZmZXIuZnJvbShkYXRhLmRlY3J5cHRpb25LZXksICdiYXNlNjQnKSA6IG51bGw7XG4gICAgdGhpcy5vdGhlclB1YktleXMgPSBkYXRhLm90aGVyUHViS2V5cyA/IChkYXRhLm90aGVyUHViS2V5cyBhcyBzdHJpbmdbXSkubWFwKChrKSA9PiBCdWZmZXIuZnJvbShrLCAnYmFzZTY0JykpIDogbnVsbDtcbiAgfVxufVxuIl19
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGtnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZGtnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLG1DQUFnQztBQUNoQyxvREFBNEI7QUFDNUIsbUNBQW9HO0FBTXBHOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsR0FBRztJQXNCZCxZQUFZLENBQVMsRUFBRSxDQUFTLEVBQUUsUUFBZ0I7UUFqQmxELHNEQUFzRDtRQUM5QyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDNUMsbUdBQW1HO1FBQzNGLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUM3QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLHFEQUFxRDtRQUM3QyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2Q0FBNkM7UUFDckMsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdEMscUNBQXFDO1FBQzdCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFtQixJQUFJLENBQUM7UUFFN0IsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUNFLE9BQU8sTUFBTSxLQUFLLFdBQVc7Z0JBQzdCLG1DQUFtQztnQkFDbkMsQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDZixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFDekIsQ0FBQztnQkFDRCx3RUFBd0U7Z0JBQ3hFLHVIQUF1SDtnQkFDdkgsTUFBTSxPQUFPLEdBQUcsd0RBQWEscUJBQXFCLEdBQUMsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixxRkFBcUY7Z0JBQ3JGLElBQUksQ0FBQyxPQUFPLEdBQUcsd0RBQWEsaUJBQWlCLEdBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFxQixFQUFFLGtCQUE0QjtRQUMvRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsT0FBZ0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLGdCQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLE1BQWdCLENBQUM7UUFDckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFjLEVBQUUsSUFBSSxDQUFDLFlBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsc0JBQXNCLENBQUMsbUJBQXlDO1FBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxDQUNULDBHQUEwRyxDQUMzRyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyxtRkFBbUYsQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CO2FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3ZDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFnQixDQUFDO1lBQ3JCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELDRFQUE0RTtZQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbEMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBWSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUF5QjtZQUM1QyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQzlCLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSxlQUFNLEVBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUk7WUFDN0QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO1lBQzdELFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUk7U0FDMUUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxZQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RILENBQUM7Q0FDRjtBQTVQRCxrQkE0UEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1zZ1N0YXRlLCBTaGFyZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIERrZ1N0YXRlLCBFZGRzYVJlZHVjZWRLZXlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5vZGVXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xudHlwZSBXYXNtTXBzID0gTm9kZVdhc21lciB8IFdlYldhc21lcjtcblxuLyoqXG4gKiBFZERTQSBEaXN0cmlidXRlZCBLZXkgR2VuZXJhdGlvbiAoREtHKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogU3RhdGUgaXMgZXhwbGljaXQ6IGVhY2ggcm91bmQgZnVuY3Rpb24gcmV0dXJucyBgeyBtc2csIHN0YXRlIH1gIGJ5dGVzLlxuICogVGhlIHN0YXRlIGJ5dGVzIGFyZSBzdG9yZWQgYmV0d2VlbiByb3VuZHMgYW5kIHBhc3NlZCB0byB0aGUgbmV4dCByb3VuZCBmdW5jdGlvbixcbiAqIG1pcnJvcmluZyB0aGUgc2VydmVyLXNpZGUgcGVyc2lzdGVuY2UgcGF0dGVybiAoc3RhdGUgd291bGQgYmUgc2VyaWFsaXNlZCB0byBEQikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRrZyA9IG5ldyBES0coMywgMiwgMCk7XG4gKiAvLyBYMjU1MTkga2V5cyBjb21lIGZyb20gR1BHIGVuY3J5cHRpb24gc3Via2V5cyAoZXh0cmFjdGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IpXG4gKiBhd2FpdCBka2cuaW5pdERrZyhteVgyNTUxOVByaXZLZXksIFtvdGhlclBhcnR5MVgyNTUxOVB1YktleSwgb3RoZXJQYXJ0eTJYMjU1MTlQdWJLZXldKTtcbiAqIGNvbnN0IG1zZzEgPSBka2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cycyA9IGRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKGFsbFRocmVlTXNnMXMpO1xuICogZGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoYWxsVGhyZWVNc2cycyk7ICAvLyBjb21wbGV0ZXMgREtHXG4gKiBjb25zdCBrZXlTaGFyZSA9IGRrZy5nZXRLZXlTaGFyZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBES0cge1xuICBwcm90ZWN0ZWQgbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcblxuICAvKiogUHJpdmF0ZSBYMjU1MTkga2V5IChmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleSkgKi9cbiAgcHJpdmF0ZSBkZWNyeXB0aW9uS2V5OiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE90aGVyIHBhcnRpZXMnIFgyNTUxOSBwdWJsaWMga2V5cyAoZnJvbSB0aGVpciBHUEcgZW5jcnlwdGlvbiBzdWJrZXlzKSwgc29ydGVkIGJ5IHBhcnR5IGluZGV4ICovXG4gIHByaXZhdGUgb3RoZXJQdWJLZXlzOiBCdWZmZXJbXSB8IG51bGwgPSBudWxsO1xuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSBka2dTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgZnJvbSByb3VuZDIgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBmcm9tIHJvdW5kMiAqL1xuICBwcml2YXRlIHNoYXJlUGs6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogMzItYnl0ZSBjaGFpbiBjb2RlIGZyb20gcm91bmQyICovXG4gIHByaXZhdGUgc2hhcmVDaGFpbmNvZGU6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZGtnU3RhdGU6IERrZ1N0YXRlID0gRGtnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihuOiBudW1iZXIsIHQ6IG51bWJlciwgcGFydHlJZHg6IG51bWJlcikge1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy50ID0gdDtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRXYXNtTXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIC8qIGNoZWNrcyBmb3IgZWxlY3Ryb24gcHJvY2Vzc2VzICovXG4gICAgICAgICF3aW5kb3cucHJvY2VzcyAmJlxuICAgICAgICAhd2luZG93LnByb2Nlc3M/LlsndHlwZSddXG4gICAgICApIHtcbiAgICAgICAgLy8gQnJvd3Nlcjogd2ViIGJ1aWxkIGhhcyBleHBsaWNpdCBpbml0KCkg4oCUIGd1YXJhbnRlZWQgcmVhZHkgYWZ0ZXIgYXdhaXRcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzIC0tIEBiaXRnby93YXNtLW1wcyBleHBvc2VzIGVudmlyb25tZW50LXNwZWNpZmljIHN1YnBhdGggZXhwb3J0cy5cbiAgICAgICAgY29uc3Qgd2ViV2FzbSA9IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xuICAgICAgICBhd2FpdCB3ZWJXYXNtLmRlZmF1bHQoKTtcbiAgICAgICAgdGhpcy53YXNtTXBzID0gd2ViV2FzbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUuanM6IGR5bmFtaWMgaW1wb3J0KCkgcmV3cml0dGVuIHRvIHJlcXVpcmUoKSBieSB0c2Mg4oaSIENKUyBidWlsZCDihpIgcmVhZEZpbGVTeW5jXG4gICAgICAgIHRoaXMud2FzbU1wcyA9IGF3YWl0IGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYXNtTXBzKCk6IFdhc21NcHMge1xuICAgIGlmICghdGhpcy53YXNtTXBzKSB7XG4gICAgICB0aHJvdyBFcnJvcignV0FTTSBtb2R1bGUgbm90IGxvYWRlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53YXNtTXBzO1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogRGtnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRrZ1N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBES0cgc2Vzc2lvbiB3aXRoIHRoaXMgcGFydHkncyBYMjU1MTkgcHJpdmF0ZSBrZXkgYW5kIHRoZSBvdGhlciBwYXJ0aWVzJ1xuICAgKiBYMjU1MTkgcHVibGljIGtleXMuIEtleXMgYXJlIGV4dHJhY3RlZCBmcm9tIEdQRyBlbmNyeXB0aW9uIHN1YmtleXMgYnkgdGhlIG9yY2hlc3RyYXRvci5cbiAgICpcbiAgICogQHBhcmFtIGRlY3J5cHRpb25LZXkgLSBUaGlzIHBhcnR5J3MgMzItYnl0ZSBYMjU1MTkgcHJpdmF0ZSBrZXkgKEdQRyBlbmMgc3Via2V5IHByaXZhdGUgcGFydCkuXG4gICAqIEBwYXJhbSBvdGhlckVuY1B1YmxpY0tleXMgLSBPdGhlciBwYXJ0aWVzJyAzMi1ieXRlIFgyNTUxOSBwdWJsaWMga2V5cywgc29ydGVkIGJ5IGFzY2VuZGluZ1xuICAgKiAgIHBhcnR5IGluZGV4IChleGNsdWRpbmcgb3duKS4gRm9yIGEgMy1wYXJ0eSBzZXR1cCwgdGhpcyBpcyBbcGFydHlfQV9wdWIsIHBhcnR5X0JfcHViXS5cbiAgICovXG4gIGFzeW5jIGluaXREa2coZGVjcnlwdGlvbktleTogQnVmZmVyLCBvdGhlckVuY1B1YmxpY0tleXM6IEJ1ZmZlcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICghZGVjcnlwdGlvbktleSB8fCBkZWNyeXB0aW9uS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgZGVjcnlwdGlvbiBrZXk6IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgICB9XG4gICAgaWYgKCFvdGhlckVuY1B1YmxpY0tleXMgfHwgb3RoZXJFbmNQdWJsaWNLZXlzLmxlbmd0aCAhPT0gdGhpcy5uIC0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkICR7dGhpcy5uIC0gMX0gb3RoZXIgcGFydGllcycgcHVibGljIGtleXNgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudCA+IHRoaXMubiB8fCB0aGlzLnBhcnR5SWR4ID49IHRoaXMubikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVycyBmb3IgREtHJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWNyeXB0aW9uS2V5ID0gZGVjcnlwdGlvbktleTtcbiAgICB0aGlzLm90aGVyUHViS2V5cyA9IG90aGVyRW5jUHVibGljS2V5cztcbiAgICB0aGlzLmRrZ1N0YXRlID0gRGtnU3RhdGUuSW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJvdW5kMCBvZiB0aGUgREtHIHByb3RvY29sLiBSZXR1cm5zIHRoaXMgcGFydHkncyBicm9hZGNhc3QgbWVzc2FnZS5cbiAgICogU3RvcmVzIHRoZSByb3VuZCBzdGF0ZSBieXRlcyBpbnRlcm5hbGx5IGZvciB0aGUgbmV4dCByb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIGRrZ1NlZWQgLSBPcHRpb25hbCAzMi1ieXRlIHNlZWQgZm9yIGRldGVybWluaXN0aWMgREtHIG91dHB1dCAodGVzdGluZyBvbmx5KS5cbiAgICovXG4gIGdldEZpcnN0TWVzc2FnZShka2dTZWVkPzogQnVmZmVyKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZGtnU3RhdGUgIT09IERrZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWVkID0gZGtnU2VlZCA/PyBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5lZDI1NTE5X2RrZ19yb3VuZDBfcHJvY2Vzcyh0aGlzLnBhcnR5SWR4LCB0aGlzLmRlY3J5cHRpb25LZXkhLCB0aGlzLm90aGVyUHViS2V5cyEsIHNlZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZXJyfWApO1xuICAgIH1cblxuICAgIHRoaXMuZGtnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLldhaXRNc2cxO1xuICAgIHJldHVybiB7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBtZXNzYWdlcyBmcm9tIGFsbCBwYXJ0aWVzIGFuZCBhZHZhbmNlcyB0aGUgcHJvdG9jb2wuXG4gICAqXG4gICAqIC0gSW4gV2FpdE1zZzE6IHJ1bnMgcm91bmQxLCByZXR1cm5zIHRoaXMgcGFydHkncyByb3VuZDEgYnJvYWRjYXN0IG1lc3NhZ2UuXG4gICAqIC0gSW4gV2FpdE1zZzI6IHJ1bnMgcm91bmQyLCBjb21wbGV0ZXMgREtHLCByZXR1cm5zIFtdLlxuICAgKlxuICAgKiBUaGUgY2FsbGVyIHBhc3NlcyBhbGwgbiBtZXNzYWdlcyAoaW5jbHVkaW5nIG93bik7IG93biBtZXNzYWdlIGlzIGZpbHRlcmVkXG4gICAqIG91dCBpbnRlcm5hbGx5LiBPdGhlciBwYXJ0aWVzJyBtZXNzYWdlcyBhcmUgc29ydGVkIGJ5IGFzY2VuZGluZyBwYXJ0eSBpbmRleCxcbiAgICogbWF0Y2hpbmcgdGhlIG9yZGVyaW5nIGV4cGVjdGVkIGJ5IEBiaXRnby93YXNtLW1wcy5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBBbGwgbiBtZXNzYWdlcyBmb3IgdGhpcyByb3VuZCAoaW5jbHVkaW5nIG93bikuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0RLRyBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSB0aGlzLm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBtZXNzYWdlcyBmb3IgdGhlIHJvdW5kLiBOdW1iZXIgb2YgbWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsIHRvIE4nKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IG90aGVyIHBhcnRpZXMnIG1lc3NhZ2VzLCBzb3J0ZWQgYnkgcGFydHkgaW5kZXggKGFzY2VuZGluZylcbiAgICBjb25zdCBvdGhlck1zZ3MgPSBtZXNzYWdlc0Zvckl0aFJvdW5kXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLmZyb20gIT09IHRoaXMucGFydHlJZHgpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKVxuICAgICAgLm1hcCgobSkgPT4gbS5wYXlsb2FkKTtcblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLmRrZ1N0YXRlID09PSBEa2dTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLmVkMjU1MTlfZGtnX3JvdW5kMV9wcm9jZXNzKG90aGVyTXNncywgdGhpcy5ka2dTdGF0ZUJ5dGVzISk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5ka2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgbmV3IHN0YXRlOyB0aGlzIGlzIHdoYXQgd291bGQgYmUgcGVyc2lzdGVkIHRvIERCIGJldHdlZW4gQVBJIHJvdW5kc1xuICAgICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZGtnU3RhdGUgPSBEa2dTdGF0ZS5XYWl0TXNnMjtcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuV2FpdE1zZzIpIHtcbiAgICAgIGxldCBzaGFyZTogU2hhcmU7XG4gICAgICB0cnkge1xuICAgICAgICBzaGFyZSA9IHdhc20uZWQyNTUxOV9ka2dfcm91bmQyX3Byb2Nlc3Mob3RoZXJNc2dzLCB0aGlzLmRrZ1N0YXRlQnl0ZXMhKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRrZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmtleVNoYXJlID0gQnVmZmVyLmZyb20oc2hhcmUuc2hhcmUpO1xuICAgICAgdGhpcy5zaGFyZVBrID0gQnVmZmVyLmZyb20oc2hhcmUucGspO1xuICAgICAgdGhpcy5zaGFyZUNoYWluY29kZSA9IEJ1ZmZlci5mcm9tKHNoYXJlLmNoYWluY29kZSk7XG4gICAgICB0aGlzLmRrZ1N0YXRlQnl0ZXMgPSBudWxsO1xuICAgICAgdGhpcy5ka2dTdGF0ZSA9IERrZ1N0YXRlLkNvbXBsZXRlO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHRocm93IEVycm9yKCdVbmV4cGVjdGVkIERLRyBzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQga2V5c2hhcmUgcHJvZHVjZWQgYnkgcm91bmQyLlxuICAgKiBUaGlzIGlzIHVzZWQgYXMgaW5wdXQgdG8gdGhlIHNpZ25pbmcgcHJvdG9jb2wuXG4gICAqL1xuICBnZXRLZXlTaGFyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5rZXlTaGFyZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXlTaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSAzMi1ieXRlIEVkMjU1MTkgcHVibGljIGtleSBhZ3JlZWQgYnkgYWxsIHBhcnRpZXMgZHVyaW5nIERLRy5cbiAgICovXG4gIGdldFNoYXJlUHVibGljS2V5KCk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLnNoYXJlUGspIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVQaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSAxMjgtY2hhciBoZXggY29tbW9uIGtleWNoYWluOiA2NC1jaGFyIHB1YmxpYyBrZXkgKyA2NC1jaGFyIGNoYWluIGNvZGUuXG4gICAqIFRoaXMgbWF0Y2hlcyB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IGFkZHJlc3MgZGVyaXZhdGlvbiAoRWRkc2EuZGVyaXZlVW5oYXJkZW5lZCkuXG4gICAqL1xuICBnZXRDb21tb25LZXljaGFpbigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5zaGFyZVBrIHx8ICF0aGlzLnNoYXJlQ2hhaW5jb2RlKSB7XG4gICAgICB0aHJvdyBFcnJvcignREtHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoYXJlUGsudG9TdHJpbmcoJ2hleCcpICsgdGhpcy5zaGFyZUNoYWluY29kZS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIENCT1ItZW5jb2RlZCByZWR1Y2VkIHJlcHJlc2VudGF0aW9uIGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBrZXkuXG4gICAqL1xuICBnZXRSZWR1Y2VkS2V5U2hhcmUoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuc2hhcmVQaykge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBjb25zdCByZWR1Y2VkS2V5U2hhcmU6IEVkZHNhUmVkdWNlZEtleVNoYXJlID0ge1xuICAgICAgcHViOiBBcnJheS5mcm9tKHRoaXMuc2hhcmVQayksXG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZW5jb2RlKHJlZHVjZWRLZXlTaGFyZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXM6IHJvdW5kIHN0YXRlIGJ5dGVzLCBjdXJyZW50IERLRyByb3VuZCwgZGVjcnlwdGlvbiBrZXksIG90aGVyIHBhcnRpZXMnIHB1YiBrZXlzLlxuICAgKiBUaGlzIG1pcnJvcnMgd2hhdCBhIHNlcnZlciB3b3VsZCBzdG9yZSBpbiBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcy5cbiAgICovXG4gIGdldFNlc3Npb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdES0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gRXhwb3J0aW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5ka2dTdGF0ZSA9PT0gRGtnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RLRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGtnU3RhdGVCeXRlczogdGhpcy5ka2dTdGF0ZUJ5dGVzPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIGRrZ1JvdW5kOiB0aGlzLmRrZ1N0YXRlLFxuICAgICAgZGVjcnlwdGlvbktleTogdGhpcy5kZWNyeXB0aW9uS2V5Py50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG90aGVyUHViS2V5czogdGhpcy5vdGhlclB1YktleXM/Lm1hcCgoaykgPT4gay50b1N0cmluZygnYmFzZTY0JykpID8/IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5IGV4cG9ydGVkIHNlc3Npb24uIEFsbG93cyB0aGUgcHJvdG9jb2wgdG8gY29udGludWVcbiAgICogZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZiwgYXMgaWYgdGhlIHJvdW5kIHN0YXRlIHdhcyBsb2FkZWQgZnJvbSBhIGRhdGFiYXNlLlxuICAgKi9cbiAgcmVzdG9yZVNlc3Npb24oc2Vzc2lvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgdGhpcy5ka2dTdGF0ZUJ5dGVzID0gZGF0YS5ka2dTdGF0ZUJ5dGVzID8gQnVmZmVyLmZyb20oZGF0YS5ka2dTdGF0ZUJ5dGVzLCAnYmFzZTY0JykgOiBudWxsO1xuICAgIHRoaXMuZGtnU3RhdGUgPSBkYXRhLmRrZ1JvdW5kO1xuICAgIHRoaXMuZGVjcnlwdGlvbktleSA9IGRhdGEuZGVjcnlwdGlvbktleSA/IEJ1ZmZlci5mcm9tKGRhdGEuZGVjcnlwdGlvbktleSwgJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB0aGlzLm90aGVyUHViS2V5cyA9IGRhdGEub3RoZXJQdWJLZXlzID8gKGRhdGEub3RoZXJQdWJLZXlzIGFzIHN0cmluZ1tdKS5tYXAoKGspID0+IEJ1ZmZlci5mcm9tKGssICdiYXNlNjQnKSkgOiBudWxsO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,90 @@
1
+ import { DeserializedMessage, DeserializedMessages, DsgState } from './types';
2
+ /**
3
+ * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
4
+ *
5
+ * State is explicit: each WASM round function returns
6
+ * `{ msg, state }` bytes; the state bytes are stored between rounds and passed to the
7
+ * next round function (this is what a server would persist to a database between API
8
+ * rounds).
9
+ *
10
+ * The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
11
+ * counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
12
+ * filters own out internally.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const dsg = new DSG(0); // partyIdx 0
17
+ * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
18
+ * const msg1 = dsg.getFirstMessage();
19
+ * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
20
+ * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
21
+ * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
22
+ * const signature = dsg.getSignature(); // 64-byte Ed25519 signature
23
+ * ```
24
+ */
25
+ export declare class DSG {
26
+ protected partyIdx: number;
27
+ protected otherPartyIdx: number | null;
28
+ /** Opaque bincode-serialised Keyshare from a prior DKG */
29
+ private keyShare;
30
+ /** Raw message bytes to sign (Ed25519 hashes internally; no prehashing required) */
31
+ private message;
32
+ /** BIP-32-style derivation path, e.g. "m" or "m/0/1". Folded in via Keyshare::derive_with_offset */
33
+ private derivationPath;
34
+ /** Serialised round state bytes returned by the previous round function */
35
+ private dsgStateBytes;
36
+ /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
37
+ private signature;
38
+ protected dsgState: DsgState;
39
+ constructor(partyIdx: number);
40
+ getState(): DsgState;
41
+ /**
42
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
43
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
44
+ *
45
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
46
+ * @param message - Raw message bytes to sign (no prehashing).
47
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
48
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
49
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
50
+ */
51
+ initDsg(keyShare: Buffer, message: Buffer, derivationPath: string, otherPartyIdx: number): void;
52
+ /**
53
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
54
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
55
+ * bytes internally for the next round.
56
+ */
57
+ getFirstMessage(): DeserializedMessage;
58
+ /**
59
+ * Handles incoming messages for the current round and advances the protocol.
60
+ *
61
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
62
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
63
+ * returns this party's `SignMsg3` broadcast (partial signature).
64
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
65
+ *
66
+ * The caller passes both messages (own + counterpart) for symmetry with
67
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
68
+ * counterpart's payload is forwarded to the WASM round function.
69
+ *
70
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
71
+ */
72
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
73
+ /**
74
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
75
+ * Only available once the protocol reaches `Complete`.
76
+ */
77
+ getSignature(): Buffer;
78
+ /**
79
+ * Exports the current session state as a JSON string for persistence.
80
+ * Includes the opaque round state bytes plus everything needed to re-enter the
81
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
82
+ */
83
+ getSession(): string;
84
+ /**
85
+ * Restores a previously exported session. Allows the protocol to continue from
86
+ * where it left off, as if the round state was loaded from a database.
87
+ */
88
+ restoreSession(session: string): void;
89
+ }
90
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +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;;;;;;;;;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"}