@bitgo-beta/sdk-core 8.2.1-beta.2062 → 8.2.1-beta.2064

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.
Files changed (34) hide show
  1. package/dist/src/bitgo/environments.js +2 -2
  2. package/dist/src/bitgo/index.d.ts +1 -0
  3. package/dist/src/bitgo/index.d.ts.map +1 -1
  4. package/dist/src/bitgo/index.js +2 -1
  5. package/dist/src/bitgo/safe/iSafe.d.ts +30 -1
  6. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
  7. package/dist/src/bitgo/safe/iSafe.js +1 -1
  8. package/dist/src/bitgo/safe/rootCoin.d.ts +15 -0
  9. package/dist/src/bitgo/safe/rootCoin.d.ts.map +1 -0
  10. package/dist/src/bitgo/safe/rootCoin.js +47 -0
  11. package/dist/src/bitgo/safe/safe.d.ts +17 -1
  12. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  13. package/dist/src/bitgo/safe/safe.js +116 -1
  14. package/dist/src/bitgo/safe/safes.d.ts +0 -5
  15. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  16. package/dist/src/bitgo/safe/safes.js +6 -42
  17. package/dist/src/bitgo/webauthn/base64url.d.ts +16 -0
  18. package/dist/src/bitgo/webauthn/base64url.d.ts.map +1 -0
  19. package/dist/src/bitgo/webauthn/base64url.js +27 -0
  20. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts +18 -0
  21. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts.map +1 -0
  22. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.js +26 -0
  23. package/dist/src/bitgo/webauthn/derivePassword.d.ts +11 -0
  24. package/dist/src/bitgo/webauthn/derivePassword.d.ts.map +1 -0
  25. package/dist/src/bitgo/webauthn/derivePassword.js +16 -0
  26. package/dist/src/bitgo/webauthn/index.d.ts +5 -0
  27. package/dist/src/bitgo/webauthn/index.d.ts.map +1 -0
  28. package/dist/src/bitgo/webauthn/index.js +21 -0
  29. package/dist/src/bitgo/webauthn/types.d.ts +18 -0
  30. package/dist/src/bitgo/webauthn/types.d.ts.map +1 -0
  31. package/dist/src/bitgo/webauthn/types.js +3 -0
  32. package/dist/test/unit/bitgo/safe/safe.js +114 -1
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +9 -9
@@ -49,6 +49,8 @@ const codecs_1 = require("../utils/codecs");
49
49
  const postWithCodec_1 = require("../utils/postWithCodec");
50
50
  const wallet_1 = require("../wallet");
51
51
  const safeKeychain_1 = require("../wallet/safeKeychain");
52
+ const webauthn_1 = require("../webauthn");
53
+ const rootCoin_1 = require("./rootCoin");
52
54
  const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
53
55
  const SafeRootKeySlot = t.keyof({
54
56
  secp256k1Multisig: null,
@@ -77,6 +79,19 @@ const CreateWalletInSafeBody = t.union([
77
79
  keys: t.tuple([t.string, t.string, t.string]),
78
80
  }),
79
81
  ]);
82
+ const PasskeyEntryCodec = t.type({
83
+ keyId: t.string,
84
+ encryptedPrv: t.string,
85
+ });
86
+ const RegisterSafePasskeyBody = t.type({
87
+ otpDeviceId: t.string,
88
+ prfSalt: t.string,
89
+ entries: t.array(PasskeyEntryCodec),
90
+ });
91
+ const RegisterSafePasskeyResponseCodec = t.type({
92
+ otpDeviceId: t.string,
93
+ updatedKeys: t.array(t.string),
94
+ });
80
95
  function rootIdFromSafe(safe, slot, position) {
81
96
  const triplet = safe.rootKeys?.hot?.[slot];
82
97
  if (!triplet || triplet.length !== 3) {
@@ -281,9 +296,109 @@ class Safe {
281
296
  const response = await this.bitgo.post(this.url('/archive')).send().result();
282
297
  return (0, codecs_1.decodeWithCodec)(public_types_1.SafeData, response, 'SafeData');
283
298
  }
299
+ /**
300
+ * Register a PRF passkey on every user root of the safe.
301
+ *
302
+ * For each user root (position 0 of each populated slot), decrypt the root with the Safe
303
+ * password, then re-encrypt it under the PRF-derived password (bound to the enterprise via
304
+ * AES-GCM AAD). One PRF assertion serves the whole safe; the write set is the user roots only
305
+ * — backup and BitGo roots are never wrapped.
306
+ */
307
+ async registerPasskey(params) {
308
+ const { device, safePassphrase, provider, encryptionVersion } = params;
309
+ if (!device.id) {
310
+ throw new Error('device.id is required to register a passkey on the safe');
311
+ }
312
+ if (!device.prfSalt) {
313
+ throw new Error('PRF extension not supported by this device. Please use a different passkey.');
314
+ }
315
+ const enterpriseId = this.enterpriseId();
316
+ const prfSalt = (0, webauthn_1.deriveEnterpriseSalt)(device.prfSalt, enterpriseId);
317
+ const entries = [];
318
+ for (const slot of rootCoin_1.SAFE_ROOT_SLOTS) {
319
+ const userRootId = rootIdFromSafe(this._safe, slot, 0);
320
+ if (userRootId === undefined) {
321
+ continue;
322
+ }
323
+ const keychain = await (0, rootCoin_1.coinForRoot)(this.bitgo, slot).keychains().get({ id: userRootId });
324
+ if (keychain.source !== 'user') {
325
+ throw new safeKeychain_1.InvalidRootKeychainSourceError(keychain.id, keychain.source);
326
+ }
327
+ const rootPrv = await (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychain, safePassphrase);
328
+ if (!rootPrv) {
329
+ throw new errors_1.IncorrectPasswordError();
330
+ }
331
+ entries.push({ keyId: userRootId, encryptedPrv: rootPrv });
332
+ }
333
+ if (entries.length === 0) {
334
+ throw new Error(`Safe ${this.id()} has no user roots to attach a passkey to`);
335
+ }
336
+ const nodeBuf = (0, webauthn_1.base64UrlToBuffer)(device.credentialId);
337
+ const credentialIdBuffer = nodeBuf.buffer.slice(nodeBuf.byteOffset, nodeBuf.byteOffset + nodeBuf.byteLength);
338
+ const authResult = await provider.get({
339
+ publicKey: {
340
+ allowCredentials: [{ type: 'public-key', id: credentialIdBuffer }],
341
+ },
342
+ evalByCredential: { [device.credentialId]: prfSalt },
343
+ });
344
+ if (!authResult.prfResult) {
345
+ throw new Error('PRF assertion did not return a result.');
346
+ }
347
+ if ((0, webauthn_1.toBase64Url)(authResult.credentialId) !== (0, webauthn_1.toBase64Url)(device.credentialId)) {
348
+ throw new Error('PRF assertion returned an unexpected credential.');
349
+ }
350
+ const prfPassword = (0, webauthn_1.derivePassword)(authResult.prfResult);
351
+ const wrappedEntries = await Promise.all(entries.map(async ({ keyId, encryptedPrv }) => ({
352
+ keyId,
353
+ encryptedPrv: await this.bitgo.encrypt({
354
+ password: prfPassword,
355
+ input: encryptedPrv,
356
+ encryptionVersion,
357
+ adata: enterpriseId,
358
+ }),
359
+ })));
360
+ const response = await (0, postWithCodec_1.postWithCodec)(this.bitgo, this.url('/passkeys'), RegisterSafePasskeyBody, {
361
+ otpDeviceId: device.id,
362
+ prfSalt,
363
+ entries: wrappedEntries,
364
+ }).result();
365
+ return (0, codecs_1.decodeWithCodec)(RegisterSafePasskeyResponseCodec, response, 'RegisterSafePasskeyResponse');
366
+ }
367
+ /**
368
+ * Remove a PRF passkey from every user root of the safe.
369
+ *
370
+ * The Safe password is verified client-side (decrypt one user root) before the server is
371
+ * called; the server enforces owner authorization and performs the idempotent per-root `$pull`.
372
+ */
373
+ async removePasskey(params) {
374
+ const { device, safePassphrase } = params;
375
+ if (!device.id) {
376
+ throw new Error('device.id is required to remove a passkey from the safe');
377
+ }
378
+ const userRoots = rootCoin_1.SAFE_ROOT_SLOTS.flatMap((slot) => {
379
+ const userRootId = rootIdFromSafe(this._safe, slot, 0);
380
+ return userRootId === undefined ? [] : [{ slot, userRootId }];
381
+ });
382
+ if (userRoots.length === 0) {
383
+ throw new Error(`Safe ${this.id()} has no user roots to remove a passkey from`);
384
+ }
385
+ let verified = false;
386
+ for (const { slot, userRootId } of userRoots) {
387
+ const keychain = await (0, rootCoin_1.coinForRoot)(this.bitgo, slot).keychains().get({ id: userRootId });
388
+ const decrypted = await (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, keychain, safePassphrase);
389
+ if (decrypted) {
390
+ verified = true;
391
+ break;
392
+ }
393
+ }
394
+ if (!verified) {
395
+ throw new errors_1.IncorrectPasswordError();
396
+ }
397
+ await this.bitgo.del(this.url(`/passkeys/${device.id}`)).result();
398
+ }
284
399
  toJSON() {
285
400
  return this._safe;
286
401
  }
287
402
  }
288
403
  exports.Safe = Safe;
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBR2hILHNDQUFtRDtBQUNuRCwwQ0FBd0Q7QUFDeEQsb0NBQWdFO0FBQ2hFLDRDQUE4RDtBQUM5RCwwREFBdUQ7QUFDdkQsc0NBQW1DO0FBQ25DLHlEQUF3RTtBQVV4RSw2REFNbUM7QUFFbkMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxlQUFlLEVBQUUsSUFBSTtDQUN0QixDQUFDLENBQUM7QUFFSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEMsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFLElBQUEsbUJBQVUsRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDO0NBQ3BELENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO1FBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNO1FBQ2YsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RCLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQixDQUFDO0lBQ0YseURBQXlEO0lBQ3pELENBQUMs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ekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0UsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBOU9ELG9CQThPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgc2FmZSBjbGllbnQgc3VyZmFjZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgKGluY2x1ZGluZyBicmVha2luZ1xuICogY2hhbmdlcykgYmVmb3JlIHRoZSBwdWJsaWMgcmVsZWFzZS5cbiAqL1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBGcmVlemVTYWZlQm9keSwgU2FmZURhdGEsIFNhZmVTaGFyZURhdGEsIFNhZmVTaGFyZVN0YXRlLCB0eXBlIFJvb3RLZXlUeXBlIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBJQmFzZUNvaW4gfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5IH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgRUNEU0FVdGlscywgcGFyc2VTYWZlTXBjS2V5RW52ZWxvcGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IgfSBmcm9tICcuLi93YWxsZXQvc2FmZUtleWNoYWluJztcbmltcG9ydCB7XG4gIEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMsXG4gIEFkZFNhZmVNZW1iZXJPcHRpb25zLFxuICBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyxcbiAgQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMsXG4gIElTYWZlLFxuICBVcGRhdGVTYWZlT3B0aW9ucyxcbiAgV2FsbGV0U2hhcmVEYXRhLFxufSBmcm9tICcuL2lTYWZlJztcbmltcG9ydCB7XG4gIGRlcml2ZUFuZFNlbGZDaGVja1NhZmVDaGlsZEhhcmRlbmVkLFxuICBkZXJpdmVTYWZlQ2hpbGRFZDI1NTE5SGFyZGVuZWQsXG4gIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCxcbiAgb25jaGFpblNsb3RGb3JDb2luLFxuICB0c3NTbG90Rm9yQ29pbixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1zYWZlcyc7XG5cbmNvbnN0IFNhZmVSb290S2V5U2xvdCA9IHQua2V5b2Yoe1xuICBzZWNwMjU2azFNdWx0aXNpZzogbnVsbCxcbiAgZWNkc2FNcGM6IG51bGwsXG4gIGVkZHNhTXBjOiBudWxsLFxuICBlZDI1NTE5TXVsdGlzaWc6IG51bGwsXG59KTtcblxuY29uc3QgR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UgPSB0LnR5cGUoe1xuICBzbG90OiBTYWZlUm9vdEtleVNsb3QsXG4gIGluZGV4OiBib3VuZGVkSW50KDAsIDB4N2ZmZmZmZmYsICdkZXJpdmF0aW9uSW5kZXgnKSxcbn0pO1xuXG5jb25zdCBDcmVhdGVXYWxsZXRJblNhZmVCb2R5ID0gdC51bmlvbihbXG4gIHQuc3RyaWN0KHtcbiAgICBjb2luOiB0LnN0cmluZyxcbiAgICBsYWJlbDogdC5zdHJpbmcsXG4gICAgdHlwZTogdC5saXRlcmFsKCdob3QnKSxcbiAgICBtdWx0aXNpZ1R5cGU6IHQubGl0ZXJhbCgnb25jaGFpbicpLFxuICAgIGtleXM6IHQudHVwbGUoW3Quc3RyaW5nXSksXG4gIH0pLFxuICAvLyBUU1MgbWludCB1c2VzIG9yZGVyZWQgdXNlciBhbmQgYmFja3VwIGNoaWxkIGRvY3VtZW50cy5cbiAgdC5zdHJpY3Qoe1xuICAgIGNvaW46IHQuc3RyaW5nLFxuICAgIGxhYmVsOiB0LnN0cmluZyxcbiAgICB0eXBlOiB0LmxpdGVyYWwoJ2hvdCcpLFxuICAgIG11bHRpc2lnVHlwZTogdC5saXRlcmFsKCd0c3MnKSxcbiAgICBrZXlzOiB0LnR1cGxlKFt0LnN0cmluZywgdC5zdHJpbmcsIHQuc3RyaW5nXSksXG4gIH0pLFxuXSk7XG5cbmZ1bmN0aW9uIHJvb3RJZEZyb21TYWZlKHNhZmU6IFNhZmVEYXRhLCBzbG90OiBSb290S2V5VHlwZSwgcG9zaXRpb246IDAgfCAxIHwgMik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaXBsZXQgPSBzYWZlLnJvb3RLZXlzPy5ob3Q/LltzbG90XTtcbiAgaWYgKCF0cmlwbGV0IHx8IHRyaXBsZXQubGVuZ3RoICE9PSAzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290SWQgPSB0cmlwbGV0W3Bvc2l0aW9uXTtcbiAgcmV0dXJuIHJvb3RJZC5sZW5ndGggPiAwID8gcm9vdElkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmUgaW1wbGVtZW50cyBJU2FmZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IF9zYWZlOiBTYWZlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzYWZlRGF0YTogU2FmZURhdGEpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5fc2FmZSA9IHNhZmVEYXRhO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5pZDtcbiAgfVxuXG4gIGVudGVycHJpc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmVudGVycHJpc2VJZDtcbiAgfVxuXG4gIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUubGFiZWw7XG4gIH1cblxuICBzdGF0dXMoKTogU2FmZURhdGFbJ3N0YXR1cyddIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXJwcmlzZS1zY29wZWQgdjIgVVJMIGZvciB0aGlzIHNhZmUsIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWQoKX0vc2FmZXMvJHt0aGlzLmlkKCl9JHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgY2hpbGQgd2FsbGV0OiBwZWVrIHRoZSBzZXF1ZW50aWFsIGluZGV4LCBkZXJpdmUgdGhlIGNoaWxkIGtleXMsIHJlZ2lzdGVyXG4gICAqIHRoZW0sIHRoZW4gbWludC5cbiAgICpcbiAgICogYG9uY2hhaW5gOiBoYXJkZW5lZC1kZXJpdmUgdGhlIHVzZXIgY2hpbGQgKGBtLzxpbmRleD4nYCksIHJlZ2lzdGVyIGl0XG4gICAqIHB1YmxpYy1vbmx5OyBiYWNrdXAgYW5kIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogYHRzc2A6IGRlY3J5cHQgdGhlIHVzZXIgcm9vdCBibG9iLCBydW4gdGhlIHVzZXIvQml0R28gaGFyZC1kZXJpdmUgY2VyZW1vbnksXG4gICAqIHJlZ2lzdGVyIHRoZSBvcmRlcmVkIGNoaWxkIGRvY3VtZW50cywgdGhlbiBtaW50LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGlmIChwYXJhbXMucGFzc3BocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3BocmFzZSBpcyByZXF1aXJlZCB0byBtaW50IGEgc2FmZSB3YWxsZXQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnR5cGUgIT09ICdob3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUgd2FsbGV0cyBhcmUgaG90LW9ubHkgaW4gdjEnKTtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlzaWdUeXBlID0gcGFyYW1zLm11bHRpc2lnVHlwZSA/PyAnb25jaGFpbic7XG4gICAgY29uc3QgaXNUc3MgPSBtdWx0aXNpZ1R5cGUgPT09ICd0c3MnO1xuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYml0Z28uY29pbihwYXJhbXMuY29pbik7XG4gICAgY29uc3Qgc2xvdCA9IGlzVHNzID8gdHNzU2xvdEZvckNvaW4oY29pbi5nZXRDaGFpbigpKSA6IG9uY2hhaW5TbG90Rm9yQ29pbihjb2luLmdldENoYWluKCkpO1xuXG4gICAgY29uc3QgaW5kZXhSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvZGVyaXZhdGlvbi1pbmRleCcpKS5xdWVyeSh7IHNsb3QgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgcGVla2VkID0gZGVjb2RlV2l0aENvZGVjKEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlLCBpbmRleFJlc3BvbnNlLCAnR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UnKTtcbiAgICBpZiAocGVla2VkLnNsb3QgIT09IHNsb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbi1pbmRleCByZXR1cm5lZCBzbG90ICcke3BlZWtlZC5zbG90fScsIGV4cGVjdGVkICcke3Nsb3R9J2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGluZGV4IH0gPSBwZWVrZWQ7XG5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHJvb3RJZEZyb21TYWZlKHRoaXMuX3NhZmUsIHNsb3QsIDApICE9PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlIDogYXdhaXQgdGhpcy5mZXRjaFNhZmVEYXRhKCk7XG4gICAgY29uc3QgdXNlclJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAwKTtcbiAgICBpZiAodXNlclJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUc3MpIHtcbiAgICAgIGNvbnN0IGJhY2t1cFJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAxKTtcbiAgICAgIGNvbnN0IGJpdGdvUm9vdElkID0gcm9vdElkRnJvbVNhZmUoc2FmZURhdGEsIHNsb3QsIDIpO1xuICAgICAgaWYgKGJhY2t1cFJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaXMgbWlzc2luZyByb290S2V5cy5ob3QuJHtzbG90fSBiYWNrdXAga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoYml0Z29Sb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH0gYml0Z28ga2V5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVUc3NXYWxsZXRJblNhZmUoY29pbiwgdXNlclJvb3RJZCwgYmFja3VwUm9vdElkLCBiaXRnb1Jvb3RJZCwgaW5kZXgsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gY29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcihyb290S2V5Y2hhaW4uaWQsIHJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cbiAgICBjb25zdCByb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCByb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXJvb3RQcnYpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVyaXZlZCA9XG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJ1xuICAgICAgICA/IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChyb290UHJ2LCBpbmRleClcbiAgICAgICAgOiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290UHJ2LCBpbmRleCk7XG4gICAgY29uc3QgZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICAgICAgZGVyaXZlZC5kZXJpdmF0aW9uUGF0aCxcbiAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnXG4gICAgKTtcblxuICAgIGNvbnN0IGNoaWxkID0gYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICBwdWI6IGRlcml2ZWQucHViLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgcGFyZW50OiB1c2VyUm9vdElkLFxuICAgICAgc2FmZUlkOiB0aGlzLmlkKCksXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgY2hpbGRJZCA9IGNoaWxkLmlkO1xuICAgIGlmIChjaGlsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYWZlIGNoaWxkIGtleSByZWdpc3RyYXRpb24gcmV0dXJuZWQgYW4gZW1wdHkgaWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5czogW3N0cmluZ10gPSBbY2hpbGRJZF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy93YWxsZXRzJyksIENyZWF0ZVdhbGxldEluU2FmZUJvZHksIHtcbiAgICAgIGNvaW46IHBhcmFtcy5jb2luLFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogVFNTIHdhbGxldCBtaW50OiBkZWNyeXB0IHRoZSB1c2VyIHJvb3QgYmxvYiwgcnVuIHRoZSB1c2VyL0JpdEdvIGhhcmQtZGVyaXZlXG4gICAqIGNlcmVtb255LCByZWdpc3RlciB0aGUgb3JkZXJlZCBjaGlsZCBkb2N1bWVudHMsIHRoZW4gbWludC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHNzV2FsbGV0SW5TYWZlKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICB1c2VyUm9vdElkOiBzdHJpbmcsXG4gICAgYmFja3VwUm9vdElkOiBzdHJpbmcsXG4gICAgYml0Z29Sb290SWQ6IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBjb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IHVzZXJSb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHVzZXJSb290S2V5Y2hhaW4uc291cmNlICE9PSAndXNlcicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IodXNlclJvb3RLZXljaGFpbi5pZCwgdXNlclJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJSb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB1c2VyUm9vdEtleWNoYWluLCBwYXJhbXMucGFzc3BocmFzZSk7XG4gICAgaWYgKCF1c2VyUm9vdFBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclJvb3RNYXRlcmlhbCA9IHBhcnNlU2FmZU1wY0tleUVudmVsb3Blcyh1c2VyUm9vdFBydik7XG5cbiAgICBjb25zdCB0c3NVdGlscyA9IG5ldyBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlscyh0aGlzLmJpdGdvLCBjb2luKTtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHRoaXMuZW50ZXJwcmlzZUlkKCksXG4gICAgICBzYWZlSWQ6IHRoaXMuaWQoKSxcbiAgICAgIHBhcmVudEtleUlkOiBiaXRnb1Jvb3RJZCxcbiAgICAgIGRlcml2YXRpb25JbmRleDogaW5kZXgsXG4gICAgICB1c2VyUm9vdEtleUlkOiB1c2VyUm9vdElkLFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBiYWNrdXBSb290SWQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnNpZ25pbmcsXG4gICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnZyZixcbiAgICB9KTtcbiAgICBpZiAodXNlcktleWNoYWluLmlkLmxlbmd0aCA9PT0gMCB8fCBiYWNrdXBLZXljaGFpbi5pZC5sZW5ndGggPT09IDAgfHwgYml0Z29LZXljaGFpbi5pZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uIHJldHVybmVkIGFuIGVtcHR5IGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL3dhbGxldHMnKSwgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSwge1xuICAgICAgY29pbjogcGFyYW1zLmNvaW4sXG4gICAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoU2FmZURhdGEoKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG1lbWJlciB0byB0aGUgd2hvbGUgc2FmZSAodmlldy9hZG1pbi9zcGVuZCkuIFNwZW5kIG9wZW5zIGEga2V5IHNoYXJlLlxuICAgKi9cbiAgYXN5bmMgYWRkTWVtYmVyKHBhcmFtczogQWRkU2FmZU1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFkZE1lbWJlciBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgT05FIHNhZmUgd2FsbGV0IHdpdGggYSBub24tbWVtYmVyIHZpYSB0aGUgZXhpc3Rpbmcgd2FsbGV0LXNoYXJlIGhhbmRzaGFrZS5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlclRvV2FsbGV0KHBhcmFtczogQWRkU2FmZVdhbGxldE1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFNoYXJlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXJUb1dhbGxldCBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgc2FmZSBrZXkgc2hhcmVzIHZpc2libGUgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiB7IHN0YXRlPzogU2FmZVNoYXJlU3RhdGUgfSA9IHt9KTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUubGlzdFNoYXJlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGEgc2FmZSBrZXkgc2hhcmUgYWRkcmVzc2VkIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMpOiBQcm9taXNlPFNhZmVTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWNjZXB0U2hhcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc2FmZSBsYWJlbC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShwYXJhbXM6IFVwZGF0ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSB0aGUgc2FmZSDigJQgYmxvY2tzIHdpdGhkcmF3YWxzIG9uIGFsbCBzYWZlIHdhbGxldHMuIFNhZmUgc3RheXMgJ2FjdGl2ZScuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGZyZWV6ZShwYXJhbXM6IEZyZWV6ZVNhZmVCb2R5ID0ge30pOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvZnJlZXplJyksIEZyZWV6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIHRoZSBzYWZlLiBSZXF1aXJlcyBldmVyeSBzYWZlIHdhbGxldCB0byBhbHJlYWR5IGJlIGFyY2hpdmVkOyBhbHNvIHRoZSBhYmFuZG9ubWVudFxuICAgKiBwYXRoIGZvciBhIHN0dWNrICdpbml0aWFsaXppbmcnIHNhZmUuXG4gICAqL1xuICBhc3luYyBhcmNoaXZlKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2FyY2hpdmUnKSkuc2VuZCgpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBTYWZlRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmU7XG4gIH1cbn1cbiJdfQ==
404
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBR2hILHNDQUFtRDtBQUNuRCwwQ0FBd0Q7QUFDeEQsb0NBQWdFO0FBQ2hFLDRDQUE4RDtBQUM5RCwwREFBdUQ7QUFDdkQsc0NBQW1DO0FBQ25DLHlEQUF3RTtBQUN4RSwwQ0FBbUc7QUFhbkcseUNBQTBEO0FBQzFELDZEQU1tQztBQUVuQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsUUFBUSxFQUFFLElBQUk7SUFDZCxRQUFRLEVBQUUsSUFBSTtJQUNkLGVBQWUsRUFBRSxJQUFJO0NBQ3RCLENBQUMsQ0FBQztBQUVILE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxJQUFJLEVBQUUsZUFBZTtJQUNyQixLQUFLLEVBQUUsSUFBQSxtQkFBVSxFQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLENBQUM7Q0FDcEQsQ0FBQyxDQUFDO0FBRUgsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCLENB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgRnJlZXplU2FmZUJvZHksIFNhZmVEYXRhLCBTYWZlU2hhcmVEYXRhLCBTYWZlU2hhcmVTdGF0ZSwgdHlwZSBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEluY29ycmVjdFBhc3N3b3JkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IEVDRFNBVXRpbHMsIHBhcnNlU2FmZU1wY0tleUVudmVsb3BlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGJvdW5kZWRJbnQsIGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL2NvZGVjcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi93YWxsZXQnO1xuaW1wb3J0IHsgSW52YWxpZFJvb3RLZXljaGFpblNvdXJjZUVycm9yIH0gZnJvbSAnLi4vd2FsbGV0L3NhZmVLZXljaGFpbic7XG5pbXBvcnQgeyBiYXNlNjRVcmxUb0J1ZmZlciwgZGVyaXZlRW50ZXJwcmlzZVNhbHQsIGRlcml2ZVBhc3N3b3JkLCB0b0Jhc2U2NFVybCB9IGZyb20gJy4uL3dlYmF1dGhuJztcbmltcG9ydCB7XG4gIEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMsXG4gIEFkZFNhZmVNZW1iZXJPcHRpb25zLFxuICBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyxcbiAgQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMsXG4gIElTYWZlLFxuICBSZWdpc3RlclNhZmVQYXNza2V5T3B0aW9ucyxcbiAgUmVnaXN0ZXJTYWZlUGFzc2tleVJlc3BvbnNlLFxuICBSZW1vdmVTYWZlUGFzc2tleU9wdGlvbnMsXG4gIFVwZGF0ZVNhZmVPcHRpb25zLFxuICBXYWxsZXRTaGFyZURhdGEsXG59IGZyb20gJy4vaVNhZmUnO1xuaW1wb3J0IHsgY29pbkZvclJvb3QsIFNBRkVfUk9PVF9TTE9UUyB9IGZyb20gJy4vcm9vdENvaW4nO1xuaW1wb3J0IHtcbiAgZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQsXG4gIGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZCxcbiAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICBvbmNoYWluU2xvdEZvckNvaW4sXG4gIHRzc1Nsb3RGb3JDb2luLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLXNhZmVzJztcblxuY29uc3QgU2FmZVJvb3RLZXlTbG90ID0gdC5rZXlvZih7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBudWxsLFxuICBlY2RzYU1wYzogbnVsbCxcbiAgZWRkc2FNcGM6IG51bGwsXG4gIGVkMjU1MTlNdWx0aXNpZzogbnVsbCxcbn0pO1xuXG5jb25zdCBHZXREZXJpdmF0aW9uSW5kZXhSZXNwb25zZSA9IHQudHlwZSh7XG4gIHNsb3Q6IFNhZmVSb290S2V5U2xvdCxcbiAgaW5kZXg6IGJvdW5kZWRJbnQoMCwgMHg3ZmZmZmZmZiwgJ2Rlcml2YXRpb25JbmRleCcpLFxufSk7XG5cbmNvbnN0IENyZWF0ZVdhbGxldEluU2FmZUJvZHkgPSB0LnVuaW9uKFtcbiAgdC5zdHJpY3Qoe1xuICAgIGNvaW46IHQuc3RyaW5nLFxuICAgIGxhYmVsOiB0LnN0cmluZyxcbiAgICB0eXBlOiB0LmxpdGVyYWwoJ2hvdCcpLFxuICAgIG11bHRpc2lnVHlwZTogdC5saXRlcmFsKCdvbmNoYWluJyksXG4gICAga2V5czogdC50dXBsZShbdC5zdHJpbmddKSxcbiAgfSksXG4gIC8vIFRTUyBtaW50IHVzZXMgb3JkZXJlZCB1c2VyIGFuZCBiYWNrdXAgY2hpbGQgZG9jdW1lbnRzLlxuICB0LnN0cmljdCh7XG4gICAgY29pbjogdC5zdHJpbmcsXG4gICAgbGFiZWw6IHQuc3RyaW5nLFxuICAgIHR5cGU6IHQubGl0ZXJhbCgnaG90JyksXG4gICAgbXVsdGlzaWdUeXBlOiB0LmxpdGVyYWwoJ3RzcycpLFxuICAgIGtleXM6IHQudHVwbGUoW3Quc3RyaW5nLCB0LnN0cmluZywgdC5zdHJpbmddKSxcbiAgfSksXG5dKTtcblxuY29uc3QgUGFzc2tleUVudHJ5Q29kZWMgPSB0LnR5cGUoe1xuICBrZXlJZDogdC5zdHJpbmcsXG4gIGVuY3J5cHRlZFBydjogdC5zdHJpbmcsXG59KTtcblxuY29uc3QgUmVnaXN0ZXJTYWZlUGFzc2tleUJvZHkgPSB0LnR5cGUoe1xuICBvdHBEZXZpY2VJZDogdC5zdHJpbmcsXG4gIHByZlNhbHQ6IHQuc3RyaW5nLFxuICBlbnRyaWVzOiB0LmFycmF5KFBhc3NrZXlFbnRyeUNvZGVjKSxcbn0pO1xuXG5jb25zdCBSZWdpc3RlclNhZmVQYXNza2V5UmVzcG9uc2VDb2RlYyA9IHQudHlwZSh7XG4gIG90cERldmljZUlkOiB0LnN0cmluZyxcbiAgdXBkYXRlZEtleXM6IHQuYXJyYXkodC5zdHJpbmcpLFxufSk7XG5cbmZ1bmN0aW9uIHJvb3RJZEZyb21TYWZlKHNhZmU6IFNhZmVEYXRhLCBzbG90OiBSb290S2V5VHlwZSwgcG9zaXRpb246IDAgfCAxIHwgMik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaXBsZXQgPSBzYWZlLnJvb3RLZXlzPy5ob3Q/LltzbG90XTtcbiAgaWYgKCF0cmlwbGV0IHx8IHRyaXBsZXQubGVuZ3RoICE9PSAzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290SWQgPSB0cmlwbGV0W3Bvc2l0aW9uXTtcbiAgcmV0dXJuIHJvb3RJZC5sZW5ndGggPiAwID8gcm9vdElkIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNhZmUgaW1wbGVtZW50cyBJU2FmZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IF9zYWZlOiBTYWZlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzYWZlRGF0YTogU2FmZURhdGEpIHtcbiAgICB0aGlzLmJpdGdvID0gYml0Z287XG4gICAgdGhpcy5fc2FmZSA9IHNhZmVEYXRhO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5pZDtcbiAgfVxuXG4gIGVudGVycHJpc2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmVudGVycHJpc2VJZDtcbiAgfVxuXG4gIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUubGFiZWw7XG4gIH1cblxuICBzdGF0dXMoKTogU2FmZURhdGFbJ3N0YXR1cyddIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXJwcmlzZS1zY29wZWQgdjIgVVJMIGZvciB0aGlzIHNhZmUsIGUuZy4gL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZFxuICAgKiBAcGFyYW0gZXh0cmFcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7dGhpcy5lbnRlcnByaXNlSWQoKX0vc2FmZXMvJHt0aGlzLmlkKCl9JHtleHRyYX1gLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGEgY2hpbGQgd2FsbGV0OiBwZWVrIHRoZSBzZXF1ZW50aWFsIGluZGV4LCBkZXJpdmUgdGhlIGNoaWxkIGtleXMsIHJlZ2lzdGVyXG4gICAqIHRoZW0sIHRoZW4gbWludC5cbiAgICpcbiAgICogYG9uY2hhaW5gOiBoYXJkZW5lZC1kZXJpdmUgdGhlIHVzZXIgY2hpbGQgKGBtLzxpbmRleD4nYCksIHJlZ2lzdGVyIGl0XG4gICAqIHB1YmxpYy1vbmx5OyBiYWNrdXAgYW5kIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgb24gdGhlIHNlcnZlci5cbiAgICpcbiAgICogYHRzc2A6IGRlY3J5cHQgdGhlIHVzZXIgcm9vdCBibG9iLCBydW4gdGhlIHVzZXIvQml0R28gaGFyZC1kZXJpdmUgY2VyZW1vbnksXG4gICAqIHJlZ2lzdGVyIHRoZSBvcmRlcmVkIGNoaWxkIGRvY3VtZW50cywgdGhlbiBtaW50LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGlmIChwYXJhbXMucGFzc3BocmFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3BocmFzZSBpcyByZXF1aXJlZCB0byBtaW50IGEgc2FmZSB3YWxsZXQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnR5cGUgIT09ICdob3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUgd2FsbGV0cyBhcmUgaG90LW9ubHkgaW4gdjEnKTtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlzaWdUeXBlID0gcGFyYW1zLm11bHRpc2lnVHlwZSA/PyAnb25jaGFpbic7XG4gICAgY29uc3QgaXNUc3MgPSBtdWx0aXNpZ1R5cGUgPT09ICd0c3MnO1xuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYml0Z28uY29pbihwYXJhbXMuY29pbik7XG4gICAgY29uc3Qgc2xvdCA9IGlzVHNzID8gdHNzU2xvdEZvckNvaW4oY29pbi5nZXRDaGFpbigpKSA6IG9uY2hhaW5TbG90Rm9yQ29pbihjb2luLmdldENoYWluKCkpO1xuXG4gICAgY29uc3QgaW5kZXhSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvZGVyaXZhdGlvbi1pbmRleCcpKS5xdWVyeSh7IHNsb3QgfSkucmVzdWx0KCk7XG4gICAgY29uc3QgcGVla2VkID0gZGVjb2RlV2l0aENvZGVjKEdldERlcml2YXRpb25JbmRleFJlc3BvbnNlLCBpbmRleFJlc3BvbnNlLCAnR2V0RGVyaXZhdGlvbkluZGV4UmVzcG9uc2UnKTtcbiAgICBpZiAocGVla2VkLnNsb3QgIT09IHNsb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVyaXZhdGlvbi1pbmRleCByZXR1cm5lZCBzbG90ICcke3BlZWtlZC5zbG90fScsIGV4cGVjdGVkICcke3Nsb3R9J2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGluZGV4IH0gPSBwZWVrZWQ7XG5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHJvb3RJZEZyb21TYWZlKHRoaXMuX3NhZmUsIHNsb3QsIDApICE9PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlIDogYXdhaXQgdGhpcy5mZXRjaFNhZmVEYXRhKCk7XG4gICAgY29uc3QgdXNlclJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAwKTtcbiAgICBpZiAodXNlclJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUc3MpIHtcbiAgICAgIGNvbnN0IGJhY2t1cFJvb3RJZCA9IHJvb3RJZEZyb21TYWZlKHNhZmVEYXRhLCBzbG90LCAxKTtcbiAgICAgIGNvbnN0IGJpdGdvUm9vdElkID0gcm9vdElkRnJvbVNhZmUoc2FmZURhdGEsIHNsb3QsIDIpO1xuICAgICAgaWYgKGJhY2t1cFJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaXMgbWlzc2luZyByb290S2V5cy5ob3QuJHtzbG90fSBiYWNrdXAga2V5YCk7XG4gICAgICB9XG4gICAgICBpZiAoYml0Z29Sb290SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgJHt0aGlzLmlkKCl9IGlzIG1pc3Npbmcgcm9vdEtleXMuaG90LiR7c2xvdH0gYml0Z28ga2V5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVUc3NXYWxsZXRJblNhZmUoY29pbiwgdXNlclJvb3RJZCwgYmFja3VwUm9vdElkLCBiaXRnb1Jvb3RJZCwgaW5kZXgsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gY29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCByb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHJvb3RLZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRSb290S2V5Y2hhaW5Tb3VyY2VFcnJvcihyb290S2V5Y2hhaW4uaWQsIHJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cbiAgICBjb25zdCByb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCByb290S2V5Y2hhaW4sIHBhcmFtcy5wYXNzcGhyYXNlKTtcbiAgICBpZiAoIXJvb3RQcnYpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVyaXZlZCA9XG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJ1xuICAgICAgICA/IGRlcml2ZVNhZmVDaGlsZEVkMjU1MTlIYXJkZW5lZChyb290UHJ2LCBpbmRleClcbiAgICAgICAgOiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290UHJ2LCBpbmRleCk7XG4gICAgY29uc3QgZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICAgICAgZGVyaXZlZC5kZXJpdmF0aW9uUGF0aCxcbiAgICAgICdkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnXG4gICAgKTtcblxuICAgIGNvbnN0IGNoaWxkID0gYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICBwdWI6IGRlcml2ZWQucHViLFxuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgcGFyZW50OiB1c2VyUm9vdElkLFxuICAgICAgc2FmZUlkOiB0aGlzLmlkKCksXG4gICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgY2hpbGRJZCA9IGNoaWxkLmlkO1xuICAgIGlmIChjaGlsZElkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYWZlIGNoaWxkIGtleSByZWdpc3RyYXRpb24gcmV0dXJuZWQgYW4gZW1wdHkgaWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5czogW3N0cmluZ10gPSBbY2hpbGRJZF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy93YWxsZXRzJyksIENyZWF0ZVdhbGxldEluU2FmZUJvZHksIHtcbiAgICAgIGNvaW46IHBhcmFtcy5jb2luLFxuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogVFNTIHdhbGxldCBtaW50OiBkZWNyeXB0IHRoZSB1c2VyIHJvb3QgYmxvYiwgcnVuIHRoZSB1c2VyL0JpdEdvIGhhcmQtZGVyaXZlXG4gICAqIGNlcmVtb255LCByZWdpc3RlciB0aGUgb3JkZXJlZCBjaGlsZCBkb2N1bWVudHMsIHRoZW4gbWludC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHNzV2FsbGV0SW5TYWZlKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICB1c2VyUm9vdElkOiBzdHJpbmcsXG4gICAgYmFja3VwUm9vdElkOiBzdHJpbmcsXG4gICAgYml0Z29Sb290SWQ6IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBjb2luLmtleWNoYWlucygpO1xuICAgIGNvbnN0IHVzZXJSb290S2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgaWYgKHVzZXJSb290S2V5Y2hhaW4uc291cmNlICE9PSAndXNlcicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IodXNlclJvb3RLZXljaGFpbi5pZCwgdXNlclJvb3RLZXljaGFpbi5zb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJSb290UHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB1c2VyUm9vdEtleWNoYWluLCBwYXJhbXMucGFzc3BocmFzZSk7XG4gICAgaWYgKCF1c2VyUm9vdFBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclJvb3RNYXRlcmlhbCA9IHBhcnNlU2FmZU1wY0tleUVudmVsb3Blcyh1c2VyUm9vdFBydik7XG5cbiAgICBjb25zdCB0c3NVdGlscyA9IG5ldyBFQ0RTQVV0aWxzLkVjZHNhVnJmTVBDdjJVdGlscyh0aGlzLmJpdGdvLCBjb2luKTtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGF3YWl0IHRzc1V0aWxzLmNyZWF0ZVNhZmVDaGlsZEtleWNoYWlucyh7XG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHRoaXMuZW50ZXJwcmlzZUlkKCksXG4gICAgICBzYWZlSWQ6IHRoaXMuaWQoKSxcbiAgICAgIHBhcmVudEtleUlkOiBiaXRnb1Jvb3RJZCxcbiAgICAgIGRlcml2YXRpb25JbmRleDogaW5kZXgsXG4gICAgICB1c2VyUm9vdEtleUlkOiB1c2VyUm9vdElkLFxuICAgICAgYmFja3VwUm9vdEtleUlkOiBiYWNrdXBSb290SWQsXG4gICAgICB1c2VyUm9vdEtleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnNpZ25pbmcsXG4gICAgICB1c2VyUm9vdFZyZktleVNoYXJlOiB1c2VyUm9vdE1hdGVyaWFsLnZyZixcbiAgICB9KTtcbiAgICBpZiAodXNlcktleWNoYWluLmlkLmxlbmd0aCA9PT0gMCB8fCBiYWNrdXBLZXljaGFpbi5pZC5sZW5ndGggPT09IDAgfHwgYml0Z29LZXljaGFpbi5pZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uIHJldHVybmVkIGFuIGVtcHR5IGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL3dhbGxldHMnKSwgQ3JlYXRlV2FsbGV0SW5TYWZlQm9keSwge1xuICAgICAgY29pbjogcGFyYW1zLmNvaW4sXG4gICAgICBsYWJlbDogcGFyYW1zLmxhYmVsLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoU2FmZURhdGEoKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG1lbWJlciB0byB0aGUgd2hvbGUgc2FmZSAodmlldy9hZG1pbi9zcGVuZCkuIFNwZW5kIG9wZW5zIGEga2V5IHNoYXJlLlxuICAgKi9cbiAgYXN5bmMgYWRkTWVtYmVyKHBhcmFtczogQWRkU2FmZU1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFkZE1lbWJlciBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgT05FIHNhZmUgd2FsbGV0IHdpdGggYSBub24tbWVtYmVyIHZpYSB0aGUgZXhpc3Rpbmcgd2FsbGV0LXNoYXJlIGhhbmRzaGFrZS5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlclRvV2FsbGV0KHBhcmFtczogQWRkU2FmZVdhbGxldE1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFNoYXJlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXJUb1dhbGxldCBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgc2FmZSBrZXkgc2hhcmVzIHZpc2libGUgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiB7IHN0YXRlPzogU2FmZVNoYXJlU3RhdGUgfSA9IHt9KTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUubGlzdFNoYXJlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGEgc2FmZSBrZXkgc2hhcmUgYWRkcmVzc2VkIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMpOiBQcm9taXNlPFNhZmVTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWNjZXB0U2hhcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc2FmZSBsYWJlbC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShwYXJhbXM6IFVwZGF0ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSB0aGUgc2FmZSDigJQgYmxvY2tzIHdpdGhkcmF3YWxzIG9uIGFsbCBzYWZlIHdhbGxldHMuIFNhZmUgc3RheXMgJ2FjdGl2ZScuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGZyZWV6ZShwYXJhbXM6IEZyZWV6ZVNhZmVCb2R5ID0ge30pOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvZnJlZXplJyksIEZyZWV6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIHRoZSBzYWZlLiBSZXF1aXJlcyBldmVyeSBzYWZlIHdhbGxldCB0byBhbHJlYWR5IGJlIGFyY2hpdmVkOyBhbHNvIHRoZSBhYmFuZG9ubWVudFxuICAgKiBwYXRoIGZvciBhIHN0dWNrICdpbml0aWFsaXppbmcnIHNhZmUuXG4gICAqL1xuICBhc3luYyBhcmNoaXZlKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2FyY2hpdmUnKSkuc2VuZCgpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIFBSRiBwYXNza2V5IG9uIGV2ZXJ5IHVzZXIgcm9vdCBvZiB0aGUgc2FmZS5cbiAgICpcbiAgICogRm9yIGVhY2ggdXNlciByb290IChwb3NpdGlvbiAwIG9mIGVhY2ggcG9wdWxhdGVkIHNsb3QpLCBkZWNyeXB0IHRoZSByb290IHdpdGggdGhlIFNhZmVcbiAgICogcGFzc3dvcmQsIHRoZW4gcmUtZW5jcnlwdCBpdCB1bmRlciB0aGUgUFJGLWRlcml2ZWQgcGFzc3dvcmQgKGJvdW5kIHRvIHRoZSBlbnRlcnByaXNlIHZpYVxuICAgKiBBRVMtR0NNIEFBRCkuIE9uZSBQUkYgYXNzZXJ0aW9uIHNlcnZlcyB0aGUgd2hvbGUgc2FmZTsgdGhlIHdyaXRlIHNldCBpcyB0aGUgdXNlciByb290cyBvbmx5XG4gICAqIOKAlCBiYWNrdXAgYW5kIEJpdEdvIHJvb3RzIGFyZSBuZXZlciB3cmFwcGVkLlxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJQYXNza2V5KHBhcmFtczogUmVnaXN0ZXJTYWZlUGFzc2tleU9wdGlvbnMpOiBQcm9taXNlPFJlZ2lzdGVyU2FmZVBhc3NrZXlSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgZGV2aWNlLCBzYWZlUGFzc3BocmFzZSwgcHJvdmlkZXIsIGVuY3J5cHRpb25WZXJzaW9uIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWRldmljZS5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXZpY2UuaWQgaXMgcmVxdWlyZWQgdG8gcmVnaXN0ZXIgYSBwYXNza2V5IG9uIHRoZSBzYWZlJyk7XG4gICAgfVxuICAgIGlmICghZGV2aWNlLnByZlNhbHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUFJGIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlLiBQbGVhc2UgdXNlIGEgZGlmZmVyZW50IHBhc3NrZXkuJyk7XG4gICAgfVxuICAgIGNvbnN0IGVudGVycHJpc2VJZCA9IHRoaXMuZW50ZXJwcmlzZUlkKCk7XG4gICAgY29uc3QgcHJmU2FsdCA9IGRlcml2ZUVudGVycHJpc2VTYWx0KGRldmljZS5wcmZTYWx0LCBlbnRlcnByaXNlSWQpO1xuXG4gICAgY29uc3QgZW50cmllczogeyBrZXlJZDogc3RyaW5nOyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNsb3Qgb2YgU0FGRV9ST09UX1NMT1RTKSB7XG4gICAgICBjb25zdCB1c2VyUm9vdElkID0gcm9vdElkRnJvbVNhZmUodGhpcy5fc2FmZSwgc2xvdCwgMCk7XG4gICAgICBpZiAodXNlclJvb3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCBjb2luRm9yUm9vdCh0aGlzLmJpdGdvLCBzbG90KS5rZXljaGFpbnMoKS5nZXQoeyBpZDogdXNlclJvb3RJZCB9KTtcbiAgICAgIGlmIChrZXljaGFpbi5zb3VyY2UgIT09ICd1c2VyJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJvb3RLZXljaGFpblNvdXJjZUVycm9yKGtleWNoYWluLmlkLCBrZXljaGFpbi5zb3VyY2UpO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm9vdFBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywga2V5Y2hhaW4sIHNhZmVQYXNzcGhyYXNlKTtcbiAgICAgIGlmICghcm9vdFBydikge1xuICAgICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigpO1xuICAgICAgfVxuICAgICAgZW50cmllcy5wdXNoKHsga2V5SWQ6IHVzZXJSb290SWQsIGVuY3J5cHRlZFBydjogcm9vdFBydiB9KTtcbiAgICB9XG5cbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaGFzIG5vIHVzZXIgcm9vdHMgdG8gYXR0YWNoIGEgcGFzc2tleSB0b2ApO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVCdWYgPSBiYXNlNjRVcmxUb0J1ZmZlcihkZXZpY2UuY3JlZGVudGlhbElkKTtcbiAgICBjb25zdCBjcmVkZW50aWFsSWRCdWZmZXIgPSBub2RlQnVmLmJ1ZmZlci5zbGljZShub2RlQnVmLmJ5dGVPZmZzZXQsIG5vZGVCdWYuYnl0ZU9mZnNldCArIG5vZGVCdWYuYnl0ZUxlbmd0aCk7XG4gICAgY29uc3QgYXV0aFJlc3VsdCA9IGF3YWl0IHByb3ZpZGVyLmdldCh7XG4gICAgICBwdWJsaWNLZXk6IHtcbiAgICAgICAgYWxsb3dDcmVkZW50aWFsczogW3sgdHlwZTogJ3B1YmxpYy1rZXknLCBpZDogY3JlZGVudGlhbElkQnVmZmVyIH1dLFxuICAgICAgfSBhcyBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMsXG4gICAgICBldmFsQnlDcmVkZW50aWFsOiB7IFtkZXZpY2UuY3JlZGVudGlhbElkXTogcHJmU2FsdCB9LFxuICAgIH0pO1xuICAgIGlmICghYXV0aFJlc3VsdC5wcmZSZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUFJGIGFzc2VydGlvbiBkaWQgbm90IHJldHVybiBhIHJlc3VsdC4nKTtcbiAgICB9XG4gICAgaWYgKHRvQmFzZTY0VXJsKGF1dGhSZXN1bHQuY3JlZGVudGlhbElkKSAhPT0gdG9CYXNlNjRVcmwoZGV2aWNlLmNyZWRlbnRpYWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUFJGIGFzc2VydGlvbiByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIGNyZWRlbnRpYWwuJyk7XG4gICAgfVxuICAgIGNvbnN0IHByZlBhc3N3b3JkID0gZGVyaXZlUGFzc3dvcmQoYXV0aFJlc3VsdC5wcmZSZXN1bHQpO1xuXG4gICAgY29uc3Qgd3JhcHBlZEVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGVudHJpZXMubWFwKGFzeW5jICh7IGtleUlkLCBlbmNyeXB0ZWRQcnYgfSkgPT4gKHtcbiAgICAgICAga2V5SWQsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBwYXNzd29yZDogcHJmUGFzc3dvcmQsXG4gICAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZFBydixcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICBhZGF0YTogZW50ZXJwcmlzZUlkLFxuICAgICAgICB9KSxcbiAgICAgIH0pKVxuICAgICk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoJy9wYXNza2V5cycpLCBSZWdpc3RlclNhZmVQYXNza2V5Qm9keSwge1xuICAgICAgb3RwRGV2aWNlSWQ6IGRldmljZS5pZCxcbiAgICAgIHByZlNhbHQsXG4gICAgICBlbnRyaWVzOiB3cmFwcGVkRW50cmllcyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFJlZ2lzdGVyU2FmZVBhc3NrZXlSZXNwb25zZUNvZGVjLCByZXNwb25zZSwgJ1JlZ2lzdGVyU2FmZVBhc3NrZXlSZXNwb25zZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIFBSRiBwYXNza2V5IGZyb20gZXZlcnkgdXNlciByb290IG9mIHRoZSBzYWZlLlxuICAgKlxuICAgKiBUaGUgU2FmZSBwYXNzd29yZCBpcyB2ZXJpZmllZCBjbGllbnQtc2lkZSAoZGVjcnlwdCBvbmUgdXNlciByb290KSBiZWZvcmUgdGhlIHNlcnZlciBpc1xuICAgKiBjYWxsZWQ7IHRoZSBzZXJ2ZXIgZW5mb3JjZXMgb3duZXIgYXV0aG9yaXphdGlvbiBhbmQgcGVyZm9ybXMgdGhlIGlkZW1wb3RlbnQgcGVyLXJvb3QgYCRwdWxsYC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBhc3NrZXkocGFyYW1zOiBSZW1vdmVTYWZlUGFzc2tleU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRldmljZSwgc2FmZVBhc3NwaHJhc2UgfSA9IHBhcmFtcztcbiAgICBpZiAoIWRldmljZS5pZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXZpY2UuaWQgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIGEgcGFzc2tleSBmcm9tIHRoZSBzYWZlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclJvb3RzID0gU0FGRV9ST09UX1NMT1RTLmZsYXRNYXAoKHNsb3QpID0+IHtcbiAgICAgIGNvbnN0IHVzZXJSb290SWQgPSByb290SWRGcm9tU2FmZSh0aGlzLl9zYWZlLCBzbG90LCAwKTtcbiAgICAgIHJldHVybiB1c2VyUm9vdElkID09PSB1bmRlZmluZWQgPyBbXSA6IFt7IHNsb3QsIHVzZXJSb290SWQgfV07XG4gICAgfSk7XG4gICAgaWYgKHVzZXJSb290cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaGFzIG5vIHVzZXIgcm9vdHMgdG8gcmVtb3ZlIGEgcGFzc2tleSBmcm9tYCk7XG4gICAgfVxuXG4gICAgbGV0IHZlcmlmaWVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB7IHNsb3QsIHVzZXJSb290SWQgfSBvZiB1c2VyUm9vdHMpIHtcbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgY29pbkZvclJvb3QodGhpcy5iaXRnbywgc2xvdCkua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IHVzZXJSb290SWQgfSk7XG4gICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KHRoaXMuYml0Z28sIGtleWNoYWluLCBzYWZlUGFzc3BocmFzZSk7XG4gICAgICBpZiAoZGVjcnlwdGVkKSB7XG4gICAgICAgIHZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdmVyaWZpZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbmNvcnJlY3RQYXNzd29yZEVycm9yKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5iaXRnby5kZWwodGhpcy51cmwoYC9wYXNza2V5cy8ke2RldmljZS5pZH1gKSkucmVzdWx0KCk7XG4gIH1cblxuICB0b0pTT04oKTogU2FmZURhdGEge1xuICAgIHJldHVybiB0aGlzLl9zYWZlO1xuICB9XG59XG4iXX0=
@@ -65,11 +65,6 @@ export declare class Safes implements ISafes {
65
65
  * @experimental
66
66
  */
67
67
  finalizeSafe(safeId: string, params: FinalizeSafeOptions): Promise<Safe>;
68
- /**
69
- * Coin used to route a given root's key ceremony (see ROOT_COIN_BY_NETWORK).
70
- * @experimental
71
- */
72
- private coinForRoot;
73
68
  /**
74
69
  * Phase 2.1 helper — mint one onchain-multisig root (cold model, as wallet creation does today):
75
70
  * generate user/backup keypairs locally, encrypt with `passphrase`, register via POST /:coin/key
@@ -1 +1 @@
1
- {"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAKvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAuC9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;YACW,kBAAkB;IAwChC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}
1
+ {"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAKvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAa9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;;;;OAMG;YACW,kBAAkB;IAwChC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}
@@ -42,37 +42,12 @@ exports.Safes = void 0;
42
42
  */
43
43
  const t = __importStar(require("io-ts"));
44
44
  const public_types_1 = require("@bitgo/public-types");
45
- const common_1 = require("../../common");
46
45
  const errors_1 = require("../errors");
47
46
  const codecs_1 = require("../utils/codecs");
48
47
  const sdk_lib_safes_1 = require("@bitgo-beta/sdk-lib-safes");
49
48
  const postWithCodec_1 = require("../utils/postWithCodec");
49
+ const rootCoin_1 = require("./rootCoin");
50
50
  const safe_1 = require("./safe");
51
- /**
52
- * Representative coin per root slot, by network. Safe roots are curve/scheme-scoped, not
53
- * coin-scoped — WP stamps `curve` server-side from the coin's key curve, so any coin of the
54
- * right (curve, scheme) works. These are stable, always-available choices used only to route
55
- * the key-generation ceremony; the resulting root is interchangeable across coins of the slot.
56
- * @experimental
57
- */
58
- const ROOT_COIN_BY_NETWORK = {
59
- mainnet: {
60
- // multisig roots
61
- secp256k1Multisig: 'btc',
62
- ed25519Multisig: 'xlm',
63
- // MPC roots
64
- ecdsaMpc: 'eth',
65
- eddsaMpc: 'sol',
66
- },
67
- testnet: {
68
- // multisig roots
69
- secp256k1Multisig: 'tbtc',
70
- ed25519Multisig: 'txlm',
71
- // MPC roots
72
- ecdsaMpc: 'hteth',
73
- eddsaMpc: 'tsol',
74
- },
75
- };
76
51
  /**
77
52
  * Wire shape of the paginated `GET /enterprise/:eId/safes` response. WP paginates with the v2
78
53
  * `prevId`/`nextBatchPrevId` convention; the SDK re-exposes it as an opaque `cursor`/`nextCursor`
@@ -149,9 +124,8 @@ class Safes {
149
124
  const enterprise = this.enterpriseId;
150
125
  // Absent `enabledRootSlots` (older WP, pre-gating) ⇒ all 4, preserving current behavior.
151
126
  // Ordered by scheme: the two multisig roots first, then the two MPC roots.
152
- const allSlots = ['secp256k1Multisig', 'ed25519Multisig', 'ecdsaMpc', 'eddsaMpc'];
153
- const enabled = new Set(enabledRootSlots ?? allSlots);
154
- const slots = allSlots.filter((slot) => enabled.has(slot));
127
+ const enabled = new Set(enabledRootSlots ?? rootCoin_1.SAFE_ROOT_SLOTS);
128
+ const slots = rootCoin_1.SAFE_ROOT_SLOTS.filter((slot) => enabled.has(slot));
155
129
  const ceremonies = {
156
130
  // Phase 2.1 — multisig roots (①④): local user/backup keypairs + BitGo key, all safeId-tagged.
157
131
  secp256k1Multisig: () => this.createMultisigRoot('secp256k1Multisig', safeId, passphrase, enterprise),
@@ -221,16 +195,6 @@ class Safes {
221
195
  const safeData = (0, codecs_1.decodeWithCodec)(public_types_1.SafeData, response, 'SafeData');
222
196
  return new safe_1.Safe(this.bitgo, safeData);
223
197
  }
224
- /**
225
- * Coin used to route a given root's key ceremony (see ROOT_COIN_BY_NETWORK).
226
- * @experimental
227
- */
228
- coinForRoot(slot) {
229
- // V1Network is exactly 'bitcoin' | 'testnet', so this branch is exhaustive over every
230
- // environment: 'bitcoin' is mainnet and every other value is a testnet.
231
- const network = common_1.Environments[this.bitgo.getEnv()].network === 'bitcoin' ? 'mainnet' : 'testnet';
232
- return this.bitgo.coin(ROOT_COIN_BY_NETWORK[network][slot]);
233
- }
234
198
  /**
235
199
  * Phase 2.1 helper — mint one onchain-multisig root (cold model, as wallet creation does today):
236
200
  * generate user/backup keypairs locally, encrypt with `passphrase`, register via POST /:coin/key
@@ -239,7 +203,7 @@ class Safes {
239
203
  * @experimental
240
204
  */
241
205
  async createMultisigRoot(slot, safeId, passphrase, enterprise) {
242
- const keychains = this.coinForRoot(slot).keychains();
206
+ const keychains = (0, rootCoin_1.coinForRoot)(this.bitgo, slot).keychains();
243
207
  const userKeyPair = keychains.create();
244
208
  const userKeychainPromise = keychains.add({
245
209
  pub: userKeyPair.pub,
@@ -273,7 +237,7 @@ class Safes {
273
237
  * @experimental
274
238
  */
275
239
  async createMpcRoot(slot, safeId, passphrase, enterprise) {
276
- const { userKeychain, backupKeychain, bitgoKeychain } = await this.coinForRoot(slot)
240
+ const { userKeychain, backupKeychain, bitgoKeychain } = await (0, rootCoin_1.coinForRoot)(this.bitgo, slot)
277
241
  .keychains()
278
242
  .createMpc({ multisigType: 'tss', passphrase, enterprise, safeId });
279
243
  return [userKeychain.id, backupKeychain.id, bitgoKeychain.id];
@@ -314,4 +278,4 @@ class Safes {
314
278
  }
315
279
  }
316
280
  exports.Safes = Safes;
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7R0FLRztBQUNILHlDQUEyQjtBQUMzQixzREFRNkI7QUFDN0IseUNBQTRDO0FBRzVDLHNDQUE2QztBQUM3Qyw0Q0FBa0Q7QUFDbEQsNkRBQWtFO0FBQ2xFLDBEQUF1RDtBQUd2RCxpQ0FBOEI7QUFFOUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBK0Q7SUFDdkYsT0FBTyxFQUFFO1FBQ1AsaUJBQWlCO1FBQ2pCLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsWUFBWTtRQUNaLFFBQVEsRUFBRSxLQUFLO1FBQ2YsUUFBUSxFQUFFLEtBQUs7S0FDaEI7SUFDRCxPQUFPLEVBQUU7UUFDUCxpQkFBaUI7UUFDakIsaUJBQWlCLEVBQUUsTUFBTTtRQUN6QixlQUFlLEVBQUUsTUFBTTtRQUN2QixZQUFZO1FBQ1osUUFBUSxFQUFFLE9BQU87UUFDakIsUUFBUSxFQUFFLE1BQU07S0FDakI7Q0FDRixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBSztJQUloQixZQUFZLEtBQWdCLEVBQUUsWUFBb0I7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIs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UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLFdBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQXBRRCxzQkFvUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHtcbiAgRmluYWxpemVTYWZlQm9keSxcbiAgSW5pdGlhbGl6ZVNhZmVCb2R5LFxuICBJbml0aWFsaXplU2FmZVJlc3BvbnNlLFxuICBSb290S2V5c0J5VHlwZSxcbiAgUm9vdEtleVRyaXBsZXQsXG4gIFJvb3RLZXlUeXBlLFxuICBTYWZlRGF0YSxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudHMgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IGlzRGVyaXZhYmxlRWQyNTUxOVB1YiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItc2FmZXMnO1xuaW1wb3J0IHsgcG9zdFdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL3Bvc3RXaXRoQ29kZWMnO1xuaW1wb3J0IHsgRmluYWxpemVTYWZlT3B0aW9ucywgSW5pdGlhbGl6ZVNhZmVPcHRpb25zIH0gZnJvbSAnLi9pU2FmZSc7XG5pbXBvcnQgeyBDcmVhdGVTYWZlT3B0aW9ucywgR2V0U2FmZU9wdGlvbnMsIElTYWZlcywgTGlzdFNhZmVzT3B0aW9ucywgU2FmZUNyZWF0aW9uSGFuZGxlLCBTYWZlS2V5cyB9IGZyb20gJy4vaVNhZmVzJztcbmltcG9ydCB7IFNhZmUgfSBmcm9tICcuL3NhZmUnO1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aXZlIGNvaW4gcGVyIHJvb3Qgc2xvdCwgYnkgbmV0d29yay4gU2FmZSByb290cyBhcmUgY3VydmUvc2NoZW1lLXNjb3BlZCwgbm90XG4gKiBjb2luLXNjb3BlZCDigJQgV1Agc3RhbXBzIGBjdXJ2ZWAgc2VydmVyLXNpZGUgZnJvbSB0aGUgY29pbidzIGtleSBjdXJ2ZSwgc28gYW55IGNvaW4gb2YgdGhlXG4gKiByaWdodCAoY3VydmUsIHNjaGVtZSkgd29ya3MuIFRoZXNlIGFyZSBzdGFibGUsIGFsd2F5cy1hdmFpbGFibGUgY2hvaWNlcyB1c2VkIG9ubHkgdG8gcm91dGVcbiAqIHRoZSBrZXktZ2VuZXJhdGlvbiBjZXJlbW9ueTsgdGhlIHJlc3VsdGluZyByb290IGlzIGludGVyY2hhbmdlYWJsZSBhY3Jvc3MgY29pbnMgb2YgdGhlIHNsb3QuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmNvbnN0IFJPT1RfQ09JTl9CWV9ORVRXT1JLOiBSZWNvcmQ8J21haW5uZXQnIHwgJ3Rlc3RuZXQnLCBSZWNvcmQ8Um9vdEtleVR5cGUsIHN0cmluZz4+ID0ge1xuICBtYWlubmV0OiB7XG4gICAgLy8gbXVsdGlzaWcgcm9vdHNcbiAgICBzZWNwMjU2azFNdWx0aXNpZzogJ2J0YycsXG4gICAgZWQyNTUxOU11bHRpc2lnOiAneGxtJyxcbiAgICAvLyBNUEMgcm9vdHNcbiAgICBlY2RzYU1wYzogJ2V0aCcsXG4gICAgZWRkc2FNcGM6ICdzb2wnLFxuICB9LFxuICB0ZXN0bmV0OiB7XG4gICAgLy8gbXVsdGlzaWcgcm9vdHNcbiAgICBzZWNwMjU2azFNdWx0aXNpZzogJ3RidGMnLFxuICAgIGVkMjU1MTlNdWx0aXNpZzogJ3R4bG0nLFxuICAgIC8vIE1QQyByb290c1xuICAgIGVjZHNhTXBjOiAnaHRldGgnLFxuICAgIGVkZHNhTXBjOiAndHNvbCcsXG4gIH0sXG59O1xuXG4vKipcbiAqIFdpcmUgc2hhcGUgb2YgdGhlIHBhZ2luYXRlZCBgR0VUIC9lbnRlcnByaXNlLzplSWQvc2FmZXNgIHJlc3BvbnNlLiBXUCBwYWdpbmF0ZXMgd2l0aCB0aGUgdjJcbiAqIGBwcmV2SWRgL2BuZXh0QmF0Y2hQcmV2SWRgIGNvbnZlbnRpb247IHRoZSBTREsgcmUtZXhwb3NlcyBpdCBhcyBhbiBvcGFxdWUgYGN1cnNvcmAvYG5leHRDdXJzb3JgXG4gKiAoc2VlIGBsaXN0YCkuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmNvbnN0IExpc3RTYWZlc1Jlc3BvbnNlID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoeyBzYWZlczogdC5hcnJheShTYWZlRGF0YSkgfSksXG4gIHQucGFydGlhbCh7IG5leHRCYXRjaFByZXZJZDogdC5zdHJpbmcgfSksXG5dKTtcblxuLyoqXG4gKiBDb2xsZWN0aW9uIGFjY2Vzc29yIGZvciBhIHNpbmdsZSBlbnRlcnByaXNlJ3Mgc2FmZXMsIG1pcnJvcmluZyBXYWxsZXRzIC8gRW50ZXJwcmlzZXMuXG4gKiBTYWZlIHJvdXRlcyBhcmUgZW50ZXJwcmlzZS1zY29wZWQgKC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzKSwgc28gdGhlIGFjY2Vzc29yIGlzXG4gKiBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBlbnRlcnByaXNlIGlkIChzZWUgRW50ZXJwcmlzZS5zYWZlcygpKS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTYWZlcyBpbXBsZW1lbnRzIElTYWZlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRlcnByaXNlSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBlbnRlcnByaXNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmVudGVycHJpc2VJZCA9IGVudGVycHJpc2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlcnByaXNlLXNjb3BlZCB2MiBVUkwgZm9yIHRoZSBzYWZlcyBjb2xsZWN0aW9uLCBlLmcuIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzXG4gICAqIEBwYXJhbSBleHRyYVxuICAgKi9cbiAgcHJpdmF0ZSB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke3RoaXMuZW50ZXJwcmlzZUlkfS9zYWZlcyR7ZXh0cmF9YCwgMik7XG4gIH1cblxuICAvKipcbiAgICogT25lLWNhbGwgY29udmVuaWVuY2Ugd3JhcHBlciBjaGFpbmluZyB0aGUgdGhyZWUgY3JlYXRpb24gcGhhc2VzOlxuICAgKiBpbml0aWFsaXplIChQaGFzZSAxKSDihpIgY3JlYXRlU2FmZUtleXMgKFBoYXNlIDIsIGVuYWJsZWQtc2xvdCBjZXJlbW9uaWVzKSDihpJcbiAgICogZmluYWxpemUgKFBoYXNlIDMpLiBIT1QgY3VzdG9keSBvbmx5IGluIHYxLlxuICAgKlxuICAgKiBJZiBhIGtleSBjZXJlbW9ueSBmYWlscywgYGNyZWF0ZVNhZmVLZXlzYCBhcmNoaXZlcyB0aGUgc2FmZSBiZWZvcmUgdGhyb3dpbmcsIHNvIGEgZmFpbGVkIHJ1blxuICAgKiBsZWF2ZXMgbm8gaGFsZi1jcmVhdGVkIHNhZmUgYmVoaW5kIOKAlCBjcmVhdGUgYSBuZXcgc2FmZSBhbmQgcmV0cnkuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlU2FmZShwYXJhbXM6IENyZWF0ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3Qgc2FmZSA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVNhZmUoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pO1xuICAgIGNvbnN0IHJvb3RLZXlzID0gYXdhaXQgdGhpcy5jcmVhdGVTYWZlS2V5cyh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBzYWZlSWQ6IHNhZmUuaWQsXG4gICAgICBlbmFibGVkUm9vdFNsb3RzOiBzYWZlLmVuYWJsZWRSb290U2xvdHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluYWxpemVTYWZlKHNhZmUuaWQsIHJvb3RLZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAxIOKAlCBpbml0aWFsaXplIGEgc2FmZSAobWV0YWRhdGEgb25seSwgbm8ga2V5IG1hdGVyaWFsKS5cbiAgICogUE9TVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcyB7IGxhYmVsIH1cbiAgICogUmVzcG9uc2UgaXMgYHsgaWQsIHN0YXR1cyB9YCBwbHVzIG9wdGlvbmFsIGBlbmFibGVkUm9vdFNsb3RzYCAoYWJzZW50IG9uIG9sZGVyIFdQKS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZVNhZmUocGFyYW1zOiBJbml0aWFsaXplU2FmZU9wdGlvbnMpOiBQcm9taXNlPEluaXRpYWxpemVTYWZlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoKSwgSW5pdGlhbGl6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoSW5pdGlhbGl6ZVNhZmVSZXNwb25zZSwgcmVzcG9uc2UsICdJbml0aWFsaXplU2FmZVJlc3BvbnNlJyk7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMiDigJQgcnVuIHRoZSBlbmFibGVkIHJvb3Qga2V5IGNlcmVtb25pZXMgdGFnZ2VkIHdpdGggYHNhZmVJZGA7IHJldHVybnMgb3JkZXJlZFxuICAgKiBbdXNlciwgYmFja3VwLCBiaXRnb10gdHJpcGxldHMgZm9yIHRob3NlIHNsb3RzLiBIT1QgY3VzdG9keSBvbmx5IGluIHYxLlxuICAgKlxuICAgKiBBYnNlbnQgYGVuYWJsZWRSb290U2xvdHNgIChvbGRlciBXUCwgcHJlLWdhdGluZykgcnVucyBhbGwgNCBzbG90cy4gRW5hYmxlZCBjZXJlbW9uaWVzXG4gICAqICgyLjEgbXVsdGlzaWcg4pGg4pGjLCAyLjIgTVBDIOKRoeKRoikgcnVuIGluIHBhcmFsbGVsLiBJZiBhbnkgb2YgdGhlbSBmYWlsLCB0aGVcbiAgICogcGFydGlhbGx5LWNyZWF0ZWQgc2FmZSBpcyBhcmNoaXZlZCAoYSBsZWdhbCBgaW5pdGlhbGl6aW5nIOKGkiBhcmNoaXZlZGAgdHJhbnNpdGlvbiwgc28gdGhlXG4gICAqIG9ycGhhbmVkIHRhZ2dlZCBrZXlzIGFyZSBpbmVydCkgYW5kIGFuIGVycm9yIGxpc3RpbmcgZXZlcnkgY2VyZW1vbnkgZmFpbHVyZSBpcyB0aHJvd24g4oCUXG4gICAqIGNyZWF0ZSBhIG5ldyBzYWZlIGFuZCByZXRyeS5cbiAgICpcbiAgICogTm90IGluZGVwZW5kZW50bHkgaWRlbXBvdGVudDogcmUtcnVubmluZyBhZ2FpbnN0IGEgc2FmZSB0aGF0IGFscmVhZHkgaGFzIHNvbWUgcm9vdHMgaGl0cyBXUCdzXG4gICAqIHVuaXF1ZSByb290LXNsb3QgaW5kZXguXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNhZmVLZXlzKHBhcmFtczogQ3JlYXRlU2FmZU9wdGlvbnMgJiBTYWZlQ3JlYXRpb25IYW5kbGUpOiBQcm9taXNlPFNhZmVLZXlzPiB7XG4gICAgY29uc3QgeyBzYWZlSWQsIHBhc3NwaHJhc2UsIGVuYWJsZWRSb290U2xvdHMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBlbnRlcnByaXNlID0gdGhpcy5lbnRlcnByaXNlSWQ7XG5cbiAgICAvLyBBYnNlbnQgYGVuYWJsZWRSb290U2xvdHNgIChvbGRlciBXUCwgcHJlLWdhdGluZykg4oeSIGFsbCA0LCBwcmVzZXJ2aW5nIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgLy8gT3JkZXJlZCBieSBzY2hlbWU6IHRoZSB0d28gbXVsdGlzaWcgcm9vdHMgZmlyc3QsIHRoZW4gdGhlIHR3byBNUEMgcm9vdHMuXG4gICAgY29uc3QgYWxsU2xvdHM6IFJvb3RLZXlUeXBlW10gPSBbJ3NlY3AyNTZrMU11bHRpc2lnJywgJ2VkMjU1MTlNdWx0aXNpZycsICdlY2RzYU1wYycsICdlZGRzYU1wYyddO1xuICAgIGNvbnN0IGVuYWJsZWQgPSBuZXcgU2V0KGVuYWJsZWRSb290U2xvdHMgPz8gYWxsU2xvdHMpO1xuICAgIGNvbnN0IHNsb3RzID0gYWxsU2xvdHMuZmlsdGVyKChzbG90KSA9PiBlbmFibGVkLmhhcyhzbG90KSk7XG4gICAgY29uc3QgY2VyZW1vbmllczogUmVjb3JkPFJvb3RLZXlUeXBlLCAoKSA9PiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0Pj4gPSB7XG4gICAgICAvLyBQaGFzZSAyLjEg4oCUIG11bHRpc2lnIHJvb3RzICjikaDikaMpOiBsb2NhbCB1c2VyL2JhY2t1cCBrZXlwYWlycyArIEJpdEdvIGtleSwgYWxsIHNhZmVJZC10YWdnZWQuXG4gICAgICBzZWNwMjU2azFNdWx0aXNpZzogKCkgPT4gdGhpcy5jcmVhdGVNdWx0aXNpZ1Jvb3QoJ3NlY3AyNTZrMU11bHRpc2lnJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICAgIGVkMjU1MTlNdWx0aXNpZzogKCkgPT4gdGhpcy5jcmVhdGVNdWx0aXNpZ1Jvb3QoJ2VkMjU1MTlNdWx0aXNpZycsIHNhZmVJZCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSksXG4gICAgICAvLyBQaGFzZSAyLjIg4oCUIE1QQyByb290cyAo4pGh4pGiKTogdGhlIGV4aXN0aW5nIERLTFMgKOKRoSkgYW5kIEVkRFNBICjikaIpIGNlcmVtb25pZXMsIHNhZmVJZCB0aHJlYWRlZC5cbiAgICAgIGVjZHNhTXBjOiAoKSA9PiB0aGlzLmNyZWF0ZU1wY1Jvb3QoJ2VjZHNhTXBjJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICAgIGVkZHNhTXBjOiAoKSA9PiB0aGlzLmNyZWF0ZU1wY1Jvb3QoJ2VkZHNhTXBjJywgc2FmZUlkLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2xvdHMubWFwKChzbG90KSA9PiBjZXJlbW9uaWVzW3Nsb3RdKCkpKTtcblxuICAgIC8vIFNpbmdsZSBwYXNzIG92ZXIgdGhlIHNldHRsZWQgcmVzdWx0czogYHN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCdgIG5hcnJvd3MgYC52YWx1ZWAgdG8gYVxuICAgIC8vIFJvb3RLZXlUcmlwbGV0LCBhbmQgcmVqZWN0aW9ucyBhcmUgY29sbGVjdGVkIHBlci1zbG90IGZvciB0aGUgZXJyb3IgYmVsb3cuXG4gICAgY29uc3QgaG90OiBSb290S2V5c0J5VHlwZSA9IHt9O1xuICAgIGNvbnN0IGZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgaG90W3Nsb3RzW2ldXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHJlc3VsdC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlc3VsdC5yZWFzb24ubWVzc2FnZSA6IFN0cmluZyhyZXN1bHQucmVhc29uKTtcbiAgICAgICAgLy8gQXBpUmVzcG9uc2VFcnJvciBjYXJyaWVzIHRoZSBzZXJ2ZXItZWNob2VkIGBSZXF1ZXN0LUlEYCBoZWFkZXIg4oCUIGluY2x1ZGUgaXQgKHdoZW5cbiAgICAgICAgLy8gcHJlc2VudCkgc28gYSBmYWlsZWQgY2VyZW1vbnkgY2FuIGJlIGNvcnJlbGF0ZWQgd2l0aCBXUCdzIHNlcnZlci1zaWRlIGxvZ3MuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlc3VsdC5yZWFzb24gaW5zdGFuY2VvZiBBcGlSZXNwb25zZUVycm9yID8gcmVzdWx0LnJlYXNvbi5yZXF1ZXN0SWQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goYCR7c2xvdHNbaV19OiAke3JlYXNvbn0ke3JlcXVlc3RJZCA/IGAgKHJlcXVlc3RJZDogJHtyZXF1ZXN0SWR9KWAgOiAnJ31gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCBhYmFuZG9uIHRoZSBwYXJ0aWFsbHktY3JlYXRlZCBzYWZlIHNvIGEgcmV0cnkgc3RhcnRzIGZyb20gYSBjbGVhbiBzbGF0ZS4gS2VlcFxuICAgICAgLy8gdGhlIGNlcmVtb255IGZhaWx1cmVzIGFzIHRoZSBwcmltYXJ5IGVycm9yOyBub3RlIGl0IGlmIHRoZSBjbGVhbnVwIGFyY2hpdmUgYWxzbyBmYWlsZWQuXG4gICAgICBsZXQgYXJjaGl2ZUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXJjaGl2ZVNhZmUoc2FmZUlkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXJjaGl2ZUVycm9yID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IG5ldyBFcnJvcihTdHJpbmcoZSkpO1xuICAgICAgfVxuICAgICAgbGV0IG1lc3NhZ2UgPVxuICAgICAgICBgU2FmZSBrZXkgZ2VuZXJhdGlvbiBmYWlsZWQgZm9yICR7ZmFpbHVyZXMubGVuZ3RofSByb290IGNlcmVtb255L2llcyBgICtcbiAgICAgICAgYFske2ZhaWx1cmVzLmpvaW4oJzsgJyl9XS4gVGhlIHNhZmUgKCR7c2FmZUlkfSkgaGFzIGJlZW4gYXJjaGl2ZWQ7IGNyZWF0ZSBhIG5ldyBzYWZlIGFuZCByZXRyeS5gO1xuICAgICAgaWYgKGFyY2hpdmVFcnJvcikge1xuICAgICAgICBtZXNzYWdlICs9IGAgTk9URTogYXJjaGl2aW5nIHRoZSBzYWZlIGFsc28gZmFpbGVkICgke2FyY2hpdmVFcnJvci5tZXNzYWdlfSk7IGFyY2hpdmUgaXQgbWFudWFsbHkgYmVmb3JlIHJldHJ5aW5nLmA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcm9vdEtleXM6IHsgaG90IH0gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIGEgc2FmZS4gQWxzbyB0aGUgYWJhbmRvbm1lbnQgcGF0aCBmb3IgYSBzdHVjayBgaW5pdGlhbGl6aW5nYCBzYWZlICh1c2VkIGJ5XG4gICAqIGBjcmVhdGVTYWZlS2V5c2AgdG8gY2xlYW4gdXAgYWZ0ZXIgYSBmYWlsZWQgY2VyZW1vbnkpLlxuICAgKiBQT1NUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzLzpzYWZlSWQvYXJjaGl2ZVxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBhc3luYyBhcmNoaXZlU2FmZShzYWZlSWQ6IHN0cmluZyk6IFByb21pc2U8U2FmZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3NhZmVJZH0vYXJjaGl2ZWApKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGNvbnN0IHNhZmVEYXRhID0gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gICAgcmV0dXJuIG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAzIOKAlCBmaW5hbGl6ZSBhIHNhZmUgd2l0aCB0aGUgbWludGVkIHJvb3Qga2V5IGlkcyBhcyBvcmRlcmVkIFt1c2VyLCBiYWNrdXAsIGJpdGdvXSB0cmlwbGV0cy5cbiAgICogUE9TVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkL2ZpbmFsaXplIHsgcm9vdEtleXMgfS5cbiAgICogSWRlbXBvdGVudDogcmUtZmluYWxpemluZyB3aXRoIHRoZSBzYW1lIGByb290S2V5c2AgcmV0dXJucyB0aGUgYWN0aXZlIHNhZmUgYWdhaW4gKDIwMCkuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGZpbmFsaXplU2FmZShzYWZlSWQ6IHN0cmluZywgcGFyYW1zOiBGaW5hbGl6ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMudXJsKGAvJHtzYWZlSWR9L2ZpbmFsaXplYCksXG4gICAgICBGaW5hbGl6ZVNhZmVCb2R5LFxuICAgICAgcGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgICBjb25zdCBzYWZlRGF0YSA9IGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICAgIHJldHVybiBuZXcgU2FmZSh0aGlzLmJpdGdvLCBzYWZlRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ29pbiB1c2VkIHRvIHJvdXRlIGEgZ2l2ZW4gcm9vdCdzIGtleSBjZXJlbW9ueSAoc2VlIFJPT1RfQ09JTl9CWV9ORVRXT1JLKS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgcHJpdmF0ZSBjb2luRm9yUm9vdChzbG90OiBSb290S2V5VHlwZSk6IElCYXNlQ29pbiB7XG4gICAgLy8gVjFOZXR3b3JrIGlzIGV4YWN0bHkgJ2JpdGNvaW4nIHwgJ3Rlc3RuZXQnLCBzbyB0aGlzIGJyYW5jaCBpcyBleGhhdXN0aXZlIG92ZXIgZXZlcnlcbiAgICAvLyBlbnZpcm9ubWVudDogJ2JpdGNvaW4nIGlzIG1haW5uZXQgYW5kIGV2ZXJ5IG90aGVyIHZhbHVlIGlzIGEgdGVzdG5ldC5cbiAgICBjb25zdCBuZXR3b3JrID0gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLm5ldHdvcmsgPT09ICdiaXRjb2luJyA/ICdtYWlubmV0JyA6ICd0ZXN0bmV0JztcbiAgICByZXR1cm4gdGhpcy5iaXRnby5jb2luKFJPT1RfQ09JTl9CWV9ORVRXT1JLW25ldHdvcmtdW3Nsb3RdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAyLjEgaGVscGVyIOKAlCBtaW50IG9uZSBvbmNoYWluLW11bHRpc2lnIHJvb3QgKGNvbGQgbW9kZWwsIGFzIHdhbGxldCBjcmVhdGlvbiBkb2VzIHRvZGF5KTpcbiAgICogZ2VuZXJhdGUgdXNlci9iYWNrdXAga2V5cGFpcnMgbG9jYWxseSwgZW5jcnlwdCB3aXRoIGBwYXNzcGhyYXNlYCwgcmVnaXN0ZXIgdmlhIFBPU1QgLzpjb2luL2tleVxuICAgKiB3aXRoIGBzYWZlSWRgOyB0aGUgQml0R28ga2V5IGlzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgc2FtZSByb3V0ZSdzIGBzb3VyY2U6J2JpdGdvJ2AgcGF0aC5cbiAgICogUmV0dXJucyB0aGUgW3VzZXIsIGJhY2t1cCwgYml0Z29dIGtleSBpZCB0cmlwbGV0LlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU11bHRpc2lnUm9vdChcbiAgICBzbG90OiAnc2VjcDI1NmsxTXVsdGlzaWcnIHwgJ2VkMjU1MTlNdWx0aXNpZycsXG4gICAgc2FmZUlkOiBzdHJpbmcsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGVudGVycHJpc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0PiB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5jb2luRm9yUm9vdChzbG90KS5rZXljaGFpbnMoKTtcblxuICAgIGNvbnN0IHVzZXJLZXlQYWlyID0ga2V5Y2hhaW5zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHB1YjogdXNlcktleVBhaXIucHViLFxuICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogdXNlcktleVBhaXIucHJ2LCBwYXNzd29yZDogcGFzc3BocmFzZSB9KSxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgc2FmZUlkLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlLCBzYWZlSWQgfSk7XG4gICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlLCBzYWZlSWQgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG5cbiAgICAvLyBTbG90IOKRoyByb290cyB1c2UgbmV1dHJhbCByYXcgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgKDMyLWJ5dGUgcHVibGljIGtleSBwbHVzIDMyLWJ5dGVcbiAgICAvLyBjaGFpbiBjb2RlKSwgc2VyaWFsaXplZCB0b2dldGhlciBhcyBjYW5vbmljYWwgdW5wYWRkZWQgUkZDIDQ2NDggYmFzZTMyICgxMDMgY2hhcmFjdGVycykuXG4gICAgLy8gQ29pbi1zcGVjaWZpYyBjaGlsZCBlbmNvZGluZyBpcyBwZXJmb3JtZWQgYnkgV2FsbGV0IFBsYXRmb3JtIGFmdGVyIHNvZnQgZGVyaXZhdGlvbi5cbiAgICBpZiAoXG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJyAmJlxuICAgICAgKCFiYWNrdXBLZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIWlzRGVyaXZhYmxlRWQyNTUxOVB1YihiYWNrdXBLZXljaGFpbi5wdWIpIHx8XG4gICAgICAgICFiaXRnb0tleWNoYWluLnB1YiB8fFxuICAgICAgICAhaXNEZXJpdmFibGVFZDI1NTE5UHViKGJpdGdvS2V5Y2hhaW4ucHViKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2FmZSBlZDI1NTE5TXVsdGlzaWcgcm9vdHMgYXJlIG5vdCBkZXJpdmFibGU6IGV4cGVjdGVkIDY0LWJ5dGUgY2Fub25pY2FsIGJhc2UzMiBtYXRlcmlhbCcpO1xuICAgIH1cblxuICAgIHJldHVybiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMi4yIGhlbHBlciDigJQgcnVuIG9uZSBNUEMgY2VyZW1vbnkgKERLTFMgZm9yIGVjZHNhTXBjLCBFZERTQSBmb3IgZWRkc2FNcGMpIHZpYSB0aGVcbiAgICogZXhpc3RpbmcgYGNyZWF0ZU1wY2AgZmxvdyB3aXRoIGBzYWZlSWRgIHRocmVhZGVkIHRocm91Z2gsIHNvIHRoZSByZXN1bHRpbmcgdXNlci9iYWNrdXAvYml0Z29cbiAgICoga2V5cyBsYW5kIHRhZ2dlZC4gUmV0dXJucyB0aGUgW3VzZXIsIGJhY2t1cCwgYml0Z29dIGtleSBpZCB0cmlwbGV0LlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU1wY1Jvb3QoXG4gICAgc2xvdDogJ2VjZHNhTXBjJyB8ICdlZGRzYU1wYycsXG4gICAgc2FmZUlkOiBzdHJpbmcsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGVudGVycHJpc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0PiB7XG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBhd2FpdCB0aGlzLmNvaW5Gb3JSb290KHNsb3QpXG4gICAgICAua2V5Y2hhaW5zKClcbiAgICAgIC5jcmVhdGVNcGMoeyBtdWx0aXNpZ1R5cGU6ICd0c3MnLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBzYWZlSWQgfSk7XG4gICAgcmV0dXJuIFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBlbnRlcnByaXNlJ3Mgc2FmZXMgdGhlIGNhbGxlciBpcyBhIG1lbWJlciBvZiAoY3Vyc29yIHBhZ2luYXRpb24pLlxuICAgKiBHRVQgL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXM/bGltaXQmcHJldklkXG4gICAqXG4gICAqIGBjdXJzb3JgIGlzIHRoZSBvcGFxdWUgYG5leHRDdXJzb3JgIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbDsgcGFnZSBmb3J3YXJkIHVudGlsXG4gICAqIGBuZXh0Q3Vyc29yYCBpcyBhYnNlbnQuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGxpc3QocGFyYW1zOiBMaXN0U2FmZXNPcHRpb25zID0ge30pOiBQcm9taXNlPHsgc2FmZXM6IFNhZmVbXTsgbmV4dEN1cnNvcj86IHN0cmluZyB9PiB7XG4gICAgLy8gU0RLIGV4cG9zZXMgYW4gb3BhcXVlIGN1cnNvcjsgV1Agc3BlYWtzIHByZXZJZC9uZXh0QmF0Y2hQcmV2SWQgKHYyIGxpc3QgY29udmVudGlvbikuXG4gICAgY29uc3QgcXVlcnk6IHsgbGltaXQ/OiBudW1iZXI7IHByZXZJZD86IHN0cmluZyB9ID0ge307XG4gICAgaWYgKHBhcmFtcy5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5jdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLmN1cnNvcjtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gICAgY29uc3QgeyBzYWZlcywgbmV4dEJhdGNoUHJldklkIH0gPSBkZWNvZGVXaXRoQ29kZWMoTGlzdFNhZmVzUmVzcG9uc2UsIHJlc3BvbnNlLCAnTGlzdFNhZmVzUmVzcG9uc2UnKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2FmZXM6IHNhZmVzLm1hcCgoc2FmZURhdGEpID0+IG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKSksXG4gICAgICBuZXh0Q3Vyc29yOiBuZXh0QmF0Y2hQcmV2SWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHNpbmdsZSBzYWZlIGJ5IGlkLiBOb24tbWVtYmVycyBnZXQgYSA0MDQgKGV4aXN0ZW5jZSBpcyBub3QgbGVha2VkKS5cbiAgICogR0VUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzLzpzYWZlSWRcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgZ2V0KHBhcmFtczogR2V0U2FmZU9wdGlvbnMpOiBQcm9taXNlPFNhZmU+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKGAvJHtwYXJhbXMuaWR9YCkpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHNhZmVEYXRhID0gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gICAgcmV0dXJuIG5ldyBTYWZlKHRoaXMuYml0Z28sIHNhZmVEYXRhKTtcbiAgfVxufVxuIl19
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7R0FLRztBQUNILHlDQUEyQjtBQUMzQixzREFRNkI7QUFFN0Isc0NBQTZDO0FBQzdDLDRDQUFrRDtBQUNsRCw2REFBa0U7QUFDbEUsMERBQXVEO0FBR3ZELHlDQUEwRDtBQUMxRCxpQ0FBOEI7QUFFOUI7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3pDLENBQUMsQ0FBQztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQWEsS0FBSztJQUloQixZQUFZLEtBQWdCLEVBQUUsWUFBb0I7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLFlBQVksU0FBUyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQXlCO1FBQzFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENB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SUFBQSx3QkFBZSxFQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JHLE9BQU87WUFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5RCxVQUFVLEVBQUUsZUFBZTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQXNCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUUsTUFBTSxRQUFRLEdBQUcsSUFBQSx3QkFBZSxFQUFDLHVCQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxXQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUF4UEQsc0JBd1BDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBzYWZlIGNsaWVudCBzdXJmYWNlIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSAoaW5jbHVkaW5nIGJyZWFraW5nXG4gKiBjaGFuZ2VzKSBiZWZvcmUgdGhlIHB1YmxpYyByZWxlYXNlLlxuICovXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7XG4gIEZpbmFsaXplU2FmZUJvZHksXG4gIEluaXRpYWxpemVTYWZlQm9keSxcbiAgSW5pdGlhbGl6ZVNhZmVSZXNwb25zZSxcbiAgUm9vdEtleXNCeVR5cGUsXG4gIFJvb3RLZXlUcmlwbGV0LFxuICBSb290S2V5VHlwZSxcbiAgU2FmZURhdGEsXG59IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IGlzRGVyaXZhYmxlRWQyNTUxOVB1YiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItc2FmZXMnO1xuaW1wb3J0IHsgcG9zdFdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL3Bvc3RXaXRoQ29kZWMnO1xuaW1wb3J0IHsgRmluYWxpemVTYWZlT3B0aW9ucywgSW5pdGlhbGl6ZVNhZmVPcHRpb25zIH0gZnJvbSAnLi9pU2FmZSc7XG5pbXBvcnQgeyBDcmVhdGVTYWZlT3B0aW9ucywgR2V0U2FmZU9wdGlvbnMsIElTYWZlcywgTGlzdFNhZmVzT3B0aW9ucywgU2FmZUNyZWF0aW9uSGFuZGxlLCBTYWZlS2V5cyB9IGZyb20gJy4vaVNhZmVzJztcbmltcG9ydCB7IGNvaW5Gb3JSb290LCBTQUZFX1JPT1RfU0xPVFMgfSBmcm9tICcuL3Jvb3RDb2luJztcbmltcG9ydCB7IFNhZmUgfSBmcm9tICcuL3NhZmUnO1xuXG4vKipcbiAqIFdpcmUgc2hhcGUgb2YgdGhlIHBhZ2luYXRlZCBgR0VUIC9lbnRlcnByaXNlLzplSWQvc2FmZXNgIHJlc3BvbnNlLiBXUCBwYWdpbmF0ZXMgd2l0aCB0aGUgdjJcbiAqIGBwcmV2SWRgL2BuZXh0QmF0Y2hQcmV2SWRgIGNvbnZlbnRpb247IHRoZSBTREsgcmUtZXhwb3NlcyBpdCBhcyBhbiBvcGFxdWUgYGN1cnNvcmAvYG5leHRDdXJzb3JgXG4gKiAoc2VlIGBsaXN0YCkuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmNvbnN0IExpc3RTYWZlc1Jlc3BvbnNlID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoeyBzYWZlczogdC5hcnJheShTYWZlRGF0YSkgfSksXG4gIHQucGFydGlhbCh7IG5leHRCYXRjaFByZXZJZDogdC5zdHJpbmcgfSksXG5dKTtcblxuLyoqXG4gKiBDb2xsZWN0aW9uIGFjY2Vzc29yIGZvciBhIHNpbmdsZSBlbnRlcnByaXNlJ3Mgc2FmZXMsIG1pcnJvcmluZyBXYWxsZXRzIC8gRW50ZXJwcmlzZXMuXG4gKiBTYWZlIHJvdXRlcyBhcmUgZW50ZXJwcmlzZS1zY29wZWQgKC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzKSwgc28gdGhlIGFjY2Vzc29yIGlzXG4gKiBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBlbnRlcnByaXNlIGlkIChzZWUgRW50ZXJwcmlzZS5zYWZlcygpKS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTYWZlcyBpbXBsZW1lbnRzIElTYWZlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRlcnByaXNlSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBlbnRlcnByaXNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmVudGVycHJpc2VJZCA9IGVudGVycHJpc2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlcnByaXNlLXNjb3BlZCB2MiBVUkwgZm9yIHRoZSBzYWZlcyBjb2xsZWN0aW9uLCBlLmcuIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzXG4gICAqIEBwYXJhbSBleHRyYVxuICAgKi9cbiAgcHJpdmF0ZSB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke3RoaXMuZW50ZXJwcmlzZUlkfS9zYWZlcyR7ZXh0cmF9YCwgMik7XG4gIH1cblxuICAvKipcbiAgICogT25lLWNhbGwgY29udmVuaWVuY2Ugd3JhcHBlciBjaGFpbmluZyB0aGUgdGhyZWUgY3JlYXRpb24gcGhhc2VzOlxuICAgKiBpbml0aWFsaXplIChQaGFzZSAxKSDihpIgY3JlYXRlU2FmZUtleXMgKFBoYXNlIDIsIGVuYWJsZWQtc2xvdCBjZXJlbW9uaWVzKSDihpJcbiAgICogZmluYWxpemUgKFBoYXNlIDMpLiBIT1QgY3VzdG9keSBvbmx5IGluIHYxLlxuICAgKlxuICAgKiBJZiBhIGtleSBjZXJlbW9ueSBmYWlscywgYGNyZWF0ZVNhZmVLZXlzYCBhcmNoaXZlcyB0aGUgc2FmZSBiZWZvcmUgdGhyb3dpbmcsIHNvIGEgZmFpbGVkIHJ1blxuICAgKiBsZWF2ZXMgbm8gaGFsZi1jcmVhdGVkIHNhZmUgYmVoaW5kIOKAlCBjcmVhdGUgYSBuZXcgc2FmZSBhbmQgcmV0cnkuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlU2FmZShwYXJhbXM6IENyZWF0ZVNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3Qgc2FmZSA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVNhZmUoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pO1xuICAgIGNvbnN0IHJvb3RLZXlzID0gYXdhaXQgdGhpcy5jcmVhdGVTYWZlS2V5cyh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBzYWZlSWQ6IHNhZmUuaWQsXG4gICAgICBlbmFibGVkUm9vdFNsb3RzOiBzYWZlLmVuYWJsZWRSb290U2xvdHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluYWxpemVTYWZlKHNhZmUuaWQsIHJvb3RLZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAxIOKAlCBpbml0aWFsaXplIGEgc2FmZSAobWV0YWRhdGEgb25seSwgbm8ga2V5IG1hdGVyaWFsKS5cbiAgICogUE9TVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcyB7IGxhYmVsIH1cbiAgICogUmVzcG9uc2UgaXMgYHsgaWQsIHN0YXR1cyB9YCBwbHVzIG9wdGlvbmFsIGBlbmFibGVkUm9vdFNsb3RzYCAoYWJzZW50IG9uIG9sZGVyIFdQKS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZVNhZmUocGFyYW1zOiBJbml0aWFsaXplU2FmZU9wdGlvbnMpOiBQcm9taXNlPEluaXRpYWxpemVTYWZlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RXaXRoQ29kZWModGhpcy5iaXRnbywgdGhpcy51cmwoKSwgSW5pdGlhbGl6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoSW5pdGlhbGl6ZVNhZmVSZXNwb25zZSwgcmVzcG9uc2UsICdJbml0aWFsaXplU2FmZVJlc3BvbnNlJyk7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMiDigJQgcnVuIHRoZSBlbmFibGVkIHJvb3Qga2V5IGNlcmVtb25pZXMgdGFnZ2VkIHdpdGggYHNhZmVJZGA7IHJldHVybnMgb3JkZXJlZFxuICAgKiBbdXNlciwgYmFja3VwLCBiaXRnb10gdHJpcGxldHMgZm9yIHRob3NlIHNsb3RzLiBIT1QgY3VzdG9keSBvbmx5IGluIHYxLlxuICAgKlxuICAgKiBBYnNlbnQgYGVuYWJsZWRSb290U2xvdHNgIChvbGRlciBXUCwgcHJlLWdhdGluZykgcnVucyBhbGwgNCBzbG90cy4gRW5hYmxlZCBjZXJlbW9uaWVzXG4gICAqICgyLjEgbXVsdGlzaWcg4pGg4pGjLCAyLjIgTVBDIOKRoeKRoikgcnVuIGluIHBhcmFsbGVsLiBJZiBhbnkgb2YgdGhlbSBmYWlsLCB0aGVcbiAgICogcGFydGlhbGx5LWNyZWF0ZWQgc2FmZSBpcyBhcmNoaXZlZCAoYSBsZWdhbCBgaW5pdGlhbGl6aW5nIOKGkiBhcmNoaXZlZGAgdHJhbnNpdGlvbiwgc28gdGhlXG4gICAqIG9ycGhhbmVkIHRhZ2dlZCBrZXlzIGFyZSBpbmVydCkgYW5kIGFuIGVycm9yIGxpc3RpbmcgZXZlcnkgY2VyZW1vbnkgZmFpbHVyZSBpcyB0aHJvd24g4oCUXG4gICAqIGNyZWF0ZSBhIG5ldyBzYWZlIGFuZCByZXRyeS5cbiAgICpcbiAgICogTm90IGluZGVwZW5kZW50bHkgaWRlbXBvdGVudDogcmUtcnVubmluZyBhZ2FpbnN0IGEgc2FmZSB0aGF0IGFscmVhZHkgaGFzIHNvbWUgcm9vdHMgaGl0cyBXUCdzXG4gICAqIHVuaXF1ZSByb290LXNsb3QgaW5kZXguXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNhZmVLZXlzKHBhcmFtczogQ3JlYXRlU2FmZU9wdGlvbnMgJiBTYWZlQ3JlYXRpb25IYW5kbGUpOiBQcm9taXNlPFNhZmVLZXlzPiB7XG4gICAgY29uc3QgeyBzYWZlSWQsIHBhc3NwaHJhc2UsIGVuYWJsZWRSb290U2xvdHMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBlbnRlcnByaXNlID0gdGhpcy5lbnRlcnByaXNlSWQ7XG5cbiAgICAvLyBBYnNlbnQgYGVuYWJsZWRSb290U2xvdHNgIChvbGRlciBXUCwgcHJlLWdhdGluZykg4oeSIGFsbCA0LCBwcmVzZXJ2aW5nIGN1cnJlbnQgYmVoYXZpb3IuXG4gICAgLy8gT3JkZXJlZCBieSBzY2hlbWU6IHRoZSB0d28gbXVsdGlzaWcgcm9vdHMgZmlyc3QsIHRoZW4gdGhlIHR3byBNUEMgcm9vdHMuXG4gICAgY29uc3QgZW5hYmxlZCA9IG5ldyBTZXQoZW5hYmxlZFJvb3RTbG90cyA/PyBTQUZFX1JPT1RfU0xPVFMpO1xuICAgIGNvbnN0IHNsb3RzID0gU0FGRV9ST09UX1NMT1RTLmZpbHRlcigoc2xvdCkgPT4gZW5hYmxlZC5oYXMoc2xvdCkpO1xuICAgIGNvbnN0IGNlcmVtb25pZXM6IFJlY29yZDxSb290S2V5VHlwZSwgKCkgPT4gUHJvbWlzZTxSb290S2V5VHJpcGxldD4+ID0ge1xuICAgICAgLy8gUGhhc2UgMi4xIOKAlCBtdWx0aXNpZyByb290cyAo4pGg4pGjKTogbG9jYWwgdXNlci9iYWNrdXAga2V5cGFpcnMgKyBCaXRHbyBrZXksIGFsbCBzYWZlSWQtdGFnZ2VkLlxuICAgICAgc2VjcDI1NmsxTXVsdGlzaWc6ICgpID0+IHRoaXMuY3JlYXRlTXVsdGlzaWdSb290KCdzZWNwMjU2azFNdWx0aXNpZycsIHNhZmVJZCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSksXG4gICAgICBlZDI1NTE5TXVsdGlzaWc6ICgpID0+IHRoaXMuY3JlYXRlTXVsdGlzaWdSb290KCdlZDI1NTE5TXVsdGlzaWcnLCBzYWZlSWQsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UpLFxuICAgICAgLy8gUGhhc2UgMi4yIOKAlCBNUEMgcm9vdHMgKOKRoeKRoik6IHRoZSBleGlzdGluZyBES0xTICjikaEpIGFuZCBFZERTQSAo4pGiKSBjZXJlbW9uaWVzLCBzYWZlSWQgdGhyZWFkZWQuXG4gICAgICBlY2RzYU1wYzogKCkgPT4gdGhpcy5jcmVhdGVNcGNSb290KCdlY2RzYU1wYycsIHNhZmVJZCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSksXG4gICAgICBlZGRzYU1wYzogKCkgPT4gdGhpcy5jcmVhdGVNcGNSb290KCdlZGRzYU1wYycsIHNhZmVJZCwgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSksXG4gICAgfTtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHNsb3RzLm1hcCgoc2xvdCkgPT4gY2VyZW1vbmllc1tzbG90XSgpKSk7XG5cbiAgICAvLyBTaW5nbGUgcGFzcyBvdmVyIHRoZSBzZXR0bGVkIHJlc3VsdHM6IGBzdGF0dXMgPT09ICdmdWxmaWxsZWQnYCBuYXJyb3dzIGAudmFsdWVgIHRvIGFcbiAgICAvLyBSb290S2V5VHJpcGxldCwgYW5kIHJlamVjdGlvbnMgYXJlIGNvbGxlY3RlZCBwZXItc2xvdCBmb3IgdGhlIGVycm9yIGJlbG93LlxuICAgIGNvbnN0IGhvdDogUm9vdEtleXNCeVR5cGUgPSB7fTtcbiAgICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIGhvdFtzbG90c1tpXV0gPSByZXN1bHQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWFzb24gPSByZXN1bHQucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQucmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcocmVzdWx0LnJlYXNvbik7XG4gICAgICAgIC8vIEFwaVJlc3BvbnNlRXJyb3IgY2FycmllcyB0aGUgc2VydmVyLWVjaG9lZCBgUmVxdWVzdC1JRGAgaGVhZGVyIOKAlCBpbmNsdWRlIGl0ICh3aGVuXG4gICAgICAgIC8vIHByZXNlbnQpIHNvIGEgZmFpbGVkIGNlcmVtb255IGNhbiBiZSBjb3JyZWxhdGVkIHdpdGggV1AncyBzZXJ2ZXItc2lkZSBsb2dzLlxuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXN1bHQucmVhc29uIGluc3RhbmNlb2YgQXBpUmVzcG9uc2VFcnJvciA/IHJlc3VsdC5yZWFzb24ucmVxdWVzdElkIDogdW5kZWZpbmVkO1xuICAgICAgICBmYWlsdXJlcy5wdXNoKGAke3Nsb3RzW2ldfTogJHtyZWFzb259JHtyZXF1ZXN0SWQgPyBgIChyZXF1ZXN0SWQ6ICR7cmVxdWVzdElkfSlgIDogJyd9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQmVzdC1lZmZvcnQgYWJhbmRvbiB0aGUgcGFydGlhbGx5LWNyZWF0ZWQgc2FmZSBzbyBhIHJldHJ5IHN0YXJ0cyBmcm9tIGEgY2xlYW4gc2xhdGUuIEtlZXBcbiAgICAgIC8vIHRoZSBjZXJlbW9ueSBmYWlsdXJlcyBhcyB0aGUgcHJpbWFyeSBlcnJvcjsgbm90ZSBpdCBpZiB0aGUgY2xlYW51cCBhcmNoaXZlIGFsc28gZmFpbGVkLlxuICAgICAgbGV0IGFyY2hpdmVFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFyY2hpdmVTYWZlKHNhZmVJZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGFyY2hpdmVFcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICAgIH1cbiAgICAgIGxldCBtZXNzYWdlID1cbiAgICAgICAgYFNhZmUga2V5IGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2ZhaWx1cmVzLmxlbmd0aH0gcm9vdCBjZXJlbW9ueS9pZXMgYCArXG4gICAgICAgIGBbJHtmYWlsdXJlcy5qb2luKCc7ICcpfV0uIFRoZSBzYWZlICgke3NhZmVJZH0pIGhhcyBiZWVuIGFyY2hpdmVkOyBjcmVhdGUgYSBuZXcgc2FmZSBhbmQgcmV0cnkuYDtcbiAgICAgIGlmIChhcmNoaXZlRXJyb3IpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgIE5PVEU6IGFyY2hpdmluZyB0aGUgc2FmZSBhbHNvIGZhaWxlZCAoJHthcmNoaXZlRXJyb3IubWVzc2FnZX0pOyBhcmNoaXZlIGl0IG1hbnVhbGx5IGJlZm9yZSByZXRyeWluZy5gO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJvb3RLZXlzOiB7IGhvdCB9IH07XG4gIH1cblxuICAvKipcbiAgICogQXJjaGl2ZSBhIHNhZmUuIEFsc28gdGhlIGFiYW5kb25tZW50IHBhdGggZm9yIGEgc3R1Y2sgYGluaXRpYWxpemluZ2Agc2FmZSAodXNlZCBieVxuICAgKiBgY3JlYXRlU2FmZUtleXNgIHRvIGNsZWFuIHVwIGFmdGVyIGEgZmFpbGVkIGNlcmVtb255KS5cbiAgICogUE9TVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkL2FyY2hpdmVcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgYXN5bmMgYXJjaGl2ZVNhZmUoc2FmZUlkOiBzdHJpbmcpOiBQcm9taXNlPFNhZmU+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKGAvJHtzYWZlSWR9L2FyY2hpdmVgKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgICBjb25zdCBzYWZlRGF0YSA9IGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICAgIHJldHVybiBuZXcgU2FmZSh0aGlzLmJpdGdvLCBzYWZlRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMyDigJQgZmluYWxpemUgYSBzYWZlIHdpdGggdGhlIG1pbnRlZCByb290IGtleSBpZHMgYXMgb3JkZXJlZCBbdXNlciwgYmFja3VwLCBiaXRnb10gdHJpcGxldHMuXG4gICAqIFBPU1QgL2FwaS92Mi9lbnRlcnByaXNlLzplSWQvc2FmZXMvOnNhZmVJZC9maW5hbGl6ZSB7IHJvb3RLZXlzIH0uXG4gICAqIElkZW1wb3RlbnQ6IHJlLWZpbmFsaXppbmcgd2l0aCB0aGUgc2FtZSBgcm9vdEtleXNgIHJldHVybnMgdGhlIGFjdGl2ZSBzYWZlIGFnYWluICgyMDApLlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBhc3luYyBmaW5hbGl6ZVNhZmUoc2FmZUlkOiBzdHJpbmcsIHBhcmFtczogRmluYWxpemVTYWZlT3B0aW9ucyk6IFByb21pc2U8U2FmZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLnVybChgLyR7c2FmZUlkfS9maW5hbGl6ZWApLFxuICAgICAgRmluYWxpemVTYWZlQm9keSxcbiAgICAgIHBhcmFtc1xuICAgICkucmVzdWx0KCk7XG4gICAgY29uc3Qgc2FmZURhdGEgPSBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgICByZXR1cm4gbmV3IFNhZmUodGhpcy5iaXRnbywgc2FmZURhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBoYXNlIDIuMSBoZWxwZXIg4oCUIG1pbnQgb25lIG9uY2hhaW4tbXVsdGlzaWcgcm9vdCAoY29sZCBtb2RlbCwgYXMgd2FsbGV0IGNyZWF0aW9uIGRvZXMgdG9kYXkpOlxuICAgKiBnZW5lcmF0ZSB1c2VyL2JhY2t1cCBrZXlwYWlycyBsb2NhbGx5LCBlbmNyeXB0IHdpdGggYHBhc3NwaHJhc2VgLCByZWdpc3RlciB2aWEgUE9TVCAvOmNvaW4va2V5XG4gICAqIHdpdGggYHNhZmVJZGA7IHRoZSBCaXRHbyBrZXkgaXMgY3JlYXRlZCB0aHJvdWdoIHRoZSBzYW1lIHJvdXRlJ3MgYHNvdXJjZTonYml0Z28nYCBwYXRoLlxuICAgKiBSZXR1cm5zIHRoZSBbdXNlciwgYmFja3VwLCBiaXRnb10ga2V5IGlkIHRyaXBsZXQuXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTXVsdGlzaWdSb290KFxuICAgIHNsb3Q6ICdzZWNwMjU2azFNdWx0aXNpZycgfCAnZWQyNTUxOU11bHRpc2lnJyxcbiAgICBzYWZlSWQ6IHN0cmluZyxcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nXG4gICk6IFByb21pc2U8Um9vdEtleVRyaXBsZXQ+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBjb2luRm9yUm9vdCh0aGlzLmJpdGdvLCBzbG90KS5rZXljaGFpbnMoKTtcblxuICAgIGNvbnN0IHVzZXJLZXlQYWlyID0ga2V5Y2hhaW5zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuYWRkKHtcbiAgICAgIHB1YjogdXNlcktleVBhaXIucHViLFxuICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogdXNlcktleVBhaXIucHJ2LCBwYXNzd29yZDogcGFzc3BocmFzZSB9KSxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgc2FmZUlkLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlLCBzYWZlSWQgfSk7XG4gICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSBrZXljaGFpbnMuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlLCBzYWZlSWQgfSk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG5cbiAgICAvLyBTbG90IOKRoyByb290cyB1c2UgbmV1dHJhbCByYXcgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgKDMyLWJ5dGUgcHVibGljIGtleSBwbHVzIDMyLWJ5dGVcbiAgICAvLyBjaGFpbiBjb2RlKSwgc2VyaWFsaXplZCB0b2dldGhlciBhcyBjYW5vbmljYWwgdW5wYWRkZWQgUkZDIDQ2NDggYmFzZTMyICgxMDMgY2hhcmFjdGVycykuXG4gICAgLy8gQ29pbi1zcGVjaWZpYyBjaGlsZCBlbmNvZGluZyBpcyBwZXJmb3JtZWQgYnkgV2FsbGV0IFBsYXRmb3JtIGFmdGVyIHNvZnQgZGVyaXZhdGlvbi5cbiAgICBpZiAoXG4gICAgICBzbG90ID09PSAnZWQyNTUxOU11bHRpc2lnJyAmJlxuICAgICAgKCFiYWNrdXBLZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIWlzRGVyaXZhYmxlRWQyNTUxOVB1YihiYWNrdXBLZXljaGFpbi5wdWIpIHx8XG4gICAgICAgICFiaXRnb0tleWNoYWluLnB1YiB8fFxuICAgICAgICAhaXNEZXJpdmFibGVFZDI1NTE5UHViKGJpdGdvS2V5Y2hhaW4ucHViKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2FmZSBlZDI1NTE5TXVsdGlzaWcgcm9vdHMgYXJlIG5vdCBkZXJpdmFibGU6IGV4cGVjdGVkIDY0LWJ5dGUgY2Fub25pY2FsIGJhc2UzMiBtYXRlcmlhbCcpO1xuICAgIH1cblxuICAgIHJldHVybiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMi4yIGhlbHBlciDigJQgcnVuIG9uZSBNUEMgY2VyZW1vbnkgKERLTFMgZm9yIGVjZHNhTXBjLCBFZERTQSBmb3IgZWRkc2FNcGMpIHZpYSB0aGVcbiAgICogZXhpc3RpbmcgYGNyZWF0ZU1wY2AgZmxvdyB3aXRoIGBzYWZlSWRgIHRocmVhZGVkIHRocm91Z2gsIHNvIHRoZSByZXN1bHRpbmcgdXNlci9iYWNrdXAvYml0Z29cbiAgICoga2V5cyBsYW5kIHRhZ2dlZC4gUmV0dXJucyB0aGUgW3VzZXIsIGJhY2t1cCwgYml0Z29dIGtleSBpZCB0cmlwbGV0LlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU1wY1Jvb3QoXG4gICAgc2xvdDogJ2VjZHNhTXBjJyB8ICdlZGRzYU1wYycsXG4gICAgc2FmZUlkOiBzdHJpbmcsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGVudGVycHJpc2U6IHN0cmluZ1xuICApOiBQcm9taXNlPFJvb3RLZXlUcmlwbGV0PiB7XG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH0gPSBhd2FpdCBjb2luRm9yUm9vdCh0aGlzLmJpdGdvLCBzbG90KVxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuY3JlYXRlTXBjKHsgbXVsdGlzaWdUeXBlOiAndHNzJywgcGFzc3BocmFzZSwgZW50ZXJwcmlzZSwgc2FmZUlkIH0pO1xuICAgIHJldHVybiBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgZW50ZXJwcmlzZSdzIHNhZmVzIHRoZSBjYWxsZXIgaXMgYSBtZW1iZXIgb2YgKGN1cnNvciBwYWdpbmF0aW9uKS5cbiAgICogR0VUIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzP2xpbWl0JnByZXZJZFxuICAgKlxuICAgKiBgY3Vyc29yYCBpcyB0aGUgb3BhcXVlIGBuZXh0Q3Vyc29yYCByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGw7IHBhZ2UgZm9yd2FyZCB1bnRpbFxuICAgKiBgbmV4dEN1cnNvcmAgaXMgYWJzZW50LlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBhc3luYyBsaXN0KHBhcmFtczogTGlzdFNhZmVzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IHNhZmVzOiBTYWZlW107IG5leHRDdXJzb3I/OiBzdHJpbmcgfT4ge1xuICAgIC8vIFNESyBleHBvc2VzIGFuIG9wYXF1ZSBjdXJzb3I7IFdQIHNwZWFrcyBwcmV2SWQvbmV4dEJhdGNoUHJldklkICh2MiBsaXN0IGNvbnZlbnRpb24pLlxuICAgIGNvbnN0IHF1ZXJ5OiB7IGxpbWl0PzogbnVtYmVyOyBwcmV2SWQ/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGlmIChwYXJhbXMubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuY3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5jdXJzb3I7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHsgc2FmZXMsIG5leHRCYXRjaFByZXZJZCB9ID0gZGVjb2RlV2l0aENvZGVjKExpc3RTYWZlc1Jlc3BvbnNlLCByZXNwb25zZSwgJ0xpc3RTYWZlc1Jlc3BvbnNlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNhZmVzOiBzYWZlcy5tYXAoKHNhZmVEYXRhKSA9PiBuZXcgU2FmZSh0aGlzLmJpdGdvLCBzYWZlRGF0YSkpLFxuICAgICAgbmV4dEN1cnNvcjogbmV4dEJhdGNoUHJldklkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBzaW5nbGUgc2FmZSBieSBpZC4gTm9uLW1lbWJlcnMgZ2V0IGEgNDA0IChleGlzdGVuY2UgaXMgbm90IGxlYWtlZCkuXG4gICAqIEdFVCAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGdldChwYXJhbXM6IEdldFNhZmVPcHRpb25zKTogUHJvbWlzZTxTYWZlPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybChgLyR7cGFyYW1zLmlkfWApKS5yZXN1bHQoKTtcbiAgICBjb25zdCBzYWZlRGF0YSA9IGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICAgIHJldHVybiBuZXcgU2FmZSh0aGlzLmJpdGdvLCBzYWZlRGF0YSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Base64url encoding helpers.
3
+ *
4
+ * Base64url uses the same alphabet as standard base64 except `+` becomes `-`,
5
+ * `/` becomes `_`, and padding (`=`) is stripped. Browser WebAuthn APIs and
6
+ * the BitGo server both use base64url for credential IDs and PRF salts, so we
7
+ * normalise to it everywhere on the client to avoid mismatches caused by
8
+ * mixing encodings.
9
+ */
10
+ /** Converts a standard base64 string (or already-base64url string) to base64url. */
11
+ export declare function toBase64Url(s: string): string;
12
+ /** Encodes an ArrayBuffer or Buffer as a base64url string (no padding). */
13
+ export declare function bufferToBase64Url(buffer: ArrayBuffer | Buffer): string;
14
+ /** Decodes a base64url string into a Buffer. */
15
+ export declare function base64UrlToBuffer(s: string): Buffer;
16
+ //# sourceMappingURL=base64url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/webauthn/base64url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,CAEtE;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Base64url encoding helpers.
4
+ *
5
+ * Base64url uses the same alphabet as standard base64 except `+` becomes `-`,
6
+ * `/` becomes `_`, and padding (`=`) is stripped. Browser WebAuthn APIs and
7
+ * the BitGo server both use base64url for credential IDs and PRF salts, so we
8
+ * normalise to it everywhere on the client to avoid mismatches caused by
9
+ * mixing encodings.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.toBase64Url = toBase64Url;
13
+ exports.bufferToBase64Url = bufferToBase64Url;
14
+ exports.base64UrlToBuffer = base64UrlToBuffer;
15
+ /** Converts a standard base64 string (or already-base64url string) to base64url. */
16
+ function toBase64Url(s) {
17
+ return s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
18
+ }
19
+ /** Encodes an ArrayBuffer or Buffer as a base64url string (no padding). */
20
+ function bufferToBase64Url(buffer) {
21
+ return toBase64Url(Buffer.from(buffer).toString('base64'));
22
+ }
23
+ /** Decodes a base64url string into a Buffer. */
24
+ function base64UrlToBuffer(s) {
25
+ return Buffer.from(s.replace(/-/g, '+').replace(/_/g, '/'), 'base64');
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0dXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dlYmF1dGhuL2Jhc2U2NHVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7O0FBR0gsa0NBRUM7QUFHRCw4Q0FFQztBQUdELDhDQUVDO0FBYkQsb0ZBQW9GO0FBQ3BGLFNBQWdCLFdBQVcsQ0FBQyxDQUFTO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsU0FBZ0IsaUJBQWlCLENBQUMsTUFBNEI7SUFDNUQsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELGdEQUFnRDtBQUNoRCxTQUFnQixpQkFBaUIsQ0FBQyxDQUFTO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2U2NHVybCBlbmNvZGluZyBoZWxwZXJzLlxuICpcbiAqIEJhc2U2NHVybCB1c2VzIHRoZSBzYW1lIGFscGhhYmV0IGFzIHN0YW5kYXJkIGJhc2U2NCBleGNlcHQgYCtgIGJlY29tZXMgYC1gLFxuICogYC9gIGJlY29tZXMgYF9gLCBhbmQgcGFkZGluZyAoYD1gKSBpcyBzdHJpcHBlZC4gQnJvd3NlciBXZWJBdXRobiBBUElzIGFuZFxuICogdGhlIEJpdEdvIHNlcnZlciBib3RoIHVzZSBiYXNlNjR1cmwgZm9yIGNyZWRlbnRpYWwgSURzIGFuZCBQUkYgc2FsdHMsIHNvIHdlXG4gKiBub3JtYWxpc2UgdG8gaXQgZXZlcnl3aGVyZSBvbiB0aGUgY2xpZW50IHRvIGF2b2lkIG1pc21hdGNoZXMgY2F1c2VkIGJ5XG4gKiBtaXhpbmcgZW5jb2RpbmdzLlxuICovXG5cbi8qKiBDb252ZXJ0cyBhIHN0YW5kYXJkIGJhc2U2NCBzdHJpbmcgKG9yIGFscmVhZHktYmFzZTY0dXJsIHN0cmluZykgdG8gYmFzZTY0dXJsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmFzZTY0VXJsKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn1cblxuLyoqIEVuY29kZXMgYW4gQXJyYXlCdWZmZXIgb3IgQnVmZmVyIGFzIGEgYmFzZTY0dXJsIHN0cmluZyAobm8gcGFkZGluZykuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjRVcmwoYnVmZmVyOiBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IHN0cmluZyB7XG4gIHJldHVybiB0b0Jhc2U2NFVybChCdWZmZXIuZnJvbShidWZmZXIgYXMgQXJyYXlCdWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG59XG5cbi8qKiBEZWNvZGVzIGEgYmFzZTY0dXJsIHN0cmluZyBpbnRvIGEgQnVmZmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFVybFRvQnVmZmVyKHM6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShzLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyksICdiYXNlNjQnKTtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Derives an enterprise-scoped PRF salt to prevent cross-enterprise key reuse.
3
+ *
4
+ * Computes HMAC-SHA256(key=prfSalt_base64url_decoded, data=enterpriseId_utf8).
5
+ * The baseSalt must always come from the server — never generate it client-side.
6
+ *
7
+ * Returns base64url so the same encoding is used everywhere the salt is handled
8
+ * (server storage, PRF eval input, prfHelpers lookup). Mixing encodings
9
+ * (e.g. hex on the client, base64url on the server) caused the PRF to receive
10
+ * different bytes during attach vs derive in browser environments where
11
+ * `Buffer.toString('hex')` is unreliable.
12
+ *
13
+ * @param baseSalt - Server-provided base64url-encoded PRF salt
14
+ * @param enterpriseId - Enterprise identifier
15
+ * @returns Base64url-encoded HMAC-SHA256 digest (no padding)
16
+ */
17
+ export declare function deriveEnterpriseSalt(baseSalt: string, enterpriseId: string): string;
18
+ //# sourceMappingURL=deriveEnterpriseSalt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deriveEnterpriseSalt.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/webauthn/deriveEnterpriseSalt.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAGnF"}