@bitgo/abstract-utxo 13.3.0 → 13.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACxE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAgBrF"}
1
+ {"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACxE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxD;AA0BD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAgBrF"}
@@ -2,7 +2,30 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.forCoin = forCoin;
4
4
  const blockapis_1 = require("@bitgo/blockapis");
5
+ const sdk_core_1 = require("@bitgo/sdk-core");
5
6
  const baseApi_1 = require("./baseApi");
7
+ /**
8
+ * Re-map `@bitgo/blockapis` provider failures (`ApiRequestError`) to the shared
9
+ * `RecoveryProviderError` so a recovery scanner can distinguish "indexer failed"
10
+ * from "wallet is empty". `ApiRequestError` is the single error type the blockchair
11
+ * http client surfaces for network failures, non-2xx responses, and malformed bodies.
12
+ */
13
+ function wrapProviderErrors(provider) {
14
+ return new Proxy(provider, {
15
+ get(target, prop, receiver) {
16
+ const value = Reflect.get(target, prop, receiver);
17
+ if (typeof value === 'function') {
18
+ return (...args) => Promise.resolve(value.apply(target, args)).catch((e) => {
19
+ if (e instanceof blockapis_1.ApiRequestError) {
20
+ throw new sdk_core_1.RecoveryProviderError(e.message, e);
21
+ }
22
+ throw e;
23
+ });
24
+ }
25
+ return value;
26
+ },
27
+ });
28
+ }
6
29
  function forCoin(coinName, apiToken) {
7
30
  switch (coinName) {
8
31
  case 'btc':
@@ -15,8 +38,8 @@ function forCoin(coinName, apiToken) {
15
38
  case 'doge':
16
39
  case 'ltc':
17
40
  case 'zec':
18
- return blockapis_1.BlockchairApi.forCoin(coinName, { apiToken });
41
+ return wrapProviderErrors(blockapis_1.BlockchairApi.forCoin(coinName, { apiToken }));
19
42
  }
20
43
  throw new baseApi_1.ApiNotImplementedError(coinName);
21
44
  }
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0JBLDBCQWdCQztBQXhDRCxnREFBNkU7QUFJN0UsdUNBQW1EO0FBb0JuRCxTQUFnQixPQUFPLENBQUMsUUFBZ0IsRUFBRSxRQUFpQjtJQUN6RCxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssS0FBSztZQUNSLE9BQU8seUJBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxJQUFJLGdDQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja2NoYWlyQXBpLCBBZGRyZXNzSW5mbywgVHJhbnNhY3Rpb25JTyB9IGZyb20gJ0BiaXRnby9ibG9ja2FwaXMnO1xuXG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQgfSBmcm9tICcuLi91bnNwZW50JztcblxuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4vYmFzZUFwaSc7XG5cbi8qKlxuICogQW4gYWNjb3VudCB3aXRoIGJlYXIgbWluaW11bSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgcmVjb3Zlcmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeUFjY291bnREYXRhIHtcbiAgdHhDb3VudDogbnVtYmVyO1xuICB0b3RhbEJhbGFuY2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBBZGRyZXNzQXBpICYgVXR4b0FwaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5UHJvdmlkZXI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICBnZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbnNwZW50PFROdW1iZXI+W10+O1xuICBnZXRBZGRyZXNzSW5mbyhhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPEFkZHJlc3NJbmZvPjtcbiAgZ2V0VHJhbnNhY3Rpb25IZXgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICBnZXRUcmFuc2FjdGlvbklPKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JTz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JDb2luKGNvaW5OYW1lOiBzdHJpbmcsIGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlcjxudW1iZXI+IHtcbiAgc3dpdGNoIChjb2luTmFtZSkge1xuICAgIGNhc2UgJ2J0Yyc6XG4gICAgY2FzZSAndGJ0Yyc6XG4gICAgY2FzZSAnYmNoJzpcbiAgICBjYXNlICdiY2hhJzpcbiAgICBjYXNlICdic3YnOlxuICAgIGNhc2UgJ2J0Zyc6XG4gICAgY2FzZSAnZGFzaCc6XG4gICAgY2FzZSAnZG9nZSc6XG4gICAgY2FzZSAnbHRjJzpcbiAgICBjYXNlICd6ZWMnOlxuICAgICAgcmV0dXJuIEJsb2NrY2hhaXJBcGkuZm9yQ29pbihjb2luTmFtZSwgeyBhcGlUb2tlbiB9KTtcbiAgfVxuXG4gIHRocm93IG5ldyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yKGNvaW5OYW1lKTtcbn1cbiJdfQ==
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaURBLDBCQWdCQztBQWpFRCxnREFBOEY7QUFDOUYsOENBQXdEO0FBSXhELHVDQUFtRDtBQW9CbkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUE2QixRQUFXO0lBQ2pFLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVE7WUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLFlBQVksMkJBQWUsRUFBRSxDQUFDO3dCQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztvQkFDRCxNQUFNLENBQUMsQ0FBQztnQkFDVixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFNLENBQUM7QUFDVixDQUFDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLFFBQWdCLEVBQUUsUUFBaUI7SUFDekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLGtCQUFrQixDQUFDLHlCQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxJQUFJLGdDQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlSZXF1ZXN0RXJyb3IsIEJsb2NrY2hhaXJBcGksIEFkZHJlc3NJbmZvLCBUcmFuc2FjdGlvbklPIH0gZnJvbSAnQGJpdGdvL2Jsb2NrYXBpcyc7XG5pbXBvcnQgeyBSZWNvdmVyeVByb3ZpZGVyRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQgfSBmcm9tICcuLi91bnNwZW50JztcblxuaW1wb3J0IHsgQXBpTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4vYmFzZUFwaSc7XG5cbi8qKlxuICogQW4gYWNjb3VudCB3aXRoIGJlYXIgbWluaW11bSBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgcmVjb3Zlcmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeUFjY291bnREYXRhIHtcbiAgdHhDb3VudDogbnVtYmVyO1xuICB0b3RhbEJhbGFuY2U6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBBZGRyZXNzQXBpICYgVXR4b0FwaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5UHJvdmlkZXI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICBnZXRVbnNwZW50c0ZvckFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxVbnNwZW50PFROdW1iZXI+W10+O1xuICBnZXRBZGRyZXNzSW5mbyhhZGRyZXNzOiBzdHJpbmcpOiBQcm9taXNlPEFkZHJlc3NJbmZvPjtcbiAgZ2V0VHJhbnNhY3Rpb25IZXgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICBnZXRUcmFuc2FjdGlvbklPKHR4aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JTz47XG59XG5cbi8qKlxuICogUmUtbWFwIGBAYml0Z28vYmxvY2thcGlzYCBwcm92aWRlciBmYWlsdXJlcyAoYEFwaVJlcXVlc3RFcnJvcmApIHRvIHRoZSBzaGFyZWRcbiAqIGBSZWNvdmVyeVByb3ZpZGVyRXJyb3JgIHNvIGEgcmVjb3Zlcnkgc2Nhbm5lciBjYW4gZGlzdGluZ3Vpc2ggXCJpbmRleGVyIGZhaWxlZFwiXG4gKiBmcm9tIFwid2FsbGV0IGlzIGVtcHR5XCIuIGBBcGlSZXF1ZXN0RXJyb3JgIGlzIHRoZSBzaW5nbGUgZXJyb3IgdHlwZSB0aGUgYmxvY2tjaGFpclxuICogaHR0cCBjbGllbnQgc3VyZmFjZXMgZm9yIG5ldHdvcmsgZmFpbHVyZXMsIG5vbi0yeHggcmVzcG9uc2VzLCBhbmQgbWFsZm9ybWVkIGJvZGllcy5cbiAqL1xuZnVuY3Rpb24gd3JhcFByb3ZpZGVyRXJyb3JzPFQgZXh0ZW5kcyBSZWNvdmVyeVByb3ZpZGVyPihwcm92aWRlcjogVCk6IFQge1xuICByZXR1cm4gbmV3IFByb3h5KHByb3ZpZGVyLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5hcHBseSh0YXJnZXQsIGFyZ3MpKS5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBcGlSZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlY292ZXJ5UHJvdmlkZXJFcnJvcihlLm1lc3NhZ2UsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICB9KSBhcyBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yQ29pbihjb2luTmFtZTogc3RyaW5nLCBhcGlUb2tlbj86IHN0cmluZyk6IFJlY292ZXJ5UHJvdmlkZXI8bnVtYmVyPiB7XG4gIHN3aXRjaCAoY29pbk5hbWUpIHtcbiAgICBjYXNlICdidGMnOlxuICAgIGNhc2UgJ3RidGMnOlxuICAgIGNhc2UgJ2JjaCc6XG4gICAgY2FzZSAnYmNoYSc6XG4gICAgY2FzZSAnYnN2JzpcbiAgICBjYXNlICdidGcnOlxuICAgIGNhc2UgJ2Rhc2gnOlxuICAgIGNhc2UgJ2RvZ2UnOlxuICAgIGNhc2UgJ2x0Yyc6XG4gICAgY2FzZSAnemVjJzpcbiAgICAgIHJldHVybiB3cmFwUHJvdmlkZXJFcnJvcnMoQmxvY2tjaGFpckFwaS5mb3JDb2luKGNvaW5OYW1lLCB7IGFwaVRva2VuIH0pKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yKGNvaW5OYW1lKTtcbn1cbiJdfQ==
@@ -39,6 +39,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const assert_1 = __importDefault(require("assert"));
40
40
  const sinon = __importStar(require("sinon"));
41
41
  const nock = require("nock");
42
+ const sdk_core_1 = require("@bitgo/sdk-core");
43
+ const blockapis_1 = require("@bitgo/blockapis");
42
44
  const src_1 = require("../../../src");
43
45
  const util_1 = require("../util");
44
46
  const mock_1 = require("./mock");
@@ -143,5 +145,49 @@ describe('Backup Key Recovery - Unspent Gathering', function () {
143
145
  });
144
146
  });
145
147
  });
148
+ describe('RecoveryProvider', function () {
149
+ afterEach(function () {
150
+ nock.cleanAll();
151
+ });
152
+ it('maps a blockchair indexer failure to RecoveryProviderError', async function () {
153
+ const failingProvider = {
154
+ getAddressInfo: () => Promise.reject(new blockapis_1.ApiRequestError('https://api.blockchair.com', 'status code 503')),
155
+ getUnspentsForAddresses: () => Promise.reject(new Error('unused')),
156
+ getTransactionHex: () => Promise.reject(new Error('unused')),
157
+ getTransactionIO: () => Promise.reject(new Error('unused')),
158
+ };
159
+ const stub = sinon.stub(blockapis_1.BlockchairApi, 'forCoin').returns(failingProvider);
160
+ try {
161
+ const provider = (0, src_1.forCoin)('btc');
162
+ await assert_1.default.rejects(() => provider.getAddressInfo('addr'), sdk_core_1.RecoveryProviderError);
163
+ }
164
+ finally {
165
+ stub.restore();
166
+ }
167
+ });
168
+ it('maps a real blockchair 503 to RecoveryProviderError', async function () {
169
+ const address = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa';
170
+ nock('https://api.blockchair.com')
171
+ .get('/bitcoin/dashboards/address/' + address)
172
+ .reply(503);
173
+ const provider = (0, src_1.forCoin)('btc');
174
+ await assert_1.default.rejects(() => provider.getAddressInfo(address), sdk_core_1.RecoveryProviderError);
175
+ });
176
+ it('maps a blockchair rate-limit body (data:null) to RecoveryProviderError', async function () {
177
+ const address = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa';
178
+ nock('https://api.blockchair.com')
179
+ .get('/bitcoin/dashboards/address/' + address)
180
+ .reply(200, {
181
+ data: null,
182
+ context: {
183
+ code: 430,
184
+ error: 'Your IP address is temporary blacklisted due to exceeding usage of API resources.',
185
+ },
186
+ api: {},
187
+ });
188
+ const provider = (0, src_1.forCoin)('btc');
189
+ await assert_1.default.rejects(() => provider.getAddressInfo(address), sdk_core_1.RecoveryProviderError);
190
+ });
191
+ });
146
192
  });
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnlVbnNwZW50R2F0aGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5VW5zcGVudEdhdGhlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBSTlCLHNDQUtzQjtBQUV0QixrQ0FVaUI7QUFFakIsaUNBQThDO0FBSTlDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBRXpCLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBUS9CLCtEQUErRDtBQUMvRCxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBQSwrQkFBd0IsR0FBRSxDQUFDO0FBRWpGLEtBQUssVUFBVSxZQUFZLENBQUMsSUFBbUIsRUFBRSxRQUFnQjtJQUMvRCxLQUFLLFVBQVUsTUFBTSxDQUFDLENBQVE7UUFDNUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLDZCQUE2QjtRQUM3QixNQUFNLFdBQVcsR0FBRyxzQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNwRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCwyQ0FBMkM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsc0JBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lB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QW9CLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRWxELE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQzlCLE1BQU0sSUFBQSx1QkFBaUIsRUFBQyxJQUFJLEVBQUUsbUJBQVksRUFBRTt3QkFDMUMsZ0JBQWdCO3dCQUNoQixtQkFBbUI7d0JBQ25CLElBQUksRUFBRSxDQUFDO3dCQUNQLGtCQUFrQixFQUFFLEVBQUU7d0JBQ3RCLEdBQUcsc0JBQXNCO3dCQUN6QixnQkFBZ0IsRUFBRSxZQUFZO3dCQUM5QixPQUFPLEVBQUUsa0JBQWtCO3FCQUM1QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQklQMzIgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7XG4gIGJhY2t1cEtleVJlY292ZXJ5LFxuICBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uLFxuICBDb2luZ2Vja29BcGksXG4gIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB0eXBlIHsgVW5zcGVudCB9IGZyb20gJy4uLy4uLy4uL3NyYy91bnNwZW50JztcbmltcG9ydCB7XG4gIGNyZWF0ZVdhc21XYWxsZXRLZXlzLFxuICBkZWZhdWx0Qml0R28sXG4gIGVuY3J5cHRLZXljaGFpbixcbiAgZ2V0RGVmYXVsdFdhc21XYWxsZXRLZXlzLFxuICBnZXRNaW5VdHhvQ29pbnMsXG4gIGdldFdhbGxldEFkZHJlc3MsXG4gIGtleWNoYWluc0Jhc2U1OCxcbiAgdG9VbnNwZW50V2l0aFByZXZUeCxcbiAgV2FsbGV0VW5zcGVudFdpdGhQcmV2VHgsXG59IGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgeyBNb2NrUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vbW9jayc7XG5cbnR5cGUgU2NyaXB0VHlwZTJPZjMgPSAncDJzaCcgfCAncDJzaFAyd3NoJyB8ICdwMndzaCcgfCAncDJ0cicgfCAncDJ0ck11c2lnMic7XG5cbm5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcblxuY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdsb2wnO1xuXG50eXBlIE5hbWVkS2V5cyA9IHtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbn07XG5cbi8vIEdldCBkZWZhdWx0IHdhc20gd2FsbGV0IGtleXMgKHhwdWJzLCB4cHJpdnMsIGFuZCB3YWxsZXRLZXlzKVxuY29uc3QgeyB3YWxsZXRLZXlzOiB3YXNtV2FsbGV0S2V5cywgeHB1YnMsIHhwcml2cyB9ID0gZ2V0RGVmYXVsdFdhc21XYWxsZXRLZXlzKCk7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVkS2V5cyhrZXlzOiBUcmlwbGU8QklQMzI+LCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxOYW1lZEtleXM+IHtcbiAgYXN5bmMgZnVuY3Rpb24gZW5jb2RlKGs6IEJJUDMyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBiYXNlNTggPSBrLnRvQmFzZTU4KCk7XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIHB1YmxpYyBrZXlcbiAgICBjb25zdCBwdWJLZXlNYXRjaCA9IGtleWNoYWluc0Jhc2U1OC5maW5kKChrYykgPT4ga2MucHViID09PSBiYXNlNTgpO1xuICAgIGlmIChwdWJLZXlNYXRjaCkge1xuICAgICAgcmV0dXJuIGJhc2U1ODtcbiAgICB9XG4gICAgLy8gSXQncyBhIHByaXZhdGUga2V5IC0gZmluZCBhbmQgZW5jcnlwdCBpdFxuICAgIGNvbnN0IGtleUJhc2U1OCA9IGtleWNoYWluc0Jhc2U1OC5maW5kKChrYykgPT4ga2MucHJ2ID09PSBiYXNlNTgpO1xuICAgIGlmICgha2V5QmFzZTU4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleSBub3QgZm91bmQgaW4ga2V5Y2hhaW5zQmFzZTU4Jyk7XG4gICAgfVxuICAgIHJldHVybiBlbmNyeXB0S2V5Y2hhaW4ocGFzc3dvcmQsIGtleUJhc2U1OCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5OiBhd2FpdCBlbmNvZGUoa2V5c1swXSksXG4gICAgYmFja3VwS2V5OiBhd2FpdCBlbmNvZGUoa2V5c1sxXSksXG4gICAgYml0Z29LZXk6IGF3YWl0IGVuY29kZShrZXlzWzJdKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeShwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxOYW1lZEtleXM+IHtcbiAgcmV0dXJuIGdldE5hbWVkS2V5cyhbeHByaXZzWzBdLCB4cHJpdnNbMV0sIHhwdWJzWzJdXSwgcGFzc3dvcmQpO1xufVxuXG5sZXQga2V5c0Z1bGxTaWduZWRSZWNvdmVyeTogTmFtZWRLZXlzO1xuXG4vKipcbiAqIFRlc3RzIGZvciB1bnNwZW50IGdhdGhlcmluZyB2aWEgYmFja3VwS2V5UmVjb3Zlcnkgd2l0aCBNb2NrUmVjb3ZlcnlQcm92aWRlci5cbiAqIFRoaXMgdmFsaWRhdGVzIHRoZSBhZGRyZXNzIHNjYW5uaW5nIGFuZCB1bnNwZW50IGNvbGxlY3Rpb24gbG9naWMgc2VwYXJhdGVseVxuICogZnJvbSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRpbmcgbG9naWMgdGVzdGVkIGluIGJhY2t1cEtleVJlY292ZXJ5LnRzLlxuICovXG5kZXNjcmliZSgnQmFja3VwIEtleSBSZWNvdmVyeSAtIFVuc3BlbnQgR2F0aGVyaW5nJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBkZWZhdWx0RmVlUmF0ZVNhdEIgPSAxMDA7XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5ID0gYXdhaXQgZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeSh3YWxsZXRQYXNzcGhyYXNlKTtcbiAgfSk7XG5cbiAgZ2V0TWluVXR4b0NvaW5zKCkuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgIGRlc2NyaWJlKGBVbnNwZW50IEdhdGhlcmluZyBbJHtjb2luLmdldENoYWluKCl9XWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgd2FsbGV0S2V5czogZXh0ZXJuYWxXYWxsZXQgfSA9IGNyZWF0ZVdhc21XYWxsZXRLZXlzKCdleHRlcm5hbCcpO1xuICAgICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9IGdldFdhbGxldEFkZHJlc3MoY29pbi5uYW1lLCBleHRlcm5hbFdhbGxldCk7XG5cbiAgICAgIGJlZm9yZSgnbW9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2lub24uc3R1YihDb2luZ2Vja29BcGkucHJvdG90eXBlLCAnZ2V0VVNEUHJpY2UnKS5yZXNvbHZlcyg2OV80MjApO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdnYXRoZXJzIHVuc3BlbnRzIGZyb20gcmVjb3ZlcnkgcHJvdmlkZXIgYW5kIGJ1aWxkcyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG4gICAgICAgIC8vIFVzZSBwMnNoIGZvciBhbGwgY29pbnMgKHVuaXZlcnNhbCBzdXBwb3J0KVxuICAgICAgICBjb25zdCBzY3JpcHRUeXBlczogU2NyaXB0VHlwZTJPZjNbXSA9IFsncDJzaCddO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0ZXN0IHVuc3BlbnRzIHdpdGggcHJldlR4IHVzaW5nIHdhc20tdXR4byBvbmx5IChubyB1dHhvbGliIGRlcGVuZGVuY3kpXG4gICAgICAgIGNvbnN0IHRlc3RVbnNwZW50czogV2FsbGV0VW5zcGVudFdpdGhQcmV2VHg8YmlnaW50PltdID0gc2NyaXB0VHlwZXMuZmxhdE1hcCgoc2NyaXB0VHlwZSwgaW5kZXgpID0+IFtcbiAgICAgICAgICB0b1Vuc3BlbnRXaXRoUHJldlR4KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgxZTgpIH0sIGluZGV4LCBjb2luLm5hbWUsIHdhc21XYWxsZXRLZXlzKSxcbiAgICAgICAgICB0b1Vuc3BlbnRXaXRoUHJldlR4KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgyZTgpIH0sIGluZGV4LCBjb2luLm5hbWUsIHdhc21XYWxsZXRLZXlzKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gQ29udmVydCB0byBBUEkgZm9ybWF0IGZvciBCQ0gvQkNIQSBpZiBuZWVkZWRcbiAgICAgICAgY29uc3QgbW9ja2VkQXBpVW5zcGVudHM6IFVuc3BlbnQ8YmlnaW50PltdID1cbiAgICAgICAgICBjb2luLmdldENoYWluKCkgPT09ICdiY2gnIHx8IGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaGEnXG4gICAgICAgICAgICA/IHRlc3RVbnNwZW50cy5tYXAoKHUpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3ModS5hZGRyZXNzLCAnY2FzaGFkZHInKS5zcGxpdCgnOicpWzFdLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogdGVzdFVuc3BlbnRzO1xuXG4gICAgICAgIGNvbnN0IG1vY2tQcm92aWRlciA9IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcihtb2NrZWRBcGlVbnNwZW50cyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IG1vY2sgcHJvdmlkZXIgd29ya3MgY29ycmVjdGx5XG4gICAgICAgIGNvbnN0IGZldGNoZWRVbnNwZW50cyA9IGF3YWl0IG1vY2tQcm92aWRlci5nZXRVbnNwZW50c0ZvckFkZHJlc3Nlcyhtb2NrZWRBcGlVbnNwZW50cy5tYXAoKHUpID0+IHUuYWRkcmVzcykpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZmV0Y2hlZFVuc3BlbnRzLmxlbmd0aCwgbW9ja2VkQXBpVW5zcGVudHMubGVuZ3RoKTtcblxuICAgICAgICAvLyBDYWxsIGJhY2t1cEtleVJlY292ZXJ5IHdoaWNoIHNob3VsZCBnYXRoZXIgdW5zcGVudHMgdmlhIHRoZSBtb2NrIHByb3ZpZGVyXG4gICAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgYmFja3VwS2V5UmVjb3ZlcnkoY29pbiwgZGVmYXVsdEJpdEdvLCB7XG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIHNjYW46IDUsXG4gICAgICAgICAgaWdub3JlQWRkcmVzc1R5cGVzOiBbXSxcbiAgICAgICAgICAuLi5rZXlzRnVsbFNpZ25lZFJlY292ZXJ5LFxuICAgICAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG1vY2tQcm92aWRlcixcbiAgICAgICAgICBmZWVSYXRlOiBkZWZhdWx0RmVlUmF0ZVNhdEIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZlcmlmeSByZWNvdmVyeSBzdWNjZWVkZWQgKHRyYW5zYWN0aW9uIGhleCBpbmRpY2F0ZXMgdW5zcGVudHMgd2VyZSBnYXRoZXJlZClcbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIChyZWNvdmVyeSBhcyBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uKS50cmFuc2FjdGlvbkhleCA/P1xuICAgICAgICAgIChyZWNvdmVyeSBhcyBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8pLnR4SGV4O1xuICAgICAgICBhc3NlcnQub2sodHhIZXgsICdzaG91bGQgaGF2ZSB0cmFuc2FjdGlvbiBoZXggZnJvbSBnYXRoZXJlZCB1bnNwZW50cycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYW5kbGVzIGVtcHR5IHVuc3BlbnRzIGZyb20gcmVjb3ZlcnkgcHJvdmlkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZW91dCgxMF8wMDApO1xuXG4gICAgICAgIGNvbnN0IG1vY2tQcm92aWRlciA9IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcihbXSk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGJhY2t1cEtleVJlY292ZXJ5KGNvaW4sIGRlZmF1bHRCaXRHbywge1xuICAgICAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgICBzY2FuOiAyLFxuICAgICAgICAgICAgaWdub3JlQWRkcmVzc1R5cGVzOiBbXSxcbiAgICAgICAgICAgIC4uLmtleXNGdWxsU2lnbmVkUmVjb3ZlcnksXG4gICAgICAgICAgICByZWNvdmVyeVByb3ZpZGVyOiBtb2NrUHJvdmlkZXIsXG4gICAgICAgICAgICBmZWVSYXRlOiBkZWZhdWx0RmVlUmF0ZVNhdEIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIC9ObyBpbnB1dCB0byByZWNvdmVyLyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnlVbnNwZW50R2F0aGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5VW5zcGVudEdhdGhlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBRTlCLDhDQUFnRTtBQUNoRSxnREFBa0U7QUFFbEUsc0NBTXNCO0FBRXRCLGtDQVVpQjtBQUVqQixpQ0FBOEM7QUFJOUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFFekIsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFRL0IsK0RBQStEO0FBQy9ELE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLCtCQUF3QixHQUFFLENBQUM7QUFFakYsS0FBSyxVQUFVLFlBQVksQ0FBQyxJQUFtQixFQUFFLFFBQWdCO0lBQy9ELEtBQUssVUFBVSxNQUFNLENBQUMsQ0FBUTtRQUM1QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsNkJBQTZCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLHNCQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxzQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJ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b0JBQ1QsS0FBSyxFQUFFLG1GQUFtRjtpQkFDM0Y7Z0JBQ0QsR0FBRyxFQUFFLEVBQUU7YUFDUixDQUFDLENBQUM7WUFFTCxNQUFNLFFBQVEsR0FBRyxJQUFBLGFBQU8sRUFBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsZ0NBQXFCLENBQUMsQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQklQMzIgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFJlY292ZXJ5UHJvdmlkZXJFcnJvciwgVHJpcGxlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEFwaVJlcXVlc3RFcnJvciwgQmxvY2tjaGFpckFwaSB9IGZyb20gJ0BiaXRnby9ibG9ja2FwaXMnO1xuXG5pbXBvcnQge1xuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbixcbiAgQ29pbmdlY2tvQXBpLFxuICBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8sXG4gIGZvckNvaW4sXG59IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQgfSBmcm9tICcuLi8uLi8uLi9zcmMvdW5zcGVudCc7XG5pbXBvcnQge1xuICBjcmVhdGVXYXNtV2FsbGV0S2V5cyxcbiAgZGVmYXVsdEJpdEdvLFxuICBlbmNyeXB0S2V5Y2hhaW4sXG4gIGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cyxcbiAgZ2V0TWluVXR4b0NvaW5zLFxuICBnZXRXYWxsZXRBZGRyZXNzLFxuICBrZXljaGFpbnNCYXNlNTgsXG4gIHRvVW5zcGVudFdpdGhQcmV2VHgsXG4gIFdhbGxldFVuc3BlbnRXaXRoUHJldlR4LFxufSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHsgTW9ja1JlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL21vY2snO1xuXG50eXBlIFNjcmlwdFR5cGUyT2YzID0gJ3Ayc2gnIHwgJ3Ayc2hQMndzaCcgfCAncDJ3c2gnIHwgJ3AydHInIHwgJ3AydHJNdXNpZzInO1xuXG5ub2NrLmRpc2FibGVOZXRDb25uZWN0KCk7XG5cbmNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAnbG9sJztcblxudHlwZSBOYW1lZEtleXMgPSB7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIGJpdGdvS2V5OiBzdHJpbmc7XG59O1xuXG4vLyBHZXQgZGVmYXVsdCB3YXNtIHdhbGxldCBrZXlzICh4cHVicywgeHByaXZzLCBhbmQgd2FsbGV0S2V5cylcbmNvbnN0IHsgd2FsbGV0S2V5czogd2FzbVdhbGxldEtleXMsIHhwdWJzLCB4cHJpdnMgfSA9IGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cygpO1xuXG5hc3luYyBmdW5jdGlvbiBnZXROYW1lZEtleXMoa2V5czogVHJpcGxlPEJJUDMyPiwgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8TmFtZWRLZXlzPiB7XG4gIGFzeW5jIGZ1bmN0aW9uIGVuY29kZShrOiBCSVAzMik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYmFzZTU4ID0gay50b0Jhc2U1OCgpO1xuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBwdWJsaWMga2V5XG4gICAgY29uc3QgcHViS2V5TWF0Y2ggPSBrZXljaGFpbnNCYXNlNTguZmluZCgoa2MpID0+IGtjLnB1YiA9PT0gYmFzZTU4KTtcbiAgICBpZiAocHViS2V5TWF0Y2gpIHtcbiAgICAgIHJldHVybiBiYXNlNTg7XG4gICAgfVxuICAgIC8vIEl0J3MgYSBwcml2YXRlIGtleSAtIGZpbmQgYW5kIGVuY3J5cHQgaXRcbiAgICBjb25zdCBrZXlCYXNlNTggPSBrZXljaGFpbnNCYXNlNTguZmluZCgoa2MpID0+IGtjLnBydiA9PT0gYmFzZTU4KTtcbiAgICBpZiAoIWtleUJhc2U1OCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdLZXkgbm90IGZvdW5kIGluIGtleWNoYWluc0Jhc2U1OCcpO1xuICAgIH1cbiAgICByZXR1cm4gZW5jcnlwdEtleWNoYWluKHBhc3N3b3JkLCBrZXlCYXNlNTgpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdXNlcktleTogYXdhaXQgZW5jb2RlKGtleXNbMF0pLFxuICAgIGJhY2t1cEtleTogYXdhaXQgZW5jb2RlKGtleXNbMV0pLFxuICAgIGJpdGdvS2V5OiBhd2FpdCBlbmNvZGUoa2V5c1syXSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEtleXNGb3JGdWxsU2lnbmVkUmVjb3ZlcnkocGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8TmFtZWRLZXlzPiB7XG4gIHJldHVybiBnZXROYW1lZEtleXMoW3hwcml2c1swXSwgeHByaXZzWzFdLCB4cHVic1syXV0sIHBhc3N3b3JkKTtcbn1cblxubGV0IGtleXNGdWxsU2lnbmVkUmVjb3Zlcnk6IE5hbWVkS2V5cztcblxuLyoqXG4gKiBUZXN0cyBmb3IgdW5zcGVudCBnYXRoZXJpbmcgdmlhIGJhY2t1cEtleVJlY292ZXJ5IHdpdGggTW9ja1JlY292ZXJ5UHJvdmlkZXIuXG4gKiBUaGlzIHZhbGlkYXRlcyB0aGUgYWRkcmVzcyBzY2FubmluZyBhbmQgdW5zcGVudCBjb2xsZWN0aW9uIGxvZ2ljIHNlcGFyYXRlbHlcbiAqIGZyb20gdGhlIHRyYW5zYWN0aW9uIGJ1aWxkaW5nIGxvZ2ljIHRlc3RlZCBpbiBiYWNrdXBLZXlSZWNvdmVyeS50cy5cbiAqL1xuZGVzY3JpYmUoJ0JhY2t1cCBLZXkgUmVjb3ZlcnkgLSBVbnNwZW50IEdhdGhlcmluZycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZGVmYXVsdEZlZVJhdGVTYXRCID0gMTAwO1xuXG4gIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAga2V5c0Z1bGxTaWduZWRSZWNvdmVyeSA9IGF3YWl0IGdldEtleXNGb3JGdWxsU2lnbmVkUmVjb3Zlcnkod2FsbGV0UGFzc3BocmFzZSk7XG4gIH0pO1xuXG4gIGdldE1pblV0eG9Db2lucygpLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICBkZXNjcmliZShgVW5zcGVudCBHYXRoZXJpbmcgWyR7Y29pbi5nZXRDaGFpbigpfV1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHdhbGxldEtleXM6IGV4dGVybmFsV2FsbGV0IH0gPSBjcmVhdGVXYXNtV2FsbGV0S2V5cygnZXh0ZXJuYWwnKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSBnZXRXYWxsZXRBZGRyZXNzKGNvaW4ubmFtZSwgZXh0ZXJuYWxXYWxsZXQpO1xuXG4gICAgICBiZWZvcmUoJ21vY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNpbm9uLnN0dWIoQ29pbmdlY2tvQXBpLnByb3RvdHlwZSwgJ2dldFVTRFByaWNlJykucmVzb2x2ZXMoNjlfNDIwKTtcbiAgICAgIH0pO1xuXG4gICAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZ2F0aGVycyB1bnNwZW50cyBmcm9tIHJlY292ZXJ5IHByb3ZpZGVyIGFuZCBidWlsZHMgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGltZW91dCgxMF8wMDApO1xuICAgICAgICAvLyBVc2UgcDJzaCBmb3IgYWxsIGNvaW5zICh1bml2ZXJzYWwgc3VwcG9ydClcbiAgICAgICAgY29uc3Qgc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10gPSBbJ3Ayc2gnXTtcblxuICAgICAgICAvLyBDcmVhdGUgdGVzdCB1bnNwZW50cyB3aXRoIHByZXZUeCB1c2luZyB3YXNtLXV0eG8gb25seSAobm8gdXR4b2xpYiBkZXBlbmRlbmN5KVxuICAgICAgICBjb25zdCB0ZXN0VW5zcGVudHM6IFdhbGxldFVuc3BlbnRXaXRoUHJldlR4PGJpZ2ludD5bXSA9IHNjcmlwdFR5cGVzLmZsYXRNYXAoKHNjcmlwdFR5cGUsIGluZGV4KSA9PiBbXG4gICAgICAgICAgdG9VbnNwZW50V2l0aFByZXZUeCh7IHNjcmlwdFR5cGUsIHZhbHVlOiBCaWdJbnQoMWU4KSB9LCBpbmRleCwgY29pbi5uYW1lLCB3YXNtV2FsbGV0S2V5cyksXG4gICAgICAgICAgdG9VbnNwZW50V2l0aFByZXZUeCh7IHNjcmlwdFR5cGUsIHZhbHVlOiBCaWdJbnQoMmU4KSB9LCBpbmRleCwgY29pbi5uYW1lLCB3YXNtV2FsbGV0S2V5cyksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdG8gQVBJIGZvcm1hdCBmb3IgQkNIL0JDSEEgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IG1vY2tlZEFwaVVuc3BlbnRzOiBVbnNwZW50PGJpZ2ludD5bXSA9XG4gICAgICAgICAgY29pbi5nZXRDaGFpbigpID09PSAnYmNoJyB8fCBjb2luLmdldENoYWluKCkgPT09ICdiY2hhJ1xuICAgICAgICAgICAgPyB0ZXN0VW5zcGVudHMubWFwKCh1KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnUsXG4gICAgICAgICAgICAgICAgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKHUuYWRkcmVzcywgJ2Nhc2hhZGRyJykuc3BsaXQoJzonKVsxXSxcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IHRlc3RVbnNwZW50cztcblxuICAgICAgICBjb25zdCBtb2NrUHJvdmlkZXIgPSBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIobW9ja2VkQXBpVW5zcGVudHMpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBtb2NrIHByb3ZpZGVyIHdvcmtzIGNvcnJlY3RseVxuICAgICAgICBjb25zdCBmZXRjaGVkVW5zcGVudHMgPSBhd2FpdCBtb2NrUHJvdmlkZXIuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMobW9ja2VkQXBpVW5zcGVudHMubWFwKCh1KSA9PiB1LmFkZHJlc3MpKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZldGNoZWRVbnNwZW50cy5sZW5ndGgsIG1vY2tlZEFwaVVuc3BlbnRzLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gQ2FsbCBiYWNrdXBLZXlSZWNvdmVyeSB3aGljaCBzaG91bGQgZ2F0aGVyIHVuc3BlbnRzIHZpYSB0aGUgbW9jayBwcm92aWRlclxuICAgICAgICBjb25zdCByZWNvdmVyeSA9IGF3YWl0IGJhY2t1cEtleVJlY292ZXJ5KGNvaW4sIGRlZmF1bHRCaXRHbywge1xuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICBzY2FuOiA1LFxuICAgICAgICAgIGlnbm9yZUFkZHJlc3NUeXBlczogW10sXG4gICAgICAgICAgLi4ua2V5c0Z1bGxTaWduZWRSZWNvdmVyeSxcbiAgICAgICAgICByZWNvdmVyeVByb3ZpZGVyOiBtb2NrUHJvdmlkZXIsXG4gICAgICAgICAgZmVlUmF0ZTogZGVmYXVsdEZlZVJhdGVTYXRCLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBWZXJpZnkgcmVjb3Zlcnkgc3VjY2VlZGVkICh0cmFuc2FjdGlvbiBoZXggaW5kaWNhdGVzIHVuc3BlbnRzIHdlcmUgZ2F0aGVyZWQpXG4gICAgICAgIGNvbnN0IHR4SGV4ID1cbiAgICAgICAgICAocmVjb3ZlcnkgYXMgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbikudHJhbnNhY3Rpb25IZXggPz9cbiAgICAgICAgICAocmVjb3ZlcnkgYXMgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvKS50eEhleDtcbiAgICAgICAgYXNzZXJ0Lm9rKHR4SGV4LCAnc2hvdWxkIGhhdmUgdHJhbnNhY3Rpb24gaGV4IGZyb20gZ2F0aGVyZWQgdW5zcGVudHMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaGFuZGxlcyBlbXB0eSB1bnNwZW50cyBmcm9tIHJlY292ZXJ5IHByb3ZpZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQoMTBfMDAwKTtcblxuICAgICAgICBjb25zdCBtb2NrUHJvdmlkZXIgPSBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIoW10pO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBiYWNrdXBLZXlSZWNvdmVyeShjb2luLCBkZWZhdWx0Qml0R28sIHtcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgICAgc2NhbjogMixcbiAgICAgICAgICAgIGlnbm9yZUFkZHJlc3NUeXBlczogW10sXG4gICAgICAgICAgICAuLi5rZXlzRnVsbFNpZ25lZFJlY292ZXJ5LFxuICAgICAgICAgICAgcmVjb3ZlcnlQcm92aWRlcjogbW9ja1Byb3ZpZGVyLFxuICAgICAgICAgICAgZmVlUmF0ZTogZGVmYXVsdEZlZVJhdGVTYXRCLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAvTm8gaW5wdXQgdG8gcmVjb3Zlci8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyeVByb3ZpZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWFwcyBhIGJsb2NrY2hhaXIgaW5kZXhlciBmYWlsdXJlIHRvIFJlY292ZXJ5UHJvdmlkZXJFcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZhaWxpbmdQcm92aWRlciA9IHtcbiAgICAgICAgZ2V0QWRkcmVzc0luZm86ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBBcGlSZXF1ZXN0RXJyb3IoJ2h0dHBzOi8vYXBpLmJsb2NrY2hhaXIuY29tJywgJ3N0YXR1cyBjb2RlIDUwMycpKSxcbiAgICAgICAgZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXM6ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndW51c2VkJykpLFxuICAgICAgICBnZXRUcmFuc2FjdGlvbkhleDogKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd1bnVzZWQnKSksXG4gICAgICAgIGdldFRyYW5zYWN0aW9uSU86ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndW51c2VkJykpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKEJsb2NrY2hhaXJBcGksICdmb3JDb2luJykucmV0dXJucyhmYWlsaW5nUHJvdmlkZXIgYXMgYW55KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gZm9yQ29pbignYnRjJyk7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IHByb3ZpZGVyLmdldEFkZHJlc3NJbmZvKCdhZGRyJyksIFJlY292ZXJ5UHJvdmlkZXJFcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdHViLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdtYXBzIGEgcmVhbCBibG9ja2NoYWlyIDUwMyB0byBSZWNvdmVyeVByb3ZpZGVyRXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzFBMXpQMWVQNVFHZWZpMkRNUFRmVEw1U0xtdjdEaXZmTmEnO1xuICAgICAgbm9jaygnaHR0cHM6Ly9hcGkuYmxvY2tjaGFpci5jb20nKVxuICAgICAgICAuZ2V0KCcvYml0Y29pbi9kYXNoYm9hcmRzL2FkZHJlc3MvJyArIGFkZHJlc3MpXG4gICAgICAgIC5yZXBseSg1MDMpO1xuXG4gICAgICBjb25zdCBwcm92aWRlciA9IGZvckNvaW4oJ2J0YycpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gcHJvdmlkZXIuZ2V0QWRkcmVzc0luZm8oYWRkcmVzcyksIFJlY292ZXJ5UHJvdmlkZXJFcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnbWFwcyBhIGJsb2NrY2hhaXIgcmF0ZS1saW1pdCBib2R5IChkYXRhOm51bGwpIHRvIFJlY292ZXJ5UHJvdmlkZXJFcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSAnMUExelAxZVA1UUdlZmkyRE1QVGZUTDVTTG12N0RpdmZOYSc7XG4gICAgICBub2NrKCdodHRwczovL2FwaS5ibG9ja2NoYWlyLmNvbScpXG4gICAgICAgIC5nZXQoJy9iaXRjb2luL2Rhc2hib2FyZHMvYWRkcmVzcy8nICsgYWRkcmVzcylcbiAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY29kZTogNDMwLFxuICAgICAgICAgICAgZXJyb3I6ICdZb3VyIElQIGFkZHJlc3MgaXMgdGVtcG9yYXJ5IGJsYWNrbGlzdGVkIGR1ZSB0byBleGNlZWRpbmcgdXNhZ2Ugb2YgQVBJIHJlc291cmNlcy4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpOiB7fSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gZm9yQ29pbignYnRjJyk7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBwcm92aWRlci5nZXRBZGRyZXNzSW5mbyhhZGRyZXNzKSwgUmVjb3ZlcnlQcm92aWRlckVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==