cdk-nextjs 0.7.10 → 0.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.jsii +3 -3
  2. package/README.md +1 -1
  3. package/docs/harness-coverage.md +1 -1
  4. package/docs/nextjs-private-apis.md +128 -0
  5. package/lib/adapter/adapter.mjs +276 -24
  6. package/lib/adapter/build-outputs.d.ts +1 -1
  7. package/lib/adapter/build-outputs.js +29 -13
  8. package/lib/adapter/build-outputs.test.js +35 -7
  9. package/lib/adapter/cache-handler.d.ts +1 -1
  10. package/lib/adapter/cache-handler.js +1 -1
  11. package/lib/adapter/cache-kinds.d.ts +12 -1
  12. package/lib/adapter/cache-kinds.js +16 -4
  13. package/lib/adapter/init-cache.js +7 -7
  14. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  15. package/lib/adapter/local-file-cache-handler.js +1 -1
  16. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  17. package/lib/adapter/memory-cache-handler.js +1 -1
  18. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  19. package/lib/adapter/s3-cache-handler.js +1 -1
  20. package/lib/adapter/use-cache-common.d.ts +1 -1
  21. package/lib/adapter/use-cache-common.js +1 -1
  22. package/lib/adapter/use-cache-common.test.js +1 -1
  23. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  24. package/lib/adapter/use-cache-default-handler.js +1 -1
  25. package/lib/adapter/use-cache-handlers.test.js +1 -1
  26. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  27. package/lib/adapter/use-cache-remote-handler.js +1 -1
  28. package/lib/cdk-nextjs-version.d.ts +10 -0
  29. package/lib/cdk-nextjs-version.js +15 -0
  30. package/lib/nextjs-api.js +1 -1
  31. package/lib/nextjs-build/nextjs-build.js +7 -6
  32. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  33. package/lib/nextjs-cache.js +1 -1
  34. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  35. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  36. package/lib/nextjs-distribution.js +5 -5
  37. package/lib/nextjs-post-deploy.js +1 -1
  38. package/lib/nextjs-static-assets.js +1 -1
  39. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  40. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  41. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  44. package/lib/runtime/core.test.js +17 -8
  45. package/lib/runtime/dispatch.js +4 -5
  46. package/lib/runtime/image.js +43 -32
  47. package/lib/runtime/image.test.js +27 -26
  48. package/lib/runtime/lambda.mjs +276 -36
  49. package/lib/runtime/manifest.d.ts +34 -8
  50. package/lib/runtime/manifest.js +7 -5
  51. package/lib/runtime/server.mjs +276 -36
  52. package/package.json +1 -1
  53. package/scripts/capture-adapter-fixture.mjs +13 -1
  54. package/scripts/zero-config-build.mjs +5 -1
@@ -12,11 +12,11 @@ exports.newImageResponseCache = newImageResponseCache;
12
12
  * makes `NextResponse.rewrite()` onto an image work. That is also why there is no
13
13
  * longer a dedicated image optimization Lambda — middleware never ran for it.
14
14
  */
15
- const node_fs_1 = require("node:fs");
16
15
  const node_path_1 = require("node:path");
17
16
  const node_url_1 = require("node:url");
18
17
  const response_1 = require("./http/response");
19
18
  const image_utils_1 = require("./image-utils");
19
+ const cdk_nextjs_version_1 = require("../cdk-nextjs-version");
20
20
  const next_modules_1 = require("./next-modules");
21
21
  const util_1 = require("./util");
22
22
  class RuntimeImageOptimizer {
@@ -35,16 +35,17 @@ class RuntimeImageOptimizer {
35
35
  * off.
36
36
  */
37
37
  isEnabled() {
38
- this.loaded ??= loadImageRuntime(this.options);
39
- const { imagesConfig } = this.loaded;
40
- return imagesConfig.loader === "default" && !imagesConfig.unoptimized;
38
+ // From the manifest alone: an app that turned images off shouldn't load the
39
+ // optimizer (and `sharp`) just to answer 404.
40
+ const images = manifestImages(this.options.manifest);
41
+ return images.loader === "default" && !images.unoptimized;
41
42
  }
42
43
  async handle(req, res, url, waitUntil) {
43
44
  // Resolved on the first image request rather than at cold start: an app with
44
- // no `<Image>` should pay neither the `next` module loads nor the
45
- // `required-server-files.json` parse.
45
+ // no `<Image>` should not pay for the `next` module loads.
46
46
  this.loaded ??= loadImageRuntime(this.options);
47
- const { next, nextConfig, imagesConfig } = this.loaded;
47
+ const { next, nextConfig } = this.loaded;
48
+ const imagesConfig = nextConfig.images;
48
49
  const { ImageError, ImageOptimizerCache, fetchExternalImage, imageOptimizer, sendResponse, } = next.optimizer;
49
50
  try {
50
51
  const params = ImageOptimizerCache.validateParams(req, Object.fromEntries(url.searchParams), nextConfig, false);
@@ -205,8 +206,8 @@ const IMAGE_KIND = "IMAGE";
205
206
  /**
206
207
  * The app's `cacheHandler`, constructed the way `next start` constructs it for
207
208
  * images (`next-server.js`, `handleNextImageRequest`): once, and kept, so its
208
- * in-memory layer lasts across requests. Its path in `required-server-files.json`
209
- * is relative to the dist dir; see {@link cacheHandlerUrl}.
209
+ * in-memory layer lasts across requests. Its path in the manifest is relative
210
+ * to the dist dir; see {@link cacheHandlerUrl}.
210
211
  */
211
212
  async function loadImageCache({ deploymentRoot, manifest, importModule }, loaded) {
212
213
  const { next, nextConfig } = loaded;
@@ -267,13 +268,11 @@ function newImageResponseCache(ResponseCache) {
267
268
  /**
268
269
  * `formatDynamicImportPath` from `next/dist/lib/format-dynamic-import-path.js`,
269
270
  * restated: `next build` doesn't trace that module into the deployment, so
270
- * loading it failed every image request with the cache on.
271
+ * loading it failed every image request with the cache on. No `file://` case:
272
+ * the adapter already turned one into a path (`distRelativeCacheHandler`).
271
273
  */
272
274
  function cacheHandlerUrl(distDir, cacheHandler) {
273
- const path = cacheHandler.startsWith("file://")
274
- ? (0, node_url_1.fileURLToPath)(cacheHandler)
275
- : cacheHandler;
276
- return (0, node_url_1.pathToFileURL)((0, node_path_1.isAbsolute)(path) ? path : (0, node_path_1.join)(distDir, path)).toString();
275
+ return (0, node_url_1.pathToFileURL)((0, node_path_1.isAbsolute)(cacheHandler) ? cacheHandler : (0, node_path_1.join)(distDir, cacheHandler)).toString();
277
276
  }
278
277
  /**
279
278
  * `images`, with its `set` moved off the response's critical path.
@@ -301,28 +300,40 @@ function sendText(res, statusCode, body) {
301
300
  res.end(body);
302
301
  }
303
302
  /**
304
- * The image config comes from the app's own `required-server-files.json`, not the
305
- * adapter manifest: `imageOptimizer` reads whole `experimental` and `images`
306
- * objects, and mirroring those into the manifest would be a second definition of
307
- * the same thing that silently goes stale on a `next` minor.
303
+ * `manifest.config.images`, once the manifest is known to be one this runtime
304
+ * reads (with `experimental`, …). The fields are typed `unknown`, so only the
305
+ * version catches a manifest another cdk-nextjs wrote; `NextjsBuild` rejects one
306
+ * at synth, which a hand-wired function skips.
307
+ */
308
+ function manifestImages(manifest) {
309
+ if (manifest.cdkNextjsVersion !== cdk_nextjs_version_1.CDK_NEXTJS_VERSION) {
310
+ throw new Error(`The adapter manifest was written by cdk-nextjs ` +
311
+ `${manifest.cdkNextjsVersion ?? "(unknown)"}, but this runtime is ` +
312
+ `cdk-nextjs ${cdk_nextjs_version_1.CDK_NEXTJS_VERSION}. Rebuild the app with this version.`);
313
+ }
314
+ return manifest.config.images;
315
+ }
316
+ /**
317
+ * The optimizer's `nextConfig`, from the adapter manifest, which copied it out
318
+ * of the build's `ctx.config` (`AdapterManifestConfig.images`): already resolved
319
+ * and defaulted, so neither `getNextConfigRuntime` nor `imageConfigDefault` is
320
+ * needed. Only the fields Next's image code reads; the cast is because the
321
+ * manifest stores them as JSON.
308
322
  */
309
- function loadImageRuntime({ deploymentRoot, manifest }) {
323
+ function loadImageRuntime({ manifest }) {
310
324
  const next = {
311
- configShared: (0, next_modules_1.nextModule)("next/dist/server/config-shared.js"),
312
- imageConfig: (0, next_modules_1.nextModule)("next/dist/shared/lib/image-config.js"),
313
325
  optimizer: (0, next_modules_1.nextModule)("next/dist/server/image-optimizer.js"),
314
326
  serveStatic: (0, next_modules_1.nextModule)("next/dist/server/serve-static.js"),
315
327
  };
316
- const path = (0, node_path_1.join)(deploymentRoot, manifest.relativeProjectDir, manifest.config.distDir, "required-server-files.json");
317
- const required = JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8"));
318
- const nextConfig = next.configShared.getNextConfigRuntime(required.config);
319
- return {
320
- next,
321
- nextConfig,
322
- imagesConfig: {
323
- ...next.imageConfig.imageConfigDefault,
324
- ...nextConfig.images,
325
- },
328
+ const { config } = manifest;
329
+ const nextConfig = {
330
+ basePath: config.basePath,
331
+ assetPrefix: config.assetPrefix,
332
+ images: manifestImages(manifest),
333
+ experimental: config.experimental,
334
+ cacheHandler: config.cacheHandler ?? undefined,
335
+ cacheMaxMemorySize: config.cacheMaxMemorySize,
326
336
  };
337
+ return { next, nextConfig };
327
338
  }
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1ZEEsc0RBY0M7QUFyZUQsc0RBQXNEO0FBQ3REOzs7Ozs7OztHQVFHO0FBQ0gscUNBQXVDO0FBQ3ZDLHlDQUErRDtBQUMvRCx1Q0FBd0Q7QUFJeEQsOENBQXVFO0FBQ3ZFLCtDQUErRTtBQUUvRSxpREFBNEM7QUFDNUMsaUNBQThDO0FBeUY5QyxNQUFhLHFCQUFxQjtJQUtJO0lBSm5CLEVBQUUsR0FBRyxJQUFBLGVBQVEsR0FBRSxDQUFDO0lBQ3pCLE1BQU0sQ0FBdUM7SUFDN0MsVUFBVSxDQUF1QjtJQUV6QyxZQUFvQyxPQUE4QjtRQUE5QixZQUFPLEdBQVAsT0FBTyxDQUF1QjtJQUFHLENBQUM7SUFFdEU7Ozs7OztPQU1HO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE9BQU8sWUFBWSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO0lBQ3hFLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUNqQixHQUF3QixFQUN4QixHQUF1QixFQUN2QixHQUFRLEVBQ1IsU0FBOEM7UUFFOUMsNkVBQTZFO1FBQzdFLGtFQUFrRTtRQUNsRSxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLEVBQ0osVUFBVSxFQUNWLG1CQUFtQixFQUNuQixrQkFBa0IsRUFD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Q0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0UsT0FBTztRQUNMLElBQUk7UUFDSixVQUFVO1FBQ1YsWUFBWSxFQUFFO1lBQ1osR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQjtZQUN0QyxHQUFHLFVBQVUsQ0FBQyxNQUFNO1NBQ3JCO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qKlxuICogYC9fbmV4dC9pbWFnZWAsIGZvbGRlZCBpbnRvIHRoZSBydW50aW1lIGNvcmUuXG4gKlxuICogVGhlIHJlc3BvbnNlIGlzIHdyaXR0ZW4gdG8gYSB7QGxpbmsgU2hpbVNlcnZlclJlc3BvbnNlfSByYXRoZXIgdGhhbiBzdHJhaWdodCB0b1xuICogYSBMYW1iZGEgcmVzcG9uc2Ugc3RyZWFtLCBzbyBpdCBjb21wb3NlcyB3aXRoIHJvdXRpbmc6IGRpc3BhdGNoIG9ubHkgY2xhc3NpZmllc1xuICogYSByZXF1ZXN0IGFzIGltYWdlIG9wdGltaXphdGlvbiAqYWZ0ZXIqIG1pZGRsZXdhcmUgaGFzIGhhZCBpdCwgd2hpY2ggaXMgd2hhdFxuICogbWFrZXMgYE5leHRSZXNwb25zZS5yZXdyaXRlKClgIG9udG8gYW4gaW1hZ2Ugd29yay4gVGhhdCBpcyBhbHNvIHdoeSB0aGVyZSBpcyBub1xuICogbG9uZ2VyIGEgZGVkaWNhdGVkIGltYWdlIG9wdGltaXphdGlvbiBMYW1iZGEg4oCUIG1pZGRsZXdhcmUgbmV2ZXIgcmFuIGZvciBpdC5cbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGlzQWJzb2x1dGUgYXMgaXNBYnNvbHV0ZVBhdGgsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWdDb21wbGV0ZSB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2NvbmZpZy1zaGFyZWQuanNcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVkUm91dGVLaW5kIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGUvdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2hpbUluY29taW5nTWVzc2FnZSB9IGZyb20gXCIuL2h0dHAvcmVxdWVzdFwiO1xuaW1wb3J0IHsgYXNTZXJ2ZXJSZXNwb25zZSwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV0YWcsIGZldGNoRnJvbVMzLCByZXNvbHZlRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuL2ltYWdlLXV0aWxzXCI7XG5pbXBvcnQgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgbmV4dE1vZHVsZSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZSwgczNDbGllbnQgfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKlxuICogUmVxdWlyZWQgdGhyb3VnaCB7QGxpbmsgbmV4dE1vZHVsZX0gcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGJlY2F1c2UgYG5leHRgIGlzXG4gKiBleHRlcm5hbCB0byB0aGUgc2hlbGwgYnVuZGxlcyBhbmQgZG9lcyBub3QgcmVzb2x2ZSBmcm9tIHdoZXJlIHRoZXkgc2l0LiBFdmVyeVxuICogdHlwZSBoZXJlIGlzIHN0aWxsIHRoZSByZWFsIG9uZTogYHR5cGVvZiBpbXBvcnQoLi4uKWAgaXMgZXJhc2VkLlxuICovXG5pbnRlcmZhY2UgTmV4dEltYWdlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IGNvbmZpZ1NoYXJlZDogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKTtcbiAgcmVhZG9ubHkgaW1hZ2VDb25maWc6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIik7XG4gIHJlYWRvbmx5IG9wdGltaXplcjogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIpO1xuICByZWFkb25seSBzZXJ2ZVN0YXRpYzogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpO1xufVxuXG4vKiogVGhlIG1vZHVsZXMgb25seSB0aGUgaW1hZ2UgY2FjaGUgbmVlZHMsIGxvYWRlZCB3aXRoIGl0LiAqL1xuaW50ZXJmYWNlIE5leHRJbWFnZUNhY2hlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlQ2FjaGU6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpO1xufVxuXG4vKiogQSBgY2FjaGVIYW5kbGVyYCBjbGFzcywgYXMgYG5leHQuY29uZmlnYCdzIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBleHBvcnRzIGl0LiAqL1xudHlwZSBDYWNoZUhhbmRsZXJDbGFzcyA9IG5ldyAoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKSA9PiBOb25OdWxsYWJsZTxcbiAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID5bMF1bXCJjYWNoZUhhbmRsZXJcIl1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUVgLiBFbXB0eSB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrXG4gICAqIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIHdoaWNoIHNlbmRzIGV2ZXJ5IG9uZSB0byBgZmV0Y2hJbnRlcm5hbGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuIEVtcHR5IHdoZW4gdGhlIGFzc2V0cyBzaXQgYXQgdGhlIHJvb3RcbiAgICogb2YgdGhlIGJ1Y2tldCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRLZXlQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgbG9jYWwgc291cmNlIGZyb20gdGhlIGFwcCdzIG93biByb3V0ZXMsIGZvciBvbmUgUzMgaGFzIG5vIGZpbGVcbiAgICogZm9yOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyP2lkPTQyXCI+YCwgc2VydmVkIGJ5IGEgcm91dGUgaGFuZGxlci4gYG5leHRcbiAgICogc3RhcnRgIGZldGNoZXMgZXZlcnkgbG9jYWwgc291cmNlIHRoYXQgd2F5IChgZmV0Y2hJbnRlcm5hbEltYWdlYCk7IGhlcmUgaXRcbiAgICogaXMgdGhlIGZhbGxiYWNrLCBzaW5jZSBuZWFybHkgZXZlcnkgc291cmNlIGlzIGEgZmlsZSwgYW5kIGEgYEdldE9iamVjdGAgaXNcbiAgICogZmFyIGNoZWFwZXIgdGhhbiBhIHJvdXRlIGludm9jYXRpb24uXG4gICAqXG4gICAqIEdpdmVuIHRoZSByZXF1ZXN0IGJlaW5nIG9wdGltaXplZCwgZm9yIGl0cyBhdXRob3JpdHk7IGxpa2UgYG5leHQgc3RhcnRgLFxuICAgKiB0aGUgdmlld2VyJ3MgY29va2llcyBhbmQgb3RoZXIgaGVhZGVycyBhcmUgbm90IHRoZSBpbXBsZW1lbnRhdGlvbidzIHRvXG4gICAqIGZvcndhcmQuIEFuZCBnaXZlbiBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCBwYXN0IHdoaWNoIGl0IHN0b3BzXG4gICAqIHJlYWRpbmcgYW5kIGFuc3dlcnMge0BsaW5rIEludGVybmFsSW1hZ2VSZXNwb25zZS50b29MYXJnZX0uXG4gICAqL1xuICByZWFkb25seSBmZXRjaEludGVybmFsOiAoXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICkgPT4gUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+O1xuICAvKipcbiAgICogTG9hZHMgdGhlIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBmcm9tIGl0cyBmaWxlIFVSTC4gQSBzZWFtIGZvciB0ZXN0cywgd2hpY2hcbiAgICogcnVuIGFzIENvbW1vbkpTIGFuZCBjYW5ub3QgYGltcG9ydCgpYCBhIFVSTC5cbiAgICogQGRlZmF1bHQgLSBgaW1wb3J0KClgXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRNb2R1bGU/OiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBUaGUgcmVzcG9uc2Uge0BsaW5rIEltYWdlT3B0aW1pemVyT3B0aW9ucy5mZXRjaEludGVybmFsfSBnb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsSW1hZ2VSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgcmVhZG9ubHkgYm9keTogQnVmZmVyO1xuICAvKipcbiAgICogVGhlIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXAgd2hvc2UgcGFja2FnZSBoYXMgdGhlIHJvdXRlIHRoYXQgc2VydmVzIHRoZVxuICAgKiBzb3VyY2UsIHdoZW4gaXQgaXMgbm90IHRoaXMgZnVuY3Rpb24nczogdGhlcmUgaXMgbm8gcmVzcG9uc2UgdG8gdXNlLCBhbmRcbiAgICogdGhlIG9wdGltaXplciBhbnN3ZXJzIGFuIGV4cGxpY2l0IDUwMiByYXRoZXIgdGhhbiBhIFwibm90IGEgdmFsaWQgaW1hZ2VcIi5cbiAgICovXG4gIHJlYWRvbmx5IG90aGVyR3JvdXA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBwYXNzZWQgYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgc28gaXQgd2FzIGN1dCBvZmY6IGEgNDEzLCBhc1xuICAgKiBgbmV4dCBzdGFydGAgYW5zd2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IHRvb0xhcmdlPzogYm9vbGVhbjtcbn1cblxuLyoqIFdoYXQgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBpcyByZWFkIGZvci4gKi9cbmludGVyZmFjZSBSZXF1aXJlZFNlcnZlckZpbGVzIHtcbiAgY29uZmlnOiBOZXh0Q29uZmlnQ29tcGxldGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHMzID0gczNDbGllbnQoKTtcbiAgcHJpdmF0ZSBsb2FkZWQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPjtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlPzogUHJvbWlzZTxJbWFnZUNhY2hlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbWFnZU9wdGltaXplck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAgYXQgYWxsLiBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDRcbiAgICogd2hlbiBgaW1hZ2VzLnVub3B0aW1pemVkYCBpcyBzZXQgb3IgYSBub24tZGVmYXVsdCBgbG9hZGVyYCBpcyBjb25maWd1cmVkXG4gICAqIChgbmV4dC1zZXJ2ZXIuanNgKSwgYW5kIHNvIGRvZXMgdGhlIHJ1bnRpbWU6IG90aGVyd2lzZSBhbnlvbmUgY2FuIG1ha2UgdGhlXG4gICAqIGNvbXB1dGUgcnVuIHNoYXJwIGFuZCB3cml0ZSB0aGUgaW1hZ2UgY2FjaGUgb24gYW4gZW5kcG9pbnQgdGhlIGFwcCB0dXJuZWRcbiAgICogb2ZmLlxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICByZXR1cm4gaW1hZ2VzQ29uZmlnLmxvYWRlciA9PT0gXCJkZWZhdWx0XCIgJiYgIWltYWdlc0NvbmZpZy51bm9wdGltaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmVkIG9uIHRoZSBmaXJzdCBpbWFnZSByZXF1ZXN0IHJhdGhlciB0aGFuIGF0IGNvbGQgc3RhcnQ6IGFuIGFwcCB3aXRoXG4gICAgLy8gbm8gYDxJbWFnZT5gIHNob3VsZCBwYXkgbmVpdGhlciB0aGUgYG5leHRgIG1vZHVsZSBsb2FkcyBub3IgdGhlXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBwYXJzZS5cbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZywgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICBjb25zdCB7XG4gICAgICBJbWFnZUVycm9yLFxuICAgICAgSW1hZ2VPcHRpbWl6ZXJDYWNoZSxcbiAgICAgIGZldGNoRXh0ZXJuYWxJbWFnZSxcbiAgICAgIGltYWdlT3B0aW1pemVyLFxuICAgICAgc2VuZFJlc3BvbnNlLFxuICAgIH0gPSBuZXh0Lm9wdGltaXplcjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICByZXEgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zXG4gICAgICAgID5bMF0sXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyh1cmwuc2VhcmNoUGFyYW1zKSxcbiAgICAgICAgbmV4dENvbmZpZyxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgaWYgKFwiZXJyb3JNZXNzYWdlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBzZW5kVGV4dChyZXMsIDQwMCwgcGFyYW1zLmVycm9yTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaHJlZiwgaXNBYnNvbHV0ZSB9ID0gcGFyYW1zO1xuICAgICAgY29uc3Qgb3B0aW1pemUgPSBhc3luYyAocHJldmlvdXNDYWNoZUVudHJ5PzogUHJldmlvdXNJbWFnZUVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwc3RyZWFtID0gaXNBYnNvbHV0ZVxuICAgICAgICAgID8gYXdhaXQgZmV0Y2hFeHRlcm5hbEltYWdlKFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcuZGFuZ2Vyb3VzbHlBbGxvd0xvY2FsSVAsXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5tYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlZGlyZWN0cyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuZmV0Y2hMb2NhbChcbiAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBuZXh0Q29uZmlnLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgICAgICAgbmV4dC5vcHRpbWl6ZXIsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG9wdGltaXplZCA9IGF3YWl0IGltYWdlT3B0aW1pemVyKFxuICAgICAgICAgIHVwc3RyZWFtLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHBlcmltZW50YWw6IG5leHRDb25maWcuZXhwZXJpbWVudGFsLFxuICAgICAgICAgICAgaW1hZ2VzOiB7XG4gICAgICAgICAgICAgIGRhbmdlcm91c2x5QWxsb3dTVkc6IGltYWdlc0NvbmZpZy5kYW5nZXJvdXNseUFsbG93U1ZHLFxuICAgICAgICAgICAgICBtaW5pbXVtQ2FjaGVUVEw6IGltYWdlc0NvbmZpZy5taW5pbXVtQ2FjaGVUVEwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpc0RldjogZmFsc2UsIHByZXZpb3VzQ2FjaGVFbnRyeSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGBpbWFnZU9wdGltaXplcmAgcmVwb3J0cyBhIGZhaWxlZCBvcHRpbWl6YXRpb24gYnkgcmV0dXJuaW5nIHRoZVxuICAgICAgICAvLyB1bnRvdWNoZWQgdXBzdHJlYW0gaW1hZ2UgYWxvbmdzaWRlIGBlcnJvcmAgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIHNvXG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcyBhIGJyb2tlbiBgc2hhcnBgIGluc3RhbGwgc2VydmVzIGZ1bGwtc2l6ZSBvcmlnaW5hbHMgd2l0aFxuICAgICAgICAvLyBhIDIwMCBpbmRlZmluaXRlbHkgYW5kIG5vdGhpbmcgaW4gdGhlIGxvZ3Mgc2F5cyB3aHkuXG4gICAgICAgIGlmIChvcHRpbWl6ZWQuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBvcHRpbWl6ZSAke2hyZWZ9LCBzZXJ2aW5nIHRoZSB1bm9wdGltaXplZCBvcmlnaW5hbDpgLFxuICAgICAgICAgICAgb3B0aW1pemVkLmVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGltaXplZDtcbiAgICAgIH07XG5cbiAgICAgIC8vIE5leHQncyBvd24gcmVzcG9uc2Ugd3JpdGVyLCByYXRoZXIgdGhhbiBhIHJlc3RhdGVtZW50IG9mIGl0LCBzbyB0aGVcbiAgICAgIC8vIGhlYWRlcnMgYG5leHQgc3RhcnRgIHNlbmRzIGNvbWUgd2l0aCBpdDogdGhlIHllYXItbG9uZyBgaW1tdXRhYmxlYCBmb3JcbiAgICAgIC8vIGEgYC9fbmV4dC9zdGF0aWMvbWVkaWFgIHNyYywgYElmLU5vbmUtTWF0Y2hgIGFzIGBmcmVzaGAgcmVhZHMgaXQgKHdlYWtcbiAgICAgIC8vIGFuZCBsaXN0ZWQgdGFncywgYENhY2hlLUNvbnRyb2w6IG5vLWNhY2hlYCksIGEgYENvbnRlbnQtRGlzcG9zaXRpb25gXG4gICAgICAvLyB0aGF0IFJGQyA1OTg3LWVuY29kZXMgYSBmaWxlbmFtZSBgd3JpdGVIZWFkYCB3b3VsZCByZWplY3QgYXNcbiAgICAgIC8vIG5vbi1sYXRpbjEsIGBDb250ZW50LUxlbmd0aGAsIGFuZCBubyBib2R5IGZvciBIRUFELiBUaGUgcmVzdGF0ZWRcbiAgICAgIC8vIHZlcnNpb24gaGFkIGRyaWZ0ZWQgb24gZXZlcnkgb25lIG9mIHRob3NlLlxuICAgICAgY29uc3Qgc2VuZCA9IChcbiAgICAgICAgZXh0ZW5zaW9uOiBzdHJpbmcsXG4gICAgICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgICAgICBldGFnOiBzdHJpbmcsXG4gICAgICAgIHhDYWNoZTogXCJNSVNTXCIgfCBcIkhJVFwiIHwgXCJTVEFMRVwiLFxuICAgICAgICBtYXhBZ2U6IG51bWJlcixcbiAgICAgICkgPT4ge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgICAgICAgc2VuZFJlc3BvbnNlKFxuICAgICAgICAgIHJlcSBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHNlbmRSZXNwb25zZT5bMF0sXG4gICAgICAgICAgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLFxuICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBldGFnLFxuICAgICAgICAgIHBhcmFtcy5pc1N0YXRpYyxcbiAgICAgICAgICB4Q2FjaGUsXG4gICAgICAgICAgaW1hZ2VzQ29uZmlnLFxuICAgICAgICAgIG1heEFnZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGBuZXh0IHN0YXJ0YCdzIGBoYW5kbGVOZXh0SW1hZ2VSZXF1ZXN0YCwgc3RlcCBmb3Igc3RlcDogYVxuICAgICAgLy8gYFJlc3BvbnNlQ2FjaGVgIG92ZXIgYW4gYEltYWdlT3B0aW1pemVyQ2FjaGVgIGJhY2tlZCBieSB0aGUgYXBwJ3NcbiAgICAgIC8vIGBjYWNoZUhhbmRsZXJgLCBzbyBhIGhpdCBza2lwcyB0aGUgZmV0Y2ggYW5kIGBzaGFycGAsIGEgc3RhbGUgZW50cnkgaXNcbiAgICAgIC8vIHNlcnZlZCB3aGlsZSBpdCBpcyByZWdlbmVyYXRlZCwgYW5kIGNvbmN1cnJlbnQgbWlzc2VzIGZvciBvbmUgaW1hZ2VcbiAgICAgIC8vIG9wdGltaXplIGl0IG9uY2UuIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCBpcyB0aGUgUzMgY2FjaGUsIHdoaWNoIHRoZVxuICAgICAgLy8gYWRhcHRlciB0dXJucyBvbiB3aXRoIGBpbWFnZXMuY3VzdG9tQ2FjaGVIYW5kbGVyYDogd2l0aCBubyBDRE4gaW4gZnJvbnRcbiAgICAgIC8vICh0aGUgUmVnaW9uYWwgdHlwZXMpIGV2ZXJ5IHJlcXVlc3Qgd291bGQgb3RoZXJ3aXNlIHJ1biBgc2hhcnBgIGFnYWluLFxuICAgICAgLy8gYW5kIGJlaGluZCBDbG91ZEZyb250IGVhY2ggZWRnZSBtaXNzIGlzIGFuIFMzIHJlYWQgaW5zdGVhZC5cbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5sb2FkQ2FjaGUodGhpcy5sb2FkZWQpO1xuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBjYWNoZS5yZXNwb25zZXMuZ2V0KFxuICAgICAgICBJbWFnZU9wdGltaXplckNhY2hlLmdldENhY2hlS2V5KHBhcmFtcyksXG4gICAgICAgIGFzeW5jICh7IHByZXZpb3VzQ2FjaGVFbnRyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBidWZmZXIsIGNvbnRlbnRUeXBlLCBtYXhBZ2UsIGV0YWcsIHVwc3RyZWFtRXRhZyB9ID1cbiAgICAgICAgICAgIGF3YWl0IG9wdGltaXplKHByZXZpb3VzQ2FjaGVFbnRyeSBhcyBQcmV2aW91c0ltYWdlRW50cnkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBraW5kOiBJTUFHRV9LSU5ELFxuICAgICAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgICAgIGV0YWcsXG4gICAgICAgICAgICAgIGV4dGVuc2lvbjogbmV4dC5zZXJ2ZVN0YXRpYy5nZXRFeHRlbnNpb24oY29udGVudFR5cGUpID8/IFwiXCIsXG4gICAgICAgICAgICAgIHVwc3RyZWFtRXRhZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHsgcmV2YWxpZGF0ZTogbWF4QWdlLCBleHBpcmU6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZUtpbmQ6IElNQUdFX0tJTkQsXG4gICAgICAgICAgaW5jcmVtZW50YWxDYWNoZTogZGVmZXJXcml0ZXMoY2FjaGUuaW1hZ2VzLCB3YWl0VW50aWwpLFxuICAgICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICAgIC8vIEEgc3RhbGUgZW50cnkgaXMgc2VydmVkIGF0IG9uY2UgYW5kIHJlZ2VuZXJhdGVkIGluIHRoZSBiYWNrZ3JvdW5kO1xuICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgYSBMYW1iZGEgY291bGQgZnJlZXplIHdpdGggdGhlIHJlZ2VuZXJhdGlvbiBoYWxmIGRvbmUuXG4gICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wicmVzcG9uc2VzXCJdW1wiZ2V0XCJdPlsyXSxcbiAgICAgICk7XG4gICAgICAvLyBBIGZhaWxlZCByZW5kZXIsIGZyb20gbmV4dCAxNi40OyBgbmV4dC1zZXJ2ZXIuanNgIHJldGhyb3dzIGl0IHRoZSBzYW1lXG4gICAgICAvLyB3YXkuIFRoZSBnZW5lcmF0b3IgYWJvdmUgdGhyb3dzIGluc3RlYWQsIHNvIHRoaXMgaXMgdGhlIHR5cGUncyBjYXNlLlxuICAgICAgaWYgKGVudHJ5ICYmIFwiZXJyb3JcIiBpbiBlbnRyeSkge1xuICAgICAgICB0aHJvdyBlbnRyeS5lcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gZW50cnk/LnZhbHVlIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAga2luZDogc3RyaW5nO1xuICAgICAgICAgICAgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gICAgICAgICAgICBidWZmZXI6IEJ1ZmZlcjtcbiAgICAgICAgICAgIGV0YWc6IHN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh2YWx1ZT8ua2luZCAhPT0gSU1BR0VfS0lORCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgaW1hZ2UgY2FjaGUgcmV0dXJuZWQgbm8gaW1hZ2UgZW50cnlcIik7XG4gICAgICB9XG4gICAgICBzZW5kKFxuICAgICAgICB2YWx1ZS5leHRlbnNpb24sXG4gICAgICAgIHZhbHVlLmJ1ZmZlcixcbiAgICAgICAgdmFsdWUuZXRhZyxcbiAgICAgICAgZW50cnkhLmlzTWlzcyA/IFwiTUlTU1wiIDogZW50cnkhLmlzU3RhbGUgPyBcIlNUQUxFXCIgOiBcIkhJVFwiLFxuICAgICAgICBlbnRyeSEuY2FjaGVDb250cm9sPy5yZXZhbGlkYXRlIHx8IDAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCB7IHN0YXR1c0NvZGUsIG1lc3NhZ2UgfSA9IHJlc29sdmVFcnJvclJlc3BvbnNlKGVycm9yLCBJbWFnZUVycm9yKTtcbiAgICAgIGlmIChzdGF0dXNDb2RlID49IDUwMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiSW1hZ2Ugb3B0aW1pemF0aW9uIGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgc2VuZFRleHQocmVzLCBzdGF0dXNDb2RlLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZpY3RlZCBvbiBmYWlsdXJlLCBhcyBgRW50cnlwb2ludFJlZ2lzdHJ5LmxvYWRgIGV2aWN0cyBhIGZhaWxlZCBtb2R1bGUgbG9hZDpcbiAgICogYSB0cmFuc2llbnQgZmFpbHVyZSBpbXBvcnRpbmcgdGhlIGBjYWNoZUhhbmRsZXJgIChFTUZJTEUgdW5kZXIgYSBjb2xkLXN0YXJ0XG4gICAqIGJ1cnN0KSB3b3VsZCBvdGhlcndpc2UgNTAwIGV2ZXJ5IGltYWdlIHJlcXVlc3QgdW50aWwgdGhlIHNhbmRib3ggcmVjeWNsZXMuXG4gICAqL1xuICBwcml2YXRlIGxvYWRDYWNoZShcbiAgICBsb2FkZWQ6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+LFxuICApOiBQcm9taXNlPEltYWdlQ2FjaGU+IHtcbiAgICBpZiAoIXRoaXMuaW1hZ2VDYWNoZSkge1xuICAgICAgY29uc3QgY2FjaGUgPSBsb2FkSW1hZ2VDYWNoZSh0aGlzLm9wdGlvbnMsIGxvYWRlZCk7XG4gICAgICB0aGlzLmltYWdlQ2FjaGUgPSBjYWNoZTtcbiAgICAgIGNhY2hlLmNhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VDYWNoZSA9PT0gY2FjaGUpIHtcbiAgICAgICAgICB0aGlzLmltYWdlQ2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbWFnZUNhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaExvY2FsKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBocmVmOiBzdHJpbmcsXG4gICAgbmV4dENvbmZpZzogUmV0dXJuVHlwZTx0eXBlb2YgbG9hZEltYWdlUnVudGltZT5bXCJuZXh0Q29uZmlnXCJdLFxuICAgIG1heGltdW1SZXNwb25zZUJvZHk6IG51bWJlcixcbiAgICBvcHRpbWl6ZXI6IE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl0sXG4gICkge1xuICAgIGNvbnN0IHsgYnVja2V0LCBmZXRjaEludGVybmFsIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgLy8gTm8gYnVja2V0IHdoZW4gdGhlIHNvdXJjZXMgYXJlIG9uIGRpc2sgKGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgKSwgYW5kXG4gICAgLy8gdGhlIHJvdXRlcyBzZXJ2ZSB0aG9zZSBhcyB0aGV5IHNlcnZlIGFueXRoaW5nIFMzIGhhcyBubyBmaWxlIGZvci5cbiAgICBpZiAoYnVja2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgICAgICB0aGlzLnMzLFxuICAgICAgICAgIGJ1Y2tldCxcbiAgICAgICAgICBocmVmLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVybEJhc2VQYXRoOiBuZXh0Q29uZmlnLmJhc2VQYXRoLFxuICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4LFxuICAgICAgICAgICAgYXNzZXRQcmVmaXg6IG5leHRDb25maWcuYXNzZXRQcmVmaXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJ1ZmZlcjogcmVzdWx0LmJ1ZmZlcixcbiAgICAgICAgICBjb250ZW50VHlwZTogcmVzdWx0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgIGNhY2hlQ29udHJvbDogbnVsbCxcbiAgICAgICAgICAvLyBFbmNvZGVkIGFzIGZvciBhIHJvdXRlJ3MgcmVzcG9uc2U6IGBmZXRjaEludGVybmFsSW1hZ2VgIGRvZXMgdG9vLlxuICAgICAgICAgIGV0YWc6IGV4dHJhY3RFdGFnKHJlc3VsdC5ldGFnLCByZXN1bHQuYnVmZmVyKSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09IFwiTm9TdWNoS2V5XCI7XG4gICAgICAgIGlmICghbWlzc2luZykgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hhdCBgZmV0Y2hJbnRlcm5hbEltYWdlYCBjaGVja3MsIGFuZCB0aHJvd3MsIGZvciB0aGUgc2FtZSByZXNwb25zZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoSW50ZXJuYWwoaHJlZiwgcmVxLCBtYXhpbXVtUmVzcG9uc2VCb2R5KTtcbiAgICBpZiAocmVzcG9uc2Uub3RoZXJHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIGRlcGxveW1lbnQgcHJvYmxlbSwgbm90IGEgYmFkIGB1cmxgOiBsZWF2ZSB0aGUgcm91dGUgaW4gdGhlIGRlZmF1bHRcbiAgICAgIC8vIGdyb3VwLCBvciBzZXJ2ZSB0aGUgaW1hZ2UgYXMgYSBmaWxlIChwdWJsaWMvIG9yIGEgc3RhdGljIGltcG9ydCkuXG4gICAgICB0aHJvdyBuZXcgb3B0aW1pemVyLkltYWdlRXJyb3IoXG4gICAgICAgIDUwMixcbiAgICAgICAgJ1widXJsXCIgcGFyYW1ldGVyIGlzIHZhbGlkIGJ1dCBpdHMgc291cmNlIGlzIGEgcm91dGUgaW4gYW5vdGhlciAnICtcbiAgICAgICAgICBgZnVuY3Rpb25Hcm91cHMgZ3JvdXAgKFwiJHtyZXNwb25zZS5vdGhlckdyb3VwfVwiKSwgd2hpY2ggdGhlIGltYWdlIGAgK1xuICAgICAgICAgIFwib3B0aW1pemVyIGNhbm5vdCBmZXRjaFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLnRvb0xhcmdlKSB7XG4gICAgICB0aHJvdyBuZXcgb3B0aW1pemVyLkltYWdlRXJyb3IoXG4gICAgICAgIDQxMyxcbiAgICAgICAgJ1widXJsXCIgcGFyYW1ldGVyIGlzIHZhbGlkIGJ1dCBpbnRlcm5hbCByZXNwb25zZSBpcyBpbnZhbGlkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2Uuc3RhdHVzQ29kZSB8fCByZXNwb25zZS5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA0MDAsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyOiByZXNwb25zZS5ib2R5LFxuICAgICAgY29udGVudFR5cGU6IGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSkgPz8gbnVsbCxcbiAgICAgIGNhY2hlQ29udHJvbDogZmlyc3RWYWx1ZShyZXNwb25zZS5oZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSkgPz8gbnVsbCxcbiAgICAgIGV0YWc6IGV4dHJhY3RFdGFnKFxuICAgICAgICBmaXJzdFZhbHVlKHJlc3BvbnNlLmhlYWRlcnMuZXRhZykgPz8gbnVsbCxcbiAgICAgICAgcmVzcG9uc2UuYm9keSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIGBDYWNoZWRSb3V0ZUtpbmQuSU1BR0VgLCB3aGljaCBpcyBhbHNvIGBSb3V0ZUtpbmQuSU1BR0VgLiBSZXN0YXRlZDogdGhlIGVudW0gaXNcbiAqIGEgcnVudGltZSB2YWx1ZSBvZiBgbmV4dGAsIHdoaWNoIHRoZSBidW5kbGUgY2Fubm90IGltcG9ydC5cbiAqL1xuY29uc3QgSU1BR0VfS0lORCA9IFwiSU1BR0VcIiBhcyBDYWNoZWRSb3V0ZUtpbmQuSU1BR0U7XG5cbi8qKiBgaW1hZ2VPcHRpbWl6ZXJgJ3MgYHByZXZpb3VzQ2FjaGVFbnRyeWAuICovXG50eXBlIFByZXZpb3VzSW1hZ2VFbnRyeSA9IFBhcmFtZXRlcnM8XG4gIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJpbWFnZU9wdGltaXplclwiXVxuPlszXVtcInByZXZpb3VzQ2FjaGVFbnRyeVwiXTtcblxuaW50ZXJmYWNlIEltYWdlQ2FjaGUge1xuICByZWFkb25seSByZXNwb25zZXM6IEluc3RhbmNlVHlwZTxcbiAgICBOZXh0SW1hZ2VDYWNoZU1vZHVsZXNbXCJyZXNwb25zZUNhY2hlXCJdW1wiZGVmYXVsdFwiXVxuICA+O1xuICByZWFkb25seSBpbWFnZXM6IEluc3RhbmNlVHlwZTxcbiAgICBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdW1wiSW1hZ2VPcHRpbWl6ZXJDYWNoZVwiXVxuICA+O1xufVxuXG4vKipcbiAqIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCwgY29uc3RydWN0ZWQgdGhlIHdheSBgbmV4dCBzdGFydGAgY29uc3RydWN0cyBpdCBmb3JcbiAqIGltYWdlcyAoYG5leHQtc2VydmVyLmpzYCwgYGhhbmRsZU5leHRJbWFnZVJlcXVlc3RgKTogb25jZSwgYW5kIGtlcHQsIHNvIGl0c1xuICogaW4tbWVtb3J5IGxheWVyIGxhc3RzIGFjcm9zcyByZXF1ZXN0cy4gSXRzIHBhdGggaW4gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYFxuICogaXMgcmVsYXRpdmUgdG8gdGhlIGRpc3QgZGlyOyBzZWUge0BsaW5rIGNhY2hlSGFuZGxlclVybH0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZUNhY2hlKFxuICB7IGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCwgaW1wb3J0TW9kdWxlIH06IEltYWdlT3B0aW1pemVyT3B0aW9ucyxcbiAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbik6IFByb21pc2U8SW1hZ2VDYWNoZT4ge1xuICBjb25zdCB7IG5leHQsIG5leHRDb25maWcgfSA9IGxvYWRlZDtcbiAgY29uc3QgbW9kdWxlczogTmV4dEltYWdlQ2FjaGVNb2R1bGVzID0ge1xuICAgIHJlc3BvbnNlQ2FjaGU6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpLFxuICB9O1xuICBjb25zdCBkaXN0RGlyID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICk7XG4gIGxldCBjYWNoZUhhbmRsZXI6IEluc3RhbmNlVHlwZTxDYWNoZUhhbmRsZXJDbGFzcz4gfCB1bmRlZmluZWQ7XG4gIGlmIChuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcikge1xuICAgIGNvbnN0IHVybCA9IGNhY2hlSGFuZGxlclVybChkaXN0RGlyLCBuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcik7XG4gICAgY29uc3QgaW1wb3J0ZWQgPSAoYXdhaXQgKGltcG9ydE1vZHVsZVxuICAgICAgPyBpbXBvcnRNb2R1bGUodXJsKVxuICAgICAgOiBpbXBvcnQodXJsKSkpIGFzIHsgZGVmYXVsdD86IENhY2hlSGFuZGxlckNsYXNzIH0gJiBDYWNoZUhhbmRsZXJDbGFzcztcbiAgICBjb25zdCBDYWNoZUhhbmRsZXIgPSBpbXBvcnRlZC5kZWZhdWx0ID8/IGltcG9ydGVkO1xuICAgIGNhY2hlSGFuZGxlciA9IG5ldyBDYWNoZUhhbmRsZXIoe1xuICAgICAgZGV2OiBmYWxzZSxcbiAgICAgIGZsdXNoVG9EaXNrOiBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbC5pc3JGbHVzaFRvRGlzayxcbiAgICAgIHNlcnZlckRpc3REaXI6IGpvaW4oZGlzdERpciwgXCJzZXJ2ZXJcIiksXG4gICAgICBtYXhNZW1vcnlDYWNoZVNpemU6IG5leHRDb25maWcuY2FjaGVNYXhNZW1vcnlTaXplLFxuICAgICAgcmV2YWxpZGF0ZWRUYWdzOiBbXSxcbiAgICAgIF9yZXF1ZXN0SGVhZGVyczoge30sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZXM6IG5ld0ltYWdlUmVzcG9uc2VDYWNoZShtb2R1bGVzLnJlc3BvbnNlQ2FjaGUuZGVmYXVsdCksXG4gICAgaW1hZ2VzOiBuZXcgbmV4dC5vcHRpbWl6ZXIuSW1hZ2VPcHRpbWl6ZXJDYWNoZSh7XG4gICAgICBkaXN0RGlyLFxuICAgICAgbmV4dENvbmZpZyxcbiAgICAgIGNhY2hlSGFuZGxlcixcbiAgICB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgbmV3IFJlc3BvbnNlQ2FjaGUoLi4uKWAgZm9yIGltYWdlcywgb24gZWl0aGVyIHNpZGUgb2YgbmV4dCAxNi4zLjguIEJlZm9yZVxuICogaXQgdGhlIGNvbnN0cnVjdG9yIHRvb2sgYG1pbmltYWxNb2RlYDsgZnJvbSBpdCwgYHsgbWluaW1hbE1vZGUsIHJvdXRlIH1gLCBhbmRcbiAqIGl0IHRocm93cyB3aXRob3V0IGEgYHJvdXRlYCAtIGBuZXh0LXNlcnZlci5qc2AgcGFzc2VzIGBcImltYWdlXCJgLiBOZWl0aGVyIGZvcm1cbiAqIGNhbiBzdGFuZCBpbiBmb3IgdGhlIG90aGVyOiBhbiBvbGRlciBgbmV4dGAgdGFrZXMgdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGFcbiAqIHRydXRoeSBgbWluaW1hbE1vZGVgLCBhbmQgMTYuMy44IHJlamVjdHMgYSBiYXJlIGBmYWxzZWAuXG4gKlxuICogVG9sZCBhcGFydCBieSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIHRoZSBvbGRlciBmb3JtIHJhdGhlciB0aGFuIGJ5XG4gKiB0aGUgdmVyc2lvbiwgd2hpY2ggYSBjYW5hcnkgZG9lcyBub3Qgb3JkZXIsIG9yIGJ5IGl0cyBwcml2YXRlIGZpZWxkczogMTYuMy44XG4gKiBkZXN0cnVjdHVyZXMgYSBiYXJlIGBmYWxzZWAgaW50byBubyBgcm91dGVgIGFuZCB0aHJvd3MuIE9ubHkgdGhhdCB0aHJvd1xuICogc2VsZWN0cyB0aGUgbmV3ZXIgZm9ybTsgYW55IG90aGVyIGVycm9yIGZyb20gdGhlIGNvbnN0cnVjdG9yIGlzIHJldGhyb3duXG4gKiByYXRoZXIgdGhhbiByZWFkIGFzIGEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0ltYWdlUmVzcG9uc2VDYWNoZShcbiAgUmVzcG9uc2VDYWNoZTogTmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0sXG4pOiBJbnN0YW5jZVR5cGU8TmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0+IHtcbiAgY29uc3QgTGVnYWN5ID0gUmVzcG9uc2VDYWNoZSBhcyB1bmtub3duIGFzIG5ldyAoXG4gICAgbWluaW1hbE1vZGU6IGJvb2xlYW4sXG4gICkgPT4gSW5zdGFuY2VUeXBlPHR5cGVvZiBSZXNwb25zZUNhY2hlPjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IExlZ2FjeShmYWxzZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghU3RyaW5nKChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlKS5pbmNsdWRlcyhcInJlcXVpcmVzIGEgc291cmNlIHJvdXRlXCIpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVzcG9uc2VDYWNoZSh7IG1pbmltYWxNb2RlOiBmYWxzZSwgcm91dGU6IFwiaW1hZ2VcIiB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGBmb3JtYXREeW5hbWljSW1wb3J0UGF0aGAgZnJvbSBgbmV4dC9kaXN0L2xpYi9mb3JtYXQtZHluYW1pYy1pbXBvcnQtcGF0aC5qc2AsXG4gKiByZXN0YXRlZDogYG5leHQgYnVpbGRgIGRvZXNuJ3QgdHJhY2UgdGhhdCBtb2R1bGUgaW50byB0aGUgZGVwbG95bWVudCwgc29cbiAqIGxvYWRpbmcgaXQgZmFpbGVkIGV2ZXJ5IGltYWdlIHJlcXVlc3Qgd2l0aCB0aGUgY2FjaGUgb24uXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFuZGxlclVybChkaXN0RGlyOiBzdHJpbmcsIGNhY2hlSGFuZGxlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IGNhY2hlSGFuZGxlci5zdGFydHNXaXRoKFwiZmlsZTovL1wiKVxuICAgID8gZmlsZVVSTFRvUGF0aChjYWNoZUhhbmRsZXIpXG4gICAgOiBjYWNoZUhhbmRsZXI7XG4gIHJldHVybiBwYXRoVG9GaWxlVVJMKFxuICAgIGlzQWJzb2x1dGVQYXRoKHBhdGgpID8gcGF0aCA6IGpvaW4oZGlzdERpciwgcGF0aCksXG4gICkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBgaW1hZ2VzYCwgd2l0aCBpdHMgYHNldGAgbW92ZWQgb2ZmIHRoZSByZXNwb25zZSdzIGNyaXRpY2FsIHBhdGguXG4gKlxuICogYFJlc3BvbnNlQ2FjaGVgIGF3YWl0cyB0aGUgd3JpdGUgb2YgYSBmcmVzaGx5IG9wdGltaXplZCBpbWFnZSBiZWZvcmUgaXQgaGFuZHNcbiAqIHRoZSBpbWFnZSBiYWNrLCBzbyBldmVyeSBtaXNzIHBhaWQgYW4gUzMgYFB1dE9iamVjdGAgKH4zMCBtcyBtZWFzdXJlZCkgYmVmb3JlXG4gKiBpdHMgZmlyc3QgYnl0ZS4gVGhlIHdyaXRlIGlzIHJlZ2lzdGVyZWQgd2l0aCBgd2FpdFVudGlsYCBpbnN0ZWFkLCB3aGljaCB0aGVcbiAqIHJ1bnRpbWUgZHJhaW5zIGJlZm9yZSBhIExhbWJkYSBpbnZvY2F0aW9uIHJldHVybnMgb3IgYSBjb250YWluZXIgc2h1dHMgZG93bixcbiAqIHNvIGl0IHN0aWxsIGxhbmRzLiBBIGZhaWxlZCB3cml0ZSBpcyBsb2dnZWQ7IHRoZSBuZXh0IHJlcXVlc3Qgb3B0aW1pemVzIHRoZVxuICogaW1hZ2UgYWdhaW4sIHdoaWNoIGlzIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGFueXdheS5cbiAqL1xuZnVuY3Rpb24gZGVmZXJXcml0ZXMoXG4gIGltYWdlczogSW1hZ2VDYWNoZVtcImltYWdlc1wiXSxcbiAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbik6IEltYWdlQ2FjaGVbXCJpbWFnZXNcIl0ge1xuICBjb25zdCBkZWZlcnJlZCA9IE9iamVjdC5jcmVhdGUoaW1hZ2VzKSBhcyBJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdO1xuICBkZWZlcnJlZC5zZXQgPSAoLi4uYXJnczogUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdW1wic2V0XCJdPikgPT4ge1xuICAgIHdhaXRVbnRpbChcbiAgICAgIGltYWdlcy5zZXQoLi4uYXJncykuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2FjaGUgYW4gb3B0aW1pemVkIGltYWdlOlwiLCBlcnJvcik7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmVycmVkO1xufVxuXG5mdW5jdGlvbiBzZW5kVGV4dChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHN0YXR1c0NvZGU6IG51bWJlcixcbiAgYm9keTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW5cIik7XG4gIHJlcy5lbmQoYm9keSk7XG59XG5cbi8qKlxuICogVGhlIGltYWdlIGNvbmZpZyBjb21lcyBmcm9tIHRoZSBhcHAncyBvd24gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgbm90IHRoZVxuICogYWRhcHRlciBtYW5pZmVzdDogYGltYWdlT3B0aW1pemVyYCByZWFkcyB3aG9sZSBgZXhwZXJpbWVudGFsYCBhbmQgYGltYWdlc2BcbiAqIG9iamVjdHMsIGFuZCBtaXJyb3JpbmcgdGhvc2UgaW50byB0aGUgbWFuaWZlc3Qgd291bGQgYmUgYSBzZWNvbmQgZGVmaW5pdGlvbiBvZlxuICogdGhlIHNhbWUgdGhpbmcgdGhhdCBzaWxlbnRseSBnb2VzIHN0YWxlIG9uIGEgYG5leHRgIG1pbm9yLlxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VSdW50aW1lKHsgZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0IH06IEltYWdlT3B0aW1pemVyT3B0aW9ucykge1xuICBjb25zdCBuZXh0OiBOZXh0SW1hZ2VNb2R1bGVzID0ge1xuICAgIGNvbmZpZ1NoYXJlZDogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKSxcbiAgICBpbWFnZUNvbmZpZzogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy5qc1wiKSxcbiAgICBvcHRpbWl6ZXI6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL2ltYWdlLW9wdGltaXplci5qc1wiKSxcbiAgICBzZXJ2ZVN0YXRpYzogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpLFxuICB9O1xuICBjb25zdCBwYXRoID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICAgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiLFxuICApO1xuICBjb25zdCByZXF1aXJlZDogUmVxdWlyZWRTZXJ2ZXJGaWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmLThcIikpO1xuICBjb25zdCBuZXh0Q29uZmlnID0gbmV4dC5jb25maWdTaGFyZWQuZ2V0TmV4dENvbmZpZ1J1bnRpbWUocmVxdWlyZWQuY29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0LFxuICAgIG5leHRDb25maWcsXG4gICAgaW1hZ2VzQ29uZmlnOiB7XG4gICAgICAuLi5uZXh0LmltYWdlQ29uZmlnLmltYWdlQ29uZmlnRGVmYXVsdCxcbiAgICAgIC4uLm5leHRDb25maWcuaW1hZ2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpZEEsc0RBY0M7QUEvZEQsc0RBQXNEO0FBQ3REOzs7Ozs7OztHQVFHO0FBQ0gseUNBQStEO0FBQy9ELHVDQUF5QztBQUl6Qyw4Q0FBdUU7QUFDdkUsK0NBQStFO0FBQy9FLDhEQUEyRDtBQUUzRCxpREFBNEM7QUFDNUMsaUNBQThDO0FBa0Y5QyxNQUFhLHFCQUFxQjtJQUtJO0lBSm5CLEVBQUUsR0FBRyxJQUFBLGVBQVEsR0FBRSxDQUFDO0lBQ3pCLE1BQU0sQ0FBdUM7SUFDN0MsVUFBVSxDQUF1QjtJQUV6QyxZQUFvQyxPQUE4QjtRQUE5QixZQUFPLEdBQVAsT0FBTyxDQUF1QjtJQUFHLENBQUM7SUFFdEU7Ozs7OztPQU1HO0lBQ0ksU0FBUztRQUNkLDRFQUE0RTtRQUM1RSw4Q0FBOEM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDNUQsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQ2pCLEdBQXdCLEVBQ3hCLEdBQXVCLEVBQ3ZCLEdBQVEsRUFDUixTQUE4QztRQUU5Qyw2RUFBNkU7UUFDN0UsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLE1BQU0sRUFDSixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixj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LE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUztRQUM5QyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO0tBQ3hCLENBQUM7SUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKipcbiAqIGAvX25leHQvaW1hZ2VgLCBmb2xkZWQgaW50byB0aGUgcnVudGltZSBjb3JlLlxuICpcbiAqIFRoZSByZXNwb25zZSBpcyB3cml0dGVuIHRvIGEge0BsaW5rIFNoaW1TZXJ2ZXJSZXNwb25zZX0gcmF0aGVyIHRoYW4gc3RyYWlnaHQgdG9cbiAqIGEgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbSwgc28gaXQgY29tcG9zZXMgd2l0aCByb3V0aW5nOiBkaXNwYXRjaCBvbmx5IGNsYXNzaWZpZXNcbiAqIGEgcmVxdWVzdCBhcyBpbWFnZSBvcHRpbWl6YXRpb24gKmFmdGVyKiBtaWRkbGV3YXJlIGhhcyBoYWQgaXQsIHdoaWNoIGlzIHdoYXRcbiAqIG1ha2VzIGBOZXh0UmVzcG9uc2UucmV3cml0ZSgpYCBvbnRvIGFuIGltYWdlIHdvcmsuIFRoYXQgaXMgYWxzbyB3aHkgdGhlcmUgaXMgbm9cbiAqIGxvbmdlciBhIGRlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhIOKAlCBtaWRkbGV3YXJlIG5ldmVyIHJhbiBmb3IgaXQuXG4gKi9cbmltcG9ydCB7IGlzQWJzb2x1dGUgYXMgaXNBYnNvbHV0ZVBhdGgsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWdDb21wbGV0ZSB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2NvbmZpZy1zaGFyZWQuanNcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVkUm91dGVLaW5kIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGUvdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2hpbUluY29taW5nTWVzc2FnZSB9IGZyb20gXCIuL2h0dHAvcmVxdWVzdFwiO1xuaW1wb3J0IHsgYXNTZXJ2ZXJSZXNwb25zZSwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV0YWcsIGZldGNoRnJvbVMzLCByZXNvbHZlRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuL2ltYWdlLXV0aWxzXCI7XG5pbXBvcnQgeyBDREtfTkVYVEpTX1ZFUlNJT04gfSBmcm9tIFwiLi4vY2RrLW5leHRqcy12ZXJzaW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgbmV4dE1vZHVsZSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZSwgczNDbGllbnQgfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKlxuICogUmVxdWlyZWQgdGhyb3VnaCB7QGxpbmsgbmV4dE1vZHVsZX0gcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGJlY2F1c2UgYG5leHRgIGlzXG4gKiBleHRlcm5hbCB0byB0aGUgc2hlbGwgYnVuZGxlcyBhbmQgZG9lcyBub3QgcmVzb2x2ZSBmcm9tIHdoZXJlIHRoZXkgc2l0LiBFdmVyeVxuICogdHlwZSBoZXJlIGlzIHN0aWxsIHRoZSByZWFsIG9uZTogYHR5cGVvZiBpbXBvcnQoLi4uKWAgaXMgZXJhc2VkLlxuICovXG5pbnRlcmZhY2UgTmV4dEltYWdlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IG9wdGltaXplcjogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIpO1xuICByZWFkb25seSBzZXJ2ZVN0YXRpYzogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpO1xufVxuXG4vKiogVGhlIG1vZHVsZXMgb25seSB0aGUgaW1hZ2UgY2FjaGUgbmVlZHMsIGxvYWRlZCB3aXRoIGl0LiAqL1xuaW50ZXJmYWNlIE5leHRJbWFnZUNhY2hlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlQ2FjaGU6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpO1xufVxuXG4vKiogQSBgY2FjaGVIYW5kbGVyYCBjbGFzcywgYXMgYG5leHQuY29uZmlnYCdzIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBleHBvcnRzIGl0LiAqL1xudHlwZSBDYWNoZUhhbmRsZXJDbGFzcyA9IG5ldyAoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKSA9PiBOb25OdWxsYWJsZTxcbiAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID5bMF1bXCJjYWNoZUhhbmRsZXJcIl1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUVgLiBFbXB0eSB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrXG4gICAqIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIHdoaWNoIHNlbmRzIGV2ZXJ5IG9uZSB0byBgZmV0Y2hJbnRlcm5hbGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuIEVtcHR5IHdoZW4gdGhlIGFzc2V0cyBzaXQgYXQgdGhlIHJvb3RcbiAgICogb2YgdGhlIGJ1Y2tldCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRLZXlQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgbG9jYWwgc291cmNlIGZyb20gdGhlIGFwcCdzIG93biByb3V0ZXMsIGZvciBvbmUgUzMgaGFzIG5vIGZpbGVcbiAgICogZm9yOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyP2lkPTQyXCI+YCwgc2VydmVkIGJ5IGEgcm91dGUgaGFuZGxlci4gYG5leHRcbiAgICogc3RhcnRgIGZldGNoZXMgZXZlcnkgbG9jYWwgc291cmNlIHRoYXQgd2F5IChgZmV0Y2hJbnRlcm5hbEltYWdlYCk7IGhlcmUgaXRcbiAgICogaXMgdGhlIGZhbGxiYWNrLCBzaW5jZSBuZWFybHkgZXZlcnkgc291cmNlIGlzIGEgZmlsZSwgYW5kIGEgYEdldE9iamVjdGAgaXNcbiAgICogZmFyIGNoZWFwZXIgdGhhbiBhIHJvdXRlIGludm9jYXRpb24uXG4gICAqXG4gICAqIEdpdmVuIHRoZSByZXF1ZXN0IGJlaW5nIG9wdGltaXplZCwgZm9yIGl0cyBhdXRob3JpdHk7IGxpa2UgYG5leHQgc3RhcnRgLFxuICAgKiB0aGUgdmlld2VyJ3MgY29va2llcyBhbmQgb3RoZXIgaGVhZGVycyBhcmUgbm90IHRoZSBpbXBsZW1lbnRhdGlvbidzIHRvXG4gICAqIGZvcndhcmQuIEFuZCBnaXZlbiBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCBwYXN0IHdoaWNoIGl0IHN0b3BzXG4gICAqIHJlYWRpbmcgYW5kIGFuc3dlcnMge0BsaW5rIEludGVybmFsSW1hZ2VSZXNwb25zZS50b29MYXJnZX0uXG4gICAqL1xuICByZWFkb25seSBmZXRjaEludGVybmFsOiAoXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICkgPT4gUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+O1xuICAvKipcbiAgICogTG9hZHMgdGhlIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBmcm9tIGl0cyBmaWxlIFVSTC4gQSBzZWFtIGZvciB0ZXN0cywgd2hpY2hcbiAgICogcnVuIGFzIENvbW1vbkpTIGFuZCBjYW5ub3QgYGltcG9ydCgpYCBhIFVSTC5cbiAgICogQGRlZmF1bHQgLSBgaW1wb3J0KClgXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRNb2R1bGU/OiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBUaGUgcmVzcG9uc2Uge0BsaW5rIEltYWdlT3B0aW1pemVyT3B0aW9ucy5mZXRjaEludGVybmFsfSBnb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsSW1hZ2VSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgcmVhZG9ubHkgYm9keTogQnVmZmVyO1xuICAvKipcbiAgICogVGhlIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXAgd2hvc2UgcGFja2FnZSBoYXMgdGhlIHJvdXRlIHRoYXQgc2VydmVzIHRoZVxuICAgKiBzb3VyY2UsIHdoZW4gaXQgaXMgbm90IHRoaXMgZnVuY3Rpb24nczogdGhlcmUgaXMgbm8gcmVzcG9uc2UgdG8gdXNlLCBhbmRcbiAgICogdGhlIG9wdGltaXplciBhbnN3ZXJzIGFuIGV4cGxpY2l0IDUwMiByYXRoZXIgdGhhbiBhIFwibm90IGEgdmFsaWQgaW1hZ2VcIi5cbiAgICovXG4gIHJlYWRvbmx5IG90aGVyR3JvdXA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBwYXNzZWQgYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgc28gaXQgd2FzIGN1dCBvZmY6IGEgNDEzLCBhc1xuICAgKiBgbmV4dCBzdGFydGAgYW5zd2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IHRvb0xhcmdlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVJbWFnZU9wdGltaXplciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgczMgPSBzM0NsaWVudCgpO1xuICBwcml2YXRlIGxvYWRlZD86IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+O1xuICBwcml2YXRlIGltYWdlQ2FjaGU/OiBQcm9taXNlPEltYWdlQ2FjaGU+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEltYWdlT3B0aW1pemVyT3B0aW9ucykge31cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXBwIHNlcnZlcyBgL19uZXh0L2ltYWdlYCBhdCBhbGwuIGBuZXh0IHN0YXJ0YCBhbnN3ZXJzIDQwNFxuICAgKiB3aGVuIGBpbWFnZXMudW5vcHRpbWl6ZWRgIGlzIHNldCBvciBhIG5vbi1kZWZhdWx0IGBsb2FkZXJgIGlzIGNvbmZpZ3VyZWRcbiAgICogKGBuZXh0LXNlcnZlci5qc2ApLCBhbmQgc28gZG9lcyB0aGUgcnVudGltZTogb3RoZXJ3aXNlIGFueW9uZSBjYW4gbWFrZSB0aGVcbiAgICogY29tcHV0ZSBydW4gc2hhcnAgYW5kIHdyaXRlIHRoZSBpbWFnZSBjYWNoZSBvbiBhbiBlbmRwb2ludCB0aGUgYXBwIHR1cm5lZFxuICAgKiBvZmYuXG4gICAqL1xuICBwdWJsaWMgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIC8vIEZyb20gdGhlIG1hbmlmZXN0IGFsb25lOiBhbiBhcHAgdGhhdCB0dXJuZWQgaW1hZ2VzIG9mZiBzaG91bGRuJ3QgbG9hZCB0aGVcbiAgICAvLyBvcHRpbWl6ZXIgKGFuZCBgc2hhcnBgKSBqdXN0IHRvIGFuc3dlciA0MDQuXG4gICAgY29uc3QgaW1hZ2VzID0gbWFuaWZlc3RJbWFnZXModGhpcy5vcHRpb25zLm1hbmlmZXN0KTtcbiAgICByZXR1cm4gaW1hZ2VzLmxvYWRlciA9PT0gXCJkZWZhdWx0XCIgJiYgIWltYWdlcy51bm9wdGltaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmVkIG9uIHRoZSBmaXJzdCBpbWFnZSByZXF1ZXN0IHJhdGhlciB0aGFuIGF0IGNvbGQgc3RhcnQ6IGFuIGFwcCB3aXRoXG4gICAgLy8gbm8gYDxJbWFnZT5gIHNob3VsZCBub3QgcGF5IGZvciB0aGUgYG5leHRgIG1vZHVsZSBsb2Fkcy5cbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZyB9ID0gdGhpcy5sb2FkZWQ7XG4gICAgY29uc3QgaW1hZ2VzQ29uZmlnID0gbmV4dENvbmZpZy5pbWFnZXM7XG4gICAgY29uc3Qge1xuICAgICAgSW1hZ2VFcnJvcixcbiAgICAgIEltYWdlT3B0aW1pemVyQ2FjaGUsXG4gICAgICBmZXRjaEV4dGVybmFsSW1hZ2UsXG4gICAgICBpbWFnZU9wdGltaXplcixcbiAgICAgIHNlbmRSZXNwb25zZSxcbiAgICB9ID0gbmV4dC5vcHRpbWl6ZXI7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gSW1hZ2VPcHRpbWl6ZXJDYWNoZS52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgcmVxIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczxcbiAgICAgICAgICB0eXBlb2YgSW1hZ2VPcHRpbWl6ZXJDYWNoZS52YWxpZGF0ZVBhcmFtc1xuICAgICAgICA+WzBdLFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXModXJsLnNlYXJjaFBhcmFtcyksXG4gICAgICAgIG5leHRDb25maWcsXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGlmIChcImVycm9yTWVzc2FnZVwiIGluIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gc2VuZFRleHQocmVzLCA0MDAsIHBhcmFtcy5lcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGhyZWYsIGlzQWJzb2x1dGUgfSA9IHBhcmFtcztcbiAgICAgIGNvbnN0IG9wdGltaXplID0gYXN5bmMgKHByZXZpb3VzQ2FjaGVFbnRyeT86IFByZXZpb3VzSW1hZ2VFbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCB1cHN0cmVhbSA9IGlzQWJzb2x1dGVcbiAgICAgICAgICA/IGF3YWl0IGZldGNoRXh0ZXJuYWxJbWFnZShcbiAgICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgICAgaW1hZ2VzQ29uZmlnLmRhbmdlcm91c2x5QWxsb3dMb2NhbElQLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgICAgICAgaW1hZ2VzQ29uZmlnLm1heGltdW1SZWRpcmVjdHMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLmZldGNoTG9jYWwoXG4gICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgICAgbmV4dENvbmZpZyxcbiAgICAgICAgICAgICAgaW1hZ2VzQ29uZmlnLm1heGltdW1SZXNwb25zZUJvZHksXG4gICAgICAgICAgICAgIG5leHQub3B0aW1pemVyLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBvcHRpbWl6ZWQgPSBhd2FpdCBpbWFnZU9wdGltaXplcihcbiAgICAgICAgICB1cHN0cmVhbSxcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhwZXJpbWVudGFsOiBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbCxcbiAgICAgICAgICAgIGltYWdlczoge1xuICAgICAgICAgICAgICBkYW5nZXJvdXNseUFsbG93U1ZHOiBpbWFnZXNDb25maWcuZGFuZ2Vyb3VzbHlBbGxvd1NWRyxcbiAgICAgICAgICAgICAgbWluaW11bUNhY2hlVFRMOiBpbWFnZXNDb25maWcubWluaW11bUNhY2hlVFRMLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgaXNEZXY6IGZhbHNlLCBwcmV2aW91c0NhY2hlRW50cnkgfSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBgaW1hZ2VPcHRpbWl6ZXJgIHJlcG9ydHMgYSBmYWlsZWQgb3B0aW1pemF0aW9uIGJ5IHJldHVybmluZyB0aGVcbiAgICAgICAgLy8gdW50b3VjaGVkIHVwc3RyZWFtIGltYWdlIGFsb25nc2lkZSBgZXJyb3JgIHJhdGhlciB0aGFuIHRocm93aW5nLCBzb1xuICAgICAgICAvLyB3aXRob3V0IHRoaXMgYSBicm9rZW4gYHNoYXJwYCBpbnN0YWxsIHNlcnZlcyBmdWxsLXNpemUgb3JpZ2luYWxzIHdpdGhcbiAgICAgICAgLy8gYSAyMDAgaW5kZWZpbml0ZWx5IGFuZCBub3RoaW5nIGluIHRoZSBsb2dzIHNheXMgd2h5LlxuICAgICAgICBpZiAob3B0aW1pemVkLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gb3B0aW1pemUgJHtocmVmfSwgc2VydmluZyB0aGUgdW5vcHRpbWl6ZWQgb3JpZ2luYWw6YCxcbiAgICAgICAgICAgIG9wdGltaXplZC5lcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpbWl6ZWQ7XG4gICAgICB9O1xuXG4gICAgICAvLyBOZXh0J3Mgb3duIHJlc3BvbnNlIHdyaXRlciwgcmF0aGVyIHRoYW4gYSByZXN0YXRlbWVudCBvZiBpdCwgc28gdGhlXG4gICAgICAvLyBoZWFkZXJzIGBuZXh0IHN0YXJ0YCBzZW5kcyBjb21lIHdpdGggaXQ6IHRoZSB5ZWFyLWxvbmcgYGltbXV0YWJsZWAgZm9yXG4gICAgICAvLyBhIGAvX25leHQvc3RhdGljL21lZGlhYCBzcmMsIGBJZi1Ob25lLU1hdGNoYCBhcyBgZnJlc2hgIHJlYWRzIGl0ICh3ZWFrXG4gICAgICAvLyBhbmQgbGlzdGVkIHRhZ3MsIGBDYWNoZS1Db250cm9sOiBuby1jYWNoZWApLCBhIGBDb250ZW50LURpc3Bvc2l0aW9uYFxuICAgICAgLy8gdGhhdCBSRkMgNTk4Ny1lbmNvZGVzIGEgZmlsZW5hbWUgYHdyaXRlSGVhZGAgd291bGQgcmVqZWN0IGFzXG4gICAgICAvLyBub24tbGF0aW4xLCBgQ29udGVudC1MZW5ndGhgLCBhbmQgbm8gYm9keSBmb3IgSEVBRC4gVGhlIHJlc3RhdGVkXG4gICAgICAvLyB2ZXJzaW9uIGhhZCBkcmlmdGVkIG9uIGV2ZXJ5IG9uZSBvZiB0aG9zZS5cbiAgICAgIGNvbnN0IHNlbmQgPSAoXG4gICAgICAgIGV4dGVuc2lvbjogc3RyaW5nLFxuICAgICAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICAgICAgZXRhZzogc3RyaW5nLFxuICAgICAgICB4Q2FjaGU6IFwiTUlTU1wiIHwgXCJISVRcIiB8IFwiU1RBTEVcIixcbiAgICAgICAgbWF4QWdlOiBudW1iZXIsXG4gICAgICApID0+IHtcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgIHNlbmRSZXNwb25zZShcbiAgICAgICAgICByZXEgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBzZW5kUmVzcG9uc2U+WzBdLFxuICAgICAgICAgIGFzU2VydmVyUmVzcG9uc2UocmVzKSxcbiAgICAgICAgICBocmVmLFxuICAgICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgZXRhZyxcbiAgICAgICAgICBwYXJhbXMuaXNTdGF0aWMsXG4gICAgICAgICAgeENhY2hlLFxuICAgICAgICAgIGltYWdlc0NvbmZpZyxcbiAgICAgICAgICBtYXhBZ2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG4gICAgICB9O1xuXG4gICAgICAvLyBgbmV4dCBzdGFydGAncyBgaGFuZGxlTmV4dEltYWdlUmVxdWVzdGAsIHN0ZXAgZm9yIHN0ZXA6IGFcbiAgICAgIC8vIGBSZXNwb25zZUNhY2hlYCBvdmVyIGFuIGBJbWFnZU9wdGltaXplckNhY2hlYCBiYWNrZWQgYnkgdGhlIGFwcCdzXG4gICAgICAvLyBgY2FjaGVIYW5kbGVyYCwgc28gYSBoaXQgc2tpcHMgdGhlIGZldGNoIGFuZCBgc2hhcnBgLCBhIHN0YWxlIGVudHJ5IGlzXG4gICAgICAvLyBzZXJ2ZWQgd2hpbGUgaXQgaXMgcmVnZW5lcmF0ZWQsIGFuZCBjb25jdXJyZW50IG1pc3NlcyBmb3Igb25lIGltYWdlXG4gICAgICAvLyBvcHRpbWl6ZSBpdCBvbmNlLiBUaGUgYXBwJ3MgYGNhY2hlSGFuZGxlcmAgaXMgdGhlIFMzIGNhY2hlLCB3aGljaCB0aGVcbiAgICAgIC8vIGFkYXB0ZXIgdHVybnMgb24gd2l0aCBgaW1hZ2VzLmN1c3RvbUNhY2hlSGFuZGxlcmA6IHdpdGggbm8gQ0ROIGluIGZyb250XG4gICAgICAvLyAodGhlIFJlZ2lvbmFsIHR5cGVzKSBldmVyeSByZXF1ZXN0IHdvdWxkIG90aGVyd2lzZSBydW4gYHNoYXJwYCBhZ2FpbixcbiAgICAgIC8vIGFuZCBiZWhpbmQgQ2xvdWRGcm9udCBlYWNoIGVkZ2UgbWlzcyBpcyBhbiBTMyByZWFkIGluc3RlYWQuXG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHRoaXMubG9hZENhY2hlKHRoaXMubG9hZGVkKTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgY2FjaGUucmVzcG9uc2VzLmdldChcbiAgICAgICAgSW1hZ2VPcHRpbWl6ZXJDYWNoZS5nZXRDYWNoZUtleShwYXJhbXMpLFxuICAgICAgICBhc3luYyAoeyBwcmV2aW91c0NhY2hlRW50cnkgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgYnVmZmVyLCBjb250ZW50VHlwZSwgbWF4QWdlLCBldGFnLCB1cHN0cmVhbUV0YWcgfSA9XG4gICAgICAgICAgICBhd2FpdCBvcHRpbWl6ZShwcmV2aW91c0NhY2hlRW50cnkgYXMgUHJldmlvdXNJbWFnZUVudHJ5KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAga2luZDogSU1BR0VfS0lORCxcbiAgICAgICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgICAgICBldGFnLFxuICAgICAgICAgICAgICBleHRlbnNpb246IG5leHQuc2VydmVTdGF0aWMuZ2V0RXh0ZW5zaW9uKGNvbnRlbnRUeXBlKSA/PyBcIlwiLFxuICAgICAgICAgICAgICB1cHN0cmVhbUV0YWcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiB7IHJldmFsaWRhdGU6IG1heEFnZSwgZXhwaXJlOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGVLaW5kOiBJTUFHRV9LSU5ELFxuICAgICAgICAgIGluY3JlbWVudGFsQ2FjaGU6IGRlZmVyV3JpdGVzKGNhY2hlLmltYWdlcywgd2FpdFVudGlsKSxcbiAgICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgICAvLyBBIHN0YWxlIGVudHJ5IGlzIHNlcnZlZCBhdCBvbmNlIGFuZCByZWdlbmVyYXRlZCBpbiB0aGUgYmFja2dyb3VuZDtcbiAgICAgICAgICAvLyB3aXRob3V0IHRoaXMsIGEgTGFtYmRhIGNvdWxkIGZyZWV6ZSB3aXRoIHRoZSByZWdlbmVyYXRpb24gaGFsZiBkb25lLlxuICAgICAgICAgIHdhaXRVbnRpbCxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8SW1hZ2VDYWNoZVtcInJlc3BvbnNlc1wiXVtcImdldFwiXT5bMl0sXG4gICAgICApO1xuICAgICAgLy8gQSBmYWlsZWQgcmVuZGVyLCBmcm9tIG5leHQgMTYuNDsgYG5leHQtc2VydmVyLmpzYCByZXRocm93cyBpdCB0aGUgc2FtZVxuICAgICAgLy8gd2F5LiBUaGUgZ2VuZXJhdG9yIGFib3ZlIHRocm93cyBpbnN0ZWFkLCBzbyB0aGlzIGlzIHRoZSB0eXBlJ3MgY2FzZS5cbiAgICAgIGlmIChlbnRyeSAmJiBcImVycm9yXCIgaW4gZW50cnkpIHtcbiAgICAgICAgdGhyb3cgZW50cnkuZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5Py52YWx1ZSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGtpbmQ6IHN0cmluZztcbiAgICAgICAgICAgIGV4dGVuc2lvbjogc3RyaW5nO1xuICAgICAgICAgICAgYnVmZmVyOiBCdWZmZXI7XG4gICAgICAgICAgICBldGFnOiBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodmFsdWU/LmtpbmQgIT09IElNQUdFX0tJTkQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGltYWdlIGNhY2hlIHJldHVybmVkIG5vIGltYWdlIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgc2VuZChcbiAgICAgICAgdmFsdWUuZXh0ZW5zaW9uLFxuICAgICAgICB2YWx1ZS5idWZmZXIsXG4gICAgICAgIHZhbHVlLmV0YWcsXG4gICAgICAgIGVudHJ5IS5pc01pc3MgPyBcIk1JU1NcIiA6IGVudHJ5IS5pc1N0YWxlID8gXCJTVEFMRVwiIDogXCJISVRcIixcbiAgICAgICAgZW50cnkhLmNhY2hlQ29udHJvbD8ucmV2YWxpZGF0ZSB8fCAwLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgeyBzdGF0dXNDb2RlLCBtZXNzYWdlIH0gPSByZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvciwgSW1hZ2VFcnJvcik7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA+PSA1MDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkltYWdlIG9wdGltaXphdGlvbiBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHNlbmRUZXh0KHJlcywgc3RhdHVzQ29kZSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2aWN0ZWQgb24gZmFpbHVyZSwgYXMgYEVudHJ5cG9pbnRSZWdpc3RyeS5sb2FkYCBldmljdHMgYSBmYWlsZWQgbW9kdWxlIGxvYWQ6XG4gICAqIGEgdHJhbnNpZW50IGZhaWx1cmUgaW1wb3J0aW5nIHRoZSBgY2FjaGVIYW5kbGVyYCAoRU1GSUxFIHVuZGVyIGEgY29sZC1zdGFydFxuICAgKiBidXJzdCkgd291bGQgb3RoZXJ3aXNlIDUwMCBldmVyeSBpbWFnZSByZXF1ZXN0IHVudGlsIHRoZSBzYW5kYm94IHJlY3ljbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ2FjaGUoXG4gICAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbiAgKTogUHJvbWlzZTxJbWFnZUNhY2hlPiB7XG4gICAgaWYgKCF0aGlzLmltYWdlQ2FjaGUpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gbG9hZEltYWdlQ2FjaGUodGhpcy5vcHRpb25zLCBsb2FkZWQpO1xuICAgICAgdGhpcy5pbWFnZUNhY2hlID0gY2FjaGU7XG4gICAgICBjYWNoZS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlQ2FjaGUgPT09IGNhY2hlKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hMb2NhbChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIG5leHRDb25maWc6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+W1wibmV4dENvbmZpZ1wiXSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICAgb3B0aW1pemVyOiBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdLFxuICApIHtcbiAgICBjb25zdCB7IGJ1Y2tldCwgZmV0Y2hJbnRlcm5hbCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIC8vIE5vIGJ1Y2tldCB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIGFuZFxuICAgIC8vIHRoZSByb3V0ZXMgc2VydmUgdGhvc2UgYXMgdGhleSBzZXJ2ZSBhbnl0aGluZyBTMyBoYXMgbm8gZmlsZSBmb3IuXG4gICAgaWYgKGJ1Y2tldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICAgICAgdGhpcy5zMyxcbiAgICAgICAgICBidWNrZXQsXG4gICAgICAgICAgaHJlZixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cmxCYXNlUGF0aDogbmV4dENvbmZpZy5iYXNlUGF0aCxcbiAgICAgICAgICAgIGtleVByZWZpeDogdGhpcy5vcHRpb25zLmJ1Y2tldEtleVByZWZpeCxcbiAgICAgICAgICAgIGFzc2V0UHJlZml4OiBuZXh0Q29uZmlnLmFzc2V0UHJlZml4LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBidWZmZXI6IHJlc3VsdC5idWZmZXIsXG4gICAgICAgICAgY29udGVudFR5cGU6IHJlc3VsdC5jb250ZW50VHlwZSxcbiAgICAgICAgICBjYWNoZUNvbnRyb2w6IG51bGwsXG4gICAgICAgICAgLy8gRW5jb2RlZCBhcyBmb3IgYSByb3V0ZSdzIHJlc3BvbnNlOiBgZmV0Y2hJbnRlcm5hbEltYWdlYCBkb2VzIHRvby5cbiAgICAgICAgICBldGFnOiBleHRyYWN0RXRhZyhyZXN1bHQuZXRhZywgcmVzdWx0LmJ1ZmZlciksXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSBcIk5vU3VjaEtleVwiO1xuICAgICAgICBpZiAoIW1pc3NpbmcpIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoYXQgYGZldGNoSW50ZXJuYWxJbWFnZWAgY2hlY2tzLCBhbmQgdGhyb3dzLCBmb3IgdGhlIHNhbWUgcmVzcG9uc2UuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bVJlc3BvbnNlQm9keSk7XG4gICAgaWYgKHJlc3BvbnNlLm90aGVyR3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSBkZXBsb3ltZW50IHByb2JsZW0sIG5vdCBhIGJhZCBgdXJsYDogbGVhdmUgdGhlIHJvdXRlIGluIHRoZSBkZWZhdWx0XG4gICAgICAvLyBncm91cCwgb3Igc2VydmUgdGhlIGltYWdlIGFzIGEgZmlsZSAocHVibGljLyBvciBhIHN0YXRpYyBpbXBvcnQpLlxuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA1MDIsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaXRzIHNvdXJjZSBpcyBhIHJvdXRlIGluIGFub3RoZXIgJyArXG4gICAgICAgICAgYGZ1bmN0aW9uR3JvdXBzIGdyb3VwIChcIiR7cmVzcG9uc2Uub3RoZXJHcm91cH1cIiksIHdoaWNoIHRoZSBpbWFnZSBgICtcbiAgICAgICAgICBcIm9wdGltaXplciBjYW5ub3QgZmV0Y2hcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS50b29MYXJnZSkge1xuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA0MTMsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLnN0YXR1c0NvZGUgfHwgcmVzcG9uc2UuYm9keS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBvcHRpbWl6ZXIuSW1hZ2VFcnJvcihcbiAgICAgICAgNDAwLFxuICAgICAgICAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgdmFsaWQgYnV0IGludGVybmFsIHJlc3BvbnNlIGlzIGludmFsaWQnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcjogcmVzcG9uc2UuYm9keSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmaXJzdFZhbHVlKHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pID8/IG51bGwsXG4gICAgICBjYWNoZUNvbnRyb2w6IGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pID8/IG51bGwsXG4gICAgICBldGFnOiBleHRyYWN0RXRhZyhcbiAgICAgICAgZmlyc3RWYWx1ZShyZXNwb25zZS5oZWFkZXJzLmV0YWcpID8/IG51bGwsXG4gICAgICAgIHJlc3BvbnNlLmJvZHksXG4gICAgICApLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBgQ2FjaGVkUm91dGVLaW5kLklNQUdFYCwgd2hpY2ggaXMgYWxzbyBgUm91dGVLaW5kLklNQUdFYC4gUmVzdGF0ZWQ6IHRoZSBlbnVtIGlzXG4gKiBhIHJ1bnRpbWUgdmFsdWUgb2YgYG5leHRgLCB3aGljaCB0aGUgYnVuZGxlIGNhbm5vdCBpbXBvcnQuXG4gKi9cbmNvbnN0IElNQUdFX0tJTkQgPSBcIklNQUdFXCIgYXMgQ2FjaGVkUm91dGVLaW5kLklNQUdFO1xuXG4vKiogYGltYWdlT3B0aW1pemVyYCdzIGBwcmV2aW91c0NhY2hlRW50cnlgLiAqL1xudHlwZSBQcmV2aW91c0ltYWdlRW50cnkgPSBQYXJhbWV0ZXJzPFxuICBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdW1wiaW1hZ2VPcHRpbWl6ZXJcIl1cbj5bM11bXCJwcmV2aW91c0NhY2hlRW50cnlcIl07XG5cbmludGVyZmFjZSBJbWFnZUNhY2hlIHtcbiAgcmVhZG9ubHkgcmVzcG9uc2VzOiBJbnN0YW5jZVR5cGU8XG4gICAgTmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl1cbiAgPjtcbiAgcmVhZG9ubHkgaW1hZ2VzOiBJbnN0YW5jZVR5cGU8XG4gICAgTmV4dEltYWdlTW9kdWxlc1tcIm9wdGltaXplclwiXVtcIkltYWdlT3B0aW1pemVyQ2FjaGVcIl1cbiAgPjtcbn1cblxuLyoqXG4gKiBUaGUgYXBwJ3MgYGNhY2hlSGFuZGxlcmAsIGNvbnN0cnVjdGVkIHRoZSB3YXkgYG5leHQgc3RhcnRgIGNvbnN0cnVjdHMgaXQgZm9yXG4gKiBpbWFnZXMgKGBuZXh0LXNlcnZlci5qc2AsIGBoYW5kbGVOZXh0SW1hZ2VSZXF1ZXN0YCk6IG9uY2UsIGFuZCBrZXB0LCBzbyBpdHNcbiAqIGluLW1lbW9yeSBsYXllciBsYXN0cyBhY3Jvc3MgcmVxdWVzdHMuIEl0cyBwYXRoIGluIHRoZSBtYW5pZmVzdCBpcyByZWxhdGl2ZVxuICogdG8gdGhlIGRpc3QgZGlyOyBzZWUge0BsaW5rIGNhY2hlSGFuZGxlclVybH0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZUNhY2hlKFxuICB7IGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCwgaW1wb3J0TW9kdWxlIH06IEltYWdlT3B0aW1pemVyT3B0aW9ucyxcbiAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbik6IFByb21pc2U8SW1hZ2VDYWNoZT4ge1xuICBjb25zdCB7IG5leHQsIG5leHRDb25maWcgfSA9IGxvYWRlZDtcbiAgY29uc3QgbW9kdWxlczogTmV4dEltYWdlQ2FjaGVNb2R1bGVzID0ge1xuICAgIHJlc3BvbnNlQ2FjaGU6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpLFxuICB9O1xuICBjb25zdCBkaXN0RGlyID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICk7XG4gIGxldCBjYWNoZUhhbmRsZXI6IEluc3RhbmNlVHlwZTxDYWNoZUhhbmRsZXJDbGFzcz4gfCB1bmRlZmluZWQ7XG4gIGlmIChuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcikge1xuICAgIGNvbnN0IHVybCA9IGNhY2hlSGFuZGxlclVybChkaXN0RGlyLCBuZXh0Q29uZmlnLmNhY2hlSGFuZGxlcik7XG4gICAgY29uc3QgaW1wb3J0ZWQgPSAoYXdhaXQgKGltcG9ydE1vZHVsZVxuICAgICAgPyBpbXBvcnRNb2R1bGUodXJsKVxuICAgICAgOiBpbXBvcnQodXJsKSkpIGFzIHsgZGVmYXVsdD86IENhY2hlSGFuZGxlckNsYXNzIH0gJiBDYWNoZUhhbmRsZXJDbGFzcztcbiAgICBjb25zdCBDYWNoZUhhbmRsZXIgPSBpbXBvcnRlZC5kZWZhdWx0ID8/IGltcG9ydGVkO1xuICAgIGNhY2hlSGFuZGxlciA9IG5ldyBDYWNoZUhhbmRsZXIoe1xuICAgICAgZGV2OiBmYWxzZSxcbiAgICAgIGZsdXNoVG9EaXNrOiBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbC5pc3JGbHVzaFRvRGlzayxcbiAgICAgIHNlcnZlckRpc3REaXI6IGpvaW4oZGlzdERpciwgXCJzZXJ2ZXJcIiksXG4gICAgICBtYXhNZW1vcnlDYWNoZVNpemU6IG5leHRDb25maWcuY2FjaGVNYXhNZW1vcnlTaXplLFxuICAgICAgcmV2YWxpZGF0ZWRUYWdzOiBbXSxcbiAgICAgIF9yZXF1ZXN0SGVhZGVyczoge30sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZXM6IG5ld0ltYWdlUmVzcG9uc2VDYWNoZShtb2R1bGVzLnJlc3BvbnNlQ2FjaGUuZGVmYXVsdCksXG4gICAgaW1hZ2VzOiBuZXcgbmV4dC5vcHRpbWl6ZXIuSW1hZ2VPcHRpbWl6ZXJDYWNoZSh7XG4gICAgICBkaXN0RGlyLFxuICAgICAgbmV4dENvbmZpZyxcbiAgICAgIGNhY2hlSGFuZGxlcixcbiAgICB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBgbmV3IFJlc3BvbnNlQ2FjaGUoLi4uKWAgZm9yIGltYWdlcywgb24gZWl0aGVyIHNpZGUgb2YgbmV4dCAxNi4zLjguIEJlZm9yZVxuICogaXQgdGhlIGNvbnN0cnVjdG9yIHRvb2sgYG1pbmltYWxNb2RlYDsgZnJvbSBpdCwgYHsgbWluaW1hbE1vZGUsIHJvdXRlIH1gLCBhbmRcbiAqIGl0IHRocm93cyB3aXRob3V0IGEgYHJvdXRlYCAtIGBuZXh0LXNlcnZlci5qc2AgcGFzc2VzIGBcImltYWdlXCJgLiBOZWl0aGVyIGZvcm1cbiAqIGNhbiBzdGFuZCBpbiBmb3IgdGhlIG90aGVyOiBhbiBvbGRlciBgbmV4dGAgdGFrZXMgdGhlIG9wdGlvbnMgb2JqZWN0IGFzIGFcbiAqIHRydXRoeSBgbWluaW1hbE1vZGVgLCBhbmQgMTYuMy44IHJlamVjdHMgYSBiYXJlIGBmYWxzZWAuXG4gKlxuICogVG9sZCBhcGFydCBieSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIHRoZSBvbGRlciBmb3JtIHJhdGhlciB0aGFuIGJ5XG4gKiB0aGUgdmVyc2lvbiwgd2hpY2ggYSBjYW5hcnkgZG9lcyBub3Qgb3JkZXIsIG9yIGJ5IGl0cyBwcml2YXRlIGZpZWxkczogMTYuMy44XG4gKiBkZXN0cnVjdHVyZXMgYSBiYXJlIGBmYWxzZWAgaW50byBubyBgcm91dGVgIGFuZCB0aHJvd3MuIE9ubHkgdGhhdCB0aHJvd1xuICogc2VsZWN0cyB0aGUgbmV3ZXIgZm9ybTsgYW55IG90aGVyIGVycm9yIGZyb20gdGhlIGNvbnN0cnVjdG9yIGlzIHJldGhyb3duXG4gKiByYXRoZXIgdGhhbiByZWFkIGFzIGEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5ld0ltYWdlUmVzcG9uc2VDYWNoZShcbiAgUmVzcG9uc2VDYWNoZTogTmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0sXG4pOiBJbnN0YW5jZVR5cGU8TmV4dEltYWdlQ2FjaGVNb2R1bGVzW1wicmVzcG9uc2VDYWNoZVwiXVtcImRlZmF1bHRcIl0+IHtcbiAgY29uc3QgTGVnYWN5ID0gUmVzcG9uc2VDYWNoZSBhcyB1bmtub3duIGFzIG5ldyAoXG4gICAgbWluaW1hbE1vZGU6IGJvb2xlYW4sXG4gICkgPT4gSW5zdGFuY2VUeXBlPHR5cGVvZiBSZXNwb25zZUNhY2hlPjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IExlZ2FjeShmYWxzZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghU3RyaW5nKChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlKS5pbmNsdWRlcyhcInJlcXVpcmVzIGEgc291cmNlIHJvdXRlXCIpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVzcG9uc2VDYWNoZSh7IG1pbmltYWxNb2RlOiBmYWxzZSwgcm91dGU6IFwiaW1hZ2VcIiB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGBmb3JtYXREeW5hbWljSW1wb3J0UGF0aGAgZnJvbSBgbmV4dC9kaXN0L2xpYi9mb3JtYXQtZHluYW1pYy1pbXBvcnQtcGF0aC5qc2AsXG4gKiByZXN0YXRlZDogYG5leHQgYnVpbGRgIGRvZXNuJ3QgdHJhY2UgdGhhdCBtb2R1bGUgaW50byB0aGUgZGVwbG95bWVudCwgc29cbiAqIGxvYWRpbmcgaXQgZmFpbGVkIGV2ZXJ5IGltYWdlIHJlcXVlc3Qgd2l0aCB0aGUgY2FjaGUgb24uIE5vIGBmaWxlOi8vYCBjYXNlOlxuICogdGhlIGFkYXB0ZXIgYWxyZWFkeSB0dXJuZWQgb25lIGludG8gYSBwYXRoIChgZGlzdFJlbGF0aXZlQ2FjaGVIYW5kbGVyYCkuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFuZGxlclVybChkaXN0RGlyOiBzdHJpbmcsIGNhY2hlSGFuZGxlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwoXG4gICAgaXNBYnNvbHV0ZVBhdGgoY2FjaGVIYW5kbGVyKSA/IGNhY2hlSGFuZGxlciA6IGpvaW4oZGlzdERpciwgY2FjaGVIYW5kbGVyKSxcbiAgKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIGBpbWFnZXNgLCB3aXRoIGl0cyBgc2V0YCBtb3ZlZCBvZmYgdGhlIHJlc3BvbnNlJ3MgY3JpdGljYWwgcGF0aC5cbiAqXG4gKiBgUmVzcG9uc2VDYWNoZWAgYXdhaXRzIHRoZSB3cml0ZSBvZiBhIGZyZXNobHkgb3B0aW1pemVkIGltYWdlIGJlZm9yZSBpdCBoYW5kc1xuICogdGhlIGltYWdlIGJhY2ssIHNvIGV2ZXJ5IG1pc3MgcGFpZCBhbiBTMyBgUHV0T2JqZWN0YCAofjMwIG1zIG1lYXN1cmVkKSBiZWZvcmVcbiAqIGl0cyBmaXJzdCBieXRlLiBUaGUgd3JpdGUgaXMgcmVnaXN0ZXJlZCB3aXRoIGB3YWl0VW50aWxgIGluc3RlYWQsIHdoaWNoIHRoZVxuICogcnVudGltZSBkcmFpbnMgYmVmb3JlIGEgTGFtYmRhIGludm9jYXRpb24gcmV0dXJucyBvciBhIGNvbnRhaW5lciBzaHV0cyBkb3duLFxuICogc28gaXQgc3RpbGwgbGFuZHMuIEEgZmFpbGVkIHdyaXRlIGlzIGxvZ2dlZDsgdGhlIG5leHQgcmVxdWVzdCBvcHRpbWl6ZXMgdGhlXG4gKiBpbWFnZSBhZ2Fpbiwgd2hpY2ggaXMgd2hhdCBpdCB3b3VsZCBoYXZlIGRvbmUgYW55d2F5LlxuICovXG5mdW5jdGlvbiBkZWZlcldyaXRlcyhcbiAgaW1hZ2VzOiBJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdLFxuICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuKTogSW1hZ2VDYWNoZVtcImltYWdlc1wiXSB7XG4gIGNvbnN0IGRlZmVycmVkID0gT2JqZWN0LmNyZWF0ZShpbWFnZXMpIGFzIEltYWdlQ2FjaGVbXCJpbWFnZXNcIl07XG4gIGRlZmVycmVkLnNldCA9ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEltYWdlQ2FjaGVbXCJpbWFnZXNcIl1bXCJzZXRcIl0+KSA9PiB7XG4gICAgd2FpdFVudGlsKFxuICAgICAgaW1hZ2VzLnNldCguLi5hcmdzKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjYWNoZSBhbiBvcHRpbWl6ZWQgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9O1xuICByZXR1cm4gZGVmZXJyZWQ7XG59XG5cbmZ1bmN0aW9uIHNlbmRUZXh0KFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICBib2R5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpblwiKTtcbiAgcmVzLmVuZChib2R5KTtcbn1cblxuLyoqXG4gKiBgbWFuaWZlc3QuY29uZmlnLmltYWdlc2AsIG9uY2UgdGhlIG1hbmlmZXN0IGlzIGtub3duIHRvIGJlIG9uZSB0aGlzIHJ1bnRpbWVcbiAqIHJlYWRzICh3aXRoIGBleHBlcmltZW50YWxgLCDigKYpLiBUaGUgZmllbGRzIGFyZSB0eXBlZCBgdW5rbm93bmAsIHNvIG9ubHkgdGhlXG4gKiB2ZXJzaW9uIGNhdGNoZXMgYSBtYW5pZmVzdCBhbm90aGVyIGNkay1uZXh0anMgd3JvdGU7IGBOZXh0anNCdWlsZGAgcmVqZWN0cyBvbmVcbiAqIGF0IHN5bnRoLCB3aGljaCBhIGhhbmQtd2lyZWQgZnVuY3Rpb24gc2tpcHMuXG4gKi9cbmZ1bmN0aW9uIG1hbmlmZXN0SW1hZ2VzKFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuKTogTmV4dENvbmZpZ0NvbXBsZXRlW1wiaW1hZ2VzXCJdIHtcbiAgaWYgKG1hbmlmZXN0LmNka05leHRqc1ZlcnNpb24gIT09IENES19ORVhUSlNfVkVSU0lPTikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgYWRhcHRlciBtYW5pZmVzdCB3YXMgd3JpdHRlbiBieSBjZGstbmV4dGpzIGAgK1xuICAgICAgICBgJHttYW5pZmVzdC5jZGtOZXh0anNWZXJzaW9uID8/IFwiKHVua25vd24pXCJ9LCBidXQgdGhpcyBydW50aW1lIGlzIGAgK1xuICAgICAgICBgY2RrLW5leHRqcyAke0NES19ORVhUSlNfVkVSU0lPTn0uIFJlYnVpbGQgdGhlIGFwcCB3aXRoIHRoaXMgdmVyc2lvbi5gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1hbmlmZXN0LmNvbmZpZy5pbWFnZXMgYXMgTmV4dENvbmZpZ0NvbXBsZXRlW1wiaW1hZ2VzXCJdO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpbWl6ZXIncyBgbmV4dENvbmZpZ2AsIGZyb20gdGhlIGFkYXB0ZXIgbWFuaWZlc3QsIHdoaWNoIGNvcGllZCBpdCBvdXRcbiAqIG9mIHRoZSBidWlsZCdzIGBjdHguY29uZmlnYCAoYEFkYXB0ZXJNYW5pZmVzdENvbmZpZy5pbWFnZXNgKTogYWxyZWFkeSByZXNvbHZlZFxuICogYW5kIGRlZmF1bHRlZCwgc28gbmVpdGhlciBgZ2V0TmV4dENvbmZpZ1J1bnRpbWVgIG5vciBgaW1hZ2VDb25maWdEZWZhdWx0YCBpc1xuICogbmVlZGVkLiBPbmx5IHRoZSBmaWVsZHMgTmV4dCdzIGltYWdlIGNvZGUgcmVhZHM7IHRoZSBjYXN0IGlzIGJlY2F1c2UgdGhlXG4gKiBtYW5pZmVzdCBzdG9yZXMgdGhlbSBhcyBKU09OLlxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VSdW50aW1lKHsgbWFuaWZlc3QgfTogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zKSB7XG4gIGNvbnN0IG5leHQ6IE5leHRJbWFnZU1vZHVsZXMgPSB7XG4gICAgb3B0aW1pemVyOiBuZXh0TW9kdWxlKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiksXG4gICAgc2VydmVTdGF0aWM6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL3NlcnZlLXN0YXRpYy5qc1wiKSxcbiAgfTtcbiAgY29uc3QgeyBjb25maWcgfSA9IG1hbmlmZXN0O1xuICBjb25zdCBuZXh0Q29uZmlnID0ge1xuICAgIGJhc2VQYXRoOiBjb25maWcuYmFzZVBhdGgsXG4gICAgYXNzZXRQcmVmaXg6IGNvbmZpZy5hc3NldFByZWZpeCxcbiAgICBpbWFnZXM6IG1hbmlmZXN0SW1hZ2VzKG1hbmlmZXN0KSxcbiAgICBleHBlcmltZW50YWw6IGNvbmZpZy5leHBlcmltZW50YWwsXG4gICAgY2FjaGVIYW5kbGVyOiBjb25maWcuY2FjaGVIYW5kbGVyID8/IHVuZGVmaW5lZCxcbiAgICBjYWNoZU1heE1lbW9yeVNpemU6IGNvbmZpZy5jYWNoZU1heE1lbW9yeVNpemUsXG4gIH0gYXMgTmV4dENvbmZpZ0NvbXBsZXRlO1xuICByZXR1cm4geyBuZXh0LCBuZXh0Q29uZmlnIH07XG59XG4iXX0=