@bitgo-beta/sdk-api 1.10.1-beta.1697 → 1.10.1-beta.1699

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.
@@ -1,3 +1,14 @@
1
+ import * as t from 'io-ts';
2
+ declare const V2EnvelopeCodec: t.TypeC<{
3
+ v: t.LiteralC<2>;
4
+ m: t.Type<number, number, unknown>;
5
+ t: t.Type<number, number, unknown>;
6
+ p: t.Type<number, number, unknown>;
7
+ salt: t.Type<string, string, unknown>;
8
+ iv: t.Type<string, string, unknown>;
9
+ ct: t.Type<string, string, unknown>;
10
+ }>;
11
+ export type V2Envelope = t.TypeOf<typeof V2EnvelopeCodec>;
1
12
  /**
2
13
  * convert a 4 element Uint8Array to a 4 byte Number
3
14
  *
@@ -11,4 +22,32 @@ export declare function encrypt(password: string, plaintext: string, options?: {
11
22
  adata?: string;
12
23
  }): string;
13
24
  export declare function decrypt(password: string, ciphertext: string): string;
25
+ /**
26
+ * Async decrypt that auto-detects v1 (SJCL) or v2 (Argon2id + AES-256-GCM)
27
+ * from the JSON envelope's `v` field.
28
+ *
29
+ * This is the migration path from sync `decrypt()`. Clients should move to
30
+ * `await decryptAsync()` before the breaking release that makes `decrypt()` async.
31
+ */
32
+ export declare function decryptAsync(password: string, ciphertext: string): Promise<string>;
33
+ /**
34
+ * Encrypt plaintext using Argon2id KDF + AES-256-GCM.
35
+ *
36
+ * Returns a JSON string containing a self-describing v2 envelope
37
+ * with Argon2id parameters, salt, IV, and ciphertext.
38
+ */
39
+ export declare function encryptV2(password: string, plaintext: string, options?: {
40
+ salt?: Uint8Array;
41
+ iv?: Uint8Array;
42
+ memorySize?: number;
43
+ iterations?: number;
44
+ parallelism?: number;
45
+ }): Promise<string>;
46
+ /**
47
+ * Decrypt a v2 envelope (Argon2id KDF + AES-256-GCM).
48
+ *
49
+ * The envelope must contain: v, m, t, p, salt, iv, ct.
50
+ */
51
+ export declare function decryptV2(password: string, ciphertext: string): Promise<string>;
52
+ export {};
14
53
  //# sourceMappingURL=encrypt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAMjE;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,MAAM,CAgCR;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEpE"}
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AA2B3B,QAAA,MAAM,eAAe;;;;;;;;EAQnB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAMjE;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,MAAM,CAgCR;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAexF;AAwBD;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBrF"}
@@ -36,8 +36,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.bytesToWord = bytesToWord;
37
37
  exports.encrypt = encrypt;
38
38
  exports.decrypt = decrypt;
39
+ exports.decryptAsync = decryptAsync;
40
+ exports.encryptV2 = encryptV2;
41
+ exports.decryptV2 = decryptV2;
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
39
43
  const sjcl = __importStar(require("@bitgo-beta/sjcl"));
40
44
  const crypto_1 = require("crypto");
45
+ const t = __importStar(require("io-ts"));
46
+ /** Default Argon2id parameters per RFC 9106 second recommendation
47
+ * @see https://www.rfc-editor.org/rfc/rfc9106#section-4
48
+ */
49
+ const ARGON2_DEFAULTS = {
50
+ memorySize: 65536, // 64 MiB in KiB
51
+ iterations: 3,
52
+ parallelism: 4,
53
+ hashLength: 32, // 256-bit key
54
+ saltLength: 16, // 128-bit salt
55
+ };
56
+ /** Maximum allowed Argon2id parameters to prevent DoS via crafted envelopes.
57
+ * memorySize: 256 MiB (4x default) -- caps memory allocation on untrusted input.
58
+ * iterations: 16 -- caps CPU time.
59
+ * parallelism: 16 -- caps thread count.
60
+ */
61
+ const ARGON2_MAX = {
62
+ memorySize: 262144,
63
+ iterations: 16,
64
+ parallelism: 16,
65
+ };
66
+ /** AES-256-GCM IV length in bytes */
67
+ const GCM_IV_LENGTH = 12;
68
+ const V2EnvelopeCodec = t.type({
69
+ v: t.literal(2),
70
+ m: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.memorySize, 'memorySize'),
71
+ t: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.iterations, 'iterations'),
72
+ p: (0, sdk_core_1.boundedInt)(1, ARGON2_MAX.parallelism, 'parallelism'),
73
+ salt: sdk_core_1.base64String,
74
+ iv: sdk_core_1.base64String,
75
+ ct: sdk_core_1.base64String,
76
+ });
41
77
  /**
42
78
  * convert a 4 element Uint8Array to a 4 byte Number
43
79
  *
@@ -78,4 +114,101 @@ function encrypt(password, plaintext, options) {
78
114
  function decrypt(password, ciphertext) {
79
115
  return sjcl.decrypt(password, ciphertext);
80
116
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0Esa0NBTUM7QUFFRCwwQkF3Q0M7QUFFRCwwQkFFQztBQTdERCx1REFBeUM7QUFDekMsbUNBQXFDO0FBRXJDOzs7OztHQUtHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQTZCO0lBQ3ZELElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQWdCLE9BQU8sQ0FDckIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsT0FJQztJQUVELE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBQSxvQkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELE1BQU0sY0FBYyxHQU1oQjtRQUNGLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLEdBQUc7UUFDUCxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEVBQUUsRUFBRTtZQUNGLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5QjtLQUNGLENBQUM7SUFFRixJQUFJLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQixjQUFjLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxTQUFnQixPQUFPLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtJQUMxRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby1iZXRhL3NqY2wnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG4vKipcbiAqIGNvbnZlcnQgYSA0IGVsZW1lbnQgVWludDhBcnJheSB0byBhIDQgYnl0ZSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0gYnl0ZXNcbiAqIEByZXR1cm4gNCBieXRlIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb1dvcmQoYnl0ZXM/OiBVaW50OEFycmF5IHwgbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoIShieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGJ5dGVzLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnl0ZXMgbXVzdCBiZSBhIFVpbnQ4QXJyYXkgd2l0aCBsZW5ndGggNCcpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzLnJlZHVjZSgobnVtLCBieXRlKSA9PiBudW0gKiAweDEwMCArIGJ5dGUsIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgc2FsdD86IEJ1ZmZlcjtcbiAgICBpdj86IEJ1ZmZlcjtcbiAgICBhZGF0YT86IHN0cmluZztcbiAgfVxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdCA9IG9wdGlvbnM/LnNhbHQgfHwgcmFuZG9tQnl0ZXMoOCk7XG4gIGlmIChzYWx0Lmxlbmd0aCAhPT0gOCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2FsdCBtdXN0IGJlIDggYnl0ZXNgKTtcbiAgfVxuICBjb25zdCBpdiA9IG9wdGlvbnM/Lml2IHx8IHJhbmRvbUJ5dGVzKDE2KTtcbiAgaWYgKGl2Lmxlbmd0aCAhPT0gMTYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGl2IG11c3QgYmUgMTYgYnl0ZXNgKTtcbiAgfVxuICBjb25zdCBlbmNyeXB0T3B0aW9uczoge1xuICAgIGl0ZXI6IG51bWJlcjtcbiAgICBrczogbnVtYmVyO1xuICAgIHNhbHQ6IG51bWJlcltdO1xuICAgIGl2OiBudW1iZXJbXTtcbiAgICBhZGF0YT86IHN0cmluZztcbiAgfSA9IHtcbiAgICBpdGVyOiAxMDAwMCxcbiAgICBrczogMjU2LFxuICAgIHNhbHQ6IFtieXRlc1RvV29yZChzYWx0LnNsaWNlKDAsIDQpKSwgYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSg0KSldLFxuICAgIGl2OiBbXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgwLCA0KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg0LCA4KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg4LCAxMikpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMTIsIDE2KSksXG4gICAgXSxcbiAgfTtcblxuICBpZiAob3B0aW9ucz8uYWRhdGEpIHtcbiAgICBlbmNyeXB0T3B0aW9ucy5hZGF0YSA9IG9wdGlvbnMuYWRhdGE7XG4gIH1cblxuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHQocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG59XG4iXX0=
117
+ /**
118
+ * Async decrypt that auto-detects v1 (SJCL) or v2 (Argon2id + AES-256-GCM)
119
+ * from the JSON envelope's `v` field.
120
+ *
121
+ * This is the migration path from sync `decrypt()`. Clients should move to
122
+ * `await decryptAsync()` before the breaking release that makes `decrypt()` async.
123
+ */
124
+ async function decryptAsync(password, ciphertext) {
125
+ let isV2 = false;
126
+ try {
127
+ // Only peeking at the v field to route; this is an internal format we produce, not external input.
128
+ const envelope = JSON.parse(ciphertext);
129
+ isV2 = envelope.v === 2;
130
+ }
131
+ catch {
132
+ // Not valid JSON -- fall through to v1
133
+ }
134
+ if (isV2) {
135
+ // Do not catch errors here: a wrong password or corrupt envelope on v2 data
136
+ // should propagate, not silently fall through to a v1 decrypt attempt.
137
+ return decryptV2(password, ciphertext);
138
+ }
139
+ return sjcl.decrypt(password, ciphertext);
140
+ }
141
+ /**
142
+ * Derive a 256-bit key from a password using Argon2id.
143
+ */
144
+ async function deriveKeyV2(password, salt, params) {
145
+ const { argon2id } = await Promise.resolve().then(() => __importStar(require('@bitgo-beta/argon2')));
146
+ const keyBytes = await argon2id({
147
+ password,
148
+ salt,
149
+ memorySize: params.memorySize,
150
+ iterations: params.iterations,
151
+ parallelism: params.parallelism,
152
+ hashLength: ARGON2_DEFAULTS.hashLength,
153
+ outputType: 'binary',
154
+ });
155
+ return crypto.subtle.importKey('raw', keyBytes, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt']);
156
+ }
157
+ /**
158
+ * Encrypt plaintext using Argon2id KDF + AES-256-GCM.
159
+ *
160
+ * Returns a JSON string containing a self-describing v2 envelope
161
+ * with Argon2id parameters, salt, IV, and ciphertext.
162
+ */
163
+ async function encryptV2(password, plaintext, options) {
164
+ const memorySize = options?.memorySize ?? ARGON2_DEFAULTS.memorySize;
165
+ const iterations = options?.iterations ?? ARGON2_DEFAULTS.iterations;
166
+ const parallelism = options?.parallelism ?? ARGON2_DEFAULTS.parallelism;
167
+ const salt = options?.salt ?? new Uint8Array((0, crypto_1.randomBytes)(ARGON2_DEFAULTS.saltLength));
168
+ if (salt.length !== ARGON2_DEFAULTS.saltLength) {
169
+ throw new Error(`salt must be ${ARGON2_DEFAULTS.saltLength} bytes`);
170
+ }
171
+ const iv = options?.iv ?? new Uint8Array((0, crypto_1.randomBytes)(GCM_IV_LENGTH));
172
+ if (iv.length !== GCM_IV_LENGTH) {
173
+ throw new Error(`iv must be ${GCM_IV_LENGTH} bytes`);
174
+ }
175
+ const key = await deriveKeyV2(password, salt, { memorySize, iterations, parallelism });
176
+ const plaintextBytes = new TextEncoder().encode(plaintext);
177
+ const ctBuffer = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintextBytes);
178
+ const envelope = {
179
+ v: 2,
180
+ m: memorySize,
181
+ t: iterations,
182
+ p: parallelism,
183
+ salt: Buffer.from(salt).toString('base64'),
184
+ iv: Buffer.from(iv).toString('base64'),
185
+ ct: Buffer.from(ctBuffer).toString('base64'),
186
+ };
187
+ return JSON.stringify(envelope);
188
+ }
189
+ /**
190
+ * Decrypt a v2 envelope (Argon2id KDF + AES-256-GCM).
191
+ *
192
+ * The envelope must contain: v, m, t, p, salt, iv, ct.
193
+ */
194
+ async function decryptV2(password, ciphertext) {
195
+ let parsed;
196
+ try {
197
+ parsed = JSON.parse(ciphertext);
198
+ }
199
+ catch {
200
+ throw new Error('v2 decrypt: invalid JSON envelope');
201
+ }
202
+ const envelope = (0, sdk_core_1.decodeWithCodec)(V2EnvelopeCodec, parsed, 'v2 decrypt: invalid envelope');
203
+ const salt = new Uint8Array(Buffer.from(envelope.salt, 'base64'));
204
+ const iv = new Uint8Array(Buffer.from(envelope.iv, 'base64'));
205
+ const ct = new Uint8Array(Buffer.from(envelope.ct, 'base64'));
206
+ const key = await deriveKeyV2(password, salt, {
207
+ memorySize: envelope.m,
208
+ iterations: envelope.t,
209
+ parallelism: envelope.p,
210
+ });
211
+ const plaintextBuffer = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, ct);
212
+ return new TextDecoder().decode(plaintextBuffer);
213
+ }
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLGtDQU1DO0FBRUQsMEJBd0NDO0FBRUQsMEJBRUM7QUFTRCxvQ0FlQztBQThCRCw4QkF5Q0M7QUFPRCw4QkF1QkM7QUFqT0QsbURBQWlGO0FBQ2pGLHVEQUF5QztBQUN6QyxtQ0FBcUM7QUFDckMseUNBQTJCO0FBRTNCOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUc7SUFDdEIsVUFBVSxFQUFFLEtBQUssRUFBRSxnQkFBZ0I7SUFDbkMsVUFBVSxFQUFFLENBQUM7SUFDYixXQUFXLEVBQUUsQ0FBQztJQUNkLFVBQVUsRUFBRSxFQUFFLEVBQUUsY0FBYztJQUM5QixVQUFVLEVBQUUsRUFBRSxFQUFFLGVBQWU7Q0FDdkIsQ0FBQztBQUVYOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixVQUFVLEVBQUUsTUFBTTtJQUNsQixVQUFVLEVBQUUsRUFBRTtJQUNkLFdBQVcsRUFBRSxFQUFFO0NBQ1AsQ0FBQztBQUVYLHFDQUFxQztBQUNyQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QixDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZixDQUFDLEVBQUUsSUFBQSxxQkFBVSxFQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztJQUNyRCxDQUFDLEVBQUUsSUFBQSxxQkFBVSxFQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztJQUNyRCxDQUFDLEVBQUUsSUFBQSxxQkFBVSxFQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQztJQUN2RCxJ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QUFDLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxlQUFlLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXRGLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJhc2U2NFN0cmluZywgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28tYmV0YS9zamNsJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuXG4vKiogRGVmYXVsdCBBcmdvbjJpZCBwYXJhbWV0ZXJzIHBlciBSRkMgOTEwNiBzZWNvbmQgcmVjb21tZW5kYXRpb25cbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMDYjc2VjdGlvbi00XG4gKi9cbmNvbnN0IEFSR09OMl9ERUZBVUxUUyA9IHtcbiAgbWVtb3J5U2l6ZTogNjU1MzYsIC8vIDY0IE1pQiBpbiBLaUJcbiAgaXRlcmF0aW9uczogMyxcbiAgcGFyYWxsZWxpc206IDQsXG4gIGhhc2hMZW5ndGg6IDMyLCAvLyAyNTYtYml0IGtleVxuICBzYWx0TGVuZ3RoOiAxNiwgLy8gMTI4LWJpdCBzYWx0XG59IGFzIGNvbnN0O1xuXG4vKiogTWF4aW11bSBhbGxvd2VkIEFyZ29uMmlkIHBhcmFtZXRlcnMgdG8gcHJldmVudCBEb1MgdmlhIGNyYWZ0ZWQgZW52ZWxvcGVzLlxuICogbWVtb3J5U2l6ZTogMjU2IE1pQiAoNHggZGVmYXVsdCkgLS0gY2FwcyBtZW1vcnkgYWxsb2NhdGlvbiBvbiB1bnRydXN0ZWQgaW5wdXQuXG4gKiBpdGVyYXRpb25zOiAxNiAtLSBjYXBzIENQVSB0aW1lLlxuICogcGFyYWxsZWxpc206IDE2IC0tIGNhcHMgdGhyZWFkIGNvdW50LlxuICovXG5jb25zdCBBUkdPTjJfTUFYID0ge1xuICBtZW1vcnlTaXplOiAyNjIxNDQsXG4gIGl0ZXJhdGlvbnM6IDE2LFxuICBwYXJhbGxlbGlzbTogMTYsXG59IGFzIGNvbnN0O1xuXG4vKiogQUVTLTI1Ni1HQ00gSVYgbGVuZ3RoIGluIGJ5dGVzICovXG5jb25zdCBHQ01fSVZfTEVOR1RIID0gMTI7XG5cbmNvbnN0IFYyRW52ZWxvcGVDb2RlYyA9IHQudHlwZSh7XG4gIHY6IHQubGl0ZXJhbCgyKSxcbiAgbTogYm91bmRlZEludCgxLCBBUkdPTjJfTUFYLm1lbW9yeVNpemUsICdtZW1vcnlTaXplJyksXG4gIHQ6IGJvdW5kZWRJbnQoMSwgQVJHT04yX01BWC5pdGVyYXRpb25zLCAnaXRlcmF0aW9ucycpLFxuICBwOiBib3VuZGVkSW50KDEsIEFSR09OMl9NQVgucGFyYWxsZWxpc20sICdwYXJhbGxlbGlzbScpLFxuICBzYWx0OiBiYXNlNjRTdHJpbmcsXG4gIGl2OiBiYXNlNjRTdHJpbmcsXG4gIGN0OiBiYXNlNjRTdHJpbmcsXG59KTtcblxuZXhwb3J0IHR5cGUgVjJFbnZlbG9wZSA9IHQuVHlwZU9mPHR5cGVvZiBWMkVudmVsb3BlQ29kZWM+O1xuXG4vKipcbiAqIGNvbnZlcnQgYSA0IGVsZW1lbnQgVWludDhBcnJheSB0byBhIDQgYnl0ZSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0gYnl0ZXNcbiAqIEByZXR1cm4gNCBieXRlIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb1dvcmQoYnl0ZXM/OiBVaW50OEFycmF5IHwgbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoIShieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGJ5dGVzLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnl0ZXMgbXVzdCBiZSBhIFVpbnQ4QXJyYXkgd2l0aCBsZW5ndGggNCcpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzLnJlZHVjZSgobnVtLCBieXRlKSA9PiBudW0gKiAweDEwMCArIGJ5dGUsIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgc2FsdD86IEJ1ZmZlcjtcbiAgICBpdj86IEJ1ZmZlcjtcbiAgICBhZGF0YT86IHN0cmluZztcbiAgfVxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdCA9IG9wdGlvbnM/LnNhbHQgfHwgcmFuZG9tQnl0ZXMoOCk7XG4gIGlmIChzYWx0Lmxlbmd0aCAhPT0gOCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2FsdCBtdXN0IGJlIDggYnl0ZXNgKTtcbiAgfVxuICBjb25zdCBpdiA9IG9wdGlvbnM/Lml2IHx8IHJhbmRvbUJ5dGVzKDE2KTtcbiAgaWYgKGl2Lmxlbmd0aCAhPT0gMTYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGl2IG11c3QgYmUgMTYgYnl0ZXNgKTtcbiAgfVxuICBjb25zdCBlbmNyeXB0T3B0aW9uczoge1xuICAgIGl0ZXI6IG51bWJlcjtcbiAgICBrczogbnVtYmVyO1xuICAgIHNhbHQ6IG51bWJlcltdO1xuICAgIGl2OiBudW1iZXJbXTtcbiAgICBhZGF0YT86IHN0cmluZztcbiAgfSA9IHtcbiAgICBpdGVyOiAxMDAwMCxcbiAgICBrczogMjU2LFxuICAgIHNhbHQ6IFtieXRlc1RvV29yZChzYWx0LnNsaWNlKDAsIDQpKSwgYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSg0KSldLFxuICAgIGl2OiBbXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgwLCA0KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg0LCA4KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg4LCAxMikpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMTIsIDE2KSksXG4gICAgXSxcbiAgfTtcblxuICBpZiAob3B0aW9ucz8uYWRhdGEpIHtcbiAgICBlbmNyeXB0T3B0aW9ucy5hZGF0YSA9IG9wdGlvbnMuYWRhdGE7XG4gIH1cblxuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHQocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG59XG5cbi8qKlxuICogQXN5bmMgZGVjcnlwdCB0aGF0IGF1dG8tZGV0ZWN0cyB2MSAoU0pDTCkgb3IgdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pXG4gKiBmcm9tIHRoZSBKU09OIGVudmVsb3BlJ3MgYHZgIGZpZWxkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pZ3JhdGlvbiBwYXRoIGZyb20gc3luYyBgZGVjcnlwdCgpYC4gQ2xpZW50cyBzaG91bGQgbW92ZSB0b1xuICogYGF3YWl0IGRlY3J5cHRBc3luYygpYCBiZWZvcmUgdGhlIGJyZWFraW5nIHJlbGVhc2UgdGhhdCBtYWtlcyBgZGVjcnlwdCgpYCBhc3luYy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRBc3luYyhwYXNzd29yZDogc3RyaW5nLCBjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgaXNWMiA9IGZhbHNlO1xuICB0cnkge1xuICAgIC8vIE9ubHkgcGVla2luZyBhdCB0aGUgdiBmaWVsZCB0byByb3V0ZTsgdGhpcyBpcyBhbiBpbnRlcm5hbCBmb3JtYXQgd2UgcHJvZHVjZSwgbm90IGV4dGVybmFsIGlucHV0LlxuICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICBpc1YyID0gZW52ZWxvcGUudiA9PT0gMjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm90IHZhbGlkIEpTT04gLS0gZmFsbCB0aHJvdWdoIHRvIHYxXG4gIH1cbiAgaWYgKGlzVjIpIHtcbiAgICAvLyBEbyBub3QgY2F0Y2ggZXJyb3JzIGhlcmU6IGEgd3JvbmcgcGFzc3dvcmQgb3IgY29ycnVwdCBlbnZlbG9wZSBvbiB2MiBkYXRhXG4gICAgLy8gc2hvdWxkIHByb3BhZ2F0ZSwgbm90IHNpbGVudGx5IGZhbGwgdGhyb3VnaCB0byBhIHYxIGRlY3J5cHQgYXR0ZW1wdC5cbiAgICByZXR1cm4gZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICByZXR1cm4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYSAyNTYtYml0IGtleSBmcm9tIGEgcGFzc3dvcmQgdXNpbmcgQXJnb24yaWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcml2ZUtleVYyKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBzYWx0OiBVaW50OEFycmF5LFxuICBwYXJhbXM6IHsgbWVtb3J5U2l6ZTogbnVtYmVyOyBpdGVyYXRpb25zOiBudW1iZXI7IHBhcmFsbGVsaXNtOiBudW1iZXIgfVxuKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgY29uc3QgeyBhcmdvbjJpZCB9ID0gYXdhaXQgaW1wb3J0KCdAYml0Z28tYmV0YS9hcmdvbjInKTtcbiAgY29uc3Qga2V5Qnl0ZXMgPSBhd2FpdCBhcmdvbjJpZCh7XG4gICAgcGFzc3dvcmQsXG4gICAgc2FsdCxcbiAgICBtZW1vcnlTaXplOiBwYXJhbXMubWVtb3J5U2l6ZSxcbiAgICBpdGVyYXRpb25zOiBwYXJhbXMuaXRlcmF0aW9ucyxcbiAgICBwYXJhbGxlbGlzbTogcGFyYW1zLnBhcmFsbGVsaXNtLFxuICAgIGhhc2hMZW5ndGg6IEFSR09OMl9ERUZBVUxUUy5oYXNoTGVuZ3RoLFxuICAgIG91dHB1dFR5cGU6ICdiaW5hcnknLFxuICB9KTtcblxuICByZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleUJ5dGVzLCB7IG5hbWU6ICdBRVMtR0NNJyB9LCBmYWxzZSwgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBwbGFpbnRleHQgdXNpbmcgQXJnb24yaWQgS0RGICsgQUVTLTI1Ni1HQ00uXG4gKlxuICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYSBzZWxmLWRlc2NyaWJpbmcgdjIgZW52ZWxvcGVcbiAqIHdpdGggQXJnb24yaWQgcGFyYW1ldGVycywgc2FsdCwgSVYsIGFuZCBjaXBoZXJ0ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdFYyKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBzYWx0PzogVWludDhBcnJheTtcbiAgICBpdj86IFVpbnQ4QXJyYXk7XG4gICAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgICBpdGVyYXRpb25zPzogbnVtYmVyO1xuICAgIHBhcmFsbGVsaXNtPzogbnVtYmVyO1xuICB9XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtZW1vcnlTaXplID0gb3B0aW9ucz8ubWVtb3J5U2l6ZSA/PyBBUkdPTjJfREVGQVVMVFMubWVtb3J5U2l6ZTtcbiAgY29uc3QgaXRlcmF0aW9ucyA9IG9wdGlvbnM/Lml0ZXJhdGlvbnMgPz8gQVJHT04yX0RFRkFVTFRTLml0ZXJhdGlvbnM7XG4gIGNvbnN0IHBhcmFsbGVsaXNtID0gb3B0aW9ucz8ucGFyYWxsZWxpc20gPz8gQVJHT04yX0RFRkFVTFRTLnBhcmFsbGVsaXNtO1xuXG4gIGNvbnN0IHNhbHQgPSBvcHRpb25zPy5zYWx0ID8/IG5ldyBVaW50OEFycmF5KHJhbmRvbUJ5dGVzKEFSR09OMl9ERUZBVUxUUy5zYWx0TGVuZ3RoKSk7XG4gIGlmIChzYWx0Lmxlbmd0aCAhPT0gQVJHT04yX0RFRkFVTFRTLnNhbHRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNhbHQgbXVzdCBiZSAke0FSR09OMl9ERUZBVUxUUy5zYWx0TGVuZ3RofSBieXRlc2ApO1xuICB9XG5cbiAgY29uc3QgaXYgPSBvcHRpb25zPy5pdiA/PyBuZXcgVWludDhBcnJheShyYW5kb21CeXRlcyhHQ01fSVZfTEVOR1RIKSk7XG4gIGlmIChpdi5sZW5ndGggIT09IEdDTV9JVl9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGl2IG11c3QgYmUgJHtHQ01fSVZfTEVOR1RIfSBieXRlc2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0gYXdhaXQgZGVyaXZlS2V5VjIocGFzc3dvcmQsIHNhbHQsIHsgbWVtb3J5U2l6ZSwgaXRlcmF0aW9ucywgcGFyYWxsZWxpc20gfSk7XG5cbiAgY29uc3QgcGxhaW50ZXh0Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGxhaW50ZXh0KTtcbiAgY29uc3QgY3RCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoeyBuYW1lOiAnQUVTLUdDTScsIGl2IH0sIGtleSwgcGxhaW50ZXh0Qnl0ZXMpO1xuXG4gIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0ge1xuICAgIHY6IDIsXG4gICAgbTogbWVtb3J5U2l6ZSxcbiAgICB0OiBpdGVyYXRpb25zLFxuICAgIHA6IHBhcmFsbGVsaXNtLFxuICAgIHNhbHQ6IEJ1ZmZlci5mcm9tKHNhbHQpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICBpdjogQnVmZmVyLmZyb20oaXYpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICBjdDogQnVmZmVyLmZyb20oY3RCdWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSB2MiBlbnZlbG9wZSAoQXJnb24yaWQgS0RGICsgQUVTLTI1Ni1HQ00pLlxuICpcbiAqIFRoZSBlbnZlbG9wZSBtdXN0IGNvbnRhaW46IHYsIG0sIHQsIHAsIHNhbHQsIGl2LCBjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRWMihwYXNzd29yZDogc3RyaW5nLCBjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcigndjIgZGVjcnlwdDogaW52YWxpZCBKU09OIGVudmVsb3BlJyk7XG4gIH1cblxuICBjb25zdCBlbnZlbG9wZSA9IGRlY29kZVdpdGhDb2RlYyhWMkVudmVsb3BlQ29kZWMsIHBhcnNlZCwgJ3YyIGRlY3J5cHQ6IGludmFsaWQgZW52ZWxvcGUnKTtcblxuICBjb25zdCBzYWx0ID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZW52ZWxvcGUuc2FsdCwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5pdiwgJ2Jhc2U2NCcpKTtcbiAgY29uc3QgY3QgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShlbnZlbG9wZS5jdCwgJ2Jhc2U2NCcpKTtcblxuICBjb25zdCBrZXkgPSBhd2FpdCBkZXJpdmVLZXlWMihwYXNzd29yZCwgc2FsdCwge1xuICAgIG1lbW9yeVNpemU6IGVudmVsb3BlLm0sXG4gICAgaXRlcmF0aW9uczogZW52ZWxvcGUudCxcbiAgICBwYXJhbGxlbGlzbTogZW52ZWxvcGUucCxcbiAgfSk7XG5cbiAgY29uc3QgcGxhaW50ZXh0QnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHsgbmFtZTogJ0FFUy1HQ00nLCBpdiB9LCBrZXksIGN0KTtcblxuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBsYWludGV4dEJ1ZmZlcik7XG59XG4iXX0=
@@ -58,5 +58,121 @@ describe('encryption methods tests', () => {
58
58
  (0, assert_1.default)(decrypted === plaintext, 'decrypted should be equal to plaintext');
59
59
  });
60
60
  });
61
+ describe('v2 encrypt/decrypt (Argon2id + AES-256-GCM)', () => {
62
+ const password = 'myPassword';
63
+ const plaintext = 'Hello, World!';
64
+ it('encrypts and decrypts round-trip', async () => {
65
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
66
+ const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
67
+ assert_1.default.strictEqual(decrypted, plaintext);
68
+ });
69
+ it('produces a valid v2 envelope', async () => {
70
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
71
+ const envelope = JSON.parse(ciphertext);
72
+ assert_1.default.strictEqual(envelope.v, 2);
73
+ assert_1.default.strictEqual(envelope.m, 65536);
74
+ assert_1.default.strictEqual(envelope.t, 3);
75
+ assert_1.default.strictEqual(envelope.p, 4);
76
+ assert_1.default.ok(envelope.salt, 'envelope must have salt');
77
+ assert_1.default.ok(envelope.iv, 'envelope must have iv');
78
+ assert_1.default.ok(envelope.ct, 'envelope must have ct');
79
+ });
80
+ it('returns different ciphertext for the same plaintext and password', async () => {
81
+ const ct1 = await (0, src_1.encryptV2)(password, plaintext);
82
+ const ct2 = await (0, src_1.encryptV2)(password, plaintext);
83
+ assert_1.default.notStrictEqual(ct1, ct2);
84
+ });
85
+ it('decrypts with custom Argon2id parameters', async () => {
86
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext, {
87
+ memorySize: 1024,
88
+ iterations: 1,
89
+ parallelism: 1,
90
+ });
91
+ const envelope = JSON.parse(ciphertext);
92
+ assert_1.default.strictEqual(envelope.m, 1024);
93
+ assert_1.default.strictEqual(envelope.t, 1);
94
+ assert_1.default.strictEqual(envelope.p, 1);
95
+ const decrypted = await (0, src_1.decryptV2)(password, ciphertext);
96
+ assert_1.default.strictEqual(decrypted, plaintext);
97
+ });
98
+ it('throws on wrong password', async () => {
99
+ const ciphertext = await (0, src_1.encryptV2)(password, plaintext);
100
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)('wrongPassword', ciphertext));
101
+ });
102
+ it('throws on invalid JSON', async () => {
103
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, 'not-json'), /invalid JSON envelope/);
104
+ });
105
+ it('throws on wrong envelope version', async () => {
106
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify({ v: 99 })), /invalid envelope/);
107
+ });
108
+ it('throws on invalid salt length', async () => {
109
+ await assert_1.default.rejects(() => (0, src_1.encryptV2)(password, plaintext, { salt: new Uint8Array(8) }), /salt must be 16 bytes/);
110
+ });
111
+ it('throws on invalid iv length', async () => {
112
+ await assert_1.default.rejects(() => (0, src_1.encryptV2)(password, plaintext, { iv: new Uint8Array(8) }), /iv must be 12 bytes/);
113
+ });
114
+ it('v1 and v2 are independent (v1 data does not decrypt with v2)', async () => {
115
+ const v1ct = (0, src_1.encrypt)(password, plaintext);
116
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, v1ct), /invalid envelope/);
117
+ });
118
+ it('rejects envelope with memorySize exceeding max', async () => {
119
+ const envelope = { v: 2, m: 999999999, t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
120
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
121
+ });
122
+ it('rejects envelope with iterations exceeding max', async () => {
123
+ const envelope = { v: 2, m: 65536, t: 100, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
124
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
125
+ });
126
+ it('rejects envelope with parallelism exceeding max', async () => {
127
+ const envelope = { v: 2, m: 65536, t: 3, p: 100, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
128
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
129
+ });
130
+ it('rejects envelope with zero-valued parameters', async () => {
131
+ const envelope = { v: 2, m: 0, t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
132
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
133
+ });
134
+ it('rejects envelope with non-numeric parameter types', async () => {
135
+ const envelope = { v: 2, m: '65536', t: 3, p: 4, salt: 'AAAA', iv: 'AAAA', ct: 'AAAA' };
136
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
137
+ });
138
+ it('rejects envelope with empty salt', async () => {
139
+ const envelope = { v: 2, m: 65536, t: 3, p: 4, salt: '', iv: 'AAAA', ct: 'AAAA' };
140
+ await assert_1.default.rejects(() => (0, src_1.decryptV2)(password, JSON.stringify(envelope)), /invalid envelope/);
141
+ });
142
+ });
143
+ describe('decryptAsync (auto-detect v1/v2)', () => {
144
+ const password = 'myPassword';
145
+ const plaintext = 'Hello, World!';
146
+ it('decrypts v1 data', async () => {
147
+ const v1ct = (0, src_1.encrypt)(password, plaintext);
148
+ const result = await (0, src_1.decryptAsync)(password, v1ct);
149
+ assert_1.default.strictEqual(result, plaintext);
150
+ });
151
+ it('decrypts v2 data', async () => {
152
+ const v2ct = await (0, src_1.encryptV2)(password, plaintext);
153
+ const result = await (0, src_1.decryptAsync)(password, v2ct);
154
+ assert_1.default.strictEqual(result, plaintext);
155
+ });
156
+ it('throws on wrong password for v1', async () => {
157
+ const v1ct = (0, src_1.encrypt)(password, plaintext);
158
+ await assert_1.default.rejects(() => (0, src_1.decryptAsync)('wrong', v1ct));
159
+ });
160
+ it('throws on wrong password for v2', async () => {
161
+ const v2ct = await (0, src_1.encryptV2)(password, plaintext);
162
+ await assert_1.default.rejects(() => (0, src_1.decryptAsync)('wrong', v2ct));
163
+ });
164
+ it('wrong password on v2 data does not fall through to v1 decrypt', async () => {
165
+ const v2ct = await (0, src_1.encryptV2)(password, plaintext, { memorySize: 1024, iterations: 1, parallelism: 1 });
166
+ let caughtError;
167
+ try {
168
+ await (0, src_1.decryptAsync)('wrong', v2ct);
169
+ }
170
+ catch (e) {
171
+ caughtError = e;
172
+ }
173
+ assert_1.default.ok(caughtError, 'should have thrown');
174
+ assert_1.default.ok(!caughtError.message?.includes('sjcl'), 'error must not be from SJCL');
175
+ });
176
+ });
61
177
  });
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBNkM7QUFFN0MsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxVQUFVLEtBQUssU0FBUyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXpDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXZDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQ3pELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUVoRCxJQUFBLGdCQUFNLEVBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtZQUNsRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUM7WUFFdEMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxhQUFPLEVBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDakcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1lBQ25FLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUM7WUFDaEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxTQUFTLEtBQUssU0FBUyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0IH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ2VuY3J5cHRpb24gbWV0aG9kcyB0ZXN0cycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2VuY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2VuY3J5cHRzIHRoZSBwbGFpbnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dCAhPT0gcGxhaW50ZXh0LCAnY2lwaGVydGV4dCBzaG91bGQgbm90IGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSBkaWZmZXJlbnQgY2lwaGVydGV4dCBmb3IgdGhlIHNhbWUgcGxhaW50ZXh0IGFuZCBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDEgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDIgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dDEgIT09IGNpcGhlcnRleHQyLCAnY2lwaGVydGV4dHMgc2hvdWxkIG5vdCBiZSBlcXVhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgc2FsdCBsZW5ndGggaXMgbm90IDggYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHNhbHQ6IHJhbmRvbUJ5dGVzKDQpIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRpb25zKSwgbmV3IEVycm9yKGBzYWx0IG11c3QgYmUgOCBieXRlc2ApKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGl2IGxlbmd0aCBpcyBub3QgMTYgYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGl2OiByYW5kb21CeXRlcyg0KSB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyksIG5ldyBFcnJvcihgaXYgbXVzdCBiZSAxNiBieXRlc2ApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2RlY3J5cHRzIHRoZSBjaXBoZXJ0ZXh0IHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuXG4gICAgICBhc3NlcnQoZGVjcnlwdGVkID09PSBwbGFpbnRleHQsICdkZWNyeXB0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc3dvcmQgaXMgd3JvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3Qgd3JvbmdQYXNzd29yZCA9ICd3cm9uZ1Bhc3N3b3JkJztcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNyeXB0KHdyb25nUGFzc3dvcmQsIGNpcGhlcnRleHQpLCAnc2pjbCBleGNlcHRpb246IGNjOiBpbnZhbGlkIGFlcyBrZXknKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB0aGUgY2lwaGVydGV4dCB3aXRoIHRoZSBnaXZlbiBwYXNzd29yZCBhbmQgYWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGFkYXRhID0gJ2FkZGl0aW9uYWwgZGF0YSc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhIH0pO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG5cbiAgICAgIGFzc2VydChkZWNyeXB0ZWQgPT09IHBsYWludGV4dCwgJ2RlY3J5cHRlZCBzaG91bGQgYmUgZXF1YWwgdG8gcGxhaW50ZXh0Jyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBNkY7QUFFN0YsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxVQUFVLEtBQUssU0FBUyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUs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QUNwQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxXQUFXLEdBQUcsQ0FBVSxDQUFDO1lBQzNCLENBQUM7WUFDRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUM3QyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBkZWNyeXB0QXN5bmMsIGRlY3J5cHRWMiwgZW5jcnlwdCwgZW5jcnlwdFYyLCBWMkVudmVsb3BlIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ2VuY3J5cHRpb24gbWV0aG9kcyB0ZXN0cycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2VuY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2VuY3J5cHRzIHRoZSBwbGFpbnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dCAhPT0gcGxhaW50ZXh0LCAnY2lwaGVydGV4dCBzaG91bGQgbm90IGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSBkaWZmZXJlbnQgY2lwaGVydGV4dCBmb3IgdGhlIHNhbWUgcGxhaW50ZXh0IGFuZCBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDEgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDIgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dDEgIT09IGNpcGhlcnRleHQyLCAnY2lwaGVydGV4dHMgc2hvdWxkIG5vdCBiZSBlcXVhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgc2FsdCBsZW5ndGggaXMgbm90IDggYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHNhbHQ6IHJhbmRvbUJ5dGVzKDQpIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRpb25zKSwgbmV3IEVycm9yKGBzYWx0IG11c3QgYmUgOCBieXRlc2ApKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGl2IGxlbmd0aCBpcyBub3QgMTYgYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGl2OiByYW5kb21CeXRlcyg0KSB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyksIG5ldyBFcnJvcihgaXYgbXVzdCBiZSAxNiBieXRlc2ApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2RlY3J5cHRzIHRoZSBjaXBoZXJ0ZXh0IHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuXG4gICAgICBhc3NlcnQoZGVjcnlwdGVkID09PSBwbGFpbnRleHQsICdkZWNyeXB0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc3dvcmQgaXMgd3JvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3Qgd3JvbmdQYXNzd29yZCA9ICd3cm9uZ1Bhc3N3b3JkJztcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNyeXB0KHdyb25nUGFzc3dvcmQsIGNpcGhlcnRleHQpLCAnc2pjbCBleGNlcHRpb246IGNjOiBpbnZhbGlkIGFlcyBrZXknKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB0aGUgY2lwaGVydGV4dCB3aXRoIHRoZSBnaXZlbiBwYXNzd29yZCBhbmQgYWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGFkYXRhID0gJ2FkZGl0aW9uYWwgZGF0YSc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhIH0pO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG5cbiAgICAgIGFzc2VydChkZWNyeXB0ZWQgPT09IHBsYWludGV4dCwgJ2RlY3J5cHRlZCBzaG91bGQgYmUgZXF1YWwgdG8gcGxhaW50ZXh0Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2MiBlbmNyeXB0L2RlY3J5cHQgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pJywgKCkgPT4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcblxuICAgIGl0KCdlbmNyeXB0cyBhbmQgZGVjcnlwdHMgcm91bmQtdHJpcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY3J5cHRlZCwgcGxhaW50ZXh0KTtcbiAgICB9KTtcblxuICAgIGl0KCdwcm9kdWNlcyBhIHZhbGlkIHYyIGVudmVsb3BlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS52LCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5tLCA2NTUzNik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUudCwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZW52ZWxvcGUucCwgNCk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuc2FsdCwgJ2VudmVsb3BlIG11c3QgaGF2ZSBzYWx0Jyk7XG4gICAgICBhc3NlcnQub2soZW52ZWxvcGUuaXYsICdlbnZlbG9wZSBtdXN0IGhhdmUgaXYnKTtcbiAgICAgIGFzc2VydC5vayhlbnZlbG9wZS5jdCwgJ2VudmVsb3BlIG11c3QgaGF2ZSBjdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZGlmZmVyZW50IGNpcGhlcnRleHQgZm9yIHRoZSBzYW1lIHBsYWludGV4dCBhbmQgcGFzc3dvcmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdDEgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBjb25zdCBjdDIgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoY3QxLCBjdDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY3J5cHRzIHdpdGggY3VzdG9tIEFyZ29uMmlkIHBhcmFtZXRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHtcbiAgICAgICAgbWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgICAgaXRlcmF0aW9uczogMSxcbiAgICAgICAgcGFyYWxsZWxpc206IDEsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVudmVsb3BlOiBWMkVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5tLCAxMDI0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS50LCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbnZlbG9wZS5wLCAxKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNyeXB0ZWQsIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMignd3JvbmdQYXNzd29yZCcsIGNpcGhlcnRleHQpKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gaW52YWxpZCBKU09OJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCAnbm90LWpzb24nKSwgL2ludmFsaWQgSlNPTiBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBvbiB3cm9uZyBlbnZlbG9wZSB2ZXJzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeSh7IHY6IDk5IH0pKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gaW52YWxpZCBzYWx0IGxlbmd0aCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IHNhbHQ6IG5ldyBVaW50OEFycmF5KDgpIH0pLCAvc2FsdCBtdXN0IGJlIDE2IGJ5dGVzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIGludmFsaWQgaXYgbGVuZ3RoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgaXY6IG5ldyBVaW50OEFycmF5KDgpIH0pLCAvaXYgbXVzdCBiZSAxMiBieXRlcy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3YxIGFuZCB2MiBhcmUgaW5kZXBlbmRlbnQgKHYxIGRhdGEgZG9lcyBub3QgZGVjcnlwdCB3aXRoIHYyKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYxY3QgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCB2MWN0KSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggbWVtb3J5U2l6ZSBleGNlZWRpbmcgbWF4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSB7IHY6IDIsIG06IDk5OTk5OTk5OSwgdDogMywgcDogNCwgc2FsdDogJ0FBQUEnLCBpdjogJ0FBQUEnLCBjdDogJ0FBQUEnIH07XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWNyeXB0VjIocGFzc3dvcmQsIEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKSksIC9pbnZhbGlkIGVudmVsb3BlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBlbnZlbG9wZSB3aXRoIGl0ZXJhdGlvbnMgZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMTAwLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggcGFyYWxsZWxpc20gZXhjZWVkaW5nIG1heCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiA2NTUzNiwgdDogMywgcDogMTAwLCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggemVyby12YWx1ZWQgcGFyYW1ldGVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0geyB2OiAyLCBtOiAwLCB0OiAzLCBwOiA0LCBzYWx0OiAnQUFBQScsIGl2OiAnQUFBQScsIGN0OiAnQUFBQScgfTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRWMihwYXNzd29yZCwgSlNPTi5zdHJpbmdpZnkoZW52ZWxvcGUpKSwgL2ludmFsaWQgZW52ZWxvcGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGVudmVsb3BlIHdpdGggbm9uLW51bWVyaWMgcGFyYW1ldGVyIHR5cGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSB7IHY6IDIsIG06ICc2NTUzNicsIHQ6IDMsIHA6IDQsIHNhbHQ6ICdBQUFBJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgZW52ZWxvcGUgd2l0aCBlbXB0eSBzYWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSB7IHY6IDIsIG06IDY1NTM2LCB0OiAzLCBwOiA0LCBzYWx0OiAnJywgaXY6ICdBQUFBJywgY3Q6ICdBQUFBJyB9O1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdFYyKHBhc3N3b3JkLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSkpLCAvaW52YWxpZCBlbnZlbG9wZS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVjcnlwdEFzeW5jIChhdXRvLWRldGVjdCB2MS92MiknLCAoKSA9PiB7XG4gICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuXG4gICAgaXQoJ2RlY3J5cHRzIHYxIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MWN0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlY3J5cHRBc3luYyhwYXNzd29yZCwgdjFjdCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBwbGFpbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY3J5cHRzIHYyIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2MmN0ID0gYXdhaXQgZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjcnlwdEFzeW5jKHBhc3N3b3JkLCB2MmN0KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHBsYWludGV4dCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIG9uIHdyb25nIHBhc3N3b3JkIGZvciB2MScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYxY3QgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVjcnlwdEFzeW5jKCd3cm9uZycsIHYxY3QpKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgb24gd3JvbmcgcGFzc3dvcmQgZm9yIHYyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdjJjdCA9IGF3YWl0IGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlY3J5cHRBc3luYygnd3JvbmcnLCB2MmN0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd3JvbmcgcGFzc3dvcmQgb24gdjIgZGF0YSBkb2VzIG5vdCBmYWxsIHRocm91Z2ggdG8gdjEgZGVjcnlwdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHYyY3QgPSBhd2FpdCBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBtZW1vcnlTaXplOiAxMDI0LCBpdGVyYXRpb25zOiAxLCBwYXJhbGxlbGlzbTogMSB9KTtcbiAgICAgIGxldCBjYXVnaHRFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkZWNyeXB0QXN5bmMoJ3dyb25nJywgdjJjdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhdWdodEVycm9yID0gZSBhcyBFcnJvcjtcbiAgICAgIH1cbiAgICAgIGFzc2VydC5vayhjYXVnaHRFcnJvciwgJ3Nob3VsZCBoYXZlIHRocm93bicpO1xuICAgICAgYXNzZXJ0Lm9rKCFjYXVnaHRFcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnc2pjbCcpLCAnZXJyb3IgbXVzdCBub3QgYmUgZnJvbSBTSkNMJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=