construct-hub 0.4.4 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,3 +15,66 @@
15
15
  * will receive one sample per tracked version.
16
16
  */
17
17
  export declare function handler(event: unknown): Promise<void>;
18
+ export declare class CanaryStateService {
19
+ private readonly bucketName;
20
+ constructor(bucketName: string);
21
+ /**
22
+ * Save the state to the bucket.
23
+ */
24
+ save(packageName: string, state: CanaryState): Promise<void>;
25
+ /**
26
+ * Load the state file for this package from the bucket.
27
+ */
28
+ load(packageName: string): Promise<CanaryState | undefined>;
29
+ /**
30
+ * Create a state from the latest version of the package.
31
+ */
32
+ latest(packageName: string): Promise<CanaryState['latest']>;
33
+ isNpmReplicaDown(): Promise<boolean>;
34
+ /**
35
+ * Estimate how far behind the NPM replica is compared to the live NPM
36
+ * registry. If the NPM replica is down, return undefined.
37
+ */
38
+ npmReplicaLagSeconds(packageName: string): Promise<number | undefined>;
39
+ private key;
40
+ private url;
41
+ }
42
+ interface CanaryState {
43
+ /**
44
+ * The latest package version, as of the last execution of the canary.
45
+ */
46
+ latest: {
47
+ /**
48
+ * The version we are tracking.
49
+ */
50
+ readonly version: string;
51
+ /**
52
+ * The publish date of the version.
53
+ */
54
+ readonly publishedAt: Date;
55
+ /**
56
+ * The date at which the version is available on the hub.
57
+ */
58
+ availableAt?: Date;
59
+ };
60
+ /**
61
+ * Each existing, but not-yet-found versions that are still tracked.
62
+ */
63
+ pending: {
64
+ [version: string]: {
65
+ /**
66
+ * The version we are tracking.
67
+ */
68
+ readonly version: string;
69
+ /**
70
+ * The publish date of the version.
71
+ */
72
+ readonly publishedAt: Date;
73
+ /**
74
+ * These pending packages are NEVER available at this point.
75
+ */
76
+ availableAt: undefined;
77
+ };
78
+ };
79
+ }
80
+ export {};
@@ -14,7 +14,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
14
14
  };
15
15
  var _catalog;
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.handler = void 0;
17
+ exports.CanaryStateService = exports.handler = void 0;
18
18
  const https = require("https");
19
19
  const zlib_1 = require("zlib");
20
20
  const aws_embedded_metrics_1 = require("aws-embedded-metrics");
@@ -66,10 +66,17 @@ async function handler(event) {
66
66
  // If the current "latest" isn't the one from state, it needs updating.
67
67
  updateLatestIfNeeded(state, latest);
68
68
  try {
69
- await aws_embedded_metrics_1.metricScope((metrics) => () => {
69
+ const replicaLag = await stateService.npmReplicaLagSeconds(packageName);
70
+ await aws_embedded_metrics_1.metricScope((metrics) => async () => {
70
71
  // Clear out default dimensions as we don't need those. See https://github.com/awslabs/aws-embedded-metrics-node/issues/73.
71
72
  metrics.setDimensions();
72
73
  metrics.putMetric("TrackedVersionCount" /* TRACKED_VERSION_COUNT */, Object.keys(state.pending).length + 1, aws_embedded_metrics_1.Unit.Count);
74
+ metrics.putMetric("NpmReplicaIsDown" /* NPM_REPLICA_DOWN */, (await stateService.isNpmReplicaDown()) ? 1 : 0, aws_embedded_metrics_1.Unit.None);
75
+ // If we weren't able to calculate the replica's lag, then simply
76
+ // don't report the metric.
77
+ if (replicaLag !== undefined) {
78
+ metrics.putMetric("EstimatedNpmReplicaLag" /* NPM_REPLICA_LAG */, replicaLag, aws_embedded_metrics_1.Unit.Seconds);
79
+ }
73
80
  })();
74
81
  for (const versionState of [
75
82
  state.latest,
@@ -235,6 +242,49 @@ class CanaryStateService {
235
242
  console.log(`Package: ${packageName} | Version : ${version} | Published At: ${publishedAt}`);
236
243
  return { version, publishedAt: new Date(publishedAt) };
237
244
  }
245
+ async isNpmReplicaDown() {
246
+ try {
247
+ await getJSON('https://replicate.npmjs.com/');
248
+ return false;
249
+ }
250
+ catch (e) {
251
+ return true;
252
+ }
253
+ }
254
+ /**
255
+ * Estimate how far behind the NPM replica is compared to the live NPM
256
+ * registry. If the NPM replica is down, return undefined.
257
+ */
258
+ async npmReplicaLagSeconds(packageName) {
259
+ const encodedPackageName = encodeURIComponent(packageName);
260
+ console.log(`Measuring NPM replica lag using ${packageName}...`);
261
+ const primaryDate = await getModifiedTimestamp(`registry.npmjs.org`);
262
+ let replicaDate;
263
+ try {
264
+ replicaDate = await getModifiedTimestamp(`replicate.npmjs.com/registry`);
265
+ }
266
+ catch (e) {
267
+ if (e instanceof Error && e.message.includes('HTTP 504')) {
268
+ console.log(`Warning: error fetching replicate.npmjs.com: ${e.toString()}`);
269
+ // There is no value to report
270
+ return undefined;
271
+ }
272
+ else {
273
+ throw e;
274
+ }
275
+ }
276
+ const deltaMs = primaryDate.getTime() - replicaDate.getTime();
277
+ console.log(`Timestamp on primary: ${primaryDate.toISOString()}`);
278
+ console.log(`Timestamp on replica: ${replicaDate.toISOString()} (${deltaMs / 3600000} hours behind)`);
279
+ // We return in seconds... The millisecond resolution is silly here since the probe package is
280
+ // only published approximately once every three hours. We use seconds only because this is the
281
+ // largest available time unit in CloudWatch.
282
+ return deltaMs / 1000;
283
+ async function getModifiedTimestamp(baseUrl) {
284
+ const isoDate = await getJSON(`https://${baseUrl}/${encodedPackageName}`, ['time', 'modified']);
285
+ return new Date(isoDate);
286
+ }
287
+ }
238
288
  key(packageName) {
239
289
  return `${"package-canary/" /* STATE_PREFIX */}${packageName}${".state.json" /* STATE_SUFFIX */}`;
240
290
  }
@@ -242,6 +292,7 @@ class CanaryStateService {
242
292
  return `s3://${this.bucketName}/${this.key(packageName)}`;
243
293
  }
244
294
  }
295
+ exports.CanaryStateService = CanaryStateService;
245
296
  /**
246
297
  * Makes a request to the provided URL and returns the response after having
247
298
  * parsed it from JSON.
@@ -298,4 +349,4 @@ function gunzip(readable) {
298
349
  readable.pipe(gz, { end: true });
299
350
  return gz;
300
351
  }
301
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhY2thZ2Utc291cmNlcy9ucG1qcy9jYW5hcnkvbnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBRS9CLCtCQUFvQztBQUNwQywrREFBd0U7QUFFeEUseUNBQXlDO0FBRXpDLGlFQUFpRTtBQUNqRSxpRkFBdUU7QUFDdkUsMkNBS3FCO0FBRXJCLG9DQUFhLENBQUMsU0FBUyxHQUFHLDZCQUFpQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBYzs7SUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFeEQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsbUNBQTBCLENBQUM7SUFDekQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsK0RBQXdDLENBQUM7SUFDdkUsTUFBTSxvQkFBb0IsR0FBRyw4QkFBVSx1REFBb0MsQ0FBQztJQUU1RSxNQUFNLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxTQUFnQixDQUFDLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxtQ0FBSTtRQUNuRSxrRkFBa0Y7UUFDbEYsTUFBTSxFQUFFO1lBQ04sR0FBRyxNQUFNO1lBQ1QsK0RBQStEO1lBQy9ELHVFQUF1RTtZQUN2RSxxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLFdBQVcsRUFBRSxDQUFDLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RSxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVc7Z0JBQ3BCLENBQUMsQ0FBQyxTQUFTO1NBQ2Q7UUFDRCxPQUFPLEVBQUUsRUFBRTtLQUNaLENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWhFLHVFQUF1RTtJQUN2RSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFcEMsSUFBSTtRQUNGLE1BQU0sa0NBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQ2xDLDJIQUEySDtZQUMzSCxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLFNBQVMsb0RBRWYsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDckMsMkJBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFTCxLQUFLLE1BQU0sWUFBWSxJQUFJO1lBQ3pCLEtBQUssQ0FBQyxNQUFNO1lBQ1osR0FBRyxNQUFNLENBQUMsTUFBTSxPQUFDLEtBQUssQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQztTQUN0QyxFQUFFO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxxQkFBcUIsWUFBWSxDQUFDLE9BQU8sY0FBYyxJQUFJLENBQUMsU0FBUyxDQUNuRSxZQUFZLEVBQ1osSUFBSSxFQUNKLENBQUMsQ0FDRixFQUFFLENBQ0osQ0FBQztZQUVGLE1BQU0sa0NBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hDLDJIQUEySDtnQkFDM0gsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN4QixPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDaEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVELE9BQU8sQ0FBQyxXQUFXLENBQ2pCLFVBQVUsRUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsT0FBTyxDQUM5QyxDQUFDO2dCQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFO29CQUM3QixJQUFJLFlBQVksQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7d0JBQ2pELElBQ0UsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQ2pFOzRCQUNBLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzt5QkFDdkM7cUJBQ0Y7eUJBQU07d0JBQ0wsc0ZBQXNGO3dCQUN0RixxRkFBcUY7d0JBQ3JGLElBQ0UsTUFBTSxZQUFZLENBQUMsMEJBQTBCLENBQzNDLFdBQVcsRUFDWCxZQUFZLENBQUMsT0FBTyxDQUNyQixFQUNEOzRCQUNBLFlBQVksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzt5QkFDdkM7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFO29CQUM1Qiw2RkFBNkY7b0JBQzdGLE9BQU8sQ0FBQyxTQUFTLHdDQUVmLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7d0JBQ2pDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ25DLElBQUssRUFDUCwyQkFBSSxDQUFDLE9BQU8sQ0FDYixDQUFDO29CQUVGLHFEQUFxRDtvQkFDckQsSUFBSSxZQUFZLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7d0JBQ3pDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQzVDO2lCQUNGO3FCQUFNO29CQUNMLDRFQUE0RTtvQkFDNUUsT0FBTyxDQUFDLFNBQVMsK0JBRWYsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUssRUFDekQsMkJBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztpQkFDSDtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDTjtLQUNGO1lBQVM7UUFDUixNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdDO0FBQ0gsQ0FBQztBQWhIRCwwQkFnSEM7QUFFRCxNQUFNLFlBQVk7SUFHaEIsWUFBNkIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFGNUMsMkJBQXdCO0lBRXVCLENBQUM7SUFFaEQ7Ozs7Ozs7O09BUUc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUN0QixXQUFtQixFQUNuQixjQUFzQjtRQUV0QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssY0FBYyxDQUNuRSxDQUFDO1FBRUYsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUNiLDhCQUE4QixXQUFXLElBQUksY0FBYyxhQUFhLENBQ3pFLENBQUM7U0FDSDtRQUVELE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLEtBQUssQ0FBQywwQkFBMEIsQ0FDckMsV0FBbUIsRUFDbkIsY0FBc0I7UUFFdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUM1QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLFNBQVMsV0FBVyxLQUFLLGNBQWMscUJBQXFCLENBQUM7WUFDeEYsS0FBSztpQkFDRixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7O2dCQUN4QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFO29CQUMxQixpRUFBaUU7b0JBQ2pFLHNDQUFzQztvQkFDdEMsT0FBTyxFQUFFLENBQ1AsQ0FBQyxRQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLDBDQUFFLFVBQVUsQ0FBQyxlQUFlLEVBQUMsQ0FDM0QsQ0FBQztpQkFDSDtnQkFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FDbkIsUUFBUSxHQUFHLFlBQVksR0FBRyxDQUFDLFVBQVUsS0FBSyxHQUFHLENBQUMsYUFBYSxHQUFHLENBQy9ELENBQUM7Z0JBQ0YsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixDQUFDLENBQUM7aUJBQ0QsR0FBRyxFQUFFLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVTtRQUN0Qiw0Q0FBbUI7WUFDakIsOENBQXFCO1NBQ3RCO1FBQ0QsT0FBTyx3QkFBQyxJQUFJLFlBQVksTUFBTSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxlQUFlLENBQUMsRUFBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRjs7QUFFRCxNQUFNLGtCQUFrQjtJQUN0QixZQUE2QixVQUFrQjtRQUFsQixlQUFVLEdBQVYsVUFBVSxDQUFRO0lBQUcsQ0FBQztJQUVuRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBbUIsRUFBRSxLQUFrQjtRQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWxDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRSxNQUFNLEdBQUc7YUFDTixFQUFFLEVBQUU7YUFDSixTQUFTLENBQUM7WUFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLFdBQVcsRUFBRSxrQkFBa0I7U0FDaEMsQ0FBQzthQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFtQjtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRTFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUc7YUFDbkIsRUFBRSxFQUFFO2FBQ0osU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDO2FBQ3RELE9BQU8sRUFBRTthQUNULEtBQUssQ0FBQyxDQUFDLEdBQWEsRUFBRSxFQUFFLENBQ3ZCLEdBQUcsQ0FBQyxJQUFJLEtBQUssV0FBVztZQUN0QixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDckIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDZCxhQUFhO2FBQ1EsQ0FBQyxDQUM3QixDQUFDO1FBRUosSUFBSSxFQUFDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxJQUFJLENBQUEsRUFBRTtZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzVELElBQUksR0FBRyxLQUFLLGFBQWEsSUFBSSxHQUFHLEtBQUssYUFBYSxFQUFFO2dCQUNsRCxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hCO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBbUI7UUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM1RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FDM0IsOEJBQThCLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQ3RFLENBQUMsU0FBUyxDQUFDLENBQ1osQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUMvQiw4QkFBOEIsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFDL0QsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQ2xCLENBQUM7UUFFRixPQUFPLENBQUMsR0FBRyxDQUNULFlBQVksV0FBVyxnQkFBZ0IsT0FBTyxvQkFBb0IsV0FBVyxFQUFFLENBQ2hGLENBQUM7UUFFRixPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFTyxHQUFHLENBQUMsV0FBbUI7UUFDN0IsT0FBTyxHQUFHLG9DQUFzQixHQUFHLFdBQVcsR0FBRyxnQ0FBc0IsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxHQUFHLENBQUMsV0FBbUI7UUFDN0IsT0FBTyxRQUFRLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7Q0FDRjtBQThDRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLE9BQU8sQ0FBQyxHQUFXLEVBQUUsUUFBbUI7SUFDL0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM1QixLQUFLLENBQUMsR0FBRyxDQUNQLEdBQUcsRUFDSDtZQUNFLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUU7U0FDdkUsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRTtnQkFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQ3JCLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQyxVQUFVLEtBQUssR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUM3RCxDQUFDO2dCQUNGLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEI7WUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV0QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXZCLE1BQU0sWUFBWSxHQUNoQixHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNqRSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsS0FBa0IsRUFDbEIsTUFBNkI7SUFFN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQzNDLE9BQU87S0FDUjtJQUVELGlGQUFpRjtJQUNqRixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtRQUNwQyxzRkFBc0Y7UUFDdEYsNEVBQTRFO1FBQzVFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRztZQUNwQyxHQUFHLEtBQUssQ0FBQyxNQUFNO1lBQ2YsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQztLQUNIO0lBRUQsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFFBQWtCO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLG1CQUFZLEVBQUUsQ0FBQztJQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IGNyZWF0ZUd1bnppcCB9IGZyb20gJ3psaWInO1xuaW1wb3J0IHsgbWV0cmljU2NvcGUsIENvbmZpZ3VyYXRpb24sIFVuaXQgfSBmcm9tICdhd3MtZW1iZWRkZWQtbWV0cmljcyc7XG5pbXBvcnQgdHlwZSB7IEFXU0Vycm9yLCBTMyB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0ICogYXMgSlNPTlN0cmVhbSBmcm9tICdKU09OU3RyZWFtJztcbmltcG9ydCB7IENhdGFsb2dNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQnO1xuaW1wb3J0ICogYXMgYXdzIGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvc2hhcmVkL2F3cy5sYW1iZGEtc2hhcmVkJztcbmltcG9ydCB7IHJlcXVpcmVFbnYgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL3NoYXJlZC9lbnYubGFtYmRhLXNoYXJlZCc7XG5pbXBvcnQge1xuICBNRVRSSUNTX05BTUVTUEFDRSxcbiAgTWV0cmljTmFtZSxcbiAgRW52aXJvbm1lbnQsXG4gIE9iamVjdEtleSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5Db25maWd1cmF0aW9uLm5hbWVzcGFjZSA9IE1FVFJJQ1NfTkFNRVNQQUNFO1xuXG4vKipcbiAqIFRoaXMgcGFja2FnZSBjYW5hcnkgbW9uaXRvcnMgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgdmVyc2lvbnMgb2YgYSBzcGVjaWZpZWRcbiAqIHBhY2thZ2UgaW4gdGhlIENvbnN0cnVjdEh1YiBjYXRhbG9nLiBJdCBwdWJsaXNoZXMgbWV0cmljcyB0aGF0IGhlbHBcbiAqIHVuZGVyc3RhbmQgaG93IG11Y2ggdGltZSBwYXNzZXMgYmV0d2VlbiBhIHBha2NhZ2UgYXBwZWFyaW5nIGluIHRoZSBwdWJsaWNcbiAqIHJlZ2lzdHJ5IGFuZCBpdCdzIGF2YWlsYWJpbGl0eSBpbiB0aGUgQ29uc3RydWN0SHViIGluc3RhbmNlLlxuICpcbiAqIEZyb20gdGhlIG1vbWVudCBhIHBhY2thZ2UgaGFzIGJlZW4gcHVibGlzaGVkLCBhbmQgdW50aWwgaXQgYXBwZWFyZWQgaW5cbiAqIGNhdGFsb2csIHRoZSBgTWV0cmljTmFtZS5EV0VMTF9USU1FYCBtZXRyaWMgaXMgZW1pdHRlZC5cbiAqXG4gKiBPbmNlIHRoZSBwYWNrYWdlIGhhcyBhcHBlYXJlZCBpbiBjYXRhbG9nLCBhbmQgdW50aWwgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzXG4gKiBpZGVudGlmaWVkIGluIG5wbWpzLmNvbSwgdGhlIGBNZXRyaWNOYW1lLlRJTUVfVE9fQ0FUQUxPR2AgbWV0cmljIGlzIGVtaXR0ZWQuXG4gKlxuICogSWYgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzIHB1Ymxpc2hlZCBiZWZvcmUgdGhlIHByZXZpb3VzIG9uZSBoYXMgYXBwZWFyZWRcbiAqIGluIGNhdGFsb2csIGJvdGggdmVyc2lvbnMgd2lsbCBiZSB0cmFja2VkIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgbWV0cmljc1xuICogd2lsbCByZWNlaXZlIG9uZSBzYW1wbGUgcGVyIHRyYWNrZWQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coYEV2ZW50OiAke0pTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKX1gKTtcblxuICBjb25zdCBwYWNrYWdlTmFtZSA9IHJlcXVpcmVFbnYoRW52aXJvbm1lbnQuUEFDS0FHRV9OQU1FKTtcbiAgY29uc3Qgc3RhdGVCdWNrZXQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LlBBQ0tBR0VfQ0FOQVJZX0JVQ0tFVF9OQU1FKTtcbiAgY29uc3QgY29uc3RydWN0SHViRW5kcG9pbnQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LkNPTlNUUlVDVF9IVUJfQkFTRV9VUkwpO1xuXG4gIGNvbnN0IHN0YXRlU2VydmljZSA9IG5ldyBDYW5hcnlTdGF0ZVNlcnZpY2Uoc3RhdGVCdWNrZXQpO1xuICBjb25zdCBjb25zdHJ1Y3RIdWIgPSBuZXcgQ29uc3RydWN0SHViKGNvbnN0cnVjdEh1YkVuZHBvaW50KTtcblxuICBjb25zdCBsYXRlc3QgPSBhd2FpdCBzdGF0ZVNlcnZpY2UubGF0ZXN0KHBhY2thZ2VOYW1lKTtcbiAgY29uc3Qgc3RhdGU6IENhbmFyeVN0YXRlID0gKGF3YWl0IHN0YXRlU2VydmljZS5sb2FkKHBhY2thZ2VOYW1lKSkgPz8ge1xuICAgIC8vIElmIHdlIGRpZCBub3QgaGF2ZSBhbnkgc3RhdGUsIHdlJ2xsIGJvb3RzdHJhcCB1c2luZyB0aGUgY3VycmVudCBsYXRlc3QgdmVyc2lvbi5cbiAgICBsYXRlc3Q6IHtcbiAgICAgIC4uLmxhdGVzdCxcbiAgICAgIC8vIElmIHRoYXQgbGF0ZXN0IHZlcnNpb24gaXMgQUxSRUFEWSBpbiBjYXRhbG9nLCBwcmV0ZW5kIGl0IHdhc1xuICAgICAgLy8gXCJpbnN0YW50YW5lb3VzbHlcIiB0aGVyZSwgc28gd2UgYXZvaWQgcG9zc2libHkgcmVwb3J0aW5nIGFuIGJyZWFjaCBvZlxuICAgICAgLy8gU0xBIGFsYXJtLCB3aGVuIHdlIHJlYWxseSBqdXN0IG9ic2VydmVkIHByZXNlbmNlIG9mIHRoZSBwYWNrYWdlIGluXG4gICAgICAvLyBjYXRhbG9nIHRvbyBsYXRlLCBmb3IgZXhhbXBsZSBvbiBmaXJzdCBkZXBsb3ltZW50IG9mIHRoZSBjYW5hcnkuXG4gICAgICBhdmFpbGFibGVBdDogKGF3YWl0IGNvbnN0cnVjdEh1Yi5pc0luQ2F0YWxvZyhwYWNrYWdlTmFtZSwgbGF0ZXN0LnZlcnNpb24pKVxuICAgICAgICA/IGxhdGVzdC5wdWJsaXNoZWRBdFxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9LFxuICAgIHBlbmRpbmc6IHt9LFxuICB9O1xuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsIHN0YXRlOiAke0pTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKX1gKTtcblxuICAvLyBJZiB0aGUgY3VycmVudCBcImxhdGVzdFwiIGlzbid0IHRoZSBvbmUgZnJvbSBzdGF0ZSwgaXQgbmVlZHMgdXBkYXRpbmcuXG4gIHVwZGF0ZUxhdGVzdElmTmVlZGVkKHN0YXRlLCBsYXRlc3QpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+ICgpID0+IHtcbiAgICAgIC8vIENsZWFyIG91dCBkZWZhdWx0IGRpbWVuc2lvbnMgYXMgd2UgZG9uJ3QgbmVlZCB0aG9zZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3NsYWJzL2F3cy1lbWJlZGRlZC1tZXRyaWNzLW5vZGUvaXNzdWVzLzczLlxuICAgICAgbWV0cmljcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICBtZXRyaWNzLnB1dE1ldHJpYyhcbiAgICAgICAgTWV0cmljTmFtZS5UUkFDS0VEX1ZFUlNJT05fQ09VTlQsXG4gICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLnBlbmRpbmcpLmxlbmd0aCArIDEsXG4gICAgICAgIFVuaXQuQ291bnRcbiAgICAgICk7XG4gICAgfSkoKTtcblxuICAgIGZvciAoY29uc3QgdmVyc2lvblN0YXRlIG9mIFtcbiAgICAgIHN0YXRlLmxhdGVzdCxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMoc3RhdGUucGVuZGluZyA/PyB7fSksXG4gICAgXSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBDaGVja2luZyBzdGF0ZSBvZiAke3ZlcnNpb25TdGF0ZS52ZXJzaW9ufSwgY3VycmVudDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB2ZXJzaW9uU3RhdGUsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgICl9YFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgICAgIG1ldHJpY3Muc2V0RGltZW5zaW9ucygpO1xuICAgICAgICBtZXRyaWNzLnNldFByb3BlcnR5KCdQYWNrYWdlTmFtZScsIHBhY2thZ2VOYW1lKTtcbiAgICAgICAgbWV0cmljcy5zZXRQcm9wZXJ0eSgnUGFja2FnZVZlcnNpb24nLCB2ZXJzaW9uU3RhdGUudmVyc2lvbik7XG4gICAgICAgIG1ldHJpY3Muc2V0UHJvcGVydHkoXG4gICAgICAgICAgJ0lzTGF0ZXN0JyxcbiAgICAgICAgICBzdGF0ZS5sYXRlc3QudmVyc2lvbiA9PT0gdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIGlmICh2ZXJzaW9uU3RhdGUudmVyc2lvbiA9PT0gc3RhdGUubGF0ZXN0LnZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgYXdhaXQgY29uc3RydWN0SHViLmlzSW5DYXRhbG9nKHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3RhdGUudmVyc2lvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2ZXJzaW9uU3RhdGUuYXZhaWxhYmxlQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb24tY3VycmVudCB2ZXJzaW9ucyB3aWxsIHByb2JhYmx5IG5ldmVyIG1ha2UgaXQgdG8gY2F0YWxvZyAodGhleSdyZSBvbGRlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB2ZXJzaW9uKSwgc28gaW5zdGVhZCwgd2UgY2hlY2sgd2hldGhlciB0aGV5IGhhdmUgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBhd2FpdCBjb25zdHJ1Y3RIdWIuaGFzVHlwZVNjcmlwdERvY3VtZW50YXRpb24oXG4gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIC8vIFRlbGxzIHVzIGhvdyBsb25nIGl0J3MgdGFrZW4gZm9yIHRoZSBwYWNrYWdlIHRvIG1ha2UgaXQgdG8gY2F0YWxvZyBhZnRlciBpdCB3YXMgcHVibGlzaGVkLlxuICAgICAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICAgICAgTWV0cmljTmFtZS5USU1FX1RPX0NBVEFMT0csXG4gICAgICAgICAgICAodmVyc2lvblN0YXRlLmF2YWlsYWJsZUF0LmdldFRpbWUoKSAtXG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC9cbiAgICAgICAgICAgICAgMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU3RvcCB0cmFja2luZyB0aGF0IHZlcnNpb24sIGFzIGl0J3Mgbm93IGF2YWlsYWJsZS5cbiAgICAgICAgICBpZiAodmVyc2lvblN0YXRlLnZlcnNpb24gaW4gc3RhdGUucGVuZGluZykge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnBlbmRpbmdbdmVyc2lvblN0YXRlLnZlcnNpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZWxscyB1cyBob3cgbG9uZyB3ZSd2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoaXMgdmVyc2lvbiB0byBzaG93IHVwLCBzbyBmYXIuXG4gICAgICAgICAgbWV0cmljcy5wdXRNZXRyaWMoXG4gICAgICAgICAgICBNZXRyaWNOYW1lLkRXRUxMX1RJTUUsXG4gICAgICAgICAgICAoRGF0ZS5ub3coKSAtIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC8gMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzdGF0ZVNlcnZpY2Uuc2F2ZShwYWNrYWdlTmFtZSwgc3RhdGUpO1xuICB9XG59XG5cbmNsYXNzIENvbnN0cnVjdEh1YiB7XG4gICNjYXRhbG9nPzogQ2F0YWxvZ01vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nKSB7fVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYWNrYWdlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgY2F0YWxvZ1xuICAgKiBvYmplY3Qgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGV4YWN0IHBhY2thZ2UgdmVyc2lvbiBpcyBmb3VuZCBpbiB0aGUgY2F0YWxvZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc0luQ2F0YWxvZyhcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IHRoaXMuZ2V0Q2F0YWxvZygpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gY2F0YWxvZy5wYWNrYWdlcy5maWx0ZXIoXG4gICAgICAocDogYW55KSA9PiBwLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHAudmVyc2lvbiA9PT0gcGFja2FnZVZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kIG11bHRpcGxlIGVudHJpZXMgZm9yICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGluIGNhdGFsb2dgXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uIGV4aXN0cyBpbiBDb25zdHJ1Y3RIdWIgZm9yIHRoZVxuICAgKiBzcGVjaWZpZWQgcGFja2FnZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGBkb2NzLXR5cGVzY3JpcHQubWRgIGRvY3VtZW50IGV4aXN0cyBmb3IgdGhlXG4gICAqICAgICAgICAgIHNwZWNpZmllZCBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc1R5cGVTY3JpcHREb2N1bWVudGF0aW9uKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9kYXRhLyR7cGFja2FnZU5hbWV9L3Yke3BhY2thZ2VWZXJzaW9ufS9kb2NzLXR5cGVzY3JpcHQubWRgO1xuICAgICAgaHR0cHNcbiAgICAgICAgLnJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0sIChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEhUVFAgMjAwIHdpdGggdGV4dC9odG1sIGlmIGl0J3MgYSA0MDQsIGR1ZSB0byBob3dcbiAgICAgICAgICAgIC8vIHdlIGNvbmZpZ3VyZWQgQ2xvdWRGcm9udCBiZWhhdmlvcnMuXG4gICAgICAgICAgICByZXR1cm4gb2soXG4gICAgICAgICAgICAgICEhcmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddPy5zdGFydHNXaXRoKCd0ZXh0L21hcmtkb3duJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBIRUFEICR7dXJsfSAtLSBIVFRQICR7cmVzLnN0YXR1c0NvZGV9ICgke3Jlcy5zdGF0dXNNZXNzYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xuICAgICAgICAgIGtvKGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2F0YWxvZygpOiBQcm9taXNlPENhdGFsb2dNb2RlbD4ge1xuICAgIGlmICh0aGlzLiNjYXRhbG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy4jY2F0YWxvZztcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLiNjYXRhbG9nID0gYXdhaXQgZ2V0SlNPTihgJHt0aGlzLmJhc2VVcmx9L2NhdGFsb2cuanNvbmApKTtcbiAgfVxufVxuXG5jbGFzcyBDYW5hcnlTdGF0ZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZykge31cblxuICAvKipcbiAgICogU2F2ZSB0aGUgc3RhdGUgdG8gdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHN0YXRlOiBDYW5hcnlTdGF0ZSkge1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKHBhY2thZ2VOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKGBTYXZpbmcgdG8gJHt1cmx9OiAke0pTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKX1gKTtcbiAgICBhd2FpdCBhd3NcbiAgICAgIC5zMygpXG4gICAgICAucHV0T2JqZWN0KHtcbiAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIEtleTogdGhpcy5rZXkocGFja2FnZU5hbWUpLFxuICAgICAgICBCb2R5OiBKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMiksXG4gICAgICAgIENvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KVxuICAgICAgLnByb21pc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBzdGF0ZSBmaWxlIGZvciB0aGlzIHBhY2thZ2UgZnJvbSB0aGUgYnVja2V0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Q2FuYXJ5U3RhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBzdGF0ZSBmb3IgcGFja2FnZSAnJHtwYWNrYWdlTmFtZX0nYCk7XG5cbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmtleShwYWNrYWdlTmFtZSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwocGFja2FnZU5hbWUpO1xuXG4gICAgY29uc29sZS5sb2coYEZldGNoaW5nOiAke3VybH1gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXdzXG4gICAgICAuczMoKVxuICAgICAgLmdldE9iamVjdCh7IEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLCBLZXk6IG9iamVjdEtleSB9KVxuICAgICAgLnByb21pc2UoKVxuICAgICAgLmNhdGNoKChlcnI6IEFXU0Vycm9yKSA9PlxuICAgICAgICBlcnIuY29kZSAhPT0gJ05vU3VjaEtleSdcbiAgICAgICAgICA/IFByb21pc2UucmVqZWN0KGVycilcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIC8qIG5vIGRhdGEgKi9cbiAgICAgICAgICAgIH0gYXMgUzMuR2V0T2JqZWN0T3V0cHV0KVxuICAgICAgKTtcblxuICAgIGlmICghZGF0YT8uQm9keSkge1xuICAgICAgY29uc29sZS5sb2coYE5vdCBmb3VuZDogJHt1cmx9YCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBMb2FkZWQ6ICR7dXJsfWApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEuQm9keS50b1N0cmluZygndXRmLTgnKSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGlmIChrZXkgPT09ICdwdWJsaXNoZWRBdCcgfHwga2V5ID09PSAnYXZhaWxhYmxlQXQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3RhdGUgZnJvbSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGF0ZXN0KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENhbmFyeVN0YXRlWydsYXRlc3QnXT4ge1xuICAgIGNvbnNvbGUubG9nKGBGZXRjaGluZyBsYXRlc3QgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIE5QTTogJHtwYWNrYWdlTmFtZX1gKTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0SlNPTihcbiAgICAgIGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZVVSSUNvbXBvbmVudChwYWNrYWdlTmFtZSl9L2xhdGVzdGAsXG4gICAgICBbJ3ZlcnNpb24nXVxuICAgICk7XG4gICAgY29uc3QgcHVibGlzaGVkQXQgPSBhd2FpdCBnZXRKU09OKFxuICAgICAgYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhY2thZ2VOYW1lKX1gLFxuICAgICAgWyd0aW1lJywgdmVyc2lvbl1cbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgUGFja2FnZTogJHtwYWNrYWdlTmFtZX0gfCBWZXJzaW9uIDogJHt2ZXJzaW9ufSB8IFB1Ymxpc2hlZCBBdDogJHtwdWJsaXNoZWRBdH1gXG4gICAgKTtcblxuICAgIHJldHVybiB7IHZlcnNpb24sIHB1Ymxpc2hlZEF0OiBuZXcgRGF0ZShwdWJsaXNoZWRBdCkgfTtcbiAgfVxuXG4gIHByaXZhdGUga2V5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtPYmplY3RLZXkuU1RBVEVfUFJFRklYfSR7cGFja2FnZU5hbWV9JHtPYmplY3RLZXkuU1RBVEVfU1VGRklYfWA7XG4gIH1cblxuICBwcml2YXRlIHVybChwYWNrYWdlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBzMzovLyR7dGhpcy5idWNrZXROYW1lfS8ke3RoaXMua2V5KHBhY2thZ2VOYW1lKX1gO1xuICB9XG59XG5cbmludGVyZmFjZSBDYW5hcnlTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGF0ZXN0IHBhY2thZ2UgdmVyc2lvbiwgYXMgb2YgdGhlIGxhc3QgZXhlY3V0aW9uIG9mIHRoZSBjYW5hcnkuXG4gICAqL1xuICBsYXRlc3Q6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiB3ZSBhcmUgdHJhY2tpbmcuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHB1Ymxpc2ggZGF0ZSBvZiB0aGUgdmVyc2lvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBwdWJsaXNoZWRBdDogRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIHRoZSB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgaHViLlxuICAgICAqL1xuICAgIGF2YWlsYWJsZUF0PzogRGF0ZTtcbiAgfTtcblxuICAvKipcbiAgICogRWFjaCBleGlzdGluZywgYnV0IG5vdC15ZXQtZm91bmQgdmVyc2lvbnMgdGhhdCBhcmUgc3RpbGwgdHJhY2tlZC5cbiAgICovXG4gIHBlbmRpbmc6IHtcbiAgICBbdmVyc2lvbjogc3RyaW5nXToge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdmVyc2lvbiB3ZSBhcmUgdHJhY2tpbmcuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcHVibGlzaCBkYXRlIG9mIHRoZSB2ZXJzaW9uLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwdWJsaXNoZWRBdDogRGF0ZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGVzZSBwZW5kaW5nIHBhY2thZ2VzIGFyZSBORVZFUiBhdmFpbGFibGUgYXQgdGhpcyBwb2ludC5cbiAgICAgICAqL1xuICAgICAgYXZhaWxhYmxlQXQ6IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIE1ha2VzIGEgcmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIHRoZSByZXNwb25zZSBhZnRlciBoYXZpbmdcbiAqIHBhcnNlZCBpdCBmcm9tIEpTT04uXG4gKlxuICogQHBhcmFtIHVybCB0aGUgVVJMIHRvIGdldC5cbiAqIEBwYXJhbSBqc29uUGF0aCBhIEpTT04gcGF0aCB0byBleHRyYWN0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0SlNPTih1cmw6IHN0cmluZywganNvblBhdGg/OiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGtvKSA9PiB7XG4gICAgaHR0cHMuZ2V0KFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQWNjZXB0LUVuY29kaW5nJzogJ2lkZW50aXR5JyB9LFxuICAgICAgfSxcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHRVQgJHt1cmx9IC0gSFRUUCAke3Jlcy5zdGF0dXNDb2RlfSAoJHtyZXMuc3RhdHVzTWVzc2FnZX0pYFxuICAgICAgICAgICk7XG4gICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBrbyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXMub25jZSgnZXJyb3InLCBrbyk7XG5cbiAgICAgICAgY29uc3QganNvbiA9IEpTT05TdHJlYW0ucGFyc2UoanNvblBhdGgpO1xuICAgICAgICBqc29uLm9uY2UoJ2RhdGEnLCBvayk7XG4gICAgICAgIGpzb24ub25jZSgnZXJyb3InLCBrbyk7XG5cbiAgICAgICAgY29uc3QgcGxhaW5QYXlsb2FkID1cbiAgICAgICAgICByZXMuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddID09PSAnZ3ppcCcgPyBndW56aXAocmVzKSA6IHJlcztcbiAgICAgICAgcGxhaW5QYXlsb2FkLnBpcGUoanNvbiwgeyBlbmQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgYGxhdGVzdGAgcHJvcGVydHkgb2YgYHN0YXRlYCB0aSB0aGUgcHJvdmlkZWQgYGxhdGVzdGAgdmFsdWUsXG4gKiB1bmxlc3MgdGhpcyBpcyBhbHJlYWR5IHRoZSBjdXJyZW50IGxhdGVzdC5cbiAqXG4gKiBJZiB0aGUgcHJldmlvdXMgbGF0ZXN0IHZlcnNpb24gZG9lcyBub3QgaGF2ZSB0aGUgYGF2YWlsYWJsZUF0YCBwcm9wZXJ0eSwgYWRkc1xuICogdGhhdCB0byB0aGUgYHBlbmRpbmdgIHNldC5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgIHRoZSBzdGF0ZSB0byBiZSB1cGRhdGVkLlxuICogQHBhcmFtIGxhdGVzdCB0aGUgY3VycmVudCBcImxhdGVzdFwiIHZlcnNpb24gb2YgdGhlIHRyYWNrZWQgcGFja2FnZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlTGF0ZXN0SWZOZWVkZWQoXG4gIHN0YXRlOiBDYW5hcnlTdGF0ZSxcbiAgbGF0ZXN0OiBDYW5hcnlTdGF0ZVsnbGF0ZXN0J11cbik6IHZvaWQge1xuICBpZiAoc3RhdGUubGF0ZXN0LnZlcnNpb24gPT09IGxhdGVzdC52ZXJzaW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIGN1cnJlbnQgXCJsYXRlc3RcIiBpc24ndCBhdmFpbGFibGUgeWV0LCBhZGQgaXQgdG8gdGhlIGBwZW5kaW5nYCB2ZXJzaW9ucy5cbiAgaWYgKHN0YXRlLmxhdGVzdC5hdmFpbGFibGVBdCA9PSBudWxsKSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgdmVyc2lvbiBvZiBqc2lpIGRvZXNuJ3QgZG8gY29udHJvbCBmbG93IGFuYWx5c2lzIHdlbGwgZW5vdWdoIGhlcmUgdG9cbiAgICAvLyBkZXRlcm1pbmUgdGhhdCB0aGVgaWZgIGJyYW5jaCBndWFyYW50ZWVzIGBhdmFpbGFibGVBdGAgaXMgdW5kZWZpbmVkIGhlcmUuXG4gICAgc3RhdGUucGVuZGluZ1tzdGF0ZS5sYXRlc3QudmVyc2lvbl0gPSB7XG4gICAgICAuLi5zdGF0ZS5sYXRlc3QsXG4gICAgICBhdmFpbGFibGVBdDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBzdGF0ZS5sYXRlc3QgPSBsYXRlc3Q7XG59XG5cbmZ1bmN0aW9uIGd1bnppcChyZWFkYWJsZTogUmVhZGFibGUpOiBSZWFkYWJsZSB7XG4gIGNvbnN0IGd6ID0gY3JlYXRlR3VuemlwKCk7XG4gIHJlYWRhYmxlLnBpcGUoZ3osIHsgZW5kOiB0cnVlIH0pO1xuICByZXR1cm4gZ3o7XG59XG4iXX0=
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhY2thZ2Utc291cmNlcy9ucG1qcy9jYW5hcnkvbnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBRS9CLCtCQUFvQztBQUNwQywrREFBd0U7QUFFeEUseUNBQXlDO0FBRXpDLGlFQUFpRTtBQUNqRSxpRkFBdUU7QUFDdkUsMkNBS3FCO0FBRXJCLG9DQUFhLENBQUMsU0FBUyxHQUFHLDZCQUFpQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBYzs7SUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFeEQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsbUNBQTBCLENBQUM7SUFDekQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsK0RBQXdDLENBQUM7SUFDdkUsTUFBTSxvQkFBb0IsR0FBRyw4QkFBVSx1REFBb0MsQ0FBQztJQUU1RSxNQUFNLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxTQUFnQixDQUFDLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxtQ0FBSTtRQUNuRSxrRkFBa0Y7UUFDbEYsTUFBTSxFQUFFO1lBQ04sR0FBRyxNQUFNO1lBQ1QsK0RBQStEO1lBQy9E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QUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsS0FBa0IsRUFDbEIsTUFBNkI7SUFFN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQzNDLE9BQU87S0FDUjtJQUVELGlGQUFpRjtJQUNqRixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtRQUNwQyxzRkFBc0Y7UUFDdEYsNEVBQTRFO1FBQzVFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRztZQUNwQyxHQUFHLEtBQUssQ0FBQyxNQUFNO1lBQ2YsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQztLQUNIO0lBRUQsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFFBQWtCO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLG1CQUFZLEVBQUUsQ0FBQztJQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IGNyZWF0ZUd1bnppcCB9IGZyb20gJ3psaWInO1xuaW1wb3J0IHsgbWV0cmljU2NvcGUsIENvbmZpZ3VyYXRpb24sIFVuaXQgfSBmcm9tICdhd3MtZW1iZWRkZWQtbWV0cmljcyc7XG5pbXBvcnQgdHlwZSB7IEFXU0Vycm9yLCBTMyB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0ICogYXMgSlNPTlN0cmVhbSBmcm9tICdKU09OU3RyZWFtJztcbmltcG9ydCB7IENhdGFsb2dNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQnO1xuaW1wb3J0ICogYXMgYXdzIGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvc2hhcmVkL2F3cy5sYW1iZGEtc2hhcmVkJztcbmltcG9ydCB7IHJlcXVpcmVFbnYgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL3NoYXJlZC9lbnYubGFtYmRhLXNoYXJlZCc7XG5pbXBvcnQge1xuICBNRVRSSUNTX05BTUVTUEFDRSxcbiAgTWV0cmljTmFtZSxcbiAgRW52aXJvbm1lbnQsXG4gIE9iamVjdEtleSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5Db25maWd1cmF0aW9uLm5hbWVzcGFjZSA9IE1FVFJJQ1NfTkFNRVNQQUNFO1xuXG4vKipcbiAqIFRoaXMgcGFja2FnZSBjYW5hcnkgbW9uaXRvcnMgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgdmVyc2lvbnMgb2YgYSBzcGVjaWZpZWRcbiAqIHBhY2thZ2UgaW4gdGhlIENvbnN0cnVjdEh1YiBjYXRhbG9nLiBJdCBwdWJsaXNoZXMgbWV0cmljcyB0aGF0IGhlbHBcbiAqIHVuZGVyc3RhbmQgaG93IG11Y2ggdGltZSBwYXNzZXMgYmV0d2VlbiBhIHBha2NhZ2UgYXBwZWFyaW5nIGluIHRoZSBwdWJsaWNcbiAqIHJlZ2lzdHJ5IGFuZCBpdCdzIGF2YWlsYWJpbGl0eSBpbiB0aGUgQ29uc3RydWN0SHViIGluc3RhbmNlLlxuICpcbiAqIEZyb20gdGhlIG1vbWVudCBhIHBhY2thZ2UgaGFzIGJlZW4gcHVibGlzaGVkLCBhbmQgdW50aWwgaXQgYXBwZWFyZWQgaW5cbiAqIGNhdGFsb2csIHRoZSBgTWV0cmljTmFtZS5EV0VMTF9USU1FYCBtZXRyaWMgaXMgZW1pdHRlZC5cbiAqXG4gKiBPbmNlIHRoZSBwYWNrYWdlIGhhcyBhcHBlYXJlZCBpbiBjYXRhbG9nLCBhbmQgdW50aWwgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzXG4gKiBpZGVudGlmaWVkIGluIG5wbWpzLmNvbSwgdGhlIGBNZXRyaWNOYW1lLlRJTUVfVE9fQ0FUQUxPR2AgbWV0cmljIGlzIGVtaXR0ZWQuXG4gKlxuICogSWYgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzIHB1Ymxpc2hlZCBiZWZvcmUgdGhlIHByZXZpb3VzIG9uZSBoYXMgYXBwZWFyZWRcbiAqIGluIGNhdGFsb2csIGJvdGggdmVyc2lvbnMgd2lsbCBiZSB0cmFja2VkIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgbWV0cmljc1xuICogd2lsbCByZWNlaXZlIG9uZSBzYW1wbGUgcGVyIHRyYWNrZWQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coYEV2ZW50OiAke0pTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKX1gKTtcblxuICBjb25zdCBwYWNrYWdlTmFtZSA9IHJlcXVpcmVFbnYoRW52aXJvbm1lbnQuUEFDS0FHRV9OQU1FKTtcbiAgY29uc3Qgc3RhdGVCdWNrZXQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LlBBQ0tBR0VfQ0FOQVJZX0JVQ0tFVF9OQU1FKTtcbiAgY29uc3QgY29uc3RydWN0SHViRW5kcG9pbnQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LkNPTlNUUlVDVF9IVUJfQkFTRV9VUkwpO1xuXG4gIGNvbnN0IHN0YXRlU2VydmljZSA9IG5ldyBDYW5hcnlTdGF0ZVNlcnZpY2Uoc3RhdGVCdWNrZXQpO1xuICBjb25zdCBjb25zdHJ1Y3RIdWIgPSBuZXcgQ29uc3RydWN0SHViKGNvbnN0cnVjdEh1YkVuZHBvaW50KTtcblxuICBjb25zdCBsYXRlc3QgPSBhd2FpdCBzdGF0ZVNlcnZpY2UubGF0ZXN0KHBhY2thZ2VOYW1lKTtcbiAgY29uc3Qgc3RhdGU6IENhbmFyeVN0YXRlID0gKGF3YWl0IHN0YXRlU2VydmljZS5sb2FkKHBhY2thZ2VOYW1lKSkgPz8ge1xuICAgIC8vIElmIHdlIGRpZCBub3QgaGF2ZSBhbnkgc3RhdGUsIHdlJ2xsIGJvb3RzdHJhcCB1c2luZyB0aGUgY3VycmVudCBsYXRlc3QgdmVyc2lvbi5cbiAgICBsYXRlc3Q6IHtcbiAgICAgIC4uLmxhdGVzdCxcbiAgICAgIC8vIElmIHRoYXQgbGF0ZXN0IHZlcnNpb24gaXMgQUxSRUFEWSBpbiBjYXRhbG9nLCBwcmV0ZW5kIGl0IHdhc1xuICAgICAgLy8gXCJpbnN0YW50YW5lb3VzbHlcIiB0aGVyZSwgc28gd2UgYXZvaWQgcG9zc2libHkgcmVwb3J0aW5nIGFuIGJyZWFjaCBvZlxuICAgICAgLy8gU0xBIGFsYXJtLCB3aGVuIHdlIHJlYWxseSBqdXN0IG9ic2VydmVkIHByZXNlbmNlIG9mIHRoZSBwYWNrYWdlIGluXG4gICAgICAvLyBjYXRhbG9nIHRvbyBsYXRlLCBmb3IgZXhhbXBsZSBvbiBmaXJzdCBkZXBsb3ltZW50IG9mIHRoZSBjYW5hcnkuXG4gICAgICBhdmFpbGFibGVBdDogKGF3YWl0IGNvbnN0cnVjdEh1Yi5pc0luQ2F0YWxvZyhwYWNrYWdlTmFtZSwgbGF0ZXN0LnZlcnNpb24pKVxuICAgICAgICA/IGxhdGVzdC5wdWJsaXNoZWRBdFxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9LFxuICAgIHBlbmRpbmc6IHt9LFxuICB9O1xuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsIHN0YXRlOiAke0pTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKX1gKTtcblxuICAvLyBJZiB0aGUgY3VycmVudCBcImxhdGVzdFwiIGlzbid0IHRoZSBvbmUgZnJvbSBzdGF0ZSwgaXQgbmVlZHMgdXBkYXRpbmcuXG4gIHVwZGF0ZUxhdGVzdElmTmVlZGVkKHN0YXRlLCBsYXRlc3QpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbGljYUxhZyA9IGF3YWl0IHN0YXRlU2VydmljZS5ucG1SZXBsaWNhTGFnU2Vjb25kcyhwYWNrYWdlTmFtZSk7XG5cbiAgICBhd2FpdCBtZXRyaWNTY29wZSgobWV0cmljcykgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgICBtZXRyaWNzLnNldERpbWVuc2lvbnMoKTtcbiAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICBNZXRyaWNOYW1lLlRSQUNLRURfVkVSU0lPTl9DT1VOVCxcbiAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUucGVuZGluZykubGVuZ3RoICsgMSxcbiAgICAgICAgVW5pdC5Db3VudFxuICAgICAgKTtcbiAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICBNZXRyaWNOYW1lLk5QTV9SRVBMSUNBX0RPV04sXG4gICAgICAgIChhd2FpdCBzdGF0ZVNlcnZpY2UuaXNOcG1SZXBsaWNhRG93bigpKSA/IDEgOiAwLFxuICAgICAgICBVbml0Lk5vbmVcbiAgICAgICk7XG5cbiAgICAgIC8vIElmIHdlIHdlcmVuJ3QgYWJsZSB0byBjYWxjdWxhdGUgdGhlIHJlcGxpY2EncyBsYWcsIHRoZW4gc2ltcGx5XG4gICAgICAvLyBkb24ndCByZXBvcnQgdGhlIG1ldHJpYy5cbiAgICAgIGlmIChyZXBsaWNhTGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5OUE1fUkVQTElDQV9MQUcsIHJlcGxpY2FMYWcsIFVuaXQuU2Vjb25kcyk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGZvciAoY29uc3QgdmVyc2lvblN0YXRlIG9mIFtcbiAgICAgIHN0YXRlLmxhdGVzdCxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMoc3RhdGUucGVuZGluZyA/PyB7fSksXG4gICAgXSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBDaGVja2luZyBzdGF0ZSBvZiAke3ZlcnNpb25TdGF0ZS52ZXJzaW9ufSwgY3VycmVudDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB2ZXJzaW9uU3RhdGUsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgICl9YFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgICAgIG1ldHJpY3Muc2V0RGltZW5zaW9ucygpO1xuICAgICAgICBtZXRyaWNzLnNldFByb3BlcnR5KCdQYWNrYWdlTmFtZScsIHBhY2thZ2VOYW1lKTtcbiAgICAgICAgbWV0cmljcy5zZXRQcm9wZXJ0eSgnUGFja2FnZVZlcnNpb24nLCB2ZXJzaW9uU3RhdGUudmVyc2lvbik7XG4gICAgICAgIG1ldHJpY3Muc2V0UHJvcGVydHkoXG4gICAgICAgICAgJ0lzTGF0ZXN0JyxcbiAgICAgICAgICBzdGF0ZS5sYXRlc3QudmVyc2lvbiA9PT0gdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIGlmICh2ZXJzaW9uU3RhdGUudmVyc2lvbiA9PT0gc3RhdGUubGF0ZXN0LnZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgYXdhaXQgY29uc3RydWN0SHViLmlzSW5DYXRhbG9nKHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3RhdGUudmVyc2lvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2ZXJzaW9uU3RhdGUuYXZhaWxhYmxlQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb24tY3VycmVudCB2ZXJzaW9ucyB3aWxsIHByb2JhYmx5IG5ldmVyIG1ha2UgaXQgdG8gY2F0YWxvZyAodGhleSdyZSBvbGRlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB2ZXJzaW9uKSwgc28gaW5zdGVhZCwgd2UgY2hlY2sgd2hldGhlciB0aGV5IGhhdmUgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBhd2FpdCBjb25zdHJ1Y3RIdWIuaGFzVHlwZVNjcmlwdERvY3VtZW50YXRpb24oXG4gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIC8vIFRlbGxzIHVzIGhvdyBsb25nIGl0J3MgdGFrZW4gZm9yIHRoZSBwYWNrYWdlIHRvIG1ha2UgaXQgdG8gY2F0YWxvZyBhZnRlciBpdCB3YXMgcHVibGlzaGVkLlxuICAgICAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICAgICAgTWV0cmljTmFtZS5USU1FX1RPX0NBVEFMT0csXG4gICAgICAgICAgICAodmVyc2lvblN0YXRlLmF2YWlsYWJsZUF0LmdldFRpbWUoKSAtXG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC9cbiAgICAgICAgICAgICAgMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU3RvcCB0cmFja2luZyB0aGF0IHZlcnNpb24sIGFzIGl0J3Mgbm93IGF2YWlsYWJsZS5cbiAgICAgICAgICBpZiAodmVyc2lvblN0YXRlLnZlcnNpb24gaW4gc3RhdGUucGVuZGluZykge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnBlbmRpbmdbdmVyc2lvblN0YXRlLnZlcnNpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZWxscyB1cyBob3cgbG9uZyB3ZSd2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoaXMgdmVyc2lvbiB0byBzaG93IHVwLCBzbyBmYXIuXG4gICAgICAgICAgbWV0cmljcy5wdXRNZXRyaWMoXG4gICAgICAgICAgICBNZXRyaWNOYW1lLkRXRUxMX1RJTUUsXG4gICAgICAgICAgICAoRGF0ZS5ub3coKSAtIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC8gMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzdGF0ZVNlcnZpY2Uuc2F2ZShwYWNrYWdlTmFtZSwgc3RhdGUpO1xuICB9XG59XG5cbmNsYXNzIENvbnN0cnVjdEh1YiB7XG4gICNjYXRhbG9nPzogQ2F0YWxvZ01vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nKSB7fVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYWNrYWdlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgY2F0YWxvZ1xuICAgKiBvYmplY3Qgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGV4YWN0IHBhY2thZ2UgdmVyc2lvbiBpcyBmb3VuZCBpbiB0aGUgY2F0YWxvZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc0luQ2F0YWxvZyhcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IHRoaXMuZ2V0Q2F0YWxvZygpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gY2F0YWxvZy5wYWNrYWdlcy5maWx0ZXIoXG4gICAgICAocDogYW55KSA9PiBwLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHAudmVyc2lvbiA9PT0gcGFja2FnZVZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kIG11bHRpcGxlIGVudHJpZXMgZm9yICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGluIGNhdGFsb2dgXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uIGV4aXN0cyBpbiBDb25zdHJ1Y3RIdWIgZm9yIHRoZVxuICAgKiBzcGVjaWZpZWQgcGFja2FnZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGBkb2NzLXR5cGVzY3JpcHQubWRgIGRvY3VtZW50IGV4aXN0cyBmb3IgdGhlXG4gICAqICAgICAgICAgIHNwZWNpZmllZCBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc1R5cGVTY3JpcHREb2N1bWVudGF0aW9uKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9kYXRhLyR7cGFja2FnZU5hbWV9L3Yke3BhY2thZ2VWZXJzaW9ufS9kb2NzLXR5cGVzY3JpcHQubWRgO1xuICAgICAgaHR0cHNcbiAgICAgICAgLnJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0sIChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEhUVFAgMjAwIHdpdGggdGV4dC9odG1sIGlmIGl0J3MgYSA0MDQsIGR1ZSB0byBob3dcbiAgICAgICAgICAgIC8vIHdlIGNvbmZpZ3VyZWQgQ2xvdWRGcm9udCBiZWhhdmlvcnMuXG4gICAgICAgICAgICByZXR1cm4gb2soXG4gICAgICAgICAgICAgICEhcmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddPy5zdGFydHNXaXRoKCd0ZXh0L21hcmtkb3duJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBIRUFEICR7dXJsfSAtLSBIVFRQICR7cmVzLnN0YXR1c0NvZGV9ICgke3Jlcy5zdGF0dXNNZXNzYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xuICAgICAgICAgIGtvKGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2F0YWxvZygpOiBQcm9taXNlPENhdGFsb2dNb2RlbD4ge1xuICAgIGlmICh0aGlzLiNjYXRhbG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy4jY2F0YWxvZztcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLiNjYXRhbG9nID0gYXdhaXQgZ2V0SlNPTihgJHt0aGlzLmJhc2VVcmx9L2NhdGFsb2cuanNvbmApKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FuYXJ5U3RhdGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIHN0YXRlIHRvIHRoZSBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZShwYWNrYWdlTmFtZTogc3RyaW5nLCBzdGF0ZTogQ2FuYXJ5U3RhdGUpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChwYWNrYWdlTmFtZSk7XG5cbiAgICBjb25zb2xlLmxvZyhgU2F2aW5nIHRvICR7dXJsfTogJHtKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMil9YCk7XG4gICAgYXdhaXQgYXdzXG4gICAgICAuczMoKVxuICAgICAgLnB1dE9iamVjdCh7XG4gICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICBLZXk6IHRoaXMua2V5KHBhY2thZ2VOYW1lKSxcbiAgICAgICAgQm9keTogSlNPTi5zdHJpbmdpZnkoc3RhdGUsIG51bGwsIDIpLFxuICAgICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSlcbiAgICAgIC5wcm9taXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc3RhdGUgZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENhbmFyeVN0YXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc29sZS5sb2coYExvYWRpbmcgc3RhdGUgZm9yIHBhY2thZ2UgJyR7cGFja2FnZU5hbWV9J2ApO1xuXG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5rZXkocGFja2FnZU5hbWUpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKHBhY2thZ2VOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKGBGZXRjaGluZzogJHt1cmx9YCk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGF3c1xuICAgICAgLnMzKClcbiAgICAgIC5nZXRPYmplY3QoeyBCdWNrZXQ6IHRoaXMuYnVja2V0TmFtZSwgS2V5OiBvYmplY3RLZXkgfSlcbiAgICAgIC5wcm9taXNlKClcbiAgICAgIC5jYXRjaCgoZXJyOiBBV1NFcnJvcikgPT5cbiAgICAgICAgZXJyLmNvZGUgIT09ICdOb1N1Y2hLZXknXG4gICAgICAgICAgPyBQcm9taXNlLnJlamVjdChlcnIpXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAvKiBubyBkYXRhICovXG4gICAgICAgICAgICB9IGFzIFMzLkdldE9iamVjdE91dHB1dClcbiAgICAgICk7XG5cbiAgICBpZiAoIWRhdGE/LkJvZHkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBOb3QgZm91bmQ6ICR7dXJsfWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgTG9hZGVkOiAke3VybH1gKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhLkJvZHkudG9TdHJpbmcoJ3V0Zi04JyksIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAncHVibGlzaGVkQXQnIHx8IGtleSA9PT0gJ2F2YWlsYWJsZUF0Jykge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YXRlIGZyb20gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxhdGVzdChwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDYW5hcnlTdGF0ZVsnbGF0ZXN0J10+IHtcbiAgICBjb25zb2xlLmxvZyhgRmV0Y2hpbmcgbGF0ZXN0IHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBOUE06ICR7cGFja2FnZU5hbWV9YCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldEpTT04oXG4gICAgICBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVVUklDb21wb25lbnQocGFja2FnZU5hbWUpfS9sYXRlc3RgLFxuICAgICAgWyd2ZXJzaW9uJ11cbiAgICApO1xuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gYXdhaXQgZ2V0SlNPTihcbiAgICAgIGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZVVSSUNvbXBvbmVudChwYWNrYWdlTmFtZSl9YCxcbiAgICAgIFsndGltZScsIHZlcnNpb25dXG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFBhY2thZ2U6ICR7cGFja2FnZU5hbWV9IHwgVmVyc2lvbiA6ICR7dmVyc2lvbn0gfCBQdWJsaXNoZWQgQXQ6ICR7cHVibGlzaGVkQXR9YFxuICAgICk7XG5cbiAgICByZXR1cm4geyB2ZXJzaW9uLCBwdWJsaXNoZWRBdDogbmV3IERhdGUocHVibGlzaGVkQXQpIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNOcG1SZXBsaWNhRG93bigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2V0SlNPTignaHR0cHM6Ly9yZXBsaWNhdGUubnBtanMuY29tLycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZSBob3cgZmFyIGJlaGluZCB0aGUgTlBNIHJlcGxpY2EgaXMgY29tcGFyZWQgdG8gdGhlIGxpdmUgTlBNXG4gICAqIHJlZ2lzdHJ5LiBJZiB0aGUgTlBNIHJlcGxpY2EgaXMgZG93biwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBucG1SZXBsaWNhTGFnU2Vjb25kcyhcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZW5jb2RlZFBhY2thZ2VOYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhY2thZ2VOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKGBNZWFzdXJpbmcgTlBNIHJlcGxpY2EgbGFnIHVzaW5nICR7cGFja2FnZU5hbWV9Li4uYCk7XG5cbiAgICBjb25zdCBwcmltYXJ5RGF0ZSA9IGF3YWl0IGdldE1vZGlmaWVkVGltZXN0YW1wKGByZWdpc3RyeS5ucG1qcy5vcmdgKTtcblxuICAgIGxldCByZXBsaWNhRGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVwbGljYURhdGUgPSBhd2FpdCBnZXRNb2RpZmllZFRpbWVzdGFtcChgcmVwbGljYXRlLm5wbWpzLmNvbS9yZWdpc3RyeWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdIVFRQIDUwNCcpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBXYXJuaW5nOiBlcnJvciBmZXRjaGluZyByZXBsaWNhdGUubnBtanMuY29tOiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIHZhbHVlIHRvIHJlcG9ydFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YU1zID0gcHJpbWFyeURhdGUuZ2V0VGltZSgpIC0gcmVwbGljYURhdGUuZ2V0VGltZSgpO1xuXG4gICAgY29uc29sZS5sb2coYFRpbWVzdGFtcCBvbiBwcmltYXJ5OiAke3ByaW1hcnlEYXRlLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgVGltZXN0YW1wIG9uIHJlcGxpY2E6ICR7cmVwbGljYURhdGUudG9JU09TdHJpbmcoKX0gKCR7XG4gICAgICAgIGRlbHRhTXMgLyAzXzYwMF8wMDBcbiAgICAgIH0gaG91cnMgYmVoaW5kKWBcbiAgICApO1xuXG4gICAgLy8gV2UgcmV0dXJuIGluIHNlY29uZHMuLi4gVGhlIG1pbGxpc2Vjb25kIHJlc29sdXRpb24gaXMgc2lsbHkgaGVyZSBzaW5jZSB0aGUgcHJvYmUgcGFja2FnZSBpc1xuICAgIC8vIG9ubHkgcHVibGlzaGVkIGFwcHJveGltYXRlbHkgb25jZSBldmVyeSB0aHJlZSBob3Vycy4gV2UgdXNlIHNlY29uZHMgb25seSBiZWNhdXNlIHRoaXMgaXMgdGhlXG4gICAgLy8gbGFyZ2VzdCBhdmFpbGFibGUgdGltZSB1bml0IGluIENsb3VkV2F0Y2guXG4gICAgcmV0dXJuIGRlbHRhTXMgLyAxXzAwMDtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldE1vZGlmaWVkVGltZXN0YW1wKGJhc2VVcmw6IHN0cmluZykge1xuICAgICAgY29uc3QgaXNvRGF0ZSA9IGF3YWl0IGdldEpTT04oXG4gICAgICAgIGBodHRwczovLyR7YmFzZVVybH0vJHtlbmNvZGVkUGFja2FnZU5hbWV9YCxcbiAgICAgICAgWyd0aW1lJywgJ21vZGlmaWVkJ11cbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoaXNvRGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBrZXkocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke09iamVjdEtleS5TVEFURV9QUkVGSVh9JHtwYWNrYWdlTmFtZX0ke09iamVjdEtleS5TVEFURV9TVUZGSVh9YDtcbiAgfVxuXG4gIHByaXZhdGUgdXJsKHBhY2thZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYHMzOi8vJHt0aGlzLmJ1Y2tldE5hbWV9LyR7dGhpcy5rZXkocGFja2FnZU5hbWUpfWA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhbmFyeVN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9uLCBhcyBvZiB0aGUgbGFzdCBleGVjdXRpb24gb2YgdGhlIGNhbmFyeS5cbiAgICovXG4gIGxhdGVzdDoge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIHdlIGFyZSB0cmFja2luZy5cbiAgICAgKi9cbiAgICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHVibGlzaCBkYXRlIG9mIHRoZSB2ZXJzaW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHB1Ymxpc2hlZEF0OiBEYXRlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggdGhlIHZlcnNpb24gaXMgYXZhaWxhYmxlIG9uIHRoZSBodWIuXG4gICAgICovXG4gICAgYXZhaWxhYmxlQXQ/OiBEYXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFYWNoIGV4aXN0aW5nLCBidXQgbm90LXlldC1mb3VuZCB2ZXJzaW9ucyB0aGF0IGFyZSBzdGlsbCB0cmFja2VkLlxuICAgKi9cbiAgcGVuZGluZzoge1xuICAgIFt2ZXJzaW9uOiBzdHJpbmddOiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIHdlIGFyZSB0cmFja2luZy5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBwdWJsaXNoIGRhdGUgb2YgdGhlIHZlcnNpb24uXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHB1Ymxpc2hlZEF0OiBEYXRlO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZXNlIHBlbmRpbmcgcGFja2FnZXMgYXJlIE5FVkVSIGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICovXG4gICAgICBhdmFpbGFibGVBdDogdW5kZWZpbmVkO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogTWFrZXMgYSByZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlIGFmdGVyIGhhdmluZ1xuICogcGFyc2VkIGl0IGZyb20gSlNPTi5cbiAqXG4gKiBAcGFyYW0gdXJsIHRoZSBVUkwgdG8gZ2V0LlxuICogQHBhcmFtIGpzb25QYXRoIGEgSlNPTiBwYXRoIHRvIGV4dHJhY3Qgb25seSBhIHN1YnNldCBvZiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBnZXRKU09OKHVybDogc3RyaW5nLCBqc29uUGF0aD86IHN0cmluZ1tdKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChvaywga28pID0+IHtcbiAgICBodHRwcy5nZXQoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQtRW5jb2RpbmcnOiAnaWRlbnRpdHknIH0sXG4gICAgICB9LFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYEdFVCAke3VybH0gLSBIVFRQICR7cmVzLnN0YXR1c0NvZGV9ICgke3Jlcy5zdGF0dXNNZXNzYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIGtvKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5vbmNlKCdlcnJvcicsIGtvKTtcblxuICAgICAgICBjb25zdCBqc29uID0gSlNPTlN0cmVhbS5wYXJzZShqc29uUGF0aCk7XG4gICAgICAgIGpzb24ub25jZSgnZGF0YScsIG9rKTtcbiAgICAgICAganNvbi5vbmNlKCdlcnJvcicsIGtvKTtcblxuICAgICAgICBjb25zdCBwbGFpblBheWxvYWQgPVxuICAgICAgICAgIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdnemlwJyA/IGd1bnppcChyZXMpIDogcmVzO1xuICAgICAgICBwbGFpblBheWxvYWQucGlwZShqc29uLCB7IGVuZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBgbGF0ZXN0YCBwcm9wZXJ0eSBvZiBgc3RhdGVgIHRpIHRoZSBwcm92aWRlZCBgbGF0ZXN0YCB2YWx1ZSxcbiAqIHVubGVzcyB0aGlzIGlzIGFscmVhZHkgdGhlIGN1cnJlbnQgbGF0ZXN0LlxuICpcbiAqIElmIHRoZSBwcmV2aW91cyBsYXRlc3QgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIHRoZSBgYXZhaWxhYmxlQXRgIHByb3BlcnR5LCBhZGRzXG4gKiB0aGF0IHRvIHRoZSBgcGVuZGluZ2Agc2V0LlxuICpcbiAqIEBwYXJhbSBzdGF0ZSAgdGhlIHN0YXRlIHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0gbGF0ZXN0IHRoZSBjdXJyZW50IFwibGF0ZXN0XCIgdmVyc2lvbiBvZiB0aGUgdHJhY2tlZCBwYWNrYWdlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVMYXRlc3RJZk5lZWRlZChcbiAgc3RhdGU6IENhbmFyeVN0YXRlLFxuICBsYXRlc3Q6IENhbmFyeVN0YXRlWydsYXRlc3QnXVxuKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5sYXRlc3QudmVyc2lvbiA9PT0gbGF0ZXN0LnZlcnNpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB0aGUgY3VycmVudCBcImxhdGVzdFwiIGlzbid0IGF2YWlsYWJsZSB5ZXQsIGFkZCBpdCB0byB0aGUgYHBlbmRpbmdgIHZlcnNpb25zLlxuICBpZiAoc3RhdGUubGF0ZXN0LmF2YWlsYWJsZUF0ID09IG51bGwpIHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCB2ZXJzaW9uIG9mIGpzaWkgZG9lc24ndCBkbyBjb250cm9sIGZsb3cgYW5hbHlzaXMgd2VsbCBlbm91Z2ggaGVyZSB0b1xuICAgIC8vIGRldGVybWluZSB0aGF0IHRoZWBpZmAgYnJhbmNoIGd1YXJhbnRlZXMgYGF2YWlsYWJsZUF0YCBpcyB1bmRlZmluZWQgaGVyZS5cbiAgICBzdGF0ZS5wZW5kaW5nW3N0YXRlLmxhdGVzdC52ZXJzaW9uXSA9IHtcbiAgICAgIC4uLnN0YXRlLmxhdGVzdCxcbiAgICAgIGF2YWlsYWJsZUF0OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRlLmxhdGVzdCA9IGxhdGVzdDtcbn1cblxuZnVuY3Rpb24gZ3VuemlwKHJlYWRhYmxlOiBSZWFkYWJsZSk6IFJlYWRhYmxlIHtcbiAgY29uc3QgZ3ogPSBjcmVhdGVHdW56aXAoKTtcbiAgcmVhZGFibGUucGlwZShneiwgeyBlbmQ6IHRydWUgfSk7XG4gIHJldHVybiBnejtcbn1cbiJdfQ==