construct-hub 0.3.338 → 0.3.339

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
3
+ exports.deserialize = exports.serialize = exports.handler = void 0;
4
+ const zlib_1 = require("zlib");
4
5
  const aws_embedded_metrics_1 = require("aws-embedded-metrics");
5
6
  const semver_1 = require("semver");
6
7
  const aws = require("../shared/aws.lambda-shared");
@@ -13,10 +14,35 @@ aws_embedded_metrics_1.Configuration.namespace = constants_1.METRICS_NAMESPACE;
13
14
  async function handler(event, context) {
14
15
  var _a;
15
16
  console.log('Event:', JSON.stringify(event, null, 2));
16
- const indexedPackages = new Map();
17
- const packageNames = new Set();
18
- const packageMajorVersions = new Set();
19
- const perLanguage = new Map();
17
+ const scratchworkBucket = env_lambda_shared_1.requireEnv('SCRATCHWORK_BUCKET_NAME');
18
+ const { continuationToken, indexedPackages, packageNames, packageMajorVersions, perLanguage } = event.continuationObjectKey
19
+ ? await loadProgress(event.continuationObjectKey)
20
+ : {
21
+ continuationToken: undefined,
22
+ indexedPackages: new Map(),
23
+ packageNames: new Set(),
24
+ packageMajorVersions: new Set(),
25
+ perLanguage: new Map(),
26
+ };
27
+ async function loadProgress(continuationObjectKey) {
28
+ console.log('Found a continuation object key, retrieving data from the existing run...');
29
+ let { Body, ContentEncoding } = await aws.s3().getObject({
30
+ Bucket: scratchworkBucket,
31
+ Key: continuationObjectKey,
32
+ }).promise();
33
+ // If it was compressed, decompress it.
34
+ if (ContentEncoding === 'gzip') {
35
+ Body = zlib_1.gunzipSync(Buffer.from(Body));
36
+ }
37
+ if (!Body) {
38
+ throw new Error(`Object key "${event.continuationObjectKey}" not found in bucket "${scratchworkBucket}".`);
39
+ }
40
+ console.log('Deserializing data...');
41
+ const serializedState = Body.toString('utf-8');
42
+ const state = deserialize(serializedState);
43
+ console.log('Deserializing finished.');
44
+ return state;
45
+ }
20
46
  /**
21
47
  * Records the status of a particular package, package major version, package
22
48
  * version, and package version submodule in the per-language state storage.
@@ -32,89 +58,128 @@ async function handler(event, context) {
32
58
  lang === language ? status : "Missing" /* MISSING */, pkgName, pkgMajor, pkgVersion, submodule);
33
59
  }
34
60
  }
35
- const bucket = env_lambda_shared_1.requireEnv('BUCKET_NAME');
36
- for await (const key of relevantObjectKeys(bucket)) {
37
- const [, name, version] = constants.STORAGE_KEY_FORMAT_REGEX.exec(key);
38
- packageNames.add(name);
39
- const majorVersion = `${name}@${new semver_1.SemVer(version).major}`;
40
- packageMajorVersions.add(majorVersion);
41
- const fullName = `${name}@${version}`;
42
- // Ensure the package is fully registered for per-language status, even if no doc exists yet.
43
- for (const language of language_1.DocumentationLanguage.ALL) {
44
- recordPerLanguage(language, "Missing" /* MISSING */, name, majorVersion, fullName);
45
- }
46
- if (!indexedPackages.has(fullName)) {
47
- indexedPackages.set(fullName, {});
48
- }
49
- const status = indexedPackages.get(fullName);
50
- if (key.endsWith(constants.METADATA_KEY_SUFFIX)) {
51
- status.metadataPresent = true;
52
- }
53
- else if (key.endsWith(constants.PACKAGE_KEY_SUFFIX)) {
54
- status.tarballPresent = true;
55
- }
56
- else if (key.endsWith(constants.ASSEMBLY_KEY_SUFFIX)) {
57
- status.assemblyPresent = true;
58
- }
59
- else if (key.endsWith(constants.UNINSTALLABLE_PACKAGE_SUFFIX)) {
60
- status.uninstallable = true;
61
- }
62
- else {
63
- let identified = false;
61
+ async function saveProgress(latestContinuationToken) {
62
+ console.log('Serializing data...');
63
+ const serializedState = serialize({
64
+ continuationToken: latestContinuationToken,
65
+ packageNames,
66
+ packageMajorVersions,
67
+ indexedPackages,
68
+ perLanguage,
69
+ });
70
+ console.log('Serializing finished.');
71
+ const { buffer, contentEncoding } = compress_content_lambda_shared_1.compressContent(Buffer.from(serializedState));
72
+ const keyName = `inventory-canary-progress-${Date.now()}`;
73
+ await aws.s3()
74
+ .putObject({
75
+ Bucket: scratchworkBucket,
76
+ Key: keyName,
77
+ Body: buffer,
78
+ ContentType: 'application/json',
79
+ ContentEncoding: contentEncoding,
80
+ Metadata: {
81
+ 'Lambda-Log-Group': context.logGroupName,
82
+ 'Lambda-Log-Stream': context.logStreamName,
83
+ 'Lambda-Run-Id': context.awsRequestId,
84
+ },
85
+ })
86
+ .promise();
87
+ return {
88
+ continuationObjectKey: keyName,
89
+ };
90
+ }
91
+ // The maximum time the handler needs to create metrics and upload
92
+ // reports once it's done processing all S3 object keys.
93
+ const maxMetricProcessingTime = 60000;
94
+ const packageDataBucket = env_lambda_shared_1.requireEnv('PACKAGE_DATA_BUCKET_NAME');
95
+ for await (const [keys, latestContinuationToken] of relevantObjectKeys(packageDataBucket, continuationToken)) {
96
+ for (const key of keys) {
97
+ const [, name, version] = constants.STORAGE_KEY_FORMAT_REGEX.exec(key);
98
+ packageNames.add(name);
99
+ const majorVersion = `${name}@${new semver_1.SemVer(version).major}`;
100
+ packageMajorVersions.add(majorVersion);
101
+ const fullName = `${name}@${version}`;
102
+ // Ensure the package is fully registered for per-language status, even if no doc exists yet.
64
103
  for (const language of language_1.DocumentationLanguage.ALL) {
65
- const matchJson = submoduleKeyRegexp(language, 'json').exec(key);
66
- const matchMd = submoduleKeyRegexp(language, 'md').exec(key);
67
- if (matchJson != null) {
68
- const [, submodule, isUnsupported] = matchJson;
69
- if (status.submodules == null) {
70
- status.submodules = new Set();
104
+ recordPerLanguage(language, "Missing" /* MISSING */, name, majorVersion, fullName);
105
+ }
106
+ if (!indexedPackages.has(fullName)) {
107
+ indexedPackages.set(fullName, {});
108
+ }
109
+ const status = indexedPackages.get(fullName);
110
+ if (key.endsWith(constants.METADATA_KEY_SUFFIX)) {
111
+ status.metadataPresent = true;
112
+ }
113
+ else if (key.endsWith(constants.PACKAGE_KEY_SUFFIX)) {
114
+ status.tarballPresent = true;
115
+ }
116
+ else if (key.endsWith(constants.ASSEMBLY_KEY_SUFFIX)) {
117
+ status.assemblyPresent = true;
118
+ }
119
+ else if (key.endsWith(constants.UNINSTALLABLE_PACKAGE_SUFFIX)) {
120
+ status.uninstallable = true;
121
+ }
122
+ else {
123
+ let identified = false;
124
+ for (const language of language_1.DocumentationLanguage.ALL) {
125
+ const matchJson = submoduleKeyRegexp(language, 'json').exec(key);
126
+ const matchMd = submoduleKeyRegexp(language, 'md').exec(key);
127
+ if (matchJson != null) {
128
+ const [, submodule, isUnsupported] = matchJson;
129
+ if (status.submodules == null) {
130
+ status.submodules = new Set();
131
+ }
132
+ status.submodules.add(`${fullName}.${submodule}`);
133
+ recordPerLanguage(language, isUnsupported ? "Unsupported" /* UNSUPPORTED */ : "Supported" /* SUPPORTED */, name, majorVersion, fullName, submodule);
134
+ identified = true;
135
+ }
136
+ else if (key.endsWith(constants.docsKeySuffix(language, undefined, 'json'))) {
137
+ recordPerLanguage(language, "Supported" /* SUPPORTED */, name, majorVersion, fullName);
138
+ identified = true;
139
+ }
140
+ else if (key.endsWith(constants.notSupportedKeySuffix(language, undefined, 'json'))) {
141
+ recordPerLanguage(language, "Unsupported" /* UNSUPPORTED */, name, majorVersion, fullName);
142
+ identified = true;
143
+ }
144
+ else if (key.endsWith(constants.corruptAssemblyKeySuffix(language, undefined, 'json'))) {
145
+ recordPerLanguage(language, "CorruptAssembly" /* CORRUPT_ASSEMBLY */, name, majorVersion, fullName);
146
+ identified = true;
147
+ // Currently we generate both JSON files and markdown files, so for now
148
+ // we record JSON files as the source of truth, but still identify
149
+ // markdown files so they are not counted as unknown.
150
+ }
151
+ else if (matchMd != null) {
152
+ identified = true;
153
+ }
154
+ else if (key.endsWith(constants.docsKeySuffix(language, undefined, 'md'))) {
155
+ identified = true;
156
+ }
157
+ else if (key.endsWith(constants.notSupportedKeySuffix(language, undefined, 'md'))) {
158
+ identified = true;
159
+ }
160
+ else if (key.endsWith(constants.corruptAssemblyKeySuffix(language, undefined, 'md'))) {
161
+ identified = true;
71
162
  }
72
- status.submodules.add(`${fullName}.${submodule}`);
73
- recordPerLanguage(language, isUnsupported ? "Unsupported" /* UNSUPPORTED */ : "Supported" /* SUPPORTED */, name, majorVersion, fullName, submodule);
74
- identified = true;
75
- }
76
- else if (key.endsWith(constants.docsKeySuffix(language, undefined, 'json'))) {
77
- recordPerLanguage(language, "Supported" /* SUPPORTED */, name, majorVersion, fullName);
78
- identified = true;
79
- }
80
- else if (key.endsWith(constants.notSupportedKeySuffix(language, undefined, 'json'))) {
81
- recordPerLanguage(language, "Unsupported" /* UNSUPPORTED */, name, majorVersion, fullName);
82
- identified = true;
83
- }
84
- else if (key.endsWith(constants.corruptAssemblyKeySuffix(language, undefined, 'json'))) {
85
- recordPerLanguage(language, "CorruptAssembly" /* CORRUPT_ASSEMBLY */, name, majorVersion, fullName);
86
- identified = true;
87
- // Currently we generate both JSON files and markdown files, so for now
88
- // we record JSON files as the source of truth, but still identify
89
- // markdown files so they are not counted as unknown.
90
- }
91
- else if (matchMd != null) {
92
- identified = true;
93
- }
94
- else if (key.endsWith(constants.docsKeySuffix(language, undefined, 'md'))) {
95
- identified = true;
96
- }
97
- else if (key.endsWith(constants.notSupportedKeySuffix(language, undefined, 'md'))) {
98
- identified = true;
99
163
  }
100
- else if (key.endsWith(constants.corruptAssemblyKeySuffix(language, undefined, 'md'))) {
101
- identified = true;
164
+ if (!identified) {
165
+ status.unknownObjects = (_a = status.unknownObjects) !== null && _a !== void 0 ? _a : [];
166
+ status.unknownObjects.push(key);
102
167
  }
103
168
  }
104
- if (!identified) {
105
- status.unknownObjects = (_a = status.unknownObjects) !== null && _a !== void 0 ? _a : [];
106
- status.unknownObjects.push(key);
107
- }
169
+ }
170
+ if (latestContinuationToken && context.getRemainingTimeInMillis() <= maxMetricProcessingTime) {
171
+ console.log('Running up to the Lambda time limit and there are still items to process. Saving our current progress...');
172
+ return saveProgress(latestContinuationToken);
108
173
  }
109
174
  }
110
175
  const reports = [];
111
176
  function createReport(reportKey, packageVersions) {
112
177
  const report = JSON.stringify(packageVersions, null, 2);
113
178
  const { buffer, contentEncoding } = compress_content_lambda_shared_1.compressContent(Buffer.from(report));
114
- console.log(`Uploading list to s3://${bucket}/${reportKey}`);
179
+ console.log(`Uploading list to s3://${packageDataBucket}/${reportKey}`);
115
180
  reports.push(aws.s3().putObject({
116
181
  Body: buffer,
117
- Bucket: bucket,
182
+ Bucket: packageDataBucket,
118
183
  ContentEncoding: contentEncoding,
119
184
  ContentType: 'application/json',
120
185
  Expires: new Date(Date.now() + 300000),
@@ -180,15 +245,16 @@ async function handler(event, context) {
180
245
  "Missing" /* MISSING */,
181
246
  "CorruptAssembly" /* CORRUPT_ASSEMBLY */,
182
247
  ]) {
183
- for (const [key, statuses] of Object.entries(data)) {
248
+ for (const [key, statuses] of data.entries()) {
184
249
  let filtered = Array.from(statuses.entries()).filter(([, status]) => forStatus === status);
185
250
  let metricName = METRIC_NAME_BY_STATUS_AND_GRAIN[forStatus][key];
186
251
  if ((forStatus === "Missing" /* MISSING */ && metricName === "MissingPackageVersionCount" /* PER_LANGUAGE_MISSING_VERSIONS */)
187
252
  || (forStatus === "CorruptAssembly" /* CORRUPT_ASSEMBLY */ && metricName === "CorruptAssemblyPackageVersionCount" /* PER_LANGUAGE_CORRUPT_ASSEMBLY_VERSIONS */)) {
188
253
  // generate reports for missing/corrupt only for package versions granularity
254
+ const lang = language_1.DocumentationLanguage.fromString(language);
189
255
  const reportKey = forStatus === "Missing" /* MISSING */ ?
190
- constants.missingDocumentationReport(language) :
191
- constants.corruptAssemblyReport(language);
256
+ constants.missingDocumentationReport(lang) :
257
+ constants.corruptAssemblyReport(lang);
192
258
  createReport(reportKey, filtered.map(([name]) => name).sort());
193
259
  }
194
260
  console.log(`${forStatus} ${key} for ${language}: ${filtered.length} entries`);
@@ -203,22 +269,31 @@ async function handler(event, context) {
203
269
  for (const report of reports) {
204
270
  await report;
205
271
  }
272
+ return {};
206
273
  }
207
274
  exports.handler = handler;
208
- async function* relevantObjectKeys(bucket) {
275
+ /**
276
+ * List all objects in the bucket, yielding batches of up to 1000 keys. Also
277
+ * yields the next continuation token if there is one.
278
+ */
279
+ async function* relevantObjectKeys(bucket, continuationToken) {
209
280
  var _a;
210
281
  const request = {
211
282
  Bucket: bucket,
212
283
  Prefix: constants.STORAGE_KEY_PREFIX,
213
284
  };
285
+ if (continuationToken)
286
+ request.ContinuationToken = continuationToken;
214
287
  do {
215
288
  const response = await aws.s3().listObjectsV2(request).promise();
289
+ const keys = [];
216
290
  for (const { Key } of (_a = response.Contents) !== null && _a !== void 0 ? _a : []) {
217
291
  if (Key == null) {
218
292
  continue;
219
293
  }
220
- yield Key;
294
+ keys.push(Key);
221
295
  }
296
+ yield [keys, response.ContinuationToken];
222
297
  request.ContinuationToken = response.NextContinuationToken;
223
298
  } while (request.ContinuationToken != null);
224
299
  }
@@ -278,24 +353,24 @@ const METRIC_NAME_BY_STATUS_AND_GRAIN = {
278
353
  * If a submodule is provided, only that submodule's availability is updated.
279
354
  */
280
355
  function doRecordPerLanguage(perLanguage, language, status, pkgName, pkgMajor, pkgVersion, submodule) {
281
- if (!perLanguage.has(language)) {
282
- perLanguage.set(language, {
283
- ["package major versions" /* PACKAGE_MAJOR_VERSIONS */]: new Map(),
284
- ["packages" /* PACKAGES */]: new Map(),
285
- ["package version submodules" /* PACKAGE_VERSION_SUBMODULES */]: new Map(),
286
- ["package versions" /* PACKAGE_VERSIONS */]: new Map(),
287
- });
356
+ if (!perLanguage.has(language.name)) {
357
+ const perGrainData = new Map();
358
+ perGrainData.set("package major versions" /* PACKAGE_MAJOR_VERSIONS */, new Map());
359
+ perGrainData.set("packages" /* PACKAGES */, new Map());
360
+ perGrainData.set("package version submodules" /* PACKAGE_VERSION_SUBMODULES */, new Map());
361
+ perGrainData.set("package versions" /* PACKAGE_VERSIONS */, new Map());
362
+ perLanguage.set(language.name, perGrainData);
288
363
  }
289
- const data = perLanguage.get(language);
364
+ const data = perLanguage.get(language.name);
290
365
  // If there is a submodule, only update the submodule domain.
291
366
  const outputDomains = submodule
292
367
  ? [
293
- [data["package version submodules" /* PACKAGE_VERSION_SUBMODULES */], `${pkgVersion}.${submodule}`],
368
+ [data.get("package version submodules" /* PACKAGE_VERSION_SUBMODULES */), `${pkgVersion}.${submodule}`],
294
369
  ]
295
370
  : [
296
- [data["package major versions" /* PACKAGE_MAJOR_VERSIONS */], pkgMajor],
297
- [data["package versions" /* PACKAGE_VERSIONS */], pkgVersion],
298
- [data["packages" /* PACKAGES */], pkgName],
371
+ [data.get("package major versions" /* PACKAGE_MAJOR_VERSIONS */), pkgMajor],
372
+ [data.get("package versions" /* PACKAGE_VERSIONS */), pkgVersion],
373
+ [data.get("packages" /* PACKAGES */), pkgName],
299
374
  ];
300
375
  for (const [map, name] of outputDomains) {
301
376
  switch (status) {
@@ -306,7 +381,7 @@ function doRecordPerLanguage(perLanguage, language, status, pkgName, pkgMajor, p
306
381
  }
307
382
  break;
308
383
  case "Supported" /* SUPPORTED */:
309
- // If thr package is "supported", this always "wins"
384
+ // If the package is "supported", this always "wins"
310
385
  map.set(name, status);
311
386
  break;
312
387
  case "Unsupported" /* UNSUPPORTED */:
@@ -319,4 +394,44 @@ function doRecordPerLanguage(perLanguage, language, status, pkgName, pkgMajor, p
319
394
  }
320
395
  }
321
396
  }
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kL2ludmVudG9yeS9jYW5hcnkubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUF3RTtBQUd4RSxtQ0FBZ0M7QUFDaEMsbURBQW1EO0FBQ25ELDZGQUEyRTtBQUMzRSxpREFBaUQ7QUFDakQsbUVBQXlEO0FBQ3pELGlEQUEyRDtBQUMzRCwyQ0FBZ0Y7QUFFaEYsb0NBQWEsQ0FBQyxTQUFTLEdBQUcsNkJBQWlCLENBQUM7QUFFckMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFxQixFQUFFLE9BQWdCOztJQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3ZDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztJQUV0RTs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsUUFBK0IsRUFDL0IsTUFBeUIsRUFDekIsT0FBZSxFQUNmLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLFNBQWtCO1FBRWxCLEtBQUssTUFBTSxJQUFJLElBQUksZ0NBQXFCLENBQUMsR0FBRyxFQUFFO1lBQzVDLG1CQUFtQixDQUNqQixXQUFXLEVBQ1gsSUFBSTtZQUNKLHVFQUF1RTtZQUN2RSxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyx3QkFBMEIsRUFDdEQsT0FBTyxFQUNQLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxDQUNWLENBQUM7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QUFJLHVEQUE4QixFQUFFLFFBQVEsQ0FBQztZQUM5QyxDQUFDLElBQUksMkNBQXdCLEVBQUUsVUFBVSxDQUFDO1lBQzFDLENBQUMsSUFBSSwyQkFBZ0IsRUFBRSxPQUFPLENBQUM7U0FDaEMsQ0FBQztJQUNOLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDdkMsUUFBUSxNQUFNLEVBQUU7WUFDZDtnQkFDRSxpRUFBaUU7Z0JBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDdkI7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLG9EQUFvRDtnQkFDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3RCLE1BQU07WUFDUixxQ0FBbUM7WUFDbkM7Z0JBQ0UsdUVBQXVFO2dCQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw0QkFBOEIsRUFBRTtvQkFDakUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3ZCO2dCQUNELE1BQU07U0FDVDtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1ldHJpY1Njb3BlLCBDb25maWd1cmF0aW9uLCBVbml0IH0gZnJvbSAnYXdzLWVtYmVkZGVkLW1ldHJpY3MnO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0LCBTY2hlZHVsZWRFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgUHJvbWlzZVJlc3VsdCB9IGZyb20gJ2F3cy1zZGsvbGliL3JlcXVlc3QnO1xuaW1wb3J0IHsgU2VtVmVyIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCAqIGFzIGF3cyBmcm9tICcuLi9zaGFyZWQvYXdzLmxhbWJkYS1zaGFyZWQnO1xuaW1wb3J0IHsgY29tcHJlc3NDb250ZW50IH0gZnJvbSAnLi4vc2hhcmVkL2NvbXByZXNzLWNvbnRlbnQubGFtYmRhLXNoYXJlZCc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vc2hhcmVkL2NvbnN0YW50cyc7XG5pbXBvcnQgeyByZXF1aXJlRW52IH0gZnJvbSAnLi4vc2hhcmVkL2Vudi5sYW1iZGEtc2hhcmVkJztcbmltcG9ydCB7IERvY3VtZW50YXRpb25MYW5ndWFnZSB9IGZyb20gJy4uL3NoYXJlZC9sYW5ndWFnZSc7XG5pbXBvcnQgeyBNRVRSSUNTX05BTUVTUEFDRSwgTWV0cmljTmFtZSwgTEFOR1VBR0VfRElNRU5TSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5Db25maWd1cmF0aW9uLm5hbWVzcGFjZSA9IE1FVFJJQ1NfTkFNRVNQQUNFO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogU2NoZWR1bGVkRXZlbnQsIGNvbnRleHQ6IENvbnRleHQpIHtcbiAgY29uc29sZS5sb2coJ0V2ZW50OicsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG5cbiAgY29uc3QgaW5kZXhlZFBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIEluZGV4ZWRQYWNrYWdlU3RhdHVzPigpO1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcGFja2FnZU1ham9yVmVyc2lvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcGVyTGFuZ3VhZ2UgPSBuZXcgTWFwPERvY3VtZW50YXRpb25MYW5ndWFnZSwgUGVyTGFuZ3VhZ2VEYXRhPigpO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoZSBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyIHBhY2thZ2UsIHBhY2thZ2UgbWFqb3IgdmVyc2lvbiwgcGFja2FnZVxuICAgKiB2ZXJzaW9uLCBhbmQgcGFja2FnZSB2ZXJzaW9uIHN1Ym1vZHVsZSBpbiB0aGUgcGVyLWxhbmd1YWdlIHN0YXRlIHN0b3JhZ2UuXG4gICAqIFdoZW5ldmVyIGEgbmV3IGVudHJ5IGlzIGFkZGVkLCBhIGBNSVNTSU5HYCBlbnRyeSBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkXG4gICAqIGZvciB0aGUgb3RoZXIgbGFuZ3VhZ2VzICh1bmxlc3MgYW5vdGhlciBlbnRyeSBhbHJlYWR5IGV4aXN0cykuXG4gICAqXG4gICAqIElmIGEgc3VibW9kdWxlIGlzIHByb3ZpZGVkLCBvbmx5IHRoYXQgc3VibW9kdWxlJ3MgYXZhaWxhYmlsaXR5IGlzIHVwZGF0ZWQuXG4gICAqL1xuICBmdW5jdGlvbiByZWNvcmRQZXJMYW5ndWFnZShcbiAgICBsYW5ndWFnZTogRG9jdW1lbnRhdGlvbkxhbmd1YWdlLFxuICAgIHN0YXR1czogUGVyTGFuZ3VhZ2VTdGF0dXMsXG4gICAgcGtnTmFtZTogc3RyaW5nLFxuICAgIHBrZ01ham9yOiBzdHJpbmcsXG4gICAgcGtnVmVyc2lvbjogc3RyaW5nLFxuICAgIHN1Ym1vZHVsZT86IHN0cmluZyxcbiAgKSB7XG4gICAgZm9yIChjb25zdCBsYW5nIG9mIERvY3VtZW50YXRpb25MYW5ndWFnZS5BTEwpIHtcbiAgICAgIGRvUmVjb3JkUGVyTGFuZ3VhZ2UoXG4gICAgICAgIHBlckxhbmd1YWdlLFxuICAgICAgICBsYW5nLFxuICAgICAgICAvLyBJZiB0aGUgbGFuZ3VhZ2UgaXMgTk9UIHRoZSByZWdpc3RlcmVkIG9uZSwgdGhlbiB3ZSBpbnNlcnQgXCJNSVNTSU5HXCIuXG4gICAgICAgIGxhbmcgPT09IGxhbmd1YWdlID8gc3RhdHVzIDogUGVyTGFuZ3VhZ2VTdGF0dXMuTUlTU0lORyxcbiAgICAgICAgcGtnTmFtZSxcbiAgICAgICAgcGtnTWFqb3IsXG4gICAgICAgIHBrZ1ZlcnNpb24sXG4gICAgICAgIHN1Ym1vZHVsZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVja2V0ID0gcmVxdWlyZUVudignQlVDS0VUX05BTUUnKTtcbiAgZm9yIGF3YWl0IChjb25zdCBrZXkgb2YgcmVsZXZhbnRPYmplY3RLZXlzKGJ1Y2tldCkpIHtcbiAgICBjb25zdCBbLCBuYW1lLCB2ZXJzaW9uXSA9IGNvbnN0YW50cy5TVE9SQUdFX0tFWV9GT1JNQVRfUkVHRVguZXhlYyhrZXkpITtcblxuICAgIHBhY2thZ2VOYW1lcy5hZGQobmFtZSk7XG4gICAgY29uc3QgbWFqb3JWZXJzaW9uID0gYCR7bmFtZX1AJHtuZXcgU2VtVmVyKHZlcnNpb24pLm1ham9yfWA7XG4gICAgcGFja2FnZU1ham9yVmVyc2lvbnMuYWRkKG1ham9yVmVyc2lvbik7XG5cbiAgICBjb25zdCBmdWxsTmFtZSA9IGAke25hbWV9QCR7dmVyc2lvbn1gO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBwYWNrYWdlIGlzIGZ1bGx5IHJlZ2lzdGVyZWQgZm9yIHBlci1sYW5ndWFnZSBzdGF0dXMsIGV2ZW4gaWYgbm8gZG9jIGV4aXN0cyB5ZXQuXG4gICAgZm9yIChjb25zdCBsYW5ndWFnZSBvZiBEb2N1bWVudGF0aW9uTGFuZ3VhZ2UuQUxMKSB7XG4gICAgICByZWNvcmRQZXJMYW5ndWFnZShsYW5ndWFnZSwgUGVyTGFuZ3VhZ2VTdGF0dXMuTUlTU0lORywgbmFtZSwgbWFqb3JWZXJzaW9uLCBmdWxsTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmRleGVkUGFja2FnZXMuaGFzKGZ1bGxOYW1lKSkge1xuICAgICAgaW5kZXhlZFBhY2thZ2VzLnNldChmdWxsTmFtZSwge30pO1xuICAgIH1cbiAgICBjb25zdCBzdGF0dXMgPSBpbmRleGVkUGFja2FnZXMuZ2V0KGZ1bGxOYW1lKSE7XG5cbiAgICBpZiAoa2V5LmVuZHNXaXRoKGNvbnN0YW50cy5NRVRBREFUQV9LRVlfU1VGRklYKSkge1xuICAgICAgc3RhdHVzLm1ldGFkYXRhUHJlc2VudCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLlBBQ0tBR0VfS0VZX1NVRkZJWCkpIHtcbiAgICAgIHN0YXR1cy50YXJiYWxsUHJlc2VudCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLkFTU0VNQkxZX0tFWV9TVUZGSVgpKSB7XG4gICAgICBzdGF0dXMuYXNzZW1ibHlQcmVzZW50ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChjb25zdGFudHMuVU5JTlNUQUxMQUJMRV9QQUNLQUdFX1NVRkZJWCkpIHtcbiAgICAgIHN0YXR1cy51bmluc3RhbGxhYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGlkZW50aWZpZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbGFuZ3VhZ2Ugb2YgRG9jdW1lbnRhdGlvbkxhbmd1YWdlLkFMTCkge1xuICAgICAgICBjb25zdCBtYXRjaEpzb24gPSBzdWJtb2R1bGVLZXlSZWdleHAobGFuZ3VhZ2UsICdqc29uJykuZXhlYyhrZXkpO1xuICAgICAgICBjb25zdCBtYXRjaE1kID0gc3VibW9kdWxlS2V5UmVnZXhwKGxhbmd1YWdlLCAnbWQnKS5leGVjKGtleSk7XG4gICAgICAgIGlmIChtYXRjaEpzb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IFssIHN1Ym1vZHVsZSwgaXNVbnN1cHBvcnRlZF0gPSBtYXRjaEpzb247XG4gICAgICAgICAgaWYgKHN0YXR1cy5zdWJtb2R1bGVzID09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXR1cy5zdWJtb2R1bGVzID0gbmV3IFNldCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0dXMuc3VibW9kdWxlcy5hZGQoYCR7ZnVsbE5hbWV9LiR7c3VibW9kdWxlfWApO1xuICAgICAgICAgIHJlY29yZFBlckxhbmd1YWdlKFxuICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICBpc1Vuc3VwcG9ydGVkID8gUGVyTGFuZ3VhZ2VTdGF0dXMuVU5TVVBQT1JURUQgOiBQZXJMYW5ndWFnZVN0YXR1cy5TVVBQT1JURUQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbWFqb3JWZXJzaW9uLFxuICAgICAgICAgICAgZnVsbE5hbWUsXG4gICAgICAgICAgICBzdWJtb2R1bGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLmRvY3NLZXlTdWZmaXgobGFuZ3VhZ2UsIHVuZGVmaW5lZCwgJ2pzb24nKSkpIHtcbiAgICAgICAgICByZWNvcmRQZXJMYW5ndWFnZShsYW5ndWFnZSwgUGVyTGFuZ3VhZ2VTdGF0dXMuU1VQUE9SVEVELCBuYW1lLCBtYWpvclZlcnNpb24sIGZ1bGxOYW1lKTtcbiAgICAgICAgICBpZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLm5vdFN1cHBvcnRlZEtleVN1ZmZpeChsYW5ndWFnZSwgdW5kZWZpbmVkLCAnanNvbicpKSkge1xuICAgICAgICAgIHJlY29yZFBlckxhbmd1YWdlKGxhbmd1YWdlLCBQZXJMYW5ndWFnZVN0YXR1cy5VTlNVUFBPUlRFRCwgbmFtZSwgbWFqb3JWZXJzaW9uLCBmdWxsTmFtZSk7XG4gICAgICAgICAgaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKGNvbnN0YW50cy5jb3JydXB0QXNzZW1ibHlLZXlTdWZmaXgobGFuZ3VhZ2UsIHVuZGVmaW5lZCwgJ2pzb24nKSkpIHtcbiAgICAgICAgICByZWNvcmRQZXJMYW5ndWFnZShsYW5ndWFnZSwgUGVyTGFuZ3VhZ2VTdGF0dXMuQ09SUlVQVF9BU1NFTUJMWSwgbmFtZSwgbWFqb3JWZXJzaW9uLCBmdWxsTmFtZSk7XG4gICAgICAgICAgaWRlbnRpZmllZCA9IHRydWU7XG5cbiAgICAgICAgLy8gQ3VycmVudGx5IHdlIGdlbmVyYXRlIGJvdGggSlNPTiBmaWxlcyBhbmQgbWFya2Rvd24gZmlsZXMsIHNvIGZvciBub3dcbiAgICAgICAgLy8gd2UgcmVjb3JkIEpTT04gZmlsZXMgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aCwgYnV0IHN0aWxsIGlkZW50aWZ5XG4gICAgICAgIC8vIG1hcmtkb3duIGZpbGVzIHNvIHRoZXkgYXJlIG5vdCBjb3VudGVkIGFzIHVua25vd24uXG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hNZCAhPSBudWxsKSB7XG4gICAgICAgICAgaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKGNvbnN0YW50cy5kb2NzS2V5U3VmZml4KGxhbmd1YWdlLCB1bmRlZmluZWQsICdtZCcpKSkge1xuICAgICAgICAgIGlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChjb25zdGFudHMubm90U3VwcG9ydGVkS2V5U3VmZml4KGxhbmd1YWdlLCB1bmRlZmluZWQsICdtZCcpKSkge1xuICAgICAgICAgIGlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChjb25zdGFudHMuY29ycnVwdEFzc2VtYmx5S2V5U3VmZml4KGxhbmd1YWdlLCB1bmRlZmluZWQsICdtZCcpKSkge1xuICAgICAgICAgIGlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlkZW50aWZpZWQpIHtcbiAgICAgICAgc3RhdHVzLnVua25vd25PYmplY3RzID0gc3RhdHVzLnVua25vd25PYmplY3RzID8/IFtdO1xuICAgICAgICBzdGF0dXMudW5rbm93bk9iamVjdHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlcG9ydHM6IFByb21pc2U8UHJvbWlzZVJlc3VsdDxBV1MuUzMuUHV0T2JqZWN0T3V0cHV0LCBBV1MuQVdTRXJyb3I+PltdID0gW107XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVwb3J0KHJlcG9ydEtleTogc3RyaW5nLCBwYWNrYWdlVmVyc2lvbnM6IHN0cmluZ1tdKSB7XG5cbiAgICBjb25zdCByZXBvcnQgPSBKU09OLnN0cmluZ2lmeShwYWNrYWdlVmVyc2lvbnMsIG51bGwsIDIpO1xuICAgIGNvbnN0IHsgYnVmZmVyLCBjb250ZW50RW5jb2RpbmcgfSA9IGNvbXByZXNzQ29udGVudChCdWZmZXIuZnJvbShyZXBvcnQpKTtcbiAgICBjb25zb2xlLmxvZyhgVXBsb2FkaW5nIGxpc3QgdG8gczM6Ly8ke2J1Y2tldH0vJHtyZXBvcnRLZXl9YCk7XG4gICAgcmVwb3J0cy5wdXNoKGF3cy5zMygpLnB1dE9iamVjdCh7XG4gICAgICBCb2R5OiBidWZmZXIsXG4gICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgIENvbnRlbnRFbmNvZGluZzogY29udGVudEVuY29kaW5nLFxuICAgICAgQ29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIEV4cGlyZXM6IG5ldyBEYXRlKERhdGUubm93KCkgKyAzMDBfMDAwKSwgLy8gNSBtaW51dGVzIGZyb20gbm93XG4gICAgICBLZXk6IHJlcG9ydEtleSxcbiAgICAgIE1ldGFkYXRhOiB7XG4gICAgICAgICdMYW1iZGEtUnVuLUlkJzogY29udGV4dC5hd3NSZXF1ZXN0SWQsXG4gICAgICAgICdMYW1iZGEtTG9nLUdyb3VwLU5hbWUnOiBjb250ZXh0LmxvZ0dyb3VwTmFtZSxcbiAgICAgICAgJ0xhbWJkYS1Mb2ctU3RyZWFtLU5hbWUnOiBjb250ZXh0LmxvZ1N0cmVhbU5hbWUsXG4gICAgICB9LFxuICAgIH0pLnByb21pc2UoKSk7XG5cbiAgfVxuXG4gIGF3YWl0IG1ldHJpY1Njb3BlKChtZXRyaWNzKSA9PiAoKSA9PiB7XG4gICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgbWV0cmljcy5zZXREaW1lbnNpb25zKCk7XG5cbiAgICBjb25zdCBtaXNzaW5nTWV0YWRhdGEgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGNvbnN0IG1pc3NpbmdBc3NlbWJseSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgY29uc3QgbWlzc2luZ1RhcmJhbGwgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGNvbnN0IHVuaW5zdGFsbGFibGUgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGNvbnN0IHVua25vd25PYmplY3RzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBjb25zdCBzdWJtb2R1bGVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzdGF0dXNdIG9mIGluZGV4ZWRQYWNrYWdlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmICghc3RhdHVzLm1ldGFkYXRhUHJlc2VudCkge1xuICAgICAgICBtaXNzaW5nTWV0YWRhdGEucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RhdHVzLmFzc2VtYmx5UHJlc2VudCkge1xuICAgICAgICBtaXNzaW5nQXNzZW1ibHkucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RhdHVzLnRhcmJhbGxQcmVzZW50KSB7XG4gICAgICAgIG1pc3NpbmdUYXJiYWxsLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdHVzLnVuaW5zdGFsbGFibGUpIHtcbiAgICAgICAgdW5pbnN0YWxsYWJsZS5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXR1cy51bmtub3duT2JqZWN0cz8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICAgIHVua25vd25PYmplY3RzLnB1c2goLi4uc3RhdHVzLnVua25vd25PYmplY3RzISk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgc3VibW9kdWxlIG9mIHN0YXR1cy5zdWJtb2R1bGVzID8/IFtdKSB7XG4gICAgICAgIHN1Ym1vZHVsZXMucHVzaChzdWJtb2R1bGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1ldHJpY3Muc2V0UHJvcGVydHkoJ2RldGFpbCcsIHsgbWlzc2luZ01ldGFkYXRhLCBtaXNzaW5nQXNzZW1ibHksIG1pc3NpbmdUYXJiYWxsLCB1bmtub3duT2JqZWN0cyB9KTtcblxuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuVU5JTlNUQUxMQUJMRV9QQUNLQUdFX0NPVU5ULCB1bmluc3RhbGxhYmxlLmxlbmd0aCwgVW5pdC5Db3VudCk7XG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5NSVNTSU5HX01FVEFEQVRBX0NPVU5ULCBtaXNzaW5nTWV0YWRhdGEubGVuZ3RoLCBVbml0LkNvdW50KTtcbiAgICBtZXRyaWNzLnB1dE1ldHJpYyhNZXRyaWNOYW1lLk1JU1NJTkdfQVNTRU1CTFlfQ09VTlQsIG1pc3NpbmdBc3NlbWJseS5sZW5ndGgsIFVuaXQuQ291bnQpO1xuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuTUlTU0lOR19UQVJCQUxMX0NPVU5ULCBtaXNzaW5nVGFyYmFsbC5sZW5ndGgsIFVuaXQuQ291bnQpO1xuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuUEFDS0FHRV9DT1VOVCwgcGFja2FnZU5hbWVzLnNpemUsIFVuaXQuQ291bnQpO1xuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuUEFDS0FHRV9NQUpPUl9DT1VOVCwgcGFja2FnZU1ham9yVmVyc2lvbnMuc2l6ZSwgVW5pdC5Db3VudCk7XG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5QQUNLQUdFX1ZFUlNJT05fQ09VTlQsIGluZGV4ZWRQYWNrYWdlcy5zaXplLCBVbml0LkNvdW50KTtcbiAgICBtZXRyaWNzLnB1dE1ldHJpYyhNZXRyaWNOYW1lLlNVQk1PRFVMRV9DT1VOVCwgc3VibW9kdWxlcy5sZW5ndGgsIFVuaXQuQ291bnQpO1xuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuVU5LTk9XTl9PQkpFQ1RfQ09VTlQsIHVua25vd25PYmplY3RzLmxlbmd0aCwgVW5pdC5Db3VudCk7XG5cbiAgICBjcmVhdGVSZXBvcnQoY29uc3RhbnRzLlVOSU5TVEFMTEFCTEVfUEFDS0FHRVNfUkVQT1JULCB1bmluc3RhbGxhYmxlKTtcblxuICB9KSgpO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgQXJyYXkuZnJvbShwZXJMYW5ndWFnZS5lbnRyaWVzKCkpKSB7XG4gICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+IGFzeW5jIChsYW5ndWFnZTogRG9jdW1lbnRhdGlvbkxhbmd1YWdlLCBkYXRhOiBQZXJMYW5ndWFnZURhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCAnJyk7XG4gICAgICBjb25zb2xlLmxvZygnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnKTtcbiAgICAgIGNvbnNvbGUubG9nKGAjIyMgU3RhcnQgb2YgZGF0YSBmb3IgJHtsYW5ndWFnZX1gKTtcblxuICAgICAgbWV0cmljcy5zZXREaW1lbnNpb25zKHsgW0xBTkdVQUdFX0RJTUVOU0lPTl06IGxhbmd1YWdlLnRvU3RyaW5nKCkgfSk7XG5cbiAgICAgIGZvciAoY29uc3QgZm9yU3RhdHVzIG9mIFtcbiAgICAgICAgUGVyTGFuZ3VhZ2VTdGF0dXMuU1VQUE9SVEVELFxuICAgICAgICBQZXJMYW5ndWFnZVN0YXR1cy5VTlNVUFBPUlRFRCxcbiAgICAgICAgUGVyTGFuZ3VhZ2VTdGF0dXMuTUlTU0lORyxcbiAgICAgICAgUGVyTGFuZ3VhZ2VTdGF0dXMuQ09SUlVQVF9BU1NFTUJMWSxcbiAgICAgIF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBzdGF0dXNlc10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgICBsZXQgZmlsdGVyZWQgPSBBcnJheS5mcm9tKHN0YXR1c2VzLmVudHJpZXMoKSkuZmlsdGVyKChbLCBzdGF0dXNdKSA9PiBmb3JTdGF0dXMgPT09IHN0YXR1cyk7XG4gICAgICAgICAgbGV0IG1ldHJpY05hbWUgPSBNRVRSSUNfTkFNRV9CWV9TVEFUVVNfQU5EX0dSQUlOW2ZvclN0YXR1cyBhcyBQZXJMYW5ndWFnZVN0YXR1c11ba2V5IGFzIGtleW9mIFBlckxhbmd1YWdlRGF0YV07XG5cbiAgICAgICAgICBpZiAoKGZvclN0YXR1cyA9PT0gUGVyTGFuZ3VhZ2VTdGF0dXMuTUlTU0lORyAmJiBtZXRyaWNOYW1lID09PSBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9NSVNTSU5HX1ZFUlNJT05TKVxuICAgICAgICAgICB8fCAoZm9yU3RhdHVzID09PSBQZXJMYW5ndWFnZVN0YXR1cy5DT1JSVVBUX0FTU0VNQkxZICYmIG1ldHJpY05hbWUgPT09IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX0NPUlJVUFRfQVNTRU1CTFlfVkVSU0lPTlMpKSB7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSByZXBvcnRzIGZvciBtaXNzaW5nL2NvcnJ1cHQgb25seSBmb3IgcGFja2FnZSB2ZXJzaW9ucyBncmFudWxhcml0eVxuICAgICAgICAgICAgY29uc3QgcmVwb3J0S2V5ID0gZm9yU3RhdHVzID09PSBQZXJMYW5ndWFnZVN0YXR1cy5NSVNTSU5HID9cbiAgICAgICAgICAgICAgY29uc3RhbnRzLm1pc3NpbmdEb2N1bWVudGF0aW9uUmVwb3J0KGxhbmd1YWdlKSA6XG4gICAgICAgICAgICAgIGNvbnN0YW50cy5jb3JydXB0QXNzZW1ibHlSZXBvcnQobGFuZ3VhZ2UpO1xuICAgICAgICAgICAgY3JlYXRlUmVwb3J0KHJlcG9ydEtleSwgZmlsdGVyZWQubWFwKChbbmFtZV0pID0+IG5hbWUpLnNvcnQoKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coYCR7Zm9yU3RhdHVzfSAke2tleX0gZm9yICR7bGFuZ3VhZ2V9OiAke2ZpbHRlcmVkLmxlbmd0aH0gZW50cmllc2ApO1xuICAgICAgICAgIG1ldHJpY3MucHV0TWV0cmljKG1ldHJpY05hbWUsIGZpbHRlcmVkLmxlbmd0aCwgVW5pdC5Db3VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coYCMjIyBFbmQgb2YgZGF0YSBmb3IgJHtsYW5ndWFnZX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycpO1xuICAgICAgY29uc29sZS5sb2coJycpO1xuICAgIH0pKC4uLmVudHJ5KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmVwb3J0IG9mIHJlcG9ydHMpIHtcbiAgICBhd2FpdCByZXBvcnQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24qIHJlbGV2YW50T2JqZWN0S2V5cyhidWNrZXQ6IHN0cmluZyk6IEFzeW5jR2VuZXJhdG9yPHN0cmluZywgdm9pZCwgdm9pZD4ge1xuICBjb25zdCByZXF1ZXN0OiBBV1MuUzMuTGlzdE9iamVjdHNWMlJlcXVlc3QgPSB7XG4gICAgQnVja2V0OiBidWNrZXQsXG4gICAgUHJlZml4OiBjb25zdGFudHMuU1RPUkFHRV9LRVlfUFJFRklYLFxuICB9O1xuICBkbyB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhd3MuczMoKS5saXN0T2JqZWN0c1YyKHJlcXVlc3QpLnByb21pc2UoKTtcbiAgICBmb3IgKGNvbnN0IHsgS2V5IH0gb2YgcmVzcG9uc2UuQ29udGVudHMgPz8gW10pIHtcbiAgICAgIGlmIChLZXkgPT0gbnVsbCkgeyBjb250aW51ZTsgfVxuICAgICAgeWllbGQgS2V5O1xuICAgIH1cbiAgICByZXF1ZXN0LkNvbnRpbnVhdGlvblRva2VuID0gcmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuICB9IHdoaWxlIChyZXF1ZXN0LkNvbnRpbnVhdGlvblRva2VuICE9IG51bGwpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gb2J0YWlucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgY2FwdHVyZSBncm91cCB0aGF0IGFsbG93c1xuICogZGV0ZXJtaW5pbmcgdGhlIHN1Ym1vZHVsZSBuYW1lIGZyb20gYSBzdWJtb2R1bGUgZG9jdW1lbnRhdGlvbiBrZXksIGFuZFxuICogYW5vdGhlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgb2JqZWN0IGlzIGFuIFwidW5zdXBwb3J0ZWQgYmVhY29uXCIgb3Igbm90LlxuICovXG5mdW5jdGlvbiBzdWJtb2R1bGVLZXlSZWdleHAobGFuZ3VhZ2U6IERvY3VtZW50YXRpb25MYW5ndWFnZSwgZmlsZUV4dDogc3RyaW5nKTogUmVnRXhwIHtcbiAgLy8gV2UgdXNlIGEgcGxhY2Vob2xkZXIgdG8gYmUgYWJsZSB0byBpbnNlcnQgdGhlIGNhcHR1cmUgZ3JvdXAgb25jZSB3ZSBoYXZlXG4gIC8vIGZ1bGx5IHF1b3RlZCB0aGUga2V5IHByZWZpeCBmb3IgUmVnZXggc2FmZXR5LlxuICBjb25zdCBwbGFjZWhvbGRlciA9ICc8U1VCTU9EVUxFTkFNRT4nO1xuXG4gIC8vIFdlIG9idGFpbiB0aGUgc3RhbmRhcmQga2V5IHN1ZmZpeC5cbiAgY29uc3Qga2V5UHJlZml4ID0gY29uc3RhbnRzLmRvY3NLZXlTdWZmaXgobGFuZ3VhZ2UsIHBsYWNlaG9sZGVyLCBmaWxlRXh0KTtcblxuICAvLyBGaW5hbGx5LCBhc3NlbWJsZSB0aGUgcmVndWxhciBleHByZXNzaW9uIHdpdGggdGhlIGNhcHR1cmUgZ3JvdXAuXG4gIHJldHVybiBuZXcgUmVnRXhwKGAuKiR7cmVRdW90ZShrZXlQcmVmaXgpLnJlcGxhY2UocGxhY2Vob2xkZXIsICcoLispJyl9KCR7cmVRdW90ZShjb25zdGFudHMuTk9UX1NVUFBPUlRFRF9TVUZGSVgpfSk/JGApO1xuXG4gIC8qKlxuICAgKiBFc2NhcGVzIGFsbCBcInNwZWFjaWFsIG1lYW5pbmdcIiBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLCBzbyBpdCBjYW4gYmUgdXNlZCBhc1xuICAgKiBwYXJ0IG9mIGEgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVRdW90ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWysqLigpPyRbXFxdXSkvZywgJ1xcXFwkMScpO1xuICB9XG59XG5cbmludGVyZmFjZSBJbmRleGVkUGFja2FnZVN0YXR1cyB7XG4gIG1ldGFkYXRhUHJlc2VudD86IGJvb2xlYW47XG4gIGFzc2VtYmx5UHJlc2VudD86IGJvb2xlYW47XG4gIHVuaW5zdGFsbGFibGU/OiBib29sZWFuO1xuICBzdWJtb2R1bGVzPzogU2V0PHN0cmluZz47XG4gIHRhcmJhbGxQcmVzZW50PzogYm9vbGVhbjtcbiAgdW5rbm93bk9iamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuY29uc3QgZW51bSBHcmFpbiB7XG4gIFBBQ0tBR0VfTUFKT1JfVkVSU0lPTlMgPSAncGFja2FnZSBtYWpvciB2ZXJzaW9ucycsXG4gIFBBQ0tBR0VfVkVSU0lPTl9TVUJNT0RVTEVTID0gJ3BhY2thZ2UgdmVyc2lvbiBzdWJtb2R1bGVzJyxcbiAgUEFDS0FHRV9WRVJTSU9OUyA9ICdwYWNrYWdlIHZlcnNpb25zJyxcbiAgUEFDS0FHRVMgPSAncGFja2FnZXMnLFxufVxuXG50eXBlIFBlckxhbmd1YWdlRGF0YSA9IHsgcmVhZG9ubHkgW2dyYWluIGluIEdyYWluXTogTWFwPHN0cmluZywgUGVyTGFuZ3VhZ2VTdGF0dXM+IH07XG5cbmNvbnN0IGVudW0gUGVyTGFuZ3VhZ2VTdGF0dXMge1xuICBNSVNTSU5HID0gJ01pc3NpbmcnLFxuICBVTlNVUFBPUlRFRCA9ICdVbnN1cHBvcnRlZCcsXG4gIENPUlJVUFRfQVNTRU1CTFkgPSAnQ29ycnVwdEFzc2VtYmx5JyxcbiAgU1VQUE9SVEVEID0gJ1N1cHBvcnRlZCcsXG59XG5cbmNvbnN0IE1FVFJJQ19OQU1FX0JZX1NUQVRVU19BTkRfR1JBSU46IHsgcmVhZG9ubHkgW3N0YXR1cyBpbiBQZXJMYW5ndWFnZVN0YXR1c106IHsgcmVhZG9ubHkgW2dyYWluIGluIEdyYWluXTogTWV0cmljTmFtZSB9IH0gPSB7XG4gIFtQZXJMYW5ndWFnZVN0YXR1cy5NSVNTSU5HXToge1xuICAgIFtHcmFpbi5QQUNLQUdFU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX01JU1NJTkdfUEFDS0FHRVMsXG4gICAgW0dyYWluLlBBQ0tBR0VfTUFKT1JfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9NSVNTSU5HX01BSk9SUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9WRVJTSU9OU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX01JU1NJTkdfVkVSU0lPTlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTl9TVUJNT0RVTEVTXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfTUlTU0lOR19TVUJNT0RVTEVTLFxuICB9LFxuICBbUGVyTGFuZ3VhZ2VTdGF0dXMuVU5TVVBQT1JURURdOiB7XG4gICAgW0dyYWluLlBBQ0tBR0VTXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfVU5TVVBQT1JURURfUEFDS0FHRVMsXG4gICAgW0dyYWluLlBBQ0tBR0VfTUFKT1JfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9VTlNVUFBPUlRFRF9NQUpPUlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9VTlNVUFBPUlRFRF9WRVJTSU9OUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9WRVJTSU9OX1NVQk1PRFVMRVNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9VTlNVUFBPUlRFRF9TVUJNT0RVTEVTLFxuICB9LFxuICBbUGVyTGFuZ3VhZ2VTdGF0dXMuU1VQUE9SVEVEXToge1xuICAgIFtHcmFpbi5QQUNLQUdFU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX1NVUFBPUlRFRF9QQUNLQUdFUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9NQUpPUl9WRVJTSU9OU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX1NVUFBPUlRFRF9NQUpPUlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9TVVBQT1JURURfVkVSU0lPTlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTl9TVUJNT0RVTEVTXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfU1VQUE9SVEVEX1NVQk1PRFVMRVMsXG4gIH0sXG4gIFtQZXJMYW5ndWFnZVN0YXR1cy5DT1JSVVBUX0FTU0VNQkxZXToge1xuICAgIFtHcmFpbi5QQUNLQUdFU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX0NPUlJVUFRfQVNTRU1CTFlfUEFDS0FHRVMsXG4gICAgW0dyYWluLlBBQ0tBR0VfTUFKT1JfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9DT1JSVVBUX0FTU0VNQkxZX01BSk9SUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9WRVJTSU9OU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX0NPUlJVUFRfQVNTRU1CTFlfVkVSU0lPTlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTl9TVUJNT0RVTEVTXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfQ09SUlVQVF9BU1NFTUJMWV9TVUJNT0RVTEVTLFxuICB9LFxufTtcblxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm92aWRlZCBsYW5ndWFnZS4gQSBcIk1JU1NJTkdcIiBzdGF0dXNcbiAqIHdpbGwgYmUgaWdub3JlZCBpZiBhbm90aGVyIHN0YXR1cyB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZVxuICogZW50aXR5LiBBbiBcIlVOU1VQUE9SVEVEXCIgc3RhdHVzIHdpbGwgYmUgaWdub3JlZCBpZiBhIFwiU1VQUE9SVEVEXCIgc3RhdHVzXG4gKiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZSBlbnRpdHkuXG4gKlxuICogSWYgYSBzdWJtb2R1bGUgaXMgcHJvdmlkZWQsIG9ubHkgdGhhdCBzdWJtb2R1bGUncyBhdmFpbGFiaWxpdHkgaXMgdXBkYXRlZC5cbiAqL1xuZnVuY3Rpb24gZG9SZWNvcmRQZXJMYW5ndWFnZShcbiAgcGVyTGFuZ3VhZ2U6IE1hcDxEb2N1bWVudGF0aW9uTGFuZ3VhZ2UsIFBlckxhbmd1YWdlRGF0YT4sXG4gIGxhbmd1YWdlOiBEb2N1bWVudGF0aW9uTGFuZ3VhZ2UsXG4gIHN0YXR1czogUGVyTGFuZ3VhZ2VTdGF0dXMsXG4gIHBrZ05hbWU6IHN0cmluZyxcbiAgcGtnTWFqb3I6IHN0cmluZyxcbiAgcGtnVmVyc2lvbjogc3RyaW5nLFxuICBzdWJtb2R1bGU/OiBzdHJpbmcsXG4pIHtcbiAgaWYgKCFwZXJMYW5ndWFnZS5oYXMobGFuZ3VhZ2UpKSB7XG4gICAgcGVyTGFuZ3VhZ2Uuc2V0KGxhbmd1YWdlLCB7XG4gICAgICBbR3JhaW4uUEFDS0FHRV9NQUpPUl9WRVJTSU9OU106IG5ldyBNYXAoKSxcbiAgICAgIFtHcmFpbi5QQUNLQUdFU106IG5ldyBNYXAoKSxcbiAgICAgIFtHcmFpbi5QQUNLQUdFX1ZFUlNJT05fU1VCTU9EVUxFU106IG5ldyBNYXAoKSxcbiAgICAgIFtHcmFpbi5QQUNLQUdFX1ZFUlNJT05TXTogbmV3IE1hcCgpLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBwZXJMYW5ndWFnZS5nZXQobGFuZ3VhZ2UpITtcblxuICAvLyBJZiB0aGVyZSBpcyBhIHN1Ym1vZHVsZSwgb25seSB1cGRhdGUgdGhlIHN1Ym1vZHVsZSBkb21haW4uXG4gIGNvbnN0IG91dHB1dERvbWFpbnM6IHJlYWRvbmx5IFtNYXA8c3RyaW5nLCBQZXJMYW5ndWFnZVN0YXR1cz4sIHN0cmluZ11bXSA9XG4gICAgc3VibW9kdWxlXG4gICAgICA/IFtcbiAgICAgICAgW2RhdGFbR3JhaW4uUEFDS0FHRV9WRVJTSU9OX1NVQk1PRFVMRVNdLCBgJHtwa2dWZXJzaW9ufS4ke3N1Ym1vZHVsZX1gXSxcbiAgICAgIF1cbiAgICAgIDogW1xuICAgICAgICBbZGF0YVtHcmFpbi5QQUNLQUdFX01BSk9SX1ZFUlNJT05TXSwgcGtnTWFqb3JdLFxuICAgICAgICBbZGF0YVtHcmFpbi5QQUNLQUdFX1ZFUlNJT05TXSwgcGtnVmVyc2lvbl0sXG4gICAgICAgIFtkYXRhW0dyYWluLlBBQ0tBR0VTXSwgcGtnTmFtZV0sXG4gICAgICBdO1xuICBmb3IgKGNvbnN0IFttYXAsIG5hbWVdIG9mIG91dHB1dERvbWFpbnMpIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSBQZXJMYW5ndWFnZVN0YXR1cy5NSVNTSU5HOlxuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdGF0dXMsIGRvbid0IG92ZXJyaWRlIGl0IHdpdGggXCJNSVNTSU5HXCIuXG4gICAgICAgIGlmICghbWFwLmhhcyhuYW1lKSkge1xuICAgICAgICAgIG1hcC5zZXQobmFtZSwgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGVyTGFuZ3VhZ2VTdGF0dXMuU1VQUE9SVEVEOlxuICAgICAgICAvLyBJZiB0aHIgcGFja2FnZSBpcyBcInN1cHBvcnRlZFwiLCB0aGlzIGFsd2F5cyBcIndpbnNcIlxuICAgICAgICBtYXAuc2V0KG5hbWUsIHN0YXR1cyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQZXJMYW5ndWFnZVN0YXR1cy5VTlNVUFBPUlRFRDpcbiAgICAgIGNhc2UgUGVyTGFuZ3VhZ2VTdGF0dXMuQ09SUlVQVF9BU1NFTUJMWTpcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgc3RhdHVzLCBvbmx5IG92ZXJyaWRlIHdpdGggaWYgaXQgd2FzIFwiTUlTU0lOR1wiLlxuICAgICAgICBpZiAoIW1hcC5oYXMobmFtZSkgfHwgbWFwLmdldChuYW1lKSA9PT0gUGVyTGFuZ3VhZ2VTdGF0dXMuTUlTU0lORykge1xuICAgICAgICAgIG1hcC5zZXQobmFtZSwgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
397
+ /**
398
+ * Replacer that can be used in JSON.stringify to automatically turn objects back into maps
399
+ * and arrays back into sets where appropriate.
400
+ */
401
+ function safeReplacer(_key, value) {
402
+ if (value instanceof Map) {
403
+ return {
404
+ _type: 'Map',
405
+ value: Array.from(value.entries()),
406
+ };
407
+ }
408
+ else if (value instanceof Set) {
409
+ return {
410
+ _type: 'Set',
411
+ value: Array.from([...value]),
412
+ };
413
+ }
414
+ else {
415
+ return value;
416
+ }
417
+ }
418
+ function safeReviver(_key, value) {
419
+ if (typeof value === 'object' && value !== null) {
420
+ if (value._type === 'Map') {
421
+ return new Map(value.value);
422
+ }
423
+ if (value._type === 'Set') {
424
+ return new Set(value.value);
425
+ }
426
+ }
427
+ return value;
428
+ }
429
+ function serialize(value) {
430
+ return JSON.stringify(value, safeReplacer, 2);
431
+ }
432
+ exports.serialize = serialize;
433
+ function deserialize(value) {
434
+ return JSON.parse(value, safeReviver);
435
+ }
436
+ exports.deserialize = deserialize;
437
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuYXJ5LmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kL2ludmVudG9yeS9jYW5hcnkubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFrQztBQUNsQywrREFBd0U7QUFHeEUsbUNBQWdDO0FBQ2hDLG1EQUFtRDtBQUNuRCw2RkFBMkU7QUFDM0UsaURBQWlEO0FBQ2pELG1FQUF5RDtBQUN6RCxpREFBMkQ7QUFDM0QsMkNBQWdGO0FBRWhGLG9DQUFhLENBQUMsU0FBUyxHQUFHLDZCQUFpQixDQUFDO0FBRXJDLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBMkIsRUFBRSxPQUFnQjs7SUFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEQsTUFBTSxpQkFBaUIsR0FBRyw4QkFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFFaEUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLHFCQUFxQjtRQUN6SCxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDO1FBQ2pELENBQUMsQ0FBQztZQUNBLGlCQUFpQixFQUFFLFNBQVM7WUFDNUIsZUFBZSxFQUFFLElBQUksR0FBRyxFQUFnQztZQUN4RCxZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQVU7WUFDL0Isb0JBQW9CLEVBQUUsSUFBSSxHQUFHLEVBQVU7WUFDdkMsV0FBVyxFQUFFLElBQUksR0FBRyxFQUEyQjtTQUNoRCxDQUFDO0lBRUosS0FBSyxVQUFVLFlBQVksQ0FBQyxxQkFBNkI7UUFFdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1FBQ3pGLElBQUksRUFB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QUU7WUFDekIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FBSSxLQUFRO0lBQ25DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBa0IsQ0FBQztBQUNqRSxDQUFDO0FBRkQsOEJBRUM7QUFFRCxTQUFnQixXQUFXLENBQUksS0FBb0I7SUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRkQsa0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBndW56aXBTeW5jIH0gZnJvbSAnemxpYic7XG5pbXBvcnQgeyBtZXRyaWNTY29wZSwgQ29uZmlndXJhdGlvbiwgVW5pdCB9IGZyb20gJ2F3cy1lbWJlZGRlZC1tZXRyaWNzJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgUHJvbWlzZVJlc3VsdCB9IGZyb20gJ2F3cy1zZGsvbGliL3JlcXVlc3QnO1xuaW1wb3J0IHsgU2VtVmVyIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCAqIGFzIGF3cyBmcm9tICcuLi9zaGFyZWQvYXdzLmxhbWJkYS1zaGFyZWQnO1xuaW1wb3J0IHsgY29tcHJlc3NDb250ZW50IH0gZnJvbSAnLi4vc2hhcmVkL2NvbXByZXNzLWNvbnRlbnQubGFtYmRhLXNoYXJlZCc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vc2hhcmVkL2NvbnN0YW50cyc7XG5pbXBvcnQgeyByZXF1aXJlRW52IH0gZnJvbSAnLi4vc2hhcmVkL2Vudi5sYW1iZGEtc2hhcmVkJztcbmltcG9ydCB7IERvY3VtZW50YXRpb25MYW5ndWFnZSB9IGZyb20gJy4uL3NoYXJlZC9sYW5ndWFnZSc7XG5pbXBvcnQgeyBNRVRSSUNTX05BTUVTUEFDRSwgTWV0cmljTmFtZSwgTEFOR1VBR0VfRElNRU5TSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5Db25maWd1cmF0aW9uLm5hbWVzcGFjZSA9IE1FVFJJQ1NfTkFNRVNQQUNFO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogSW52ZW50b3J5Q2FuYXJ5RXZlbnQsIGNvbnRleHQ6IENvbnRleHQpIHtcbiAgY29uc29sZS5sb2coJ0V2ZW50OicsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG5cbiAgY29uc3Qgc2NyYXRjaHdvcmtCdWNrZXQgPSByZXF1aXJlRW52KCdTQ1JBVENIV09SS19CVUNLRVRfTkFNRScpO1xuXG4gIGNvbnN0IHsgY29udGludWF0aW9uVG9rZW4sIGluZGV4ZWRQYWNrYWdlcywgcGFja2FnZU5hbWVzLCBwYWNrYWdlTWFqb3JWZXJzaW9ucywgcGVyTGFuZ3VhZ2UgfSA9IGV2ZW50LmNvbnRpbnVhdGlvbk9iamVjdEtleVxuICAgID8gYXdhaXQgbG9hZFByb2dyZXNzKGV2ZW50LmNvbnRpbnVhdGlvbk9iamVjdEtleSlcbiAgICA6IHtcbiAgICAgIGNvbnRpbnVhdGlvblRva2VuOiB1bmRlZmluZWQsXG4gICAgICBpbmRleGVkUGFja2FnZXM6IG5ldyBNYXA8c3RyaW5nLCBJbmRleGVkUGFja2FnZVN0YXR1cz4oKSxcbiAgICAgIHBhY2thZ2VOYW1lczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBwYWNrYWdlTWFqb3JWZXJzaW9uczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBwZXJMYW5ndWFnZTogbmV3IE1hcDxzdHJpbmcsIFBlckxhbmd1YWdlRGF0YT4oKSxcbiAgICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQcm9ncmVzcyhjb250aW51YXRpb25PYmplY3RLZXk6IHN0cmluZykge1xuXG4gICAgY29uc29sZS5sb2coJ0ZvdW5kIGEgY29udGludWF0aW9uIG9iamVjdCBrZXksIHJldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBleGlzdGluZyBydW4uLi4nKTtcbiAgICBsZXQgeyBCb2R5LCBDb250ZW50RW5jb2RpbmcgfSA9IGF3YWl0IGF3cy5zMygpLmdldE9iamVjdCh7XG4gICAgICBCdWNrZXQ6IHNjcmF0Y2h3b3JrQnVja2V0LFxuICAgICAgS2V5OiBjb250aW51YXRpb25PYmplY3RLZXksXG4gICAgfSkucHJvbWlzZSgpO1xuICAgIC8vIElmIGl0IHdhcyBjb21wcmVzc2VkLCBkZWNvbXByZXNzIGl0LlxuICAgIGlmIChDb250ZW50RW5jb2RpbmcgPT09ICdnemlwJykge1xuICAgICAgQm9keSA9IGd1bnppcFN5bmMoQnVmZmVyLmZyb20oQm9keSEgYXMgYW55KSk7XG4gICAgfVxuICAgIGlmICghQm9keSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPYmplY3Qga2V5IFwiJHtldmVudC5jb250aW51YXRpb25PYmplY3RLZXl9XCIgbm90IGZvdW5kIGluIGJ1Y2tldCBcIiR7c2NyYXRjaHdvcmtCdWNrZXR9XCIuYCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdEZXNlcmlhbGl6aW5nIGRhdGEuLi4nKTtcbiAgICBjb25zdCBzZXJpYWxpemVkU3RhdGUgPSBCb2R5LnRvU3RyaW5nKCd1dGYtOCcpIGFzIFNlcmlhbGl6ZWQ8SW52ZW50b3J5Q2FuYXJ5U3RhdGU+O1xuICAgIGNvbnN0IHN0YXRlID0gZGVzZXJpYWxpemUoc2VyaWFsaXplZFN0YXRlKTtcbiAgICBjb25zb2xlLmxvZygnRGVzZXJpYWxpemluZyBmaW5pc2hlZC4nKTtcbiAgICByZXR1cm4gc3RhdGU7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoZSBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyIHBhY2thZ2UsIHBhY2thZ2UgbWFqb3IgdmVyc2lvbiwgcGFja2FnZVxuICAgKiB2ZXJzaW9uLCBhbmQgcGFja2FnZSB2ZXJzaW9uIHN1Ym1vZHVsZSBpbiB0aGUgcGVyLWxhbmd1YWdlIHN0YXRlIHN0b3JhZ2UuXG4gICAqIFdoZW5ldmVyIGEgbmV3IGVudHJ5IGlzIGFkZGVkLCBhIGBNSVNTSU5HYCBlbnRyeSBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkXG4gICAqIGZvciB0aGUgb3RoZXIgbGFuZ3VhZ2VzICh1bmxlc3MgYW5vdGhlciBlbnRyeSBhbHJlYWR5IGV4aXN0cykuXG4gICAqXG4gICAqIElmIGEgc3VibW9kdWxlIGlzIHByb3ZpZGVkLCBvbmx5IHRoYXQgc3VibW9kdWxlJ3MgYXZhaWxhYmlsaXR5IGlzIHVwZGF0ZWQuXG4gICAqL1xuICBmdW5jdGlvbiByZWNvcmRQZXJMYW5ndWFnZShcbiAgICBsYW5ndWFnZTogRG9jdW1lbnRhdGlvbkxhbmd1YWdlLFxuICAgIHN0YXR1czogRG9jdW1lbnRhdGlvblN0YXR1cyxcbiAgICBwa2dOYW1lOiBzdHJpbmcsXG4gICAgcGtnTWFqb3I6IHN0cmluZyxcbiAgICBwa2dWZXJzaW9uOiBzdHJpbmcsXG4gICAgc3VibW9kdWxlPzogc3RyaW5nLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IGxhbmcgb2YgRG9jdW1lbnRhdGlvbkxhbmd1YWdlLkFMTCkge1xuICAgICAgZG9SZWNvcmRQZXJMYW5ndWFnZShcbiAgICAgICAgcGVyTGFuZ3VhZ2UsXG4gICAgICAgIGxhbmcsXG4gICAgICAgIC8vIElmIHRoZSBsYW5ndWFnZSBpcyBOT1QgdGhlIHJlZ2lzdGVyZWQgb25lLCB0aGVuIHdlIGluc2VydCBcIk1JU1NJTkdcIi5cbiAgICAgICAgbGFuZyA9PT0gbGFuZ3VhZ2UgPyBzdGF0dXMgOiBEb2N1bWVudGF0aW9uU3RhdHVzLk1JU1NJTkcsXG4gICAgICAgIHBrZ05hbWUsXG4gICAgICAgIHBrZ01ham9yLFxuICAgICAgICBwa2dWZXJzaW9uLFxuICAgICAgICBzdWJtb2R1bGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVQcm9ncmVzcyhsYXRlc3RDb250aW51YXRpb25Ub2tlbjogc3RyaW5nKTogUHJvbWlzZTxJbnZlbnRvcnlDYW5hcnlFdmVudD4ge1xuICAgIGNvbnNvbGUubG9nKCdTZXJpYWxpemluZyBkYXRhLi4uJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFN0YXRlOiBTZXJpYWxpemVkPEludmVudG9yeUNhbmFyeVN0YXRlPiA9IHNlcmlhbGl6ZSh7XG4gICAgICBjb250aW51YXRpb25Ub2tlbjogbGF0ZXN0Q29udGludWF0aW9uVG9rZW4sXG4gICAgICBwYWNrYWdlTmFtZXMsXG4gICAgICBwYWNrYWdlTWFqb3JWZXJzaW9ucyxcbiAgICAgIGluZGV4ZWRQYWNrYWdlcyxcbiAgICAgIHBlckxhbmd1YWdlLFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCdTZXJpYWxpemluZyBmaW5pc2hlZC4nKTtcblxuICAgIGNvbnN0IHsgYnVmZmVyLCBjb250ZW50RW5jb2RpbmcgfSA9IGNvbXByZXNzQ29udGVudChCdWZmZXIuZnJvbShzZXJpYWxpemVkU3RhdGUpKTtcblxuICAgIGNvbnN0IGtleU5hbWUgPSBgaW52ZW50b3J5LWNhbmFyeS1wcm9ncmVzcy0ke0RhdGUubm93KCl9YDtcbiAgICBhd2FpdCBhd3MuczMoKVxuICAgICAgLnB1dE9iamVjdCh7XG4gICAgICAgIEJ1Y2tldDogc2NyYXRjaHdvcmtCdWNrZXQsXG4gICAgICAgIEtleToga2V5TmFtZSxcbiAgICAgICAgQm9keTogYnVmZmVyLFxuICAgICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBDb250ZW50RW5jb2Rpbmc6IGNvbnRlbnRFbmNvZGluZyxcbiAgICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgICAnTGFtYmRhLUxvZy1Hcm91cCc6IGNvbnRleHQubG9nR3JvdXBOYW1lLFxuICAgICAgICAgICdMYW1iZGEtTG9nLVN0cmVhbSc6IGNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICAgICAgICAnTGFtYmRhLVJ1bi1JZCc6IGNvbnRleHQuYXdzUmVxdWVzdElkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5wcm9taXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRpbnVhdGlvbk9iamVjdEtleToga2V5TmFtZSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIG1heGltdW0gdGltZSB0aGUgaGFuZGxlciBuZWVkcyB0byBjcmVhdGUgbWV0cmljcyBhbmQgdXBsb2FkXG4gIC8vIHJlcG9ydHMgb25jZSBpdCdzIGRvbmUgcHJvY2Vzc2luZyBhbGwgUzMgb2JqZWN0IGtleXMuXG4gIGNvbnN0IG1heE1ldHJpY1Byb2Nlc3NpbmdUaW1lID0gNjBfMDAwO1xuXG4gIGNvbnN0IHBhY2thZ2VEYXRhQnVja2V0ID0gcmVxdWlyZUVudignUEFDS0FHRV9EQVRBX0JVQ0tFVF9OQU1FJyk7XG5cbiAgZm9yIGF3YWl0IChjb25zdCBba2V5cywgbGF0ZXN0Q29udGludWF0aW9uVG9rZW5dIG9mIHJlbGV2YW50T2JqZWN0S2V5cyhwYWNrYWdlRGF0YUJ1Y2tldCwgY29udGludWF0aW9uVG9rZW4pKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuXG4gICAgICBjb25zdCBbLCBuYW1lLCB2ZXJzaW9uXSA9IGNvbnN0YW50cy5TVE9SQUdFX0tFWV9GT1JNQVRfUkVHRVguZXhlYyhrZXkpITtcblxuICAgICAgcGFja2FnZU5hbWVzLmFkZChuYW1lKTtcbiAgICAgIGNvbnN0IG1ham9yVmVyc2lvbiA9IGAke25hbWV9QCR7bmV3IFNlbVZlcih2ZXJzaW9uKS5tYWpvcn1gO1xuICAgICAgcGFja2FnZU1ham9yVmVyc2lvbnMuYWRkKG1ham9yVmVyc2lvbik7XG5cbiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gYCR7bmFtZX1AJHt2ZXJzaW9ufWA7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgcGFja2FnZSBpcyBmdWxseSByZWdpc3RlcmVkIGZvciBwZXItbGFuZ3VhZ2Ugc3RhdHVzLCBldmVuIGlmIG5vIGRvYyBleGlzdHMgeWV0LlxuICAgICAgZm9yIChjb25zdCBsYW5ndWFnZSBvZiBEb2N1bWVudGF0aW9uTGFuZ3VhZ2UuQUxMKSB7XG4gICAgICAgIHJlY29yZFBlckxhbmd1YWdlKGxhbmd1YWdlLCBEb2N1bWVudGF0aW9uU3RhdHVzLk1JU1NJTkcsIG5hbWUsIG1ham9yVmVyc2lvbiwgZnVsbE5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluZGV4ZWRQYWNrYWdlcy5oYXMoZnVsbE5hbWUpKSB7XG4gICAgICAgIGluZGV4ZWRQYWNrYWdlcy5zZXQoZnVsbE5hbWUsIHt9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGluZGV4ZWRQYWNrYWdlcy5nZXQoZnVsbE5hbWUpITtcblxuICAgICAgaWYgKGtleS5lbmRzV2l0aChjb25zdGFudHMuTUVUQURBVEFfS0VZX1NVRkZJWCkpIHtcbiAgICAgICAgc3RhdHVzLm1ldGFkYXRhUHJlc2VudCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChjb25zdGFudHMuUEFDS0FHRV9LRVlfU1VGRklYKSkge1xuICAgICAgICBzdGF0dXMudGFyYmFsbFByZXNlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLkFTU0VNQkxZX0tFWV9TVUZGSVgpKSB7XG4gICAgICAgIHN0YXR1cy5hc3NlbWJseVByZXNlbnQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLlVOSU5TVEFMTEFCTEVfUEFDS0FHRV9TVUZGSVgpKSB7XG4gICAgICAgIHN0YXR1cy51bmluc3RhbGxhYmxlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBpZGVudGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgbGFuZ3VhZ2Ugb2YgRG9jdW1lbnRhdGlvbkxhbmd1YWdlLkFMTCkge1xuICAgICAgICAgIGNvbnN0IG1hdGNoSnNvbiA9IHN1Ym1vZHVsZUtleVJlZ2V4cChsYW5ndWFnZSwgJ2pzb24nKS5leGVjKGtleSk7XG4gICAgICAgICAgY29uc3QgbWF0Y2hNZCA9IHN1Ym1vZHVsZUtleVJlZ2V4cChsYW5ndWFnZSwgJ21kJykuZXhlYyhrZXkpO1xuICAgICAgICAgIGlmIChtYXRjaEpzb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgWywgc3VibW9kdWxlLCBpc1Vuc3VwcG9ydGVkXSA9IG1hdGNoSnNvbjtcbiAgICAgICAgICAgIGlmIChzdGF0dXMuc3VibW9kdWxlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN0YXR1cy5zdWJtb2R1bGVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdHVzLnN1Ym1vZHVsZXMuYWRkKGAke2Z1bGxOYW1lfS4ke3N1Ym1vZHVsZX1gKTtcbiAgICAgICAgICAgIHJlY29yZFBlckxhbmd1YWdlKFxuICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgaXNVbnN1cHBvcnRlZCA/IERvY3VtZW50YXRpb25TdGF0dXMuVU5TVVBQT1JURUQgOiBEb2N1bWVudGF0aW9uU3RhdHVzLlNVUFBPUlRFRCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgbWFqb3JWZXJzaW9uLFxuICAgICAgICAgICAgICBmdWxsTmFtZSxcbiAgICAgICAgICAgICAgc3VibW9kdWxlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKGNvbnN0YW50cy5kb2NzS2V5U3VmZml4KGxhbmd1YWdlLCB1bmRlZmluZWQsICdqc29uJykpKSB7XG4gICAgICAgICAgICByZWNvcmRQZXJMYW5ndWFnZShsYW5ndWFnZSwgRG9jdW1lbnRhdGlvblN0YXR1cy5TVVBQT1JURUQsIG5hbWUsIG1ham9yVmVyc2lvbiwgZnVsbE5hbWUpO1xuICAgICAgICAgICAgaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLm5vdFN1cHBvcnRlZEtleVN1ZmZpeChsYW5ndWFnZSwgdW5kZWZpbmVkLCAnanNvbicpKSkge1xuICAgICAgICAgICAgcmVjb3JkUGVyTGFuZ3VhZ2UobGFuZ3VhZ2UsIERvY3VtZW50YXRpb25TdGF0dXMuVU5TVVBQT1JURUQsIG5hbWUsIG1ham9yVmVyc2lvbiwgZnVsbE5hbWUpO1xuICAgICAgICAgICAgaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLmNvcnJ1cHRBc3NlbWJseUtleVN1ZmZpeChsYW5ndWFnZSwgdW5kZWZpbmVkLCAnanNvbicpKSkge1xuICAgICAgICAgICAgcmVjb3JkUGVyTGFuZ3VhZ2UobGFuZ3VhZ2UsIERvY3VtZW50YXRpb25TdGF0dXMuQ09SUlVQVF9BU1NFTUJMWSwgbmFtZSwgbWFqb3JWZXJzaW9uLCBmdWxsTmFtZSk7XG4gICAgICAgICAgICBpZGVudGlmaWVkID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBnZW5lcmF0ZSBib3RoIEpTT04gZmlsZXMgYW5kIG1hcmtkb3duIGZpbGVzLCBzbyBmb3Igbm93XG4gICAgICAgICAgICAvLyB3ZSByZWNvcmQgSlNPTiBmaWxlcyBhcyB0aGUgc291cmNlIG9mIHRydXRoLCBidXQgc3RpbGwgaWRlbnRpZnlcbiAgICAgICAgICAgIC8vIG1hcmtkb3duIGZpbGVzIHNvIHRoZXkgYXJlIG5vdCBjb3VudGVkIGFzIHVua25vd24uXG4gICAgICAgICAgfSBlbHNlIGlmIChtYXRjaE1kICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKGNvbnN0YW50cy5kb2NzS2V5U3VmZml4KGxhbmd1YWdlLCB1bmRlZmluZWQsICdtZCcpKSkge1xuICAgICAgICAgICAgaWRlbnRpZmllZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoY29uc3RhbnRzLm5vdFN1cHBvcnRlZEtleVN1ZmZpeChsYW5ndWFnZSwgdW5kZWZpbmVkLCAnbWQnKSkpIHtcbiAgICAgICAgICAgIGlkZW50aWZpZWQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKGNvbnN0YW50cy5jb3JydXB0QXNzZW1ibHlLZXlTdWZmaXgobGFuZ3VhZ2UsIHVuZGVmaW5lZCwgJ21kJykpKSB7XG4gICAgICAgICAgICBpZGVudGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpZGVudGlmaWVkKSB7XG4gICAgICAgICAgc3RhdHVzLnVua25vd25PYmplY3RzID0gc3RhdHVzLnVua25vd25PYmplY3RzID8/IFtdO1xuICAgICAgICAgIHN0YXR1cy51bmtub3duT2JqZWN0cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGF0ZXN0Q29udGludWF0aW9uVG9rZW4gJiYgY29udGV4dC5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMoKSA8PSBtYXhNZXRyaWNQcm9jZXNzaW5nVGltZSkge1xuICAgICAgY29uc29sZS5sb2coJ1J1bm5pbmcgdXAgdG8gdGhlIExhbWJkYSB0aW1lIGxpbWl0IGFuZCB0aGVyZSBhcmUgc3RpbGwgaXRlbXMgdG8gcHJvY2Vzcy4gU2F2aW5nIG91ciBjdXJyZW50IHByb2dyZXNzLi4uJyk7XG4gICAgICByZXR1cm4gc2F2ZVByb2dyZXNzKGxhdGVzdENvbnRpbnVhdGlvblRva2VuKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXBvcnRzOiBQcm9taXNlPFByb21pc2VSZXN1bHQ8QVdTLlMzLlB1dE9iamVjdE91dHB1dCwgQVdTLkFXU0Vycm9yPj5bXSA9IFtdO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlcG9ydChyZXBvcnRLZXk6IHN0cmluZywgcGFja2FnZVZlcnNpb25zOiBzdHJpbmdbXSkge1xuXG4gICAgY29uc3QgcmVwb3J0ID0gSlNPTi5zdHJpbmdpZnkocGFja2FnZVZlcnNpb25zLCBudWxsLCAyKTtcbiAgICBjb25zdCB7IGJ1ZmZlciwgY29udGVudEVuY29kaW5nIH0gPSBjb21wcmVzc0NvbnRlbnQoQnVmZmVyLmZyb20ocmVwb3J0KSk7XG4gICAgY29uc29sZS5sb2coYFVwbG9hZGluZyBsaXN0IHRvIHMzOi8vJHtwYWNrYWdlRGF0YUJ1Y2tldH0vJHtyZXBvcnRLZXl9YCk7XG4gICAgcmVwb3J0cy5wdXNoKGF3cy5zMygpLnB1dE9iamVjdCh7XG4gICAgICBCb2R5OiBidWZmZXIsXG4gICAgICBCdWNrZXQ6IHBhY2thZ2VEYXRhQnVja2V0LFxuICAgICAgQ29udGVudEVuY29kaW5nOiBjb250ZW50RW5jb2RpbmcsXG4gICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgRXhwaXJlczogbmV3IERhdGUoRGF0ZS5ub3coKSArIDMwMF8wMDApLCAvLyA1IG1pbnV0ZXMgZnJvbSBub3dcbiAgICAgIEtleTogcmVwb3J0S2V5LFxuICAgICAgTWV0YWRhdGE6IHtcbiAgICAgICAgJ0xhbWJkYS1SdW4tSWQnOiBjb250ZXh0LmF3c1JlcXVlc3RJZCxcbiAgICAgICAgJ0xhbWJkYS1Mb2ctR3JvdXAtTmFtZSc6IGNvbnRleHQubG9nR3JvdXBOYW1lLFxuICAgICAgICAnTGFtYmRhLUxvZy1TdHJlYW0tTmFtZSc6IGNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICAgIH0sXG4gICAgfSkucHJvbWlzZSgpKTtcblxuICB9XG5cbiAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+ICgpID0+IHtcbiAgICAvLyBDbGVhciBvdXQgZGVmYXVsdCBkaW1lbnNpb25zIGFzIHdlIGRvbid0IG5lZWQgdGhvc2UuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzbGFicy9hd3MtZW1iZWRkZWQtbWV0cmljcy1ub2RlL2lzc3Vlcy83My5cbiAgICBtZXRyaWNzLnNldERpbWVuc2lvbnMoKTtcblxuICAgIGNvbnN0IG1pc3NpbmdNZXRhZGF0YSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgY29uc3QgbWlzc2luZ0Fzc2VtYmx5ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBjb25zdCBtaXNzaW5nVGFyYmFsbCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgY29uc3QgdW5pbnN0YWxsYWJsZSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgY29uc3QgdW5rbm93bk9iamVjdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGNvbnN0IHN1Ym1vZHVsZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHN0YXR1c10gb2YgaW5kZXhlZFBhY2thZ2VzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFzdGF0dXMubWV0YWRhdGFQcmVzZW50KSB7XG4gICAgICAgIG1pc3NpbmdNZXRhZGF0YS5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdGF0dXMuYXNzZW1ibHlQcmVzZW50KSB7XG4gICAgICAgIG1pc3NpbmdBc3NlbWJseS5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdGF0dXMudGFyYmFsbFByZXNlbnQpIHtcbiAgICAgICAgbWlzc2luZ1RhcmJhbGwucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0dXMudW5pbnN0YWxsYWJsZSkge1xuICAgICAgICB1bmluc3RhbGxhYmxlLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdHVzLnVua25vd25PYmplY3RzPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgICAgdW5rbm93bk9iamVjdHMucHVzaCguLi5zdGF0dXMudW5rbm93bk9iamVjdHMhKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBzdWJtb2R1bGUgb2Ygc3RhdHVzLnN1Ym1vZHVsZXMgPz8gW10pIHtcbiAgICAgICAgc3VibW9kdWxlcy5wdXNoKHN1Ym1vZHVsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWV0cmljcy5zZXRQcm9wZXJ0eSgnZGV0YWlsJywgeyBtaXNzaW5nTWV0YWRhdGEsIG1pc3NpbmdBc3NlbWJseSwgbWlzc2luZ1RhcmJhbGwsIHVua25vd25PYmplY3RzIH0pO1xuXG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5VTklOU1RBTExBQkxFX1BBQ0tBR0VfQ09VTlQsIHVuaW5zdGFsbGFibGUubGVuZ3RoLCBVbml0LkNvdW50KTtcbiAgICBtZXRyaWNzLnB1dE1ldHJpYyhNZXRyaWNOYW1lLk1JU1NJTkdfTUVUQURBVEFfQ09VTlQsIG1pc3NpbmdNZXRhZGF0YS5sZW5ndGgsIFVuaXQuQ291bnQpO1xuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuTUlTU0lOR19BU1NFTUJMWV9DT1VOVCwgbWlzc2luZ0Fzc2VtYmx5Lmxlbmd0aCwgVW5pdC5Db3VudCk7XG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5NSVNTSU5HX1RBUkJBTExfQ09VTlQsIG1pc3NpbmdUYXJiYWxsLmxlbmd0aCwgVW5pdC5Db3VudCk7XG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5QQUNLQUdFX0NPVU5ULCBwYWNrYWdlTmFtZXMuc2l6ZSwgVW5pdC5Db3VudCk7XG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5QQUNLQUdFX01BSk9SX0NPVU5ULCBwYWNrYWdlTWFqb3JWZXJzaW9ucy5zaXplLCBVbml0LkNvdW50KTtcbiAgICBtZXRyaWNzLnB1dE1ldHJpYyhNZXRyaWNOYW1lLlBBQ0tBR0VfVkVSU0lPTl9DT1VOVCwgaW5kZXhlZFBhY2thZ2VzLnNpemUsIFVuaXQuQ291bnQpO1xuICAgIG1ldHJpY3MucHV0TWV0cmljKE1ldHJpY05hbWUuU1VCTU9EVUxFX0NPVU5ULCBzdWJtb2R1bGVzLmxlbmd0aCwgVW5pdC5Db3VudCk7XG4gICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5VTktOT1dOX09CSkVDVF9DT1VOVCwgdW5rbm93bk9iamVjdHMubGVuZ3RoLCBVbml0LkNvdW50KTtcblxuICAgIGNyZWF0ZVJlcG9ydChjb25zdGFudHMuVU5JTlNUQUxMQUJMRV9QQUNLQUdFU19SRVBPUlQsIHVuaW5zdGFsbGFibGUpO1xuXG4gIH0pKCk7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBBcnJheS5mcm9tKHBlckxhbmd1YWdlLmVudHJpZXMoKSkpIHtcbiAgICBhd2FpdCBtZXRyaWNTY29wZSgobWV0cmljcykgPT4gYXN5bmMgKGxhbmd1YWdlOiBzdHJpbmcsIGRhdGE6IFBlckxhbmd1YWdlRGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coICcnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycpO1xuICAgICAgY29uc29sZS5sb2coYCMjIyBTdGFydCBvZiBkYXRhIGZvciAke2xhbmd1YWdlfWApO1xuXG4gICAgICBtZXRyaWNzLnNldERpbWVuc2lvbnMoeyBbTEFOR1VBR0VfRElNRU5TSU9OXTogbGFuZ3VhZ2UudG9TdHJpbmcoKSB9KTtcblxuICAgICAgZm9yIChjb25zdCBmb3JTdGF0dXMgb2YgW1xuICAgICAgICBEb2N1bWVudGF0aW9uU3RhdHVzLlNVUFBPUlRFRCxcbiAgICAgICAgRG9jdW1lbnRhdGlvblN0YXR1cy5VTlNVUFBPUlRFRCxcbiAgICAgICAgRG9jdW1lbnRhdGlvblN0YXR1cy5NSVNTSU5HLFxuICAgICAgICBEb2N1bWVudGF0aW9uU3RhdHVzLkNPUlJVUFRfQVNTRU1CTFksXG4gICAgICBdKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgc3RhdHVzZXNdIG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICAgICAgbGV0IGZpbHRlcmVkID0gQXJyYXkuZnJvbShzdGF0dXNlcy5lbnRyaWVzKCkpLmZpbHRlcigoWywgc3RhdHVzXSkgPT4gZm9yU3RhdHVzID09PSBzdGF0dXMpO1xuICAgICAgICAgIGxldCBtZXRyaWNOYW1lID0gTUVUUklDX05BTUVfQllfU1RBVFVTX0FORF9HUkFJTltmb3JTdGF0dXMgYXMgRG9jdW1lbnRhdGlvblN0YXR1c11ba2V5IGFzIEdyYWluXTtcblxuICAgICAgICAgIGlmICgoZm9yU3RhdHVzID09PSBEb2N1bWVudGF0aW9uU3RhdHVzLk1JU1NJTkcgJiYgbWV0cmljTmFtZSA9PT0gTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfTUlTU0lOR19WRVJTSU9OUylcbiAgICAgICAgICAgfHwgKGZvclN0YXR1cyA9PT0gRG9jdW1lbnRhdGlvblN0YXR1cy5DT1JSVVBUX0FTU0VNQkxZICYmIG1ldHJpY05hbWUgPT09IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX0NPUlJVUFRfQVNTRU1CTFlfVkVSU0lPTlMpKSB7XG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSByZXBvcnRzIGZvciBtaXNzaW5nL2NvcnJ1cHQgb25seSBmb3IgcGFja2FnZSB2ZXJzaW9ucyBncmFudWxhcml0eVxuICAgICAgICAgICAgY29uc3QgbGFuZyA9IERvY3VtZW50YXRpb25MYW5ndWFnZS5mcm9tU3RyaW5nKGxhbmd1YWdlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydEtleSA9IGZvclN0YXR1cyA9PT0gRG9jdW1lbnRhdGlvblN0YXR1cy5NSVNTSU5HID9cbiAgICAgICAgICAgICAgY29uc3RhbnRzLm1pc3NpbmdEb2N1bWVudGF0aW9uUmVwb3J0KGxhbmcpIDpcbiAgICAgICAgICAgICAgY29uc3RhbnRzLmNvcnJ1cHRBc3NlbWJseVJlcG9ydChsYW5nKTtcbiAgICAgICAgICAgIGNyZWF0ZVJlcG9ydChyZXBvcnRLZXksIGZpbHRlcmVkLm1hcCgoW25hbWVdKSA9PiBuYW1lKS5zb3J0KCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGAke2ZvclN0YXR1c30gJHtrZXl9IGZvciAke2xhbmd1YWdlfTogJHtmaWx0ZXJlZC5sZW5ndGh9IGVudHJpZXNgKTtcbiAgICAgICAgICBtZXRyaWNzLnB1dE1ldHJpYyhtZXRyaWNOYW1lLCBmaWx0ZXJlZC5sZW5ndGgsIFVuaXQuQ291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGAjIyMgRW5kIG9mIGRhdGEgZm9yICR7bGFuZ3VhZ2V9YCk7XG4gICAgICBjb25zb2xlLmxvZygnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICB9KSguLi5lbnRyeSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlcG9ydCBvZiByZXBvcnRzKSB7XG4gICAgYXdhaXQgcmVwb3J0O1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIExpc3QgYWxsIG9iamVjdHMgaW4gdGhlIGJ1Y2tldCwgeWllbGRpbmcgYmF0Y2hlcyBvZiB1cCB0byAxMDAwIGtleXMuIEFsc29cbiAqIHlpZWxkcyB0aGUgbmV4dCBjb250aW51YXRpb24gdG9rZW4gaWYgdGhlcmUgaXMgb25lLlxuICovXG5hc3luYyBmdW5jdGlvbiogcmVsZXZhbnRPYmplY3RLZXlzKGJ1Y2tldDogc3RyaW5nLCBjb250aW51YXRpb25Ub2tlbj86IHN0cmluZyk6IEFzeW5jR2VuZXJhdG9yPFtzdHJpbmdbXSwgc3RyaW5nIHwgdW5kZWZpbmVkXSwgdm9pZCwgdm9pZD4ge1xuICBjb25zdCByZXF1ZXN0OiBBV1MuUzMuTGlzdE9iamVjdHNWMlJlcXVlc3QgPSB7XG4gICAgQnVja2V0OiBidWNrZXQsXG4gICAgUHJlZml4OiBjb25zdGFudHMuU1RPUkFHRV9LRVlfUFJFRklYLFxuICB9O1xuICBpZiAoY29udGludWF0aW9uVG9rZW4pIHJlcXVlc3QuQ29udGludWF0aW9uVG9rZW4gPSBjb250aW51YXRpb25Ub2tlbjtcblxuICBkbyB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhd3MuczMoKS5saXN0T2JqZWN0c1YyKHJlcXVlc3QpLnByb21pc2UoKTtcbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgZm9yIChjb25zdCB7IEtleSB9IG9mIHJlc3BvbnNlLkNvbnRlbnRzID8/IFtdKSB7XG4gICAgICBpZiAoS2V5ID09IG51bGwpIHsgY29udGludWU7IH1cbiAgICAgIGtleXMucHVzaChLZXkpO1xuICAgIH1cbiAgICB5aWVsZCBba2V5cywgcmVzcG9uc2UuQ29udGludWF0aW9uVG9rZW5dO1xuICAgIHJlcXVlc3QuQ29udGludWF0aW9uVG9rZW4gPSByZXNwb25zZS5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gIH0gd2hpbGUgKHJlcXVlc3QuQ29udGludWF0aW9uVG9rZW4gIT0gbnVsbCk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBvYnRhaW5zIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBjYXB0dXJlIGdyb3VwIHRoYXQgYWxsb3dzXG4gKiBkZXRlcm1pbmluZyB0aGUgc3VibW9kdWxlIG5hbWUgZnJvbSBhIHN1Ym1vZHVsZSBkb2N1bWVudGF0aW9uIGtleSwgYW5kXG4gKiBhbm90aGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBvYmplY3QgaXMgYW4gXCJ1bnN1cHBvcnRlZCBiZWFjb25cIiBvciBub3QuXG4gKi9cbmZ1bmN0aW9uIHN1Ym1vZHVsZUtleVJlZ2V4cChsYW5ndWFnZTogRG9jdW1lbnRhdGlvbkxhbmd1YWdlLCBmaWxlRXh0OiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBXZSB1c2UgYSBwbGFjZWhvbGRlciB0byBiZSBhYmxlIHRvIGluc2VydCB0aGUgY2FwdHVyZSBncm91cCBvbmNlIHdlIGhhdmVcbiAgLy8gZnVsbHkgcXVvdGVkIHRoZSBrZXkgcHJlZml4IGZvciBSZWdleCBzYWZldHkuXG4gIGNvbnN0IHBsYWNlaG9sZGVyID0gJzxTVUJNT0RVTEVOQU1FPic7XG5cbiAgLy8gV2Ugb2J0YWluIHRoZSBzdGFuZGFyZCBrZXkgc3VmZml4LlxuICBjb25zdCBrZXlQcmVmaXggPSBjb25zdGFudHMuZG9jc0tleVN1ZmZpeChsYW5ndWFnZSwgcGxhY2Vob2xkZXIsIGZpbGVFeHQpO1xuXG4gIC8vIEZpbmFsbHksIGFzc2VtYmxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB0aGUgY2FwdHVyZSBncm91cC5cbiAgcmV0dXJuIG5ldyBSZWdFeHAoYC4qJHtyZVF1b3RlKGtleVByZWZpeCkucmVwbGFjZShwbGFjZWhvbGRlciwgJyguKyknKX0oJHtyZVF1b3RlKGNvbnN0YW50cy5OT1RfU1VQUE9SVEVEX1NVRkZJWCl9KT8kYCk7XG5cbiAgLyoqXG4gICAqIEVzY2FwZXMgYWxsIFwic3BlYWNpYWwgbWVhbmluZ1wiIGNoYXJhY3RlcnMgaW4gYSBzdHJpbmcsIHNvIGl0IGNhbiBiZSB1c2VkIGFzXG4gICAqIHBhcnQgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBmdW5jdGlvbiByZVF1b3RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbKyouKCk/JFtcXF1dKS9nLCAnXFxcXCQxJyk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEluZGV4ZWRQYWNrYWdlU3RhdHVzIHtcbiAgbWV0YWRhdGFQcmVzZW50PzogYm9vbGVhbjtcbiAgYXNzZW1ibHlQcmVzZW50PzogYm9vbGVhbjtcbiAgdW5pbnN0YWxsYWJsZT86IGJvb2xlYW47XG4gIHN1Ym1vZHVsZXM/OiBTZXQ8c3RyaW5nPjtcbiAgdGFyYmFsbFByZXNlbnQ/OiBib29sZWFuO1xuICB1bmtub3duT2JqZWN0cz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBHcmFpbiB7XG4gIFBBQ0tBR0VfTUFKT1JfVkVSU0lPTlMgPSAncGFja2FnZSBtYWpvciB2ZXJzaW9ucycsXG4gIFBBQ0tBR0VfVkVSU0lPTl9TVUJNT0RVTEVTID0gJ3BhY2thZ2UgdmVyc2lvbiBzdWJtb2R1bGVzJyxcbiAgUEFDS0FHRV9WRVJTSU9OUyA9ICdwYWNrYWdlIHZlcnNpb25zJyxcbiAgUEFDS0FHRVMgPSAncGFja2FnZXMnLFxufVxuXG50eXBlIFBlckxhbmd1YWdlRGF0YSA9IE1hcDxHcmFpbiwgTWFwPHN0cmluZywgRG9jdW1lbnRhdGlvblN0YXR1cz4+O1xuXG5leHBvcnQgY29uc3QgZW51bSBEb2N1bWVudGF0aW9uU3RhdHVzIHtcbiAgLyoqXG4gICAqIFRoaXMgcGFja2FnZSBpcyBtaXNzaW5nIGFueSBraW5kIG9mIGRvY3VtZW50YXRpb24gb3IgbWFya2VyIGZpbGUuXG4gICAqL1xuICBNSVNTSU5HID0gJ01pc3NpbmcnLFxuXG4gIC8qKlxuICAgKiBUaGlzIHBhY2thZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZ2l2ZW4gbGFuZ3VhZ2UuXG4gICAqL1xuICBVTlNVUFBPUlRFRCA9ICdVbnN1cHBvcnRlZCcsXG5cbiAgLyoqXG4gICAqIFRoaXMgcGFja2FnZSBoYXMgYSBjb3JydXB0ZWQgSlNJSSBhc3NlbWJseSBzbyB3ZSBjYW4ndCBnZW5lcmF0ZVxuICAgKiBkb2N1bWVudGF0aW9uIGZvciBpdC5cbiAgICovXG4gIENPUlJVUFRfQVNTRU1CTFkgPSAnQ29ycnVwdEFzc2VtYmx5JyxcblxuICAvKipcbiAgICogVGhpcyBwYWNrYWdlIHN1cHBvcnRzIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgaGFzIGRvY3VtZW50YXRpb24gZm9yIGl0LlxuICAgKi9cbiAgU1VQUE9SVEVEID0gJ1N1cHBvcnRlZCcsXG59XG5cbmNvbnN0IE1FVFJJQ19OQU1FX0JZX1NUQVRVU19BTkRfR1JBSU46IHsgcmVhZG9ubHkgW3N0YXR1cyBpbiBEb2N1bWVudGF0aW9uU3RhdHVzXTogeyByZWFkb25seSBbZ3JhaW4gaW4gR3JhaW5dOiBNZXRyaWNOYW1lIH0gfSA9IHtcbiAgW0RvY3VtZW50YXRpb25TdGF0dXMuTUlTU0lOR106IHtcbiAgICBbR3JhaW4uUEFDS0FHRVNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9NSVNTSU5HX1BBQ0tBR0VTLFxuICAgIFtHcmFpbi5QQUNLQUdFX01BSk9SX1ZFUlNJT05TXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfTUlTU0lOR19NQUpPUlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9NSVNTSU5HX1ZFUlNJT05TLFxuICAgIFtHcmFpbi5QQUNLQUdFX1ZFUlNJT05fU1VCTU9EVUxFU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX01JU1NJTkdfU1VCTU9EVUxFUyxcbiAgfSxcbiAgW0RvY3VtZW50YXRpb25TdGF0dXMuVU5TVVBQT1JURURdOiB7XG4gICAgW0dyYWluLlBBQ0tBR0VTXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfVU5TVVBQT1JURURfUEFDS0FHRVMsXG4gICAgW0dyYWluLlBBQ0tBR0VfTUFKT1JfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9VTlNVUFBPUlRFRF9NQUpPUlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9VTlNVUFBPUlRFRF9WRVJTSU9OUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9WRVJTSU9OX1NVQk1PRFVMRVNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9VTlNVUFBPUlRFRF9TVUJNT0RVTEVTLFxuICB9LFxuICBbRG9jdW1lbnRhdGlvblN0YXR1cy5TVVBQT1JURURdOiB7XG4gICAgW0dyYWluLlBBQ0tBR0VTXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfU1VQUE9SVEVEX1BBQ0tBR0VTLFxuICAgIFtHcmFpbi5QQUNLQUdFX01BSk9SX1ZFUlNJT05TXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfU1VQUE9SVEVEX01BSk9SUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9WRVJTSU9OU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX1NVUFBPUlRFRF9WRVJTSU9OUyxcbiAgICBbR3JhaW4uUEFDS0FHRV9WRVJTSU9OX1NVQk1PRFVMRVNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9TVVBQT1JURURfU1VCTU9EVUxFUyxcbiAgfSxcbiAgW0RvY3VtZW50YXRpb25TdGF0dXMuQ09SUlVQVF9BU1NFTUJMWV06IHtcbiAgICBbR3JhaW4uUEFDS0FHRVNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9DT1JSVVBUX0FTU0VNQkxZX1BBQ0tBR0VTLFxuICAgIFtHcmFpbi5QQUNLQUdFX01BSk9SX1ZFUlNJT05TXTogTWV0cmljTmFtZS5QRVJfTEFOR1VBR0VfQ09SUlVQVF9BU1NFTUJMWV9NQUpPUlMsXG4gICAgW0dyYWluLlBBQ0tBR0VfVkVSU0lPTlNdOiBNZXRyaWNOYW1lLlBFUl9MQU5HVUFHRV9DT1JSVVBUX0FTU0VNQkxZX1ZFUlNJT05TLFxuICAgIFtHcmFpbi5QQUNLQUdFX1ZFUlNJT05fU1VCTU9EVUxFU106IE1ldHJpY05hbWUuUEVSX0xBTkdVQUdFX0NPUlJVUFRfQVNTRU1CTFlfU1VCTU9EVUxFUyxcbiAgfSxcbn07XG5cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvdmlkZWQgbGFuZ3VhZ2UuIEEgXCJNSVNTSU5HXCIgc3RhdHVzXG4gKiB3aWxsIGJlIGlnbm9yZWQgaWYgYW5vdGhlciBzdGF0dXMgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWVcbiAqIGVudGl0eS4gQW4gXCJVTlNVUFBPUlRFRFwiIHN0YXR1cyB3aWxsIGJlIGlnbm9yZWQgaWYgYSBcIlNVUFBPUlRFRFwiIHN0YXR1c1xuICogd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUgZW50aXR5LlxuICpcbiAqIElmIGEgc3VibW9kdWxlIGlzIHByb3ZpZGVkLCBvbmx5IHRoYXQgc3VibW9kdWxlJ3MgYXZhaWxhYmlsaXR5IGlzIHVwZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGRvUmVjb3JkUGVyTGFuZ3VhZ2UoXG4gIHBlckxhbmd1YWdlOiBNYXA8c3RyaW5nLCBQZXJMYW5ndWFnZURhdGE+LFxuICBsYW5ndWFnZTogRG9jdW1lbnRhdGlvbkxhbmd1YWdlLFxuICBzdGF0dXM6IERvY3VtZW50YXRpb25TdGF0dXMsXG4gIHBrZ05hbWU6IHN0cmluZyxcbiAgcGtnTWFqb3I6IHN0cmluZyxcbiAgcGtnVmVyc2lvbjogc3RyaW5nLFxuICBzdWJtb2R1bGU/OiBzdHJpbmcsXG4pIHtcbiAgaWYgKCFwZXJMYW5ndWFnZS5oYXMobGFuZ3VhZ2UubmFtZSkpIHtcbiAgICBjb25zdCBwZXJHcmFpbkRhdGEgPSBuZXcgTWFwPEdyYWluLCBNYXA8c3RyaW5nLCBEb2N1bWVudGF0aW9uU3RhdHVzPj4oKTtcbiAgICBwZXJHcmFpbkRhdGEuc2V0KEdyYWluLlBBQ0tBR0VfTUFKT1JfVkVSU0lPTlMsIG5ldyBNYXAoKSk7XG4gICAgcGVyR3JhaW5EYXRhLnNldChHcmFpbi5QQUNLQUdFUywgbmV3IE1hcCgpKTtcbiAgICBwZXJHcmFpbkRhdGEuc2V0KEdyYWluLlBBQ0tBR0VfVkVSU0lPTl9TVUJNT0RVTEVTLCBuZXcgTWFwKCkpO1xuICAgIHBlckdyYWluRGF0YS5zZXQoR3JhaW4uUEFDS0FHRV9WRVJTSU9OUywgbmV3IE1hcCgpKTtcbiAgICBwZXJMYW5ndWFnZS5zZXQobGFuZ3VhZ2UubmFtZSwgcGVyR3JhaW5EYXRhKTtcbiAgfVxuICBjb25zdCBkYXRhID0gcGVyTGFuZ3VhZ2UuZ2V0KGxhbmd1YWdlLm5hbWUpITtcblxuICAvLyBJZiB0aGVyZSBpcyBhIHN1Ym1vZHVsZSwgb25seSB1cGRhdGUgdGhlIHN1Ym1vZHVsZSBkb21haW4uXG4gIGNvbnN0IG91dHB1dERvbWFpbnM6IHJlYWRvbmx5IFtNYXA8c3RyaW5nLCBEb2N1bWVudGF0aW9uU3RhdHVzPiwgc3RyaW5nXVtdID1cbiAgICBzdWJtb2R1bGVcbiAgICAgID8gW1xuICAgICAgICBbZGF0YS5nZXQoR3JhaW4uUEFDS0FHRV9WRVJTSU9OX1NVQk1PRFVMRVMpISwgYCR7cGtnVmVyc2lvbn0uJHtzdWJtb2R1bGV9YF0sXG4gICAgICBdXG4gICAgICA6IFtcbiAgICAgICAgW2RhdGEuZ2V0KEdyYWluLlBBQ0tBR0VfTUFKT1JfVkVSU0lPTlMpISwgcGtnTWFqb3JdLFxuICAgICAgICBbZGF0YS5nZXQoR3JhaW4uUEFDS0FHRV9WRVJTSU9OUykhLCBwa2dWZXJzaW9uXSxcbiAgICAgICAgW2RhdGEuZ2V0KEdyYWluLlBBQ0tBR0VTKSEsIHBrZ05hbWVdLFxuICAgICAgXTtcbiAgZm9yIChjb25zdCBbbWFwLCBuYW1lXSBvZiBvdXRwdXREb21haW5zKSB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgRG9jdW1lbnRhdGlvblN0YXR1cy5NSVNTSU5HOlxuICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdGF0dXMsIGRvbid0IG92ZXJyaWRlIGl0IHdpdGggXCJNSVNTSU5HXCIuXG4gICAgICAgIGlmICghbWFwLmhhcyhuYW1lKSkge1xuICAgICAgICAgIG1hcC5zZXQobmFtZSwgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRG9jdW1lbnRhdGlvblN0YXR1cy5TVVBQT1JURUQ6XG4gICAgICAgIC8vIElmIHRoZSBwYWNrYWdlIGlzIFwic3VwcG9ydGVkXCIsIHRoaXMgYWx3YXlzIFwid2luc1wiXG4gICAgICAgIG1hcC5zZXQobmFtZSwgc3RhdHVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERvY3VtZW50YXRpb25TdGF0dXMuVU5TVVBQT1JURUQ6XG4gICAgICBjYXNlIERvY3VtZW50YXRpb25TdGF0dXMuQ09SUlVQVF9BU1NFTUJMWTpcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgc3RhdHVzLCBvbmx5IG92ZXJyaWRlIHdpdGggaWYgaXQgd2FzIFwiTUlTU0lOR1wiLlxuICAgICAgICBpZiAoIW1hcC5oYXMobmFtZSkgfHwgbWFwLmdldChuYW1lKSA9PT0gRG9jdW1lbnRhdGlvblN0YXR1cy5NSVNTSU5HKSB7XG4gICAgICAgICAgbWFwLnNldChuYW1lLCBzdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEV4cGVjdGVkIGlucHV0IGV2ZW50IHN0cnVjdHVyZSBhcyBwYXNzZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZW50b3J5Q2FuYXJ5RXZlbnQge1xuICByZWFkb25seSBjb250aW51YXRpb25PYmplY3RLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJtZWRpYXRlIHN0YXRlIHN0b3JlZCBiZXR3ZWVuIGludm9jYXRpb25zIG9mIHRoZSBpbnZlbnRvcnkgY2FuYXJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVudG9yeUNhbmFyeVN0YXRlIHtcbiAgcmVhZG9ubHkgY29udGludWF0aW9uVG9rZW46IHN0cmluZztcbiAgcmVhZG9ubHkgaW5kZXhlZFBhY2thZ2VzOiBNYXA8c3RyaW5nLCBJbmRleGVkUGFja2FnZVN0YXR1cz47XG4gIHJlYWRvbmx5IHBhY2thZ2VOYW1lczogU2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHBhY2thZ2VNYWpvclZlcnNpb25zOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcGVyTGFuZ3VhZ2U6IE1hcDxzdHJpbmcsIFBlckxhbmd1YWdlRGF0YT47XG59XG5cbnR5cGUgU2VyaWFsaXplZDxUPiA9IHN0cmluZyAmIHsgX3NlcmlhbGl6ZWQ6IFQgfVxuXG4vKipcbiAqIFJlcGxhY2VyIHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNPTi5zdHJpbmdpZnkgdG8gYXV0b21hdGljYWxseSB0dXJuIG9iamVjdHMgYmFjayBpbnRvIG1hcHNcbiAqIGFuZCBhcnJheXMgYmFjayBpbnRvIHNldHMgd2hlcmUgYXBwcm9wcmlhdGUuXG4gKi9cbmZ1bmN0aW9uIHNhZmVSZXBsYWNlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiAnTWFwJyxcbiAgICAgIHZhbHVlOiBBcnJheS5mcm9tKHZhbHVlLmVudHJpZXMoKSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogJ1NldCcsXG4gICAgICB2YWx1ZTogQXJyYXkuZnJvbShbLi4udmFsdWVdKSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlUmV2aXZlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBpZiAodmFsdWUuX3R5cGUgPT09ICdNYXAnKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcCh2YWx1ZS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5fdHlwZSA9PT0gJ1NldCcpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplPFQ+KHZhbHVlOiBUKTogU2VyaWFsaXplZDxUPiB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgc2FmZVJlcGxhY2VyLCAyKSBhcyBTZXJpYWxpemVkPFQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8VD4odmFsdWU6IFNlcmlhbGl6ZWQ8VD4pOiBUIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUsIHNhZmVSZXZpdmVyKTtcbn1cbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  import { Metric, MetricOptions } from '@aws-cdk/aws-cloudwatch';
2
2
  import { IFunction } from '@aws-cdk/aws-lambda';
3
3
  import { RetentionDays } from '@aws-cdk/aws-logs';
4
- import { IBucket } from '@aws-cdk/aws-s3';
4
+ import * as s3 from '@aws-cdk/aws-s3';
5
5
  import { Construct, Duration } from '@aws-cdk/core';
6
6
  import { Monitoring } from '../../monitoring';
7
7
  import { OverviewDashboard } from '../../overview-dashboard';
@@ -10,7 +10,7 @@ export interface InventoryProps {
10
10
  /**
11
11
  * The data storage bucket.
12
12
  */
13
- readonly bucket: IBucket;
13
+ readonly bucket: s3.IBucket;
14
14
  /**
15
15
  * The `Monitoring` instance to use for reporting this canary's health.
16
16
  */
@@ -31,7 +31,7 @@ export interface InventoryProps {
31
31
  readonly scheduleRate?: Duration;
32
32
  }
33
33
  /**
34
- * Periodically computes an inventory of all indexed packages into the storage
34
+ * Periodically computes an inventory of all indexed packages in the storage
35
35
  * bucket, and produces metrics with an overview of the index' state.
36
36
  */
37
37
  export declare class Inventory extends Construct {