@bitgo-beta/sdk-lib-mpc 8.2.0-beta.2093 → 8.2.0-beta.2094

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,10 +10,18 @@ import { DeserializedMessage, DeserializedMessages, RedPallasDsgState, RedPallas
10
10
  * (ask/nk/rivk/ivks) happens upstream, as part of DKG (`redpallas_dkg_round2_process` +
11
11
  * the platform-side-only `redpallas_derivation_process`); DSG only ever operates on an
12
12
  * already-derived (or root) opaque `Keyshare`.
13
+ * - DSG does not randomize the key it signs with: since `@bitgo/wasm-mps` 1.17.0, key
14
+ * re-randomization is a separate `rerand` protocol (see `./rerand.ts`, `RedPallasRerand`)
15
+ * that must run before every DSG, between the same 2 parties. The keyshare passed to
16
+ * `initDsg` must be the `keyShare` from that rerand result.
13
17
  * - Round3 does not return a raw signature; it returns a `RedPallasSignature` bundle of
14
- * `signature` (64 raw bytes), `rk` (the randomized verification key the signature
15
- * verifies against — NOT the DKG public key) and `alpha` (the 32-byte randomizer scalar
16
- * used to re-randomize the DKG public key into `rk`). See `RedPallasSignatureResult`.
18
+ * `signature` (64 raw bytes) and `rk` (the rerandomized verification key the signature
19
+ * verifies against — NOT the DKG public key). `rk` equals the `pk` of the rerand result
20
+ * the DSG session was initialized with. See `RedPallasSignatureResult`.
21
+ *
22
+ * Signing a stored DKG keyshare directly (without rerand) still produces a valid
23
+ * signature — under the bare DKG public key, with the same `rk` every spend — but the
24
+ * supported, tested path is rerand → DSG.
17
25
  *
18
26
  * State is explicit: each WASM round function returns `{ msg, state }` bytes; the state
19
27
  * bytes are stored between rounds and passed to the next round function (this is what a
@@ -25,13 +33,21 @@ import { DeserializedMessage, DeserializedMessages, RedPallasDsgState, RedPallas
25
33
  *
26
34
  * @example
27
35
  * ```typescript
36
+ * // Rerand first — same 2 parties that will sign (see RedPallasRerand).
37
+ * const rerand = new RedPallasRerand(0);
38
+ * await rerand.initRerand(dkgKeyShare, 2);
39
+ * const rerandMsg1 = rerand.getFirstMessage();
40
+ * const rerandMsg2 = rerand.handleIncomingMessages([rerandMsg1, peerRerandMsg1]);
41
+ * rerand.handleIncomingMessages([rerandMsg2[0], peerRerandMsg2]);
42
+ * const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
43
+ *
28
44
  * const dsg = new RedPallasDSG(0); // partyIdx 0
29
45
  * await dsg.initDsg(keyShare, message, 2); // counterpart is party 2
30
46
  * const msg1 = dsg.getFirstMessage();
31
47
  * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
32
48
  * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
33
49
  * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
34
- * const { signature, rk, alpha } = dsg.getSignature(); // 64-byte RedPallas signature + rk/alpha
50
+ * const { signature, rk } = dsg.getSignature(); // verifies under rk == pk
35
51
  * ```
36
52
  */
37
53
  export declare class RedPallasDSG {
@@ -55,14 +71,19 @@ export declare class RedPallasDSG {
55
71
  private loadWasmMps;
56
72
  private getWasmMps;
57
73
  /**
58
- * Initialises the DSG session. The keyshare must come from a prior DKG run (and, if a
59
- * derived key is being used, from the subsequent platform-side derivation process), and
60
- * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
74
+ * Initialises the DSG session. The keyshare must be the rerandomized `keyShare` from
75
+ * a prior `RedPallasRerand` run with the same counterpart (which itself takes the
76
+ * opaque Keyshare from DKG — already derived, if applicable). Signing a bare DKG
77
+ * keyshare produces a valid but non-rerandomized signature under the DKG public key;
78
+ * use rerand → DSG instead. `otherPartyIdx` must be the single counterpart who ran
79
+ * that rerand session and will co-sign with this party.
61
80
  *
62
- * @param keyShare - Opaque bincode-serialised Keyshare bytes from `RedPallasDKG.getKeyShare()`.
81
+ * @param keyShare - Opaque bincode-serialised rerandomized Keyshare bytes from
82
+ * `RedPallasRerand.getRerandomizedKeyShare().keyShare`.
63
83
  * @param message - Raw message bytes to sign.
64
84
  * @param otherPartyIdx - Party index of the single counterpart in this signing session.
65
- * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
85
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`, and match the
86
+ * counterpart of the preceding rerand session.
66
87
  */
67
88
  initDsg(keyShare: Buffer, message: Buffer, otherPartyIdx: number): Promise<void>;
68
89
  /**
@@ -88,9 +109,10 @@ export declare class RedPallasDSG {
88
109
  handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
89
110
  /**
90
111
  * Returns the final signature bundle produced by round 3: the 64-byte raw RedPallas
91
- * signature, the randomized verification key `rk` it must be verified against (via
92
- * `redpallas_verify(rk, signature, message)` — NOT the DKG public key), and the
93
- * `alpha` randomizer scalar used to derive `rk` from the DKG public key.
112
+ * signature and the rerandomized verification key `rk` it must be verified against
113
+ * (via `redpallas_verify(rk, signature, message)` — NOT the DKG public key). `rk`
114
+ * equals the `pk` of the rerand result this session was initialized with; the
115
+ * corresponding `alpha` is available from `RedPallasRerand.getRerandomizedKeyShare()`.
94
116
  */
95
117
  getSignature(): RedPallasSignatureResult;
96
118
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/dsg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,YAAY;IACvB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAuB;IACvC,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAuB;IAEtC,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,mEAAmE;IACnE,OAAO,CAAC,eAAe,CAAyC;IAChE,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAmC;gBAE5D,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,iBAAiB;IAI7B,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,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtF;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IA0EvF;;;;;OAKG;IACH,YAAY,IAAI,wBAAwB;IAOxC;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAoBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwDrD"}
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/dsg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,YAAY;IACvB,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAuB;IACvC,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAuB;IAEtC,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,mEAAmE;IACnE,OAAO,CAAC,eAAe,CAAyC;IAChE,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAmC;gBAE5D,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,iBAAiB;IAI7B,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;YAInB,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;;;;;;OAcG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtF;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAyEvF;;;;;;OAMG;IACH,YAAY,IAAI,wBAAwB;IAOxC;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAoBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwDrD"}
@@ -50,10 +50,18 @@ const types_1 = require("./types");
50
50
  * (ask/nk/rivk/ivks) happens upstream, as part of DKG (`redpallas_dkg_round2_process` +
51
51
  * the platform-side-only `redpallas_derivation_process`); DSG only ever operates on an
52
52
  * already-derived (or root) opaque `Keyshare`.
53
+ * - DSG does not randomize the key it signs with: since `@bitgo/wasm-mps` 1.17.0, key
54
+ * re-randomization is a separate `rerand` protocol (see `./rerand.ts`, `RedPallasRerand`)
55
+ * that must run before every DSG, between the same 2 parties. The keyshare passed to
56
+ * `initDsg` must be the `keyShare` from that rerand result.
53
57
  * - Round3 does not return a raw signature; it returns a `RedPallasSignature` bundle of
54
- * `signature` (64 raw bytes), `rk` (the randomized verification key the signature
55
- * verifies against — NOT the DKG public key) and `alpha` (the 32-byte randomizer scalar
56
- * used to re-randomize the DKG public key into `rk`). See `RedPallasSignatureResult`.
58
+ * `signature` (64 raw bytes) and `rk` (the rerandomized verification key the signature
59
+ * verifies against — NOT the DKG public key). `rk` equals the `pk` of the rerand result
60
+ * the DSG session was initialized with. See `RedPallasSignatureResult`.
61
+ *
62
+ * Signing a stored DKG keyshare directly (without rerand) still produces a valid
63
+ * signature — under the bare DKG public key, with the same `rk` every spend — but the
64
+ * supported, tested path is rerand → DSG.
57
65
  *
58
66
  * State is explicit: each WASM round function returns `{ msg, state }` bytes; the state
59
67
  * bytes are stored between rounds and passed to the next round function (this is what a
@@ -65,13 +73,21 @@ const types_1 = require("./types");
65
73
  *
66
74
  * @example
67
75
  * ```typescript
76
+ * // Rerand first — same 2 parties that will sign (see RedPallasRerand).
77
+ * const rerand = new RedPallasRerand(0);
78
+ * await rerand.initRerand(dkgKeyShare, 2);
79
+ * const rerandMsg1 = rerand.getFirstMessage();
80
+ * const rerandMsg2 = rerand.handleIncomingMessages([rerandMsg1, peerRerandMsg1]);
81
+ * rerand.handleIncomingMessages([rerandMsg2[0], peerRerandMsg2]);
82
+ * const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
83
+ *
68
84
  * const dsg = new RedPallasDSG(0); // partyIdx 0
69
85
  * await dsg.initDsg(keyShare, message, 2); // counterpart is party 2
70
86
  * const msg1 = dsg.getFirstMessage();
71
87
  * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
72
88
  * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
73
89
  * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
74
- * const { signature, rk, alpha } = dsg.getSignature(); // 64-byte RedPallas signature + rk/alpha
90
+ * const { signature, rk } = dsg.getSignature(); // verifies under rk == pk
75
91
  * ```
76
92
  */
77
93
  class RedPallasDSG {
@@ -124,14 +140,19 @@ class RedPallasDSG {
124
140
  return this.wasmMps;
125
141
  }
126
142
  /**
127
- * Initialises the DSG session. The keyshare must come from a prior DKG run (and, if a
128
- * derived key is being used, from the subsequent platform-side derivation process), and
129
- * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
143
+ * Initialises the DSG session. The keyshare must be the rerandomized `keyShare` from
144
+ * a prior `RedPallasRerand` run with the same counterpart (which itself takes the
145
+ * opaque Keyshare from DKG — already derived, if applicable). Signing a bare DKG
146
+ * keyshare produces a valid but non-rerandomized signature under the DKG public key;
147
+ * use rerand → DSG instead. `otherPartyIdx` must be the single counterpart who ran
148
+ * that rerand session and will co-sign with this party.
130
149
  *
131
- * @param keyShare - Opaque bincode-serialised Keyshare bytes from `RedPallasDKG.getKeyShare()`.
150
+ * @param keyShare - Opaque bincode-serialised rerandomized Keyshare bytes from
151
+ * `RedPallasRerand.getRerandomizedKeyShare().keyShare`.
132
152
  * @param message - Raw message bytes to sign.
133
153
  * @param otherPartyIdx - Party index of the single counterpart in this signing session.
134
- * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
154
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`, and match the
155
+ * counterpart of the preceding rerand session.
135
156
  */
136
157
  async initDsg(keyShare, message, otherPartyIdx) {
137
158
  await this.loadWasmMps();
@@ -250,7 +271,6 @@ class RedPallasDSG {
250
271
  this.signatureResult = {
251
272
  signature: Buffer.from(result.signature),
252
273
  rk: Buffer.from(result.rk),
253
- alpha: Buffer.from(result.alpha),
254
274
  };
255
275
  this.dsgStateBytes = null;
256
276
  this.dsgState = types_1.RedPallasDsgState.Complete;
@@ -260,9 +280,10 @@ class RedPallasDSG {
260
280
  }
261
281
  /**
262
282
  * Returns the final signature bundle produced by round 3: the 64-byte raw RedPallas
263
- * signature, the randomized verification key `rk` it must be verified against (via
264
- * `redpallas_verify(rk, signature, message)` — NOT the DKG public key), and the
265
- * `alpha` randomizer scalar used to derive `rk` from the DKG public key.
283
+ * signature and the rerandomized verification key `rk` it must be verified against
284
+ * (via `redpallas_verify(rk, signature, message)` — NOT the DKG public key). `rk`
285
+ * equals the `pk` of the rerand result this session was initialized with; the
286
+ * corresponding `alpha` is available from `RedPallasRerand.getRerandomizedKeyShare()`.
266
287
  */
267
288
  getSignature() {
268
289
  if (!this.signatureResult) {
@@ -352,4 +373,4 @@ class RedPallasDSG {
352
373
  }
353
374
  }
354
375
  exports.RedPallasDSG = RedPallasDSG;
355
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9yZWRwYWxsYXMtbXBzL2RzZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbUNBQWlIO0FBTWpIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsTUFBYSxZQUFZO0lBa0J2QixZQUFZLFFBQWdCO1FBaEJsQixrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFOUMsMkZBQTJGO1FBQ25GLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGdDQUFnQztRQUN4QixZQUFPLEdBQWtCLElBQUksQ0FBQztRQUV0QywyRUFBMkU7UUFDbkUsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLG1FQUFtRTtRQUMzRCxvQkFBZSxHQUFvQyxJQUFJLENBQUM7UUFDaEUsZ0NBQWdDO1FBQ3hCLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRTdCLGFBQVEsR0FBc0IseUJBQWlCLENBQUMsYUFBYSxDQUFDO1FBR3RFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFDRSxPQUFPLE1BQU0sS0FBSyxXQUFXO2dCQUM3QixtQ0FBbUM7Z0JBQ25DLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ2YsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFF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O0FBL1NELG9DQStTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB0eXBlIHsgTXNnU3RhdGUsIFJlZFBhbGxhc1NpZ25hdHVyZSB9IGZyb20gJ0BiaXRnby93YXNtLW1wcyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWRNZXNzYWdlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgUmVkUGFsbGFzRHNnU3RhdGUsIFJlZFBhbGxhc1NpZ25hdHVyZVJlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuXG50eXBlIE5vZGVXYXNtZXIgPSB0eXBlb2YgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbnR5cGUgV2ViV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzL3dlYicpO1xudHlwZSBXYXNtTXBzID0gTm9kZVdhc21lciB8IFdlYldhc21lcjtcblxuLyoqXG4gKiBSZWRQYWxsYXMgKFpjYXNoIElyb253b29kKSBEaXN0cmlidXRlZCBTaWduIEdlbmVyYXRpb24gKERTRykgaW1wbGVtZW50YXRpb24gdXNpbmdcbiAqIEBiaXRnby93YXNtLW1wcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEVkRFNBIE1QUyBgRFNHYCBjbGFzcyAoc2VlIGAuLi9lZGRzYS1tcHMvZHNnLnRzYCksIGJ1dCB3cmFwc1xuICogdGhlIGByZWRwYWxsYXNfZHNnXypgIFdBU00gYmluZGluZ3MuIFVubGlrZSB0aGUgRWREU0EgdmVyc2lvbjpcbiAqXG4gKiAtIGByZWRwYWxsYXNfZHNnX3JvdW5kMF9wcm9jZXNzYCBkb2VzIG5vdCB0YWtlIGEgZGVyaXZhdGlvbiBwYXRoOiBSZWRQYWxsYXMga2V5IGRlcml2YXRpb25cbiAqICAgKGFzay9uay9yaXZrL2l2a3MpIGhhcHBlbnMgdXBzdHJlYW0sIGFzIHBhcnQgb2YgREtHIChgcmVkcGFsbGFzX2RrZ19yb3VuZDJfcHJvY2Vzc2AgK1xuICogICB0aGUgcGxhdGZvcm0tc2lkZS1vbmx5IGByZWRwYWxsYXNfZGVyaXZhdGlvbl9wcm9jZXNzYCk7IERTRyBvbmx5IGV2ZXIgb3BlcmF0ZXMgb24gYW5cbiAqICAgYWxyZWFkeS1kZXJpdmVkIChvciByb290KSBvcGFxdWUgYEtleXNoYXJlYC5cbiAqIC0gUm91bmQzIGRvZXMgbm90IHJldHVybiBhIHJhdyBzaWduYXR1cmU7IGl0IHJldHVybnMgYSBgUmVkUGFsbGFzU2lnbmF0dXJlYCBidW5kbGUgb2ZcbiAqICAgYHNpZ25hdHVyZWAgKDY0IHJhdyBieXRlcyksIGBya2AgKHRoZSByYW5kb21pemVkIHZlcmlmaWNhdGlvbiBrZXkgdGhlIHNpZ25hdHVyZVxuICogICB2ZXJpZmllcyBhZ2FpbnN0IOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KSBhbmQgYGFscGhhYCAodGhlIDMyLWJ5dGUgcmFuZG9taXplciBzY2FsYXJcbiAqICAgdXNlZCB0byByZS1yYW5kb21pemUgdGhlIERLRyBwdWJsaWMga2V5IGludG8gYHJrYCkuIFNlZSBgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0YC5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnMgYHsgbXNnLCBzdGF0ZSB9YCBieXRlczsgdGhlIHN0YXRlXG4gKiBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlIG5leHQgcm91bmQgZnVuY3Rpb24gKHRoaXMgaXMgd2hhdCBhXG4gKiBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcykuXG4gKlxuICogVGhlIHByb3RvY29sIGlzIGhhcmQtY29kZWQgMi1vZi0zOiBlYWNoIHNpZ25pbmcgcGFydHkgY29tbXVuaWNhdGVzIHdpdGggZXhhY3RseSBvbmVcbiAqIGNvdW50ZXJwYXJ0LiBgaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgYWNjZXB0cyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCksIGFuZFxuICogZmlsdGVycyBvd24gb3V0IGludGVybmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRzZyA9IG5ldyBSZWRQYWxsYXNEU0coMCk7ICAvLyBwYXJ0eUlkeCAwXG4gKiBhd2FpdCBkc2cuaW5pdERzZyhrZXlTaGFyZSwgbWVzc2FnZSwgMik7ICAvLyBjb3VudGVycGFydCBpcyBwYXJ0eSAyXG4gKiBjb25zdCBtc2cxID0gZHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuICogY29uc3QgbXNnMiA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cxLCBwZWVyTXNnMV0pOyAgLy8gZW1pdHMgU2lnbk1zZzJcbiAqIGNvbnN0IG1zZzMgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMlswXSwgcGVlck1zZzJdKTsgIC8vIGVtaXRzIFNpZ25Nc2czXG4gKiBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnM1swXSwgcGVlck1zZzNdKTsgIC8vIGNvbXBsZXRlcyBEU0dcbiAqIGNvbnN0IHsgc2lnbmF0dXJlLCByaywgYWxwaGEgfSA9IGRzZy5nZXRTaWduYXR1cmUoKTsgIC8vIDY0LWJ5dGUgUmVkUGFsbGFzIHNpZ25hdHVyZSArIHJrL2FscGhhXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZFBhbGxhc0RTRyB7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb3RoZXJQYXJ0eUlkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgZnJvbSBhIHByaW9yIERLRyAoYWxyZWFkeSBkZXJpdmVkLCBpZiBhcHBsaWNhYmxlKSAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKi9cbiAgcHJpdmF0ZSBtZXNzYWdlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICAvKiogU2VyaWFsaXNlZCByb3VuZCBzdGF0ZSBieXRlcyByZXR1cm5lZCBieSB0aGUgcHJldmlvdXMgcm91bmQgZnVuY3Rpb24gKi9cbiAgcHJpdmF0ZSBkc2dTdGF0ZUJ5dGVzOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZpbmFsIHNpZ25hdHVyZSBidW5kbGUsIGF2YWlsYWJsZSBhZnRlciBXYWl0TXNnMyAtPiBDb21wbGV0ZSAqL1xuICBwcml2YXRlIHNpZ25hdHVyZVJlc3VsdDogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXppbHkgbG9hZGVkIFdBU00gbW9kdWxlICovXG4gIHByaXZhdGUgd2FzbU1wczogV2FzbU1wcyB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBkc2dTdGF0ZTogUmVkUGFsbGFzRHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5VbmluaXRpYWxpemVkO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnR5SWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLnBhcnR5SWR4ID0gcGFydHlJZHg7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBSZWRQYWxsYXNEc2dTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZHNnU3RhdGU7XG4gIH1cblxuICBnZXRQYXJ0eUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0T3RoZXJQYXJ0eUlkeCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdGhlclBhcnR5SWR4O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkV2FzbU1wcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAvKiBjaGVja3MgZm9yIGVsZWN0cm9uIHByb2Nlc3NlcyAqL1xuICAgICAgICAhd2luZG93LnByb2Nlc3MgJiZcbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzPy5bJ3R5cGUnXVxuICAgICAgKSB7XG4gICAgICAgIC8vIEJyb3dzZXI6IHdlYiBidWlsZCBoYXMgZXhwbGljaXQgaW5pdCgpIOKAlCBndWFyYW50ZWVkIHJlYWR5IGFmdGVyIGF3YWl0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAtLSBAYml0Z28vd2FzbS1tcHMgZXhwb3NlcyBlbnZpcm9ubWVudC1zcGVjaWZpYyBzdWJwYXRoIGV4cG9ydHMuXG4gICAgICAgIGNvbnN0IHdlYldhc20gPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbiAgICAgICAgYXdhaXQgd2ViV2FzbS5kZWZhdWx0KCk7XG4gICAgICAgIHRoaXMud2FzbU1wcyA9IHdlYldhc207XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb2RlLmpzOiBkeW5hbWljIGltcG9ydCgpIHJld3JpdHRlbiB0byByZXF1aXJlKCkgYnkgdHNjIOKGkiBDSlMgYnVpbGQg4oaSIHJlYWRGaWxlU3luY1xuICAgICAgICB0aGlzLndhc21NcHMgPSBhd2FpdCBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2FzbU1wcygpOiBXYXNtTXBzIHtcbiAgICBpZiAoIXRoaXMud2FzbU1wcykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1dBU00gbW9kdWxlIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2FzbU1wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNlcyB0aGUgRFNHIHNlc3Npb24uIFRoZSBrZXlzaGFyZSBtdXN0IGNvbWUgZnJvbSBhIHByaW9yIERLRyBydW4gKGFuZCwgaWYgYVxuICAgKiBkZXJpdmVkIGtleSBpcyBiZWluZyB1c2VkLCBmcm9tIHRoZSBzdWJzZXF1ZW50IHBsYXRmb3JtLXNpZGUgZGVyaXZhdGlvbiBwcm9jZXNzKSwgYW5kXG4gICAqIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgY28tc2lnbiB3aXRoIHRoaXMgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAtIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgYnl0ZXMgZnJvbSBgUmVkUGFsbGFzREtHLmdldEtleVNoYXJlKClgLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24uXG4gICAqIEBwYXJhbSBvdGhlclBhcnR5SWR4IC0gUGFydHkgaW5kZXggb2YgdGhlIHNpbmdsZSBjb3VudGVycGFydCBpbiB0aGlzIHNpZ25pbmcgc2Vzc2lvbi5cbiAgICogICBNdXN0IGRpZmZlciBmcm9tIHRoaXMgcGFydHkncyBvd24gYHBhcnR5SWR4YCBhbmQgYmUgaW4gYFswLCAyXWAuXG4gICAqL1xuICBhc3luYyBpbml0RHNnKGtleVNoYXJlOiBCdWZmZXIsIG1lc3NhZ2U6IEJ1ZmZlciwgb3RoZXJQYXJ0eUlkeDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkV2FzbU1wcygpO1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gb3RoZXJQYXJ0eUlkeDtcbiAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuSW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJvdW5kIDAgb2YgdGhlIERTRyBwcm90b2NvbC4gUmV0dXJucyB0aGlzIHBhcnR5J3MgYnJvYWRjYXN0IG1lc3NhZ2VcbiAgICogKGEgYFNpZ25Nc2cxYCBjb250YWluaW5nIHRoZSBjb21taXRtZW50IHRvIGBSX2lgKS4gU3RvcmVzIHRoZSByb3VuZCBzdGF0ZVxuICAgKiBieXRlcyBpbnRlcm5hbGx5IGZvciB0aGUgbmV4dCByb3VuZC5cbiAgICovXG4gIGdldEZpcnN0TWVzc2FnZSgpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgICBpZiAodGhpcy5kc2dTdGF0ZSAhPT0gUmVkUGFsbGFzRHNnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBhc3NlcnQodGhpcy5rZXlTaGFyZSwgJ2tleVNoYXJlIG11c3QgYmUgc2V0IGFmdGVyIGluaXREc2cnKTtcbiAgICBhc3NlcnQodGhpcy5tZXNzYWdlLCAnbWVzc2FnZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG5cbiAgICBjb25zdCB3YXNtID0gdGhpcy5nZXRXYXNtTXBzKCk7XG4gICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHdhc20ucmVkcGFsbGFzX2RzZ19yb3VuZDBfcHJvY2Vzcyh0aGlzLmtleVNoYXJlLCB0aGlzLm1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH06ICR7ZXJyfWApO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cxO1xuICAgIHJldHVybiB7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBtZXNzYWdlcyBmb3IgdGhlIGN1cnJlbnQgcm91bmQgYW5kIGFkdmFuY2VzIHRoZSBwcm90b2NvbC5cbiAgICpcbiAgICogLSBJbiBgV2FpdE1zZzFgOiBydW5zIHJvdW5kIDEsIHJldHVybnMgdGhpcyBwYXJ0eSdzIGBTaWduTXNnMmAgYnJvYWRjYXN0LlxuICAgKiAtIEluIGBXYWl0TXNnMmA6IHJ1bnMgcm91bmQgMiAod2hpY2ggaW50ZXJuYWxseSBmdXNlcyB0d28gU2lsZW5jZSBMYWJzIHRyYW5zaXRpb25zKSxcbiAgICogICByZXR1cm5zIHRoaXMgcGFydHkncyBgU2lnbk1zZzNgIGJyb2FkY2FzdCAocGFydGlhbCBzaWduYXR1cmUpLlxuICAgKiAtIEluIGBXYWl0TXNnM2A6IHJ1bnMgcm91bmQgMywgY29tcGxldGVzIERTRywgcmV0dXJucyBgW11gLlxuICAgKlxuICAgKiBUaGUgY2FsbGVyIHBhc3NlcyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCkgZm9yIHN5bW1ldHJ5IHdpdGhcbiAgICogYFJlZFBhbGxhc0RLRy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzYC4gT3duIG1lc3NhZ2UgaXMgZmlsdGVyZWQgb3V0IGludGVybmFsbHk7IG9ubHkgdGhlXG4gICAqIGNvdW50ZXJwYXJ0J3MgcGF5bG9hZCBpcyBmb3J3YXJkZWQgdG8gdGhlIFdBU00gcm91bmQgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlc0Zvckl0aFJvdW5kIC0gQm90aCBtZXNzYWdlcyBmb3IgdGhpcyByb3VuZCAob3duICsgY291bnRlcnBhcnQpLlxuICAgKi9cbiAgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhtZXNzYWdlc0Zvckl0aFJvdW5kOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBhbHJlYWR5IGNvbXBsZXRlZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuSW5pdCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICdEU0cgc2Vzc2lvbiBtdXN0IGNhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgYmVmb3JlIGhhbmRsaW5nIGluY29taW5nIG1lc3NhZ2VzLiBDYWxsIGdldEZpcnN0TWVzc2FnZSgpIGZpcnN0LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlc0Zvckl0aFJvdW5kLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgbnVtYmVyIG9mIG1lc3NhZ2VzIGZvciB0aGUgcm91bmQuIEV4cGVjdGVkIDIgbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3IgMi1vZi0zIERTRycpO1xuICAgIH1cblxuICAgIGNvbnN0IHBlZXJNZXNzYWdlcyA9IG1lc3NhZ2VzRm9ySXRoUm91bmQuZmlsdGVyKChtKSA9PiBtLmZyb20gIT09IHRoaXMucGFydHlJZHgpO1xuICAgIGlmIChwZWVyTWVzc2FnZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSAxIGNvdW50ZXJwYXJ0IG1lc3NhZ2U7IGdvdCAke3BlZXJNZXNzYWdlcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBlZXJNc2cgPSBwZWVyTWVzc2FnZXNbMF07XG4gICAgaWYgKHBlZXJNc2cuZnJvbSAhPT0gdGhpcy5vdGhlclBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBjb3VudGVycGFydCBwYXJ0eSBpbmRleDogZ290ICR7cGVlck1zZy5mcm9tfSwgZXhwZWN0ZWQgJHt0aGlzLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBlZXJQYXlsb2FkID0gQnVmZmVyLmZyb20ocGVlck1zZy5wYXlsb2FkKTtcbiAgICBjb25zdCB3YXNtID0gdGhpcy5nZXRXYXNtTXBzKCk7XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cxJyk7XG4gICAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IHdhc20ucmVkcGFsbGFzX2RzZ19yb3VuZDFfcHJvY2VzcyhwZWVyUGF5bG9hZCwgdGhpcy5kc2dTdGF0ZUJ5dGVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIG1lc3NhZ2VzIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fSwgcm91bmQgJHt0aGlzLmRzZ1N0YXRlfTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgICAgdGhpcy5kc2dTdGF0ZSA9IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cyO1xuICAgICAgcmV0dXJuIFt7IHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KHJlc3VsdC5tc2cpLCBmcm9tOiB0aGlzLnBhcnR5SWR4IH1dO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMikge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzInKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMl9wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzM7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2czKSB7XG4gICAgICBhc3NlcnQodGhpcy5kc2dTdGF0ZUJ5dGVzLCAnZHNnU3RhdGVCeXRlcyBtdXN0IGJlIHNldCBpbiBXYWl0TXNnMycpO1xuICAgICAgbGV0IHJlc3VsdDogUmVkUGFsbGFzU2lnbmF0dXJlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kM19wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlUmVzdWx0ID0ge1xuICAgICAgICBzaWduYXR1cmU6IEJ1ZmZlci5mcm9tKHJlc3VsdC5zaWduYXR1cmUpLFxuICAgICAgICByazogQnVmZmVyLmZyb20ocmVzdWx0LnJrKSxcbiAgICAgICAgYWxwaGE6IEJ1ZmZlci5mcm9tKHJlc3VsdC5hbHBoYSksXG4gICAgICB9O1xuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBEU0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCBzaWduYXR1cmUgYnVuZGxlIHByb2R1Y2VkIGJ5IHJvdW5kIDM6IHRoZSA2NC1ieXRlIHJhdyBSZWRQYWxsYXNcbiAgICogc2lnbmF0dXJlLCB0aGUgcmFuZG9taXplZCB2ZXJpZmljYXRpb24ga2V5IGBya2AgaXQgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0ICh2aWFcbiAgICogYHJlZHBhbGxhc192ZXJpZnkocmssIHNpZ25hdHVyZSwgbWVzc2FnZSlgIOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KSwgYW5kIHRoZVxuICAgKiBgYWxwaGFgIHJhbmRvbWl6ZXIgc2NhbGFyIHVzZWQgdG8gZGVyaXZlIGBya2AgZnJvbSB0aGUgREtHIHB1YmxpYyBrZXkuXG4gICAqL1xuICBnZXRTaWduYXR1cmUoKTogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlUmVzdWx0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaGFzIG5vdCBwcm9kdWNlZCBhIHNpZ25hdHVyZSB5ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXMgdGhlIG9wYXF1ZSByb3VuZCBzdGF0ZSBieXRlcyBwbHVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlLWVudGVyIHRoZVxuICAgKiBwcm90b2NvbCBhZnRlciBhIHJlc3RhcnQgKGtleXNoYXJlLCBtZXNzYWdlLCBjb3VudGVycGFydCkuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBtdXN0IHByb2R1Y2UgaXRzIGZpcnN0IG1lc3NhZ2UgYmVmb3JlIGV4cG9ydGluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1N0YXRlQnl0ZXM6IHRoaXMuZHNnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBkc2dSb3VuZDogdGhpcy5kc2dTdGF0ZSxcbiAgICAgIGtleVNoYXJlOiB0aGlzLmtleVNoYXJlPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFJlZFBhbGxhc0RzZ1N0YXRlKS5pbmNsdWRlcyhkYXRhLmRzZ1JvdW5kKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZHNnUm91bmQgaW4gc2Vzc2lvbjogJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCB8fCBkYXRhLmRzZ1JvdW5kID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IHJlc3RvcmUgRFNHIHNlc3Npb24gaW4gc3RhdGUgJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gUmVzdG9yaW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEucGFydHlJZHggIT09ICdudW1iZXInIHx8IGRhdGEucGFydHlJZHggPCAwIHx8IGRhdGEucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBkYXRhLm90aGVyUGFydHlJZHggIT09ICdudW1iZXInIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPCAwIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPiAyIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPT09IGRhdGEucGFydHlJZHhcbiAgICApIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4ICE9PSBkYXRhLnBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2Vzc2lvbiBwYXJ0eUlkeCAke2RhdGEucGFydHlJZHh9IGRvZXMgbm90IG1hdGNoIGluc3RhbmNlICR7dGhpcy5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRzZ1N0YXRlQnl0ZXMgIT09ICdzdHJpbmcnIHx8IGRhdGEuZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmtleVNoYXJlICE9PSAnc3RyaW5nJyB8fCBkYXRhLmtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5tZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBtZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZHNnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGtleVNoYXJlID0gQnVmZmVyLmZyb20oZGF0YS5rZXlTaGFyZSwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShkYXRhLm1lc3NhZ2UsICdiYXNlNjQnKTtcbiAgICBpZiAoZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKGtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IGRzZ1N0YXRlQnl0ZXM7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IGRhdGEuZHNnUm91bmQ7XG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IGRhdGEucGFydHlJZHg7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gZGF0YS5vdGhlclBhcnR5SWR4O1xuICB9XG59XG4iXX0=
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9yZWRwYWxsYXMtbXBzL2RzZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbUNBQWlIO0FBTWpIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUNILE1BQWEsWUFBWTtJQWtCdkIsWUFBWSxRQUFnQjtRQWhCbEIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTlDLDJGQUEyRjtRQUNuRixhQUFRLEdBQWtCLElBQUksQ0FBQztRQUN2QyxnQ0FBZ0M7UUFDeEIsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFFdEMsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1QyxtRUFBbUU7UUFDM0Qsb0JBQWUsR0FBb0MsSUFBSSxDQUFDO1FBQ2hFLGdDQUFnQztRQUN4QixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUU3QixhQUFRLEdBQXNCLHlCQUFpQixDQUFDLGFBQWEsQ0FBQztRQUd0RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQ0UsT0FBTyxNQUFNLEtBQUssV0FBVztnQkFDN0IsbUNBQW1DO2dCQUNuQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO2dCQUNmLENBQUMsTUFB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bXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgdHlwZSB7IE1zZ1N0YXRlLCBSZWRQYWxsYXNTaWduYXR1cmUgfSBmcm9tICdAYml0Z28vd2FzbS1tcHMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkTWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMsIFJlZFBhbGxhc0RzZ1N0YXRlLCBSZWRQYWxsYXNTaWduYXR1cmVSZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBOb2RlV2FzbWVyID0gdHlwZW9mIGltcG9ydCgnQGJpdGdvL3dhc20tbXBzJyk7XG50eXBlIFdlYldhc21lciA9IHR5cGVvZiBpbXBvcnQoJ0BiaXRnby93YXNtLW1wcy93ZWInKTtcbnR5cGUgV2FzbU1wcyA9IE5vZGVXYXNtZXIgfCBXZWJXYXNtZXI7XG5cbi8qKlxuICogUmVkUGFsbGFzIChaY2FzaCBJcm9ud29vZCkgRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uIChEU0cpIGltcGxlbWVudGF0aW9uIHVzaW5nXG4gKiBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogTWlycm9ycyB0aGUgc3RydWN0dXJlIG9mIHRoZSBFZERTQSBNUFMgYERTR2AgY2xhc3MgKHNlZSBgLi4vZWRkc2EtbXBzL2RzZy50c2ApLCBidXQgd3JhcHNcbiAqIHRoZSBgcmVkcGFsbGFzX2RzZ18qYCBXQVNNIGJpbmRpbmdzLiBVbmxpa2UgdGhlIEVkRFNBIHZlcnNpb246XG4gKlxuICogLSBgcmVkcGFsbGFzX2RzZ19yb3VuZDBfcHJvY2Vzc2AgZG9lcyBub3QgdGFrZSBhIGRlcml2YXRpb24gcGF0aDogUmVkUGFsbGFzIGtleSBkZXJpdmF0aW9uXG4gKiAgIChhc2svbmsvcml2ay9pdmtzKSBoYXBwZW5zIHVwc3RyZWFtLCBhcyBwYXJ0IG9mIERLRyAoYHJlZHBhbGxhc19ka2dfcm91bmQyX3Byb2Nlc3NgICtcbiAqICAgdGhlIHBsYXRmb3JtLXNpZGUtb25seSBgcmVkcGFsbGFzX2Rlcml2YXRpb25fcHJvY2Vzc2ApOyBEU0cgb25seSBldmVyIG9wZXJhdGVzIG9uIGFuXG4gKiAgIGFscmVhZHktZGVyaXZlZCAob3Igcm9vdCkgb3BhcXVlIGBLZXlzaGFyZWAuXG4gKiAtIERTRyBkb2VzIG5vdCByYW5kb21pemUgdGhlIGtleSBpdCBzaWducyB3aXRoOiBzaW5jZSBgQGJpdGdvL3dhc20tbXBzYCAxLjE3LjAsIGtleVxuICogICByZS1yYW5kb21pemF0aW9uIGlzIGEgc2VwYXJhdGUgYHJlcmFuZGAgcHJvdG9jb2wgKHNlZSBgLi9yZXJhbmQudHNgLCBgUmVkUGFsbGFzUmVyYW5kYClcbiAqICAgdGhhdCBtdXN0IHJ1biBiZWZvcmUgZXZlcnkgRFNHLCBiZXR3ZWVuIHRoZSBzYW1lIDIgcGFydGllcy4gVGhlIGtleXNoYXJlIHBhc3NlZCB0b1xuICogICBgaW5pdERzZ2AgbXVzdCBiZSB0aGUgYGtleVNoYXJlYCBmcm9tIHRoYXQgcmVyYW5kIHJlc3VsdC5cbiAqIC0gUm91bmQzIGRvZXMgbm90IHJldHVybiBhIHJhdyBzaWduYXR1cmU7IGl0IHJldHVybnMgYSBgUmVkUGFsbGFzU2lnbmF0dXJlYCBidW5kbGUgb2ZcbiAqICAgYHNpZ25hdHVyZWAgKDY0IHJhdyBieXRlcykgYW5kIGBya2AgKHRoZSByZXJhbmRvbWl6ZWQgdmVyaWZpY2F0aW9uIGtleSB0aGUgc2lnbmF0dXJlXG4gKiAgIHZlcmlmaWVzIGFnYWluc3Qg4oCUIE5PVCB0aGUgREtHIHB1YmxpYyBrZXkpLiBgcmtgIGVxdWFscyB0aGUgYHBrYCBvZiB0aGUgcmVyYW5kIHJlc3VsdFxuICogICB0aGUgRFNHIHNlc3Npb24gd2FzIGluaXRpYWxpemVkIHdpdGguIFNlZSBgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0YC5cbiAqXG4gKiBTaWduaW5nIGEgc3RvcmVkIERLRyBrZXlzaGFyZSBkaXJlY3RseSAod2l0aG91dCByZXJhbmQpIHN0aWxsIHByb2R1Y2VzIGEgdmFsaWRcbiAqIHNpZ25hdHVyZSDigJQgdW5kZXIgdGhlIGJhcmUgREtHIHB1YmxpYyBrZXksIHdpdGggdGhlIHNhbWUgYHJrYCBldmVyeSBzcGVuZCDigJQgYnV0IHRoZVxuICogc3VwcG9ydGVkLCB0ZXN0ZWQgcGF0aCBpcyByZXJhbmQg4oaSIERTRy5cbiAqXG4gKiBTdGF0ZSBpcyBleHBsaWNpdDogZWFjaCBXQVNNIHJvdW5kIGZ1bmN0aW9uIHJldHVybnMgYHsgbXNnLCBzdGF0ZSB9YCBieXRlczsgdGhlIHN0YXRlXG4gKiBieXRlcyBhcmUgc3RvcmVkIGJldHdlZW4gcm91bmRzIGFuZCBwYXNzZWQgdG8gdGhlIG5leHQgcm91bmQgZnVuY3Rpb24gKHRoaXMgaXMgd2hhdCBhXG4gKiBzZXJ2ZXIgd291bGQgcGVyc2lzdCB0byBhIGRhdGFiYXNlIGJldHdlZW4gQVBJIHJvdW5kcykuXG4gKlxuICogVGhlIHByb3RvY29sIGlzIGhhcmQtY29kZWQgMi1vZi0zOiBlYWNoIHNpZ25pbmcgcGFydHkgY29tbXVuaWNhdGVzIHdpdGggZXhhY3RseSBvbmVcbiAqIGNvdW50ZXJwYXJ0LiBgaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AgYWNjZXB0cyBib3RoIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCksIGFuZFxuICogZmlsdGVycyBvd24gb3V0IGludGVybmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFJlcmFuZCBmaXJzdCDigJQgc2FtZSAyIHBhcnRpZXMgdGhhdCB3aWxsIHNpZ24gKHNlZSBSZWRQYWxsYXNSZXJhbmQpLlxuICogY29uc3QgcmVyYW5kID0gbmV3IFJlZFBhbGxhc1JlcmFuZCgwKTtcbiAqIGF3YWl0IHJlcmFuZC5pbml0UmVyYW5kKGRrZ0tleVNoYXJlLCAyKTtcbiAqIGNvbnN0IHJlcmFuZE1zZzEgPSByZXJhbmQuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCByZXJhbmRNc2cyID0gcmVyYW5kLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3JlcmFuZE1zZzEsIHBlZXJSZXJhbmRNc2cxXSk7XG4gKiByZXJhbmQuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbcmVyYW5kTXNnMlswXSwgcGVlclJlcmFuZE1zZzJdKTtcbiAqIGNvbnN0IHsga2V5U2hhcmUsIHBrLCBhbHBoYSB9ID0gcmVyYW5kLmdldFJlcmFuZG9taXplZEtleVNoYXJlKCk7XG4gKlxuICogY29uc3QgZHNnID0gbmV3IFJlZFBhbGxhc0RTRygwKTsgIC8vIHBhcnR5SWR4IDBcbiAqIGF3YWl0IGRzZy5pbml0RHNnKGtleVNoYXJlLCBtZXNzYWdlLCAyKTsgIC8vIGNvdW50ZXJwYXJ0IGlzIHBhcnR5IDJcbiAqIGNvbnN0IG1zZzEgPSBkc2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gKiBjb25zdCBtc2cyID0gZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzEsIHBlZXJNc2cxXSk7ICAvLyBlbWl0cyBTaWduTXNnMlxuICogY29uc3QgbXNnMyA9IGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2cyWzBdLCBwZWVyTXNnMl0pOyAgLy8gZW1pdHMgU2lnbk1zZzNcbiAqIGRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFttc2czWzBdLCBwZWVyTXNnM10pOyAgLy8gY29tcGxldGVzIERTR1xuICogY29uc3QgeyBzaWduYXR1cmUsIHJrIH0gPSBkc2cuZ2V0U2lnbmF0dXJlKCk7ICAvLyB2ZXJpZmllcyB1bmRlciByayA9PSBwa1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWRQYWxsYXNEU0cge1xuICBwcm90ZWN0ZWQgcGFydHlJZHg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG90aGVyUGFydHlJZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBPcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIEtleXNoYXJlIGZyb20gYSBwcmlvciBES0cgKGFscmVhZHkgZGVyaXZlZCwgaWYgYXBwbGljYWJsZSkgKi9cbiAgcHJpdmF0ZSBrZXlTaGFyZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduICovXG4gIHByaXZhdGUgbWVzc2FnZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlcmlhbGlzZWQgcm91bmQgc3RhdGUgYnl0ZXMgcmV0dXJuZWQgYnkgdGhlIHByZXZpb3VzIHJvdW5kIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgZHNnU3RhdGVCeXRlczogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGaW5hbCBzaWduYXR1cmUgYnVuZGxlLCBhdmFpbGFibGUgYWZ0ZXIgV2FpdE1zZzMgLT4gQ29tcGxldGUgKi9cbiAgcHJpdmF0ZSBzaWduYXR1cmVSZXN1bHQ6IFJlZFBhbGxhc1NpZ25hdHVyZVJlc3VsdCB8IG51bGwgPSBudWxsO1xuICAvKiogTGF6aWx5IGxvYWRlZCBXQVNNIG1vZHVsZSAqL1xuICBwcml2YXRlIHdhc21NcHM6IFdhc21NcHMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZHNnU3RhdGU6IFJlZFBhbGxhc0RzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogUmVkUGFsbGFzRHNnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRzZ1N0YXRlO1xuICB9XG5cbiAgZ2V0UGFydHlJZHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0eUlkeDtcbiAgfVxuXG4gIGdldE90aGVyUGFydHlJZHgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJQYXJ0eUlkeDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFdhc21NcHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLyogY2hlY2tzIGZvciBlbGVjdHJvbiBwcm9jZXNzZXMgKi9cbiAgICAgICAgIXdpbmRvdy5wcm9jZXNzICYmXG4gICAgICAgICF3aW5kb3cucHJvY2Vzcz8uWyd0eXBlJ11cbiAgICAgICkge1xuICAgICAgICAvLyBCcm93c2VyOiB3ZWIgYnVpbGQgaGFzIGV4cGxpY2l0IGluaXQoKSDigJQgZ3VhcmFudGVlZCByZWFkeSBhZnRlciBhd2FpdFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgLS0gQGJpdGdvL3dhc20tbXBzIGV4cG9zZXMgZW52aXJvbm1lbnQtc3BlY2lmaWMgc3VicGF0aCBleHBvcnRzLlxuICAgICAgICBjb25zdCB3ZWJXYXNtID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMvd2ViJyk7XG4gICAgICAgIGF3YWl0IHdlYldhc20uZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLndhc21NcHMgPSB3ZWJXYXNtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm9kZS5qczogZHluYW1pYyBpbXBvcnQoKSByZXdyaXR0ZW4gdG8gcmVxdWlyZSgpIGJ5IHRzYyDihpIgQ0pTIGJ1aWxkIOKGkiByZWFkRmlsZVN5bmNcbiAgICAgICAgdGhpcy53YXNtTXBzID0gYXdhaXQgaW1wb3J0KCdAYml0Z28vd2FzbS1tcHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhc21NcHMoKTogV2FzbU1wcyB7XG4gICAgaWYgKCF0aGlzLndhc21NcHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdXQVNNIG1vZHVsZSBub3QgbG9hZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndhc21NcHM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGlzZXMgdGhlIERTRyBzZXNzaW9uLiBUaGUga2V5c2hhcmUgbXVzdCBiZSB0aGUgcmVyYW5kb21pemVkIGBrZXlTaGFyZWAgZnJvbVxuICAgKiBhIHByaW9yIGBSZWRQYWxsYXNSZXJhbmRgIHJ1biB3aXRoIHRoZSBzYW1lIGNvdW50ZXJwYXJ0ICh3aGljaCBpdHNlbGYgdGFrZXMgdGhlXG4gICAqIG9wYXF1ZSBLZXlzaGFyZSBmcm9tIERLRyDigJQgYWxyZWFkeSBkZXJpdmVkLCBpZiBhcHBsaWNhYmxlKS4gU2lnbmluZyBhIGJhcmUgREtHXG4gICAqIGtleXNoYXJlIHByb2R1Y2VzIGEgdmFsaWQgYnV0IG5vbi1yZXJhbmRvbWl6ZWQgc2lnbmF0dXJlIHVuZGVyIHRoZSBES0cgcHVibGljIGtleTtcbiAgICogdXNlIHJlcmFuZCDihpIgRFNHIGluc3RlYWQuIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHJhblxuICAgKiB0aGF0IHJlcmFuZCBzZXNzaW9uIGFuZCB3aWxsIGNvLXNpZ24gd2l0aCB0aGlzIHBhcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5U2hhcmUgLSBPcGFxdWUgYmluY29kZS1zZXJpYWxpc2VkIHJlcmFuZG9taXplZCBLZXlzaGFyZSBieXRlcyBmcm9tXG4gICAqICAgYFJlZFBhbGxhc1JlcmFuZC5nZXRSZXJhbmRvbWl6ZWRLZXlTaGFyZSgpLmtleVNoYXJlYC5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBSYXcgbWVzc2FnZSBieXRlcyB0byBzaWduLlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLCBhbmQgbWF0Y2ggdGhlXG4gICAqICAgY291bnRlcnBhcnQgb2YgdGhlIHByZWNlZGluZyByZXJhbmQgc2Vzc2lvbi5cbiAgICovXG4gIGFzeW5jIGluaXREc2coa2V5U2hhcmU6IEJ1ZmZlciwgbWVzc2FnZTogQnVmZmVyLCBvdGhlclBhcnR5SWR4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgaWYgKCFrZXlTaGFyZSB8fCBrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggPCAwIHx8IHRoaXMucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCAke3RoaXMucGFydHlJZHh9OiBtdXN0IGJlIGluIFswLCAyXWApO1xuICAgIH1cbiAgICBpZiAob3RoZXJQYXJ0eUlkeCA8IDAgfHwgb3RoZXJQYXJ0eUlkeCA+IDIgfHwgb3RoZXJQYXJ0eUlkeCA9PT0gdGhpcy5wYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCAke290aGVyUGFydHlJZHh9OiBtdXN0IGJlIGluIFswLCAyXSBhbmQgIT0gcGFydHlJZHhgKTtcbiAgICB9XG5cbiAgICB0aGlzLmtleVNoYXJlID0ga2V5U2hhcmU7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLm90aGVyUGFydHlJZHggPSBvdGhlclBhcnR5SWR4O1xuICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm91bmQgMCBvZiB0aGUgRFNHIHByb3RvY29sLiBSZXR1cm5zIHRoaXMgcGFydHkncyBicm9hZGNhc3QgbWVzc2FnZVxuICAgKiAoYSBgU2lnbk1zZzFgIGNvbnRhaW5pbmcgdGhlIGNvbW1pdG1lbnQgdG8gYFJfaWApLiBTdG9yZXMgdGhlIHJvdW5kIHN0YXRlXG4gICAqIGJ5dGVzIGludGVybmFsbHkgZm9yIHRoZSBuZXh0IHJvdW5kLlxuICAgKi9cbiAgZ2V0Rmlyc3RNZXNzYWdlKCk6IERlc2VyaWFsaXplZE1lc3NhZ2Uge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlICE9PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGFzc2VydCh0aGlzLmtleVNoYXJlLCAna2V5U2hhcmUgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuICAgIGFzc2VydCh0aGlzLm1lc3NhZ2UsICdtZXNzYWdlIG11c3QgYmUgc2V0IGFmdGVyIGluaXREc2cnKTtcblxuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcbiAgICBsZXQgcmVzdWx0OiBNc2dTdGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMF9wcm9jZXNzKHRoaXMua2V5U2hhcmUsIHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaXJzdCBtZXNzYWdlIGZyb20gcGFydHkgJHt0aGlzLnBhcnR5SWR4fTogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzE7XG4gICAgcmV0dXJuIHsgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIGZvciB0aGUgY3VycmVudCByb3VuZCBhbmQgYWR2YW5jZXMgdGhlIHByb3RvY29sLlxuICAgKlxuICAgKiAtIEluIGBXYWl0TXNnMWA6IHJ1bnMgcm91bmQgMSwgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2cyYCBicm9hZGNhc3QuXG4gICAqIC0gSW4gYFdhaXRNc2cyYDogcnVucyByb3VuZCAyICh3aGljaCBpbnRlcm5hbGx5IGZ1c2VzIHR3byBTaWxlbmNlIExhYnMgdHJhbnNpdGlvbnMpLFxuICAgKiAgIHJldHVybnMgdGhpcyBwYXJ0eSdzIGBTaWduTXNnM2AgYnJvYWRjYXN0IChwYXJ0aWFsIHNpZ25hdHVyZSkuXG4gICAqIC0gSW4gYFdhaXRNc2czYDogcnVucyByb3VuZCAzLCBjb21wbGV0ZXMgRFNHLCByZXR1cm5zIGBbXWAuXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgcGFzc2VzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSBmb3Igc3ltbWV0cnkgd2l0aFxuICAgKiBgUmVkUGFsbGFzREtHLmhhbmRsZUluY29taW5nTWVzc2FnZXNgLiBPd24gbWVzc2FnZSBpcyBmaWx0ZXJlZCBvdXQgaW50ZXJuYWxseTsgb25seSB0aGVcbiAgICogY291bnRlcnBhcnQncyBwYXlsb2FkIGlzIGZvcndhcmRlZCB0byB0aGUgV0FTTSByb3VuZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2VzRm9ySXRoUm91bmQgLSBCb3RoIG1lc3NhZ2VzIGZvciB0aGlzIHJvdW5kIChvd24gKyBjb3VudGVycGFydCkuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzRm9ySXRoUm91bmQ6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGFscmVhZHkgY29tcGxldGVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ0RTRyBzZXNzaW9uIG11c3QgY2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBiZWZvcmUgaGFuZGxpbmcgaW5jb21pbmcgbWVzc2FnZXMuIENhbGwgZ2V0Rmlyc3RNZXNzYWdlKCkgZmlyc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzRm9ySXRoUm91bmQubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSByb3VuZC4gRXhwZWN0ZWQgMiBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciAyLW9mLTMgRFNHJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVlck1lc3NhZ2VzID0gbWVzc2FnZXNGb3JJdGhSb3VuZC5maWx0ZXIoKG0pID0+IG0uZnJvbSAhPT0gdGhpcy5wYXJ0eUlkeCk7XG4gICAgaWYgKHBlZXJNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IDEgY291bnRlcnBhcnQgbWVzc2FnZTsgZ290ICR7cGVlck1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlck1zZyA9IHBlZXJNZXNzYWdlc1swXTtcbiAgICBpZiAocGVlck1zZy5mcm9tICE9PSB0aGlzLm90aGVyUGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBVbmV4cGVjdGVkIGNvdW50ZXJwYXJ0IHBhcnR5IGluZGV4OiBnb3QgJHtwZWVyTXNnLmZyb219LCBleHBlY3RlZCAke3RoaXMub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgY29uc3QgcGVlclBheWxvYWQgPSBCdWZmZXIuZnJvbShwZWVyTXNnLnBheWxvYWQpO1xuICAgIGNvbnN0IHdhc20gPSB0aGlzLmdldFdhc21NcHMoKTtcblxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMSkge1xuICAgICAgYXNzZXJ0KHRoaXMuZHNnU3RhdGVCeXRlcywgJ2RzZ1N0YXRlQnl0ZXMgbXVzdCBiZSBzZXQgaW4gV2FpdE1zZzEnKTtcbiAgICAgIGxldCByZXN1bHQ6IE1zZ1N0YXRlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gd2FzbS5yZWRwYWxsYXNfZHNnX3JvdW5kMV9wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGF0ZSk7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzI7XG4gICAgICByZXR1cm4gW3sgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkocmVzdWx0Lm1zZyksIGZyb206IHRoaXMucGFydHlJZHggfV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLldhaXRNc2cyKSB7XG4gICAgICBhc3NlcnQodGhpcy5kc2dTdGF0ZUJ5dGVzLCAnZHNnU3RhdGVCeXRlcyBtdXN0IGJlIHNldCBpbiBXYWl0TXNnMicpO1xuICAgICAgbGV0IHJlc3VsdDogTXNnU3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBSZWRQYWxsYXNEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgcmVzdWx0OiBSZWRQYWxsYXNTaWduYXR1cmU7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB3YXNtLnJlZHBhbGxhc19kc2dfcm91bmQzX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5zaWduYXR1cmVSZXN1bHQgPSB7XG4gICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20ocmVzdWx0LnNpZ25hdHVyZSksXG4gICAgICAgIHJrOiBCdWZmZXIuZnJvbShyZXN1bHQucmspLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IG51bGw7XG4gICAgICB0aGlzLmRzZ1N0YXRlID0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGU7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdGhyb3cgRXJyb3IoJ1VuZXhwZWN0ZWQgRFNHIHN0YXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmluYWwgc2lnbmF0dXJlIGJ1bmRsZSBwcm9kdWNlZCBieSByb3VuZCAzOiB0aGUgNjQtYnl0ZSByYXcgUmVkUGFsbGFzXG4gICAqIHNpZ25hdHVyZSBhbmQgdGhlIHJlcmFuZG9taXplZCB2ZXJpZmljYXRpb24ga2V5IGBya2AgaXQgbXVzdCBiZSB2ZXJpZmllZCBhZ2FpbnN0XG4gICAqICh2aWEgYHJlZHBhbGxhc192ZXJpZnkocmssIHNpZ25hdHVyZSwgbWVzc2FnZSlgIOKAlCBOT1QgdGhlIERLRyBwdWJsaWMga2V5KS4gYHJrYFxuICAgKiBlcXVhbHMgdGhlIGBwa2Agb2YgdGhlIHJlcmFuZCByZXN1bHQgdGhpcyBzZXNzaW9uIHdhcyBpbml0aWFsaXplZCB3aXRoOyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBgYWxwaGFgIGlzIGF2YWlsYWJsZSBmcm9tIGBSZWRQYWxsYXNSZXJhbmQuZ2V0UmVyYW5kb21pemVkS2V5U2hhcmUoKWAuXG4gICAqL1xuICBnZXRTaWduYXR1cmUoKTogUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuc2lnbmF0dXJlUmVzdWx0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaGFzIG5vdCBwcm9kdWNlZCBhIHNpZ25hdHVyZSB5ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzdGF0ZSBhcyBhIEpTT04gc3RyaW5nIGZvciBwZXJzaXN0ZW5jZS5cbiAgICogSW5jbHVkZXMgdGhlIG9wYXF1ZSByb3VuZCBzdGF0ZSBieXRlcyBwbHVzIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlLWVudGVyIHRoZVxuICAgKiBwcm90b2NvbCBhZnRlciBhIHJlc3RhcnQgKGtleXNoYXJlLCBtZXNzYWdlLCBjb3VudGVycGFydCkuXG4gICAqL1xuICBnZXRTZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gaXMgY29tcGxldGUuIEV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpcyBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IFJlZFBhbGxhc0RzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBtdXN0IHByb2R1Y2UgaXRzIGZpcnN0IG1lc3NhZ2UgYmVmb3JlIGV4cG9ydGluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGRzZ1N0YXRlQnl0ZXM6IHRoaXMuZHNnU3RhdGVCeXRlcz8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBkc2dSb3VuZDogdGhpcy5kc2dTdGF0ZSxcbiAgICAgIGtleVNoYXJlOiB0aGlzLmtleVNoYXJlPy50b1N0cmluZygnYmFzZTY0JykgPz8gbnVsbCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRXYXNtTXBzKCk7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvbik7XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFJlZFBhbGxhc0RzZ1N0YXRlKS5pbmNsdWRlcyhkYXRhLmRzZ1JvdW5kKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZHNnUm91bmQgaW4gc2Vzc2lvbjogJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuVW5pbml0aWFsaXplZCB8fCBkYXRhLmRzZ1JvdW5kID09PSBSZWRQYWxsYXNEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ2Fubm90IHJlc3RvcmUgRFNHIHNlc3Npb24gaW4gc3RhdGUgJHtkYXRhLmRzZ1JvdW5kfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5kc2dSb3VuZCA9PT0gUmVkUGFsbGFzRHNnU3RhdGUuQ29tcGxldGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBpcyBjb21wbGV0ZS4gUmVzdG9yaW5nIHRoZSBzZXNzaW9uIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEucGFydHlJZHggIT09ICdudW1iZXInIHx8IGRhdGEucGFydHlJZHggPCAwIHx8IGRhdGEucGFydHlJZHggPiAyKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBwYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEucGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBkYXRhLm90aGVyUGFydHlJZHggIT09ICdudW1iZXInIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPCAwIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPiAyIHx8XG4gICAgICBkYXRhLm90aGVyUGFydHlJZHggPT09IGRhdGEucGFydHlJZHhcbiAgICApIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggaW4gc2Vzc2lvbjogJHtkYXRhLm90aGVyUGFydHlJZHh9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4ICE9PSBkYXRhLnBhcnR5SWR4KSB7XG4gICAgICB0aHJvdyBFcnJvcihgU2Vzc2lvbiBwYXJ0eUlkeCAke2RhdGEucGFydHlJZHh9IGRvZXMgbm90IG1hdGNoIGluc3RhbmNlICR7dGhpcy5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRzZ1N0YXRlQnl0ZXMgIT09ICdzdHJpbmcnIHx8IGRhdGEuZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmtleVNoYXJlICE9PSAnc3RyaW5nJyB8fCBkYXRhLmtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5tZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBtZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHNnU3RhdGVCeXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEuZHNnU3RhdGVCeXRlcywgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGtleVNoYXJlID0gQnVmZmVyLmZyb20oZGF0YS5rZXlTaGFyZSwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuZnJvbShkYXRhLm1lc3NhZ2UsICdiYXNlNjQnKTtcbiAgICBpZiAoZHNnU3RhdGVCeXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGBSb3VuZCAke2RhdGEuZHNnUm91bmR9IHJlcXVpcmVzIGRzZ1N0YXRlQnl0ZXNgKTtcbiAgICB9XG4gICAgaWYgKGtleVNoYXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBrZXlTaGFyZScpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3NpbmcgbWVzc2FnZScpO1xuICAgIH1cblxuICAgIHRoaXMuZHNnU3RhdGVCeXRlcyA9IGRzZ1N0YXRlQnl0ZXM7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IGRhdGEuZHNnUm91bmQ7XG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IGRhdGEucGFydHlJZHg7XG4gICAgdGhpcy5vdGhlclBhcnR5SWR4ID0gZGF0YS5vdGhlclBhcnR5SWR4O1xuICB9XG59XG4iXX0=
@@ -1,7 +1,8 @@
1
1
  export * as RedPallasMPSDkg from './dkg';
2
2
  export * as RedPallasMPSDsg from './dsg';
3
+ export * as RedPallasMPSRerand from './rerand';
3
4
  export * as RedPallasMPSUtil from './util';
4
5
  export * as RedPallasMPSTypes from './types';
5
6
  export * as RedPallasMPSComms from './commsLayer';
6
- export type { RedPallasSignatureResult } from './types';
7
+ export type { RedPallasRerandResult, RedPallasSignatureResult } from './types';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,eAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,kBAAkB,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
@@ -33,10 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.RedPallasMPSComms = exports.RedPallasMPSTypes = exports.RedPallasMPSUtil = exports.RedPallasMPSDsg = exports.RedPallasMPSDkg = void 0;
36
+ exports.RedPallasMPSComms = exports.RedPallasMPSTypes = exports.RedPallasMPSUtil = exports.RedPallasMPSRerand = exports.RedPallasMPSDsg = exports.RedPallasMPSDkg = void 0;
37
37
  exports.RedPallasMPSDkg = __importStar(require("./dkg"));
38
38
  exports.RedPallasMPSDsg = __importStar(require("./dsg"));
39
+ exports.RedPallasMPSRerand = __importStar(require("./rerand"));
39
40
  exports.RedPallasMPSUtil = __importStar(require("./util"));
40
41
  exports.RedPallasMPSTypes = __importStar(require("./types"));
41
42
  exports.RedPallasMPSComms = __importStar(require("./commsLayer"));
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3JlZHBhbGxhcy1tcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXlDO0FBQ3pDLHlEQUF5QztBQUN6QywyREFBMkM7QUFDM0MsNkRBQTZDO0FBQzdDLGtFQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU0RrZyBmcm9tICcuL2RrZyc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0ICogYXMgUmVkUGFsbGFzTVBTVXRpbCBmcm9tICcuL3V0aWwnO1xuZXhwb3J0ICogYXMgUmVkUGFsbGFzTVBTVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNDb21tcyBmcm9tICcuL2NvbW1zTGF5ZXInO1xuZXhwb3J0IHR5cGUgeyBSZWRQYWxsYXNTaWduYXR1cmVSZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcbiJdfQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3JlZHBhbGxhcy1tcHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXlDO0FBQ3pDLHlEQUF5QztBQUN6QywrREFBK0M7QUFDL0MsMkRBQTJDO0FBQzNDLDZEQUE2QztBQUM3QyxrRUFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNEa2cgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgUmVkUGFsbGFzTVBTRHNnIGZyb20gJy4vZHNnJztcbmV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU1JlcmFuZCBmcm9tICcuL3JlcmFuZCc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNVdGlsIGZyb20gJy4vdXRpbCc7XG5leHBvcnQgKiBhcyBSZWRQYWxsYXNNUFNUeXBlcyBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGFzIFJlZFBhbGxhc01QU0NvbW1zIGZyb20gJy4vY29tbXNMYXllcic7XG5leHBvcnQgdHlwZSB7IFJlZFBhbGxhc1JlcmFuZFJlc3VsdCwgUmVkUGFsbGFzU2lnbmF0dXJlUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG4iXX0=
@@ -0,0 +1,110 @@
1
+ import { DeserializedMessage, DeserializedMessages, RedPallasRerandResult, RedPallasRerandState } from './types';
2
+ /**
3
+ * RedPallas (Zcash Ironwood) key re-randomization implementation using @bitgo/wasm-mps.
4
+ *
5
+ * As of `@bitgo/wasm-mps` 1.17.0, key re-randomization has moved out of DSG and into
6
+ * this separate `rerand` protocol: DSG no longer randomizes the key it signs with.
7
+ * A rerand session MUST run before every RedPallas DSG, between the same 2 parties
8
+ * that will then sign:
9
+ *
10
+ * - Round 0 (local): each party commits to a fresh random randomizer.
11
+ * - Round 1 (commit): each party broadcasts its commitment.
12
+ * - Round 2 (open): each party broadcasts its randomizer and blind, bound to the
13
+ * session id. Both parties then locally verify the openings and apply the same
14
+ * tweak `alpha = hash(Σ randomizers)`: `d_i += alpha`, `pk += G·alpha`.
15
+ *
16
+ * The output `RedPallasRerandShare` is a rerandomized keyshare (`share`), the
17
+ * rerandomized public key (`pk`) and the tweak scalar (`alpha`). `share` is what
18
+ * goes into `RedPallasDSG.initDsg`; the resulting DSG signature verifies under
19
+ * `rk == pk`, and `alpha` is only available here — not from the DSG result.
20
+ *
21
+ * Signing a stored DKG keyshare directly (without rerand) still yields a valid
22
+ * signature, but under the bare DKG public key with the same `rk` every time; the
23
+ * rerand → DSG sequence is the supported path.
24
+ *
25
+ * Mirrors the structure of `RedPallasDSG` (see `./dsg.ts`): lazy web/node WASM
26
+ * loading, explicit round state bytes persisted between rounds, hard-coded 2-of-3
27
+ * with a single counterpart, and the same 2-message `handleIncomingMessages`
28
+ * contract (own + counterpart; own is filtered out internally).
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const rerand = new RedPallasRerand(0); // partyIdx 0
33
+ * await rerand.initRerand(keyShare, 2); // counterpart is party 2
34
+ * const msg1 = rerand.getFirstMessage();
35
+ * const msg2 = rerand.handleIncomingMessages([msg1, peerMsg1]); // emits rerand msg2
36
+ * rerand.handleIncomingMessages([msg2[0], peerMsg2]); // completes rerand
37
+ * const { keyShare, pk, alpha } = rerand.getRerandomizedKeyShare();
38
+ * const dsg = new RedPallasDSG(0);
39
+ * await dsg.initDsg(keyShare, message, 2); // DSG verifies under rk == pk
40
+ * ```
41
+ */
42
+ export declare class RedPallasRerand {
43
+ protected partyIdx: number;
44
+ protected otherPartyIdx: number | null;
45
+ /** Opaque bincode-serialised Keyshare from a prior DKG (already derived, if applicable) */
46
+ private keyShare;
47
+ /** Serialised round state bytes returned by the previous round function */
48
+ private rerandStateBytes;
49
+ /** Final rerandomized share bundle, available after WaitMsg2 -> Complete */
50
+ private rerandResult;
51
+ /** Lazily loaded WASM module */
52
+ private wasmMps;
53
+ protected rerandState: RedPallasRerandState;
54
+ constructor(partyIdx: number);
55
+ getState(): RedPallasRerandState;
56
+ getPartyIdx(): number;
57
+ getOtherPartyIdx(): number | null;
58
+ private loadWasmMps;
59
+ private getWasmMps;
60
+ /**
61
+ * Initialises the rerand session. The keyshare must come from a prior DKG run (and,
62
+ * if a derived key is being used, from the subsequent platform-side derivation
63
+ * process), and `otherPartyIdx` must be the single counterpart who will then co-sign
64
+ * (via DSG) with this party. Rerand and DSG must use the same 2 parties.
65
+ *
66
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `RedPallasDKG.getKeyShare()`.
67
+ * @param otherPartyIdx - Party index of the single counterpart in this rerand session.
68
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
69
+ */
70
+ initRerand(keyShare: Buffer, otherPartyIdx: number): Promise<void>;
71
+ /**
72
+ * Runs round 0 of the rerand protocol (local). Returns this party's broadcast
73
+ * message (a commitment to a fresh random randomizer). Stores the round state
74
+ * bytes internally for the next round.
75
+ */
76
+ getFirstMessage(): DeserializedMessage;
77
+ /**
78
+ * Handles incoming messages for the current round and advances the protocol.
79
+ *
80
+ * - In `WaitMsg1`: runs round 1 (commit), returns this party's round 2 broadcast
81
+ * (its randomizer and blind).
82
+ * - In `WaitMsg2`: runs round 2 (open + local tweak), completes rerand, returns `[]`.
83
+ *
84
+ * The caller passes both messages (own + counterpart) for symmetry with
85
+ * `RedPallasDSG.handleIncomingMessages`. Own message is filtered out internally;
86
+ * only the counterpart's payload is forwarded to the WASM round function.
87
+ *
88
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
89
+ */
90
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
91
+ /**
92
+ * Returns the rerandomized share bundle produced by round 2: the rerandomized
93
+ * keyshare `keyShare` (to be passed to `RedPallasDSG.initDsg`), the rerandomized
94
+ * public key `pk` (the DSG result's `rk` equals it), and the 32-byte tweak scalar
95
+ * `alpha` (fresh per rerand session, identical on both parties).
96
+ */
97
+ getRerandomizedKeyShare(): RedPallasRerandResult;
98
+ /**
99
+ * Exports the current session state as a JSON string for persistence.
100
+ * Includes the opaque round state bytes plus everything needed to re-enter the
101
+ * protocol after a restart (keyshare, counterpart).
102
+ */
103
+ getSession(): string;
104
+ /**
105
+ * Restores a previously exported session. Allows the protocol to continue from
106
+ * where it left off, as if the round state was loaded from a database.
107
+ */
108
+ restoreSession(session: string): Promise<void>;
109
+ }
110
+ //# sourceMappingURL=rerand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rerand.d.ts","sourceRoot":"","sources":["../../../../src/tss/redpallas-mps/rerand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAMjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,eAAe;IAC1B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAuB;IAEvC,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAsC;IAC1D,gCAAgC;IAChC,OAAO,CAAC,OAAO,CAAwB;IAEvC,SAAS,CAAC,WAAW,EAAE,oBAAoB,CAAsC;gBAErE,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,oBAAoB;IAIhC,WAAW,IAAI,MAAM;IAIrB,gBAAgB,IAAI,MAAM,GAAG,IAAI;YAInB,WAAW;IAoBzB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;OASG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxE;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAmBtC;;;;;;;;;;;;OAYG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IA+DvF;;;;;OAKG;IACH,uBAAuB,IAAI,qBAAqB;IAOhD;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAmBpB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDrD"}