cdk-nextjs 0.7.5 → 0.7.7

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 (69) hide show
  1. package/.jsii +38 -38
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/adapter-runtime.md +1 -1
  6. package/docs/caching-guide.md +11 -1
  7. package/docs/harness-coverage.md +11 -9
  8. package/lib/adapter/adapter.mjs +220 -149
  9. package/lib/adapter/aws-cache-store.d.ts +242 -7
  10. package/lib/adapter/aws-cache-store.js +520 -54
  11. package/lib/adapter/aws-cache-store.test.js +710 -3
  12. package/lib/adapter/build-outputs.js +23 -1
  13. package/lib/adapter/build-outputs.test.js +18 -1
  14. package/lib/adapter/cache-handler.d.ts +4 -3
  15. package/lib/adapter/cache-handler.js +1 -1
  16. package/lib/adapter/cache-handler.mjs +552 -91
  17. package/lib/adapter/cache-handler.test.js +31 -1
  18. package/lib/adapter/cache-utils.d.ts +68 -2
  19. package/lib/adapter/cache-utils.js +108 -2
  20. package/lib/adapter/cache-utils.test.js +45 -1
  21. package/lib/adapter/init-cache.d.ts +1 -1
  22. package/lib/adapter/init-cache.js +60 -37
  23. package/lib/adapter/init-cache.test.js +55 -2
  24. package/lib/adapter/local-file-cache-handler.d.ts +2 -2
  25. package/lib/adapter/local-file-cache-handler.js +4 -5
  26. package/lib/adapter/s3-cache-handler.d.ts +23 -7
  27. package/lib/adapter/s3-cache-handler.js +63 -27
  28. package/lib/adapter/s3-cache-handler.test.js +168 -1
  29. package/lib/adapter/use-cache-common.d.ts +53 -1
  30. package/lib/adapter/use-cache-common.js +121 -14
  31. package/lib/adapter/use-cache-common.test.js +138 -1
  32. package/lib/adapter/use-cache-default-handler.js +36 -6
  33. package/lib/adapter/use-cache-default-handler.mjs +557 -51
  34. package/lib/adapter/use-cache-handlers.test.js +247 -7
  35. package/lib/adapter/use-cache-remote-handler.js +10 -9
  36. package/lib/adapter/use-cache-remote-handler.mjs +597 -101
  37. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  38. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  39. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  40. package/lib/nextjs-api.js +1 -1
  41. package/lib/nextjs-build/nextjs-build.d.ts +0 -7
  42. package/lib/nextjs-build/nextjs-build.js +4 -11
  43. package/lib/nextjs-build/nextjs-build.test.js +4 -3
  44. package/lib/nextjs-cache.js +1 -1
  45. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  46. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  47. package/lib/nextjs-distribution.js +1 -1
  48. package/lib/nextjs-post-deploy.js +1 -1
  49. package/lib/nextjs-static-assets.js +1 -1
  50. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  51. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  52. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  53. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  54. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  55. package/lib/runtime/core.js +18 -4
  56. package/lib/runtime/core.test.js +17 -1
  57. package/lib/runtime/image.d.ts +19 -0
  58. package/lib/runtime/image.js +28 -2
  59. package/lib/runtime/image.test.js +43 -1
  60. package/lib/runtime/lambda.mjs +30 -6
  61. package/lib/runtime/server.mjs +30 -6
  62. package/lib/runtime/tag-manifest.d.ts +15 -0
  63. package/lib/runtime/tag-manifest.js +24 -0
  64. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  65. package/lib/runtime/tag-manifest.test.js +21 -0
  66. package/lib/utils/deployment-build-id.d.ts +11 -0
  67. package/lib/utils/deployment-build-id.js +15 -0
  68. package/package.json +3 -3
  69. package/scripts/e2e-harness/README.md +1 -1
@@ -23,6 +23,50 @@ describe("prerenderPathToCacheKey", () => {
23
23
  expect((0, cache_utils_1.prerenderPathToCacheKey)("/production/1", "/prod")).toBe("production/1");
24
24
  });
25
25
  });
26
+ describe("routeCacheKeyFromFilePath", () => {
27
+ const hash = "a".repeat(64);
28
+ it("reads the key next >= 16.3.8 filed a prerender under", () => {
29
+ expect((0, cache_utils_1.routeCacheKeyFromFilePath)(`/app/.next/server/route-cache/APP_PAGE/${hash}/$/blog/a.b.html`)).toBe(`route-cache/APP_PAGE/${hash}/$/blog/a.b`);
30
+ });
31
+ it("strips only the output's own extension", () => {
32
+ expect((0, cache_utils_1.routeCacheKeyFromFilePath)(`/app/.next/server/route-cache/APP_ROUTE/${hash}/$/robots.txt.body`)).toBe(`route-cache/APP_ROUTE/${hash}/$/robots.txt`);
33
+ });
34
+ it("is undefined for the pathname layout before 16.3.8", () => {
35
+ expect((0, cache_utils_1.routeCacheKeyFromFilePath)("/app/.next/server/app/blog/a.html")).toBeUndefined();
36
+ expect((0, cache_utils_1.routeCacheKeyFromFilePath)(undefined)).toBeUndefined();
37
+ });
38
+ it("reads the key off the first route-cache directory, not one in the route", () => {
39
+ expect((0, cache_utils_1.routeCacheKeyFromFilePath)(`/app/.next/server/route-cache/APP_PAGE/${hash}/$/docs/server/route-cache/APP_PAGE/${hash}/$/x.html`)).toBe(`route-cache/APP_PAGE/${hash}/$/docs/server/route-cache/APP_PAGE/${hash}/$/x`);
40
+ });
41
+ it("is undefined for an older app's route named /server/route-cache", () => {
42
+ expect((0, cache_utils_1.routeCacheKeyFromFilePath)("/app/.next/server/app/server/route-cache/x.html")).toBeUndefined();
43
+ });
44
+ });
45
+ describe("cacheObjectName", () => {
46
+ it("is the key's own name while the whole S3 key fits", () => {
47
+ expect((0, cache_utils_1.cacheObjectName)("/")).toBe("index.json");
48
+ expect((0, cache_utils_1.cacheObjectName)("/isr/1")).toBe("isr/1.json");
49
+ expect((0, cache_utils_1.cacheObjectName)(`/${"p".repeat(890)}`)).toBe(`${"p".repeat(890)}.json`);
50
+ });
51
+ it("hashes a name that would leave the S3 key past 1024 bytes", () => {
52
+ const name = (0, cache_utils_1.cacheObjectName)(`/${"p".repeat(900)}`);
53
+ expect(name).toMatch(/^_long-key\/[0-9a-f]{64}\.long$/);
54
+ // Leading slash or not, one key names one object.
55
+ expect((0, cache_utils_1.cacheObjectName)("p".repeat(900))).toBe(name);
56
+ });
57
+ it("counts bytes rather than characters", () => {
58
+ expect((0, cache_utils_1.cacheObjectName)(`/${"é".repeat(450)}`)).toMatch(/^_long-key\//);
59
+ });
60
+ });
61
+ describe("denormalizePagePath", () => {
62
+ it("reverses normalizePagePath", () => {
63
+ expect((0, cache_utils_1.denormalizePagePath)("/index")).toBe("/");
64
+ expect((0, cache_utils_1.denormalizePagePath)("/index/index")).toBe("/index");
65
+ expect((0, cache_utils_1.denormalizePagePath)("/index/index/a")).toBe("/index/a");
66
+ expect((0, cache_utils_1.denormalizePagePath)("/about")).toBe("/about");
67
+ expect((0, cache_utils_1.denormalizePagePath)("/indexes")).toBe("/indexes");
68
+ });
69
+ });
26
70
  describe("groupPrerenders", () => {
27
71
  const at = (...pathnames) => pathnames.map((pathname) => ({
28
72
  pathname,
@@ -176,4 +220,4 @@ describe("serializeCacheValue / parseCacheValue", () => {
176
220
  expect(restored.nodes.toString()).toBe("hi");
177
221
  });
178
222
  });
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtdXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2NhY2hlLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQ0FNdUI7QUFFdkIsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUN2QyxFQUFFLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLE1BQU0sQ0FBQyxJQUFBLHFDQUF1QixFQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDdEMsTUFBTSxDQUFDLElBQUEscUNBQXVCLEVBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsTUFBTSxDQUFDLElBQUEscUNBQXVCLEVBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLENBQUMsSUFBQSxxQ0FBdUIsRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLHFDQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsY0FBYyxD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bnRlbnQiOlsiaW1wb3J0IHtcbiAgYXBwUGFnZUNhY2hlSGVhZGVycyxcbiAgZ3JvdXBQcmVyZW5kZXJzLFxuICBwYXJzZUNhY2hlVmFsdWUsXG4gIHByZXJlbmRlclBhdGhUb0NhY2hlS2V5LFxuICBzZXJpYWxpemVDYWNoZVZhbHVlLFxufSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuXG5kZXNjcmliZShcInByZXJlbmRlclBhdGhUb0NhY2hlS2V5XCIsICgpID0+IHtcbiAgaXQoXCJkcm9wcyB0aGUgbGVhZGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZXJlbmRlclBhdGhUb0NhY2hlS2V5KFwiL3NzZy8xXCIsIFwiXCIpKS50b0JlKFwic3NnLzFcIik7XG4gIH0pO1xuXG4gIGl0KFwibWFwcyB0aGUgcm9vdCByb3V0ZSB0byBpbmRleFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZXJlbmRlclBhdGhUb0NhY2hlS2V5KFwiL1wiLCBcIlwiKSkudG9CZShcImluZGV4XCIpO1xuICB9KTtcblxuICAvKipcbiAgICogVGhlIHJlZ3Jlc3Npb24gdGhhdCBtYWRlIGV2ZXJ5IHByZXJlbmRlciBhIE1JU1Mgb24gYSBkZXBsb3ltZW50IHdpdGggYVxuICAgKiBgYmFzZVBhdGhgOiB0aGUgc2VlZCB3cm90ZSBgcHJvZC9zc2cvMS5qc29uYCB3aGlsZSB0aGUgc2VydmVyLCB3aGljaCBzZWVzIHRoZVxuICAgKiBwYXRoIG9ubHkgYWZ0ZXIgTmV4dC5qcyBoYXMgc3RyaXBwZWQgYGJhc2VQYXRoYCwgYXNrZWQgZm9yIGBzc2cvMS5qc29uYC5cbiAgICovXG4gIGl0KFwic3RyaXBzIHRoZSBhcHAncyBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZXJlbmRlclBhdGhUb0NhY2hlS2V5KFwiL3Byb2Qvc3NnLzFcIiwgXCIvcHJvZFwiKSkudG9CZShcInNzZy8xXCIpO1xuICB9KTtcblxuICBpdChcIm1hcHMgdGhlIGJhc2VQYXRoIHJvb3QgdG8gaW5kZXhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVyZW5kZXJQYXRoVG9DYWNoZUtleShcIi9wcm9kXCIsIFwiL3Byb2RcIikpLnRvQmUoXCJpbmRleFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJvbmx5IHN0cmlwcyBiYXNlUGF0aCBvbiBhIHBhdGggYm91bmRhcnlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVyZW5kZXJQYXRoVG9DYWNoZUtleShcIi9wcm9kdWN0aW9uLzFcIiwgXCIvcHJvZFwiKSkudG9CZShcbiAgICAgIFwicHJvZHVjdGlvbi8xXCIsXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJncm91cFByZXJlbmRlcnNcIiwgKCkgPT4ge1xuICBjb25zdCBhdCA9ICguLi5wYXRobmFtZXM6IHN0cmluZ1tdKSA9PlxuICAgIHBhdGhuYW1lcy5tYXAoKHBhdGhuYW1lKSA9PiAoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgfSkpO1xuXG4gIGl0KFwiZ3JvdXBzIGEgcm91dGUncyBodG1sLCByc2MgYW5kIHNlZ21lbnQgb3V0cHV0cyB0b2dldGhlclwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKFxuICAgICAgYXQoXG4gICAgICAgIFwiL2Jsb2cvaGVsbG9cIixcbiAgICAgICAgXCIvYmxvZy9oZWxsby5yc2NcIixcbiAgICAgICAgXCIvYmxvZy9oZWxsby5zZWdtZW50cy8kYyQuc2VnbWVudC5yc2NcIixcbiAgICAgICAgXCIvYmxvZy9oZWxsby5zZWdtZW50cy8kYyQvX19QQUdFX18uc2VnbWVudC5yc2NcIixcbiAgICAgICksXG4gICAgKTtcbiAgICBleHBlY3QoZ3JvdXBzLnNpemUpLnRvQmUoMSk7XG4gICAgY29uc3QgdmFyaWFudHMgPSBncm91cHMuZ2V0KFwiL2Jsb2cvaGVsbG9cIik7XG4gICAgZXhwZWN0KHZhcmlhbnRzPy5odG1sPy5wYXRobmFtZSkudG9CZShcIi9ibG9nL2hlbGxvXCIpO1xuICAgIGV4cGVjdCh2YXJpYW50cz8ucnNjPy5wYXRobmFtZSkudG9CZShcIi9ibG9nL2hlbGxvLnJzY1wiKTtcbiAgICBleHBlY3QodmFyaWFudHM/LnNlZ21lbnRzKS50b0hhdmVMZW5ndGgoMik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVncmVzc2lvbjogdGhlIHJvb3Qgcm91dGUncyBIVE1MIGlzIGVtaXR0ZWQgYXMgYC9gIGJ1dCBpdHMgZmxpZ2h0IHBheWxvYWRcbiAgICogYXMgYC9pbmRleC5yc2NgLCBzbyBncm91cGluZyBieSBhIHJlY29uc3RydWN0ZWQgYCR7cm91dGV9LnJzY2AgbGVmdCBgL2Agd2l0aCBub1xuICAgKiBgcnNjRGF0YWAgYW5kIGV2ZXJ5IGNsaWVudC1zaWRlIG5hdmlnYXRpb24gdG8gdGhlIGhvbWUgcGFnZSA0MDQnZC5cbiAgICovXG4gIGl0KFwiZ2l2ZXMgdGhlIHJvb3Qgcm91dGUgdGhlIC9pbmRleC5yc2MgcGF5bG9hZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKFxuICAgICAgYXQoXCIvXCIsIFwiL2luZGV4LnJzY1wiLCBcIi9pbmRleC5zZWdtZW50cy8kYyQuc2VnbWVudC5yc2NcIiksXG4gICAgKTtcbiAgICBleHBlY3QoQXJyYXkuZnJvbShncm91cHMua2V5cygpKSkudG9FcXVhbChbXCIvXCJdKTtcbiAgICBleHBlY3QoZ3JvdXBzLmdldChcIi9cIik/LnJzYz8ucGF0aG5hbWUpLnRvQmUoXCIvaW5kZXgucnNjXCIpO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL1wiKT8uc2VnbWVudHMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgLyoqIFdpdGggYSBgYmFzZVBhdGhgIHRoZSBzcGxpdCBpcyBgL3Byb2RgIHZzIGAvcHJvZC9pbmRleGAuICovXG4gIGl0KFwiZ2l2ZXMgdGhlIGJhc2VQYXRoIHJvb3QgaXRzIC9pbmRleC5yc2MgcGF5bG9hZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKFxuICAgICAgYXQoXCIvcHJvZFwiLCBcIi9wcm9kL2luZGV4LnJzY1wiLCBcIi9wcm9kL2luZGV4LnNlZ21lbnRzLyRjJC5zZWdtZW50LnJzY1wiKSxcbiAgICApO1xuICAgIGV4cGVjdChBcnJheS5mcm9tKGdyb3Vwcy5rZXlzKCkpKS50b0VxdWFsKFtcIi9wcm9kXCJdKTtcbiAgICBleHBlY3QoZ3JvdXBzLmdldChcIi9wcm9kXCIpPy5yc2M/LnBhdGhuYW1lKS50b0JlKFwiL3Byb2QvaW5kZXgucnNjXCIpO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL3Byb2RcIik/LnNlZ21lbnRzKS50b0hhdmVMZW5ndGgoMSk7XG4gIH0pO1xuXG4gIC8qKiBBbiBhcHAgd2l0aCBhIHJlYWwgYGFwcC9pbmRleC9wYWdlLnRzeGAga2VlcHMgaXRzIG93biBncm91cC4gKi9cbiAgaXQoXCJsZWF2ZXMgYSBnZW51aW5lIC9pbmRleCByb3V0ZSBhbG9uZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKGF0KFwiL1wiLCBcIi9pbmRleFwiLCBcIi9pbmRleC5yc2NcIikpO1xuICAgIGV4cGVjdChBcnJheS5mcm9tKGdyb3Vwcy5rZXlzKCkpLnNvcnQoKSkudG9FcXVhbChbXCIvXCIsIFwiL2luZGV4XCJdKTtcbiAgICBleHBlY3QoZ3JvdXBzLmdldChcIi9cIik/LnJzYykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL2luZGV4XCIpPy5yc2M/LnBhdGhuYW1lKS50b0JlKFwiL2luZGV4LnJzY1wiKTtcbiAgfSk7XG5cbiAgLyoqIGAvbmVzdGVkL2luZGV4LnJzY2Agd2l0aCBubyBgL25lc3RlZGAgSFRNTCBpcyBpdHMgb3duIHJvdXRlLCBub3QgYSByZW1hcC4gKi9cbiAgaXQoXCJvbmx5IHJlbWFwcyB3aGVuIHRoZSBwYXJlbnQgcmVhbGx5IGlzIGEgcHJlcmVuZGVyZWQgcm91dGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwUHJlcmVuZGVycyhhdChcIi9uZXN0ZWQvaW5kZXgucnNjXCIpKTtcbiAgICBleHBlY3QoQXJyYXkuZnJvbShncm91cHMua2V5cygpKSkudG9FcXVhbChbXCIvbmVzdGVkL2luZGV4XCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBzZWdtZW50cyB3aG9zZSByb3V0ZSBoYXMgbm8gb3RoZXIgb3V0cHV0XCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoYXQoXCIvcHByLnNlZ21lbnRzLyRjJC5zZWdtZW50LnJzY1wiKSk7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvcHByXCIpPy5zZWdtZW50cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL3BwclwiKT8uaHRtbCkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICAvKipcbiAgICogQSBQYWdlcyBSb3V0ZXIgcm91dGUncyBgcGFnZURhdGFgIGxpdmVzIGF0IGEgcGF0aG5hbWUgb2YgaXRzIG93biByYXRoZXIgdGhhblxuICAgKiBhdCBhIHN1ZmZpeCBvZiB0aGUgcGFnZSdzLCBzbyBhbiB1bm1hdGNoZWQgb25lIHdvdWxkIGJlY29tZSBhIGdyb3VwIG5hbWVkXG4gICAqIGAvX25leHQvZGF0YS8uLi5gIC0gd2hpY2ggZ2V0cyBubyBjYWNoZSBraW5kLCBhbmQgc28gc2lsZW50bHkgZHJvcHMgdGhlIGRhdGFcbiAgICogZXZlcnkgc2VlZGVkIGVudHJ5IG5lZWRzLlxuICAgKi9cbiAgaXQoXCJhdHRhY2hlcyBhIFBhZ2VzIFJvdXRlciByb3V0ZSdzIC9fbmV4dC9kYXRhIG91dHB1dFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKFxuICAgICAgYXQoXCIvYmxvZy9oZWxsb1wiLCBcIi9fbmV4dC9kYXRhL2J1aWxkLWFiYzEyMy9ibG9nL2hlbGxvLmpzb25cIiksXG4gICAgKTtcbiAgICBleHBlY3QoQXJyYXkuZnJvbShncm91cHMua2V5cygpKSkudG9FcXVhbChbXCIvYmxvZy9oZWxsb1wiXSk7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvYmxvZy9oZWxsb1wiKT8uZGF0YT8ucGF0aG5hbWUpLnRvQmUoXG4gICAgICBcIi9fbmV4dC9kYXRhL2J1aWxkLWFiYzEyMy9ibG9nL2hlbGxvLmpzb25cIixcbiAgICApO1xuICB9KTtcblxuICAvKiogVGhlIGBmYWxsYmFjazogdHJ1ZWAgdGVtcGxhdGUsIHdob3NlIGRhdGEgcm91dGUgaGFzIG5vIGZpbGUgYmVoaW5kIGl0LiAqL1xuICBpdChcImF0dGFjaGVzIHRoZSBkYXRhIG91dHB1dCBvZiBhIGR5bmFtaWMgcm91dGUncyBmYWxsYmFjayB0ZW1wbGF0ZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKFxuICAgICAgYXQoXCIvW3NsdWddXCIsIFwiL19uZXh0L2RhdGEvYnVpbGQtYWJjMTIzL1tzbHVnXS5qc29uXCIpLFxuICAgICk7XG4gICAgZXhwZWN0KEFycmF5LmZyb20oZ3JvdXBzLmtleXMoKSkpLnRvRXF1YWwoW1wiL1tzbHVnXVwiXSk7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvW3NsdWddXCIpPy5kYXRhPy5wYXRobmFtZSkudG9CZShcbiAgICAgIFwiL19uZXh0L2RhdGEvYnVpbGQtYWJjMTIzL1tzbHVnXS5qc29uXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqIGAvaW5kZXguanNvbmAgaXMgdGhlIHJvb3QgcGFnZSdzIGRhdGEgcm91dGUsIHRoZSBzYW1lIHJlbWFwIGFzIGAvaW5kZXgucnNjYC4gKi9cbiAgaXQoXCJnaXZlcyB0aGUgcm9vdCByb3V0ZSBpdHMgL2luZGV4Lmpzb24gZGF0YSBvdXRwdXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwUHJlcmVuZGVycyhcbiAgICAgIGF0KFwiL3Byb2RcIiwgXCIvcHJvZC9fbmV4dC9kYXRhL2J1aWxkLWFiYzEyMy9pbmRleC5qc29uXCIpLFxuICAgICk7XG4gICAgZXhwZWN0KEFycmF5LmZyb20oZ3JvdXBzLmtleXMoKSkpLnRvRXF1YWwoW1wiL3Byb2RcIl0pO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL3Byb2RcIik/LmRhdGE/LnBhdGhuYW1lKS50b0JlKFxuICAgICAgXCIvcHJvZC9fbmV4dC9kYXRhL2J1aWxkLWFiYzEyMy9pbmRleC5qc29uXCIsXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJhcHBQYWdlQ2FjaGVIZWFkZXJzXCIsICgpID0+IHtcbiAgLyoqIEV4YWN0bHkgd2hhdCBgb25CdWlsZENvbXBsZXRlYCBpcyBoYW5kZWQgZm9yIGEgcHJlcmVuZGVyZWQgYXBwIHBhZ2UuICovXG4gIGNvbnN0IGluaXRpYWxIZWFkZXJzID0ge1xuICAgIHZhcnk6IFwicnNjLCBuZXh0LXJvdXRlci1zdGF0ZS10cmVlLCBuZXh0LXJvdXRlci1wcmVmZXRjaCwgbmV4dC1yb3V0ZXItc2VnbWVudC1wcmVmZXRjaFwiLFxuICAgIFwiY29udGVudC10eXBlXCI6IFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgXCJ4LW5leHRqcy1zdGFsZS10aW1lXCI6IFwiMzAwXCIsXG4gICAgXCJ4LW5leHRqcy1wcmVyZW5kZXJcIjogXCIxXCIsXG4gICAgXCJ4LW5leHQtY2FjaGUtdGFnc1wiOiBcIl9OX1RfL2xheW91dCxfTl9UXy9wYWdlLF9OX1RfLyxfTl9UXy9pbmRleFwiLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVncmVzc2lvbjogYSBzZWVkZWQgYGNvbnRlbnQtdHlwZTogdGV4dC9odG1sYCBzdXJ2aXZlcyBpbnRvIHRoZSByZXNwb25zZVxuICAgKiBhbmQgYHNlbmQtcGF5bG9hZC5qc2Agd2lsbCBub3Qgb3ZlcndyaXRlIGl0LCBzbyBhbiBSU0MgcmVxdWVzdCB0byBhXG4gICAqIHByZXJlbmRlcmVkIHBhZ2UgZ2V0cyB0aGUgZmxpZ2h0IHBheWxvYWQgbGFiZWxlZCBhcyBIVE1MLlxuICAgKi9cbiAgaXQoXCJkcm9wcyBjb250ZW50LXR5cGUsIHdoaWNoIHdvdWxkIG1pc2xhYmVsIGV2ZXJ5IFJTQyByZXNwb25zZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGFwcFBhZ2VDYWNoZUhlYWRlcnMoaW5pdGlhbEhlYWRlcnMpKS5ub3QudG9IYXZlUHJvcGVydHkoXG4gICAgICBcImNvbnRlbnQtdHlwZVwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgdGhlIGhlYWRlcnMgYSByZW5kZXIgd291bGQgcmVhbGx5IGhhdmUgc3RvcmVkXCIsICgpID0+IHtcbiAgICBleHBlY3QoYXBwUGFnZUNhY2hlSGVhZGVycyhpbml0aWFsSGVhZGVycykpLnRvRXF1YWwoe1xuICAgICAgXCJ4LW5leHRqcy1zdGFsZS10aW1lXCI6IFwiMzAwXCIsXG4gICAgICBcIngtbmV4dC1jYWNoZS10YWdzXCI6IFwiX05fVF8vbGF5b3V0LF9OX1RfL3BhZ2UsX05fVF8vLF9OX1RfL2luZGV4XCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZHJvcHMgdGhlIGhlYWRlcnMgdGhlIGVudHJ5cG9pbnQgc2V0cyBpdHNlbGYsIHdoaWNoIHdvdWxkIGRvdWJsZSB1cFwiLCAoKSA9PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IGFwcFBhZ2VDYWNoZUhlYWRlcnMoe1xuICAgICAgLi4uaW5pdGlhbEhlYWRlcnMsXG4gICAgICBcIngtbmV4dGpzLXBvc3Rwb25lZFwiOiBcIjFcIixcbiAgICB9KTtcbiAgICBleHBlY3QoT2JqZWN0LmtleXMoaGVhZGVycykpLm5vdC50b0NvbnRhaW4oXCJ2YXJ5XCIpO1xuICAgIGV4cGVjdChPYmplY3Qua2V5cyhoZWFkZXJzKSkubm90LnRvQ29udGFpbihcIngtbmV4dGpzLXByZXJlbmRlclwiKTtcbiAgICBleHBlY3QoT2JqZWN0LmtleXMoaGVhZGVycykpLm5vdC50b0NvbnRhaW4oXCJ4LW5leHRqcy1wb3N0cG9uZWRcIik7XG4gIH0pO1xuXG4gIGl0KFwibWF0Y2hlcyBjYXNlLWluc2Vuc2l0aXZlbHlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChhcHBQYWdlQ2FjaGVIZWFkZXJzKHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KSkudG9FcXVhbCh7fSk7XG4gIH0pO1xuXG4gIGl0KFwicGFzc2VzIHRocm91Z2ggYW55dGhpbmcgdGhlIGFwcCBzZXQgaXRzZWxmXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhcHBQYWdlQ2FjaGVIZWFkZXJzKHsgXCJ4LWN1c3RvbVwiOiBcIjFcIiwgXCJzZXQtY29va2llXCI6IFwiYT1iXCIgfSksXG4gICAgKS50b0VxdWFsKHsgXCJ4LWN1c3RvbVwiOiBcIjFcIiwgXCJzZXQtY29va2llXCI6IFwiYT1iXCIgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwic2VyaWFsaXplQ2FjaGVWYWx1ZSAvIHBhcnNlQ2FjaGVWYWx1ZVwiLCAoKSA9PiB7XG4gIGl0KFwicm91bmQtdHJpcHMgYSBCdWZmZXJcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0geyByc2NEYXRhOiBCdWZmZXIuZnJvbShcImhlbGxvLCBjYWNoZVwiKSB9O1xuXG4gICAgY29uc3QgcmVzdG9yZWQgPSBwYXJzZUNhY2hlVmFsdWUoc2VyaWFsaXplQ2FjaGVWYWx1ZSh2YWx1ZSkpO1xuXG4gICAgZXhwZWN0KEJ1ZmZlci5pc0J1ZmZlcihyZXN0b3JlZC5yc2NEYXRhKSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3QocmVzdG9yZWQucnNjRGF0YS50b1N0cmluZygpKS50b0JlKFwiaGVsbG8sIGNhY2hlXCIpO1xuICB9KTtcblxuICBpdChcInJvdW5kLXRyaXBzIGJ5dGVzIHRoYXQgYXJlIG5vdCB2YWxpZCBVVEYtOFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBCdWZmZXIuZnJvbShbMHgwMCwgMHhmZiwgMHhmZSwgMHg4MCwgMHg3Zl0pO1xuXG4gICAgY29uc3QgcmVzdG9yZWQgPSBwYXJzZUNhY2hlVmFsdWUoc2VyaWFsaXplQ2FjaGVWYWx1ZSh7IHZhbHVlIH0pKS52YWx1ZTtcblxuICAgIGV4cGVjdChyZXN0b3JlZC5lcXVhbHModmFsdWUpKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdChcInJvdW5kLXRyaXBzIGEgTWFwLCBpbmNsdWRpbmcgQnVmZmVycyBpbnNpZGUgaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IE1hcChbW1wiL19pbmRleFwiLCBCdWZmZXIuZnJvbShcInNlZ21lbnRcIildXSk7XG5cbiAgICBjb25zdCByZXN0b3JlZCA9IHBhcnNlQ2FjaGVWYWx1ZShzZXJpYWxpemVDYWNoZVZhbHVlKHsgdmFsdWUgfSkpLnZhbHVlO1xuXG4gICAgZXhwZWN0KHJlc3RvcmVkKS50b0JlSW5zdGFuY2VPZihNYXApO1xuICAgIGV4cGVjdChyZXN0b3JlZC5nZXQoXCIvX2luZGV4XCIpLnRvU3RyaW5nKCkpLnRvQmUoXCJzZWdtZW50XCIpO1xuICB9KTtcblxuICAvKipcbiAgICogYmFzZTY0LCBub3QgdGhlIGFycmF5IG9mIHBlci1ieXRlIGludGVnZXJzIGBCdWZmZXIudG9KU09OKClgIHByb2R1Y2VzOiB0aGF0XG4gICAqIGFycmF5IGlzIH4zIGJ5dGVzIG9mIEpTT04gcGVyIGJ5dGUgb2YgcGF5bG9hZCAqYW5kKiBtYWtlcyBgSlNPTi5wYXJzZWAnc1xuICAgKiByZXZpdmVyIHJ1biBvbmNlIHBlciBlbGVtZW50LCB3aGljaCBjb3N0IDQuOHMgb2YgTGFtYmRhIHRpbWUgdG8gYW5zd2VyIGFcbiAgICogc2luZ2xlIDEgTWlCIHNlZ21lbnQgcHJlZmV0Y2ggb24gYSByZWFsIGRlcGxveW1lbnQuXG4gICAqL1xuICBpdChcIndyaXRlcyBhIEJ1ZmZlciBhcyBiYXNlNjQgcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2YgYnl0ZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGpzb24gPSBzZXJpYWxpemVDYWNoZVZhbHVlKHsgcnNjRGF0YTogQnVmZmVyLmZyb20oXCJoZWxsb1wiKSB9KTtcblxuICAgIGV4cGVjdChKU09OLnBhcnNlKGpzb24pLnJzY0RhdGEpLnRvRXF1YWwoe1xuICAgICAgX190eXBlOiBcIkJ1ZmZlclwiLFxuICAgICAgYmFzZTY0OiBcImFHVnNiRzg9XCIsXG4gICAgfSk7XG4gICAgLy8gQ29tZm9ydGFibHkgdW5kZXIgdGhlIH41IGJ5dGVzIHBlciBwYXlsb2FkIGJ5dGUgYW4gaW50ZWdlciBhcnJheSBjb3N0cy5cbiAgICBleHBlY3QoanNvbi5sZW5ndGgpLnRvQmVMZXNzVGhhbig2MCk7XG4gIH0pO1xuXG4gIGl0KFwic3RpbGwgcmVhZHMgdGhlIGludGVnZXItYXJyYXkgZm9ybWF0IGFuIG9sZGVyIGJ1aWxkIHdyb3RlXCIsICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3kgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBvdXJzOiB7IF9fdHlwZTogXCJCdWZmZXJcIiwgZGF0YTogWzEwNCwgMTA1XSB9LFxuICAgICAgbm9kZXM6IHsgdHlwZTogXCJCdWZmZXJcIiwgZGF0YTogWzEwNCwgMTA1XSB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdG9yZWQgPSBwYXJzZUNhY2hlVmFsdWUobGVnYWN5KTtcblxuICAgIGV4cGVjdChyZXN0b3JlZC5vdXJzLnRvU3RyaW5nKCkpLnRvQmUoXCJoaVwiKTtcbiAgICBleHBlY3QocmVzdG9yZWQubm9kZXMudG9TdHJpbmcoKSkudG9CZShcImhpXCIpO1xuICB9KTtcbn0pO1xuIl19
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtdXRpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2NhY2hlLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQ0FTdUI7QUFFdkIsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUN2QyxFQUFFLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLE1BQU0sQ0FBQyxJQUFBLHFDQUF1QixFQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDdEMsTUFBTSxDQUFDLElBQUEscUNBQXVCLEVBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsTUFBTSxDQUFDLElBQUEscUNBQXVCLEVBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLENBQUMsSUFBQSxxQ0FBdUIsRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLHFDQUF1QixFQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsY0FBYyxD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QyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1FBQ25FLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDNUIsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDNUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7U0FDNUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsSUFBQSw2QkFBZSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhcHBQYWdlQ2FjaGVIZWFkZXJzLFxuICBjYWNoZU9iamVjdE5hbWUsXG4gIGRlbm9ybWFsaXplUGFnZVBhdGgsXG4gIGdyb3VwUHJlcmVuZGVycyxcbiAgcGFyc2VDYWNoZVZhbHVlLFxuICBwcmVyZW5kZXJQYXRoVG9DYWNoZUtleSxcbiAgcm91dGVDYWNoZUtleUZyb21GaWxlUGF0aCxcbiAgc2VyaWFsaXplQ2FjaGVWYWx1ZSxcbn0gZnJvbSBcIi4vY2FjaGUtdXRpbHNcIjtcblxuZGVzY3JpYmUoXCJwcmVyZW5kZXJQYXRoVG9DYWNoZUtleVwiLCAoKSA9PiB7XG4gIGl0KFwiZHJvcHMgdGhlIGxlYWRpbmcgc2xhc2hcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVyZW5kZXJQYXRoVG9DYWNoZUtleShcIi9zc2cvMVwiLCBcIlwiKSkudG9CZShcInNzZy8xXCIpO1xuICB9KTtcblxuICBpdChcIm1hcHMgdGhlIHJvb3Qgcm91dGUgdG8gaW5kZXhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVyZW5kZXJQYXRoVG9DYWNoZUtleShcIi9cIiwgXCJcIikpLnRvQmUoXCJpbmRleFwiKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdyZXNzaW9uIHRoYXQgbWFkZSBldmVyeSBwcmVyZW5kZXIgYSBNSVNTIG9uIGEgZGVwbG95bWVudCB3aXRoIGFcbiAgICogYGJhc2VQYXRoYDogdGhlIHNlZWQgd3JvdGUgYHByb2Qvc3NnLzEuanNvbmAgd2hpbGUgdGhlIHNlcnZlciwgd2hpY2ggc2VlcyB0aGVcbiAgICogcGF0aCBvbmx5IGFmdGVyIE5leHQuanMgaGFzIHN0cmlwcGVkIGBiYXNlUGF0aGAsIGFza2VkIGZvciBgc3NnLzEuanNvbmAuXG4gICAqL1xuICBpdChcInN0cmlwcyB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVyZW5kZXJQYXRoVG9DYWNoZUtleShcIi9wcm9kL3NzZy8xXCIsIFwiL3Byb2RcIikpLnRvQmUoXCJzc2cvMVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJtYXBzIHRoZSBiYXNlUGF0aCByb290IHRvIGluZGV4XCIsICgpID0+IHtcbiAgICBleHBlY3QocHJlcmVuZGVyUGF0aFRvQ2FjaGVLZXkoXCIvcHJvZFwiLCBcIi9wcm9kXCIpKS50b0JlKFwiaW5kZXhcIik7XG4gIH0pO1xuXG4gIGl0KFwib25seSBzdHJpcHMgYmFzZVBhdGggb24gYSBwYXRoIGJvdW5kYXJ5XCIsICgpID0+IHtcbiAgICBleHBlY3QocHJlcmVuZGVyUGF0aFRvQ2FjaGVLZXkoXCIvcHJvZHVjdGlvbi8xXCIsIFwiL3Byb2RcIikpLnRvQmUoXG4gICAgICBcInByb2R1Y3Rpb24vMVwiLFxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicm91dGVDYWNoZUtleUZyb21GaWxlUGF0aFwiLCAoKSA9PiB7XG4gIGNvbnN0IGhhc2ggPSBcImFcIi5yZXBlYXQoNjQpO1xuXG4gIGl0KFwicmVhZHMgdGhlIGtleSBuZXh0ID49IDE2LjMuOCBmaWxlZCBhIHByZXJlbmRlciB1bmRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgcm91dGVDYWNoZUtleUZyb21GaWxlUGF0aChcbiAgICAgICAgYC9hcHAvLm5leHQvc2VydmVyL3JvdXRlLWNhY2hlL0FQUF9QQUdFLyR7aGFzaH0vJC9ibG9nL2EuYi5odG1sYCxcbiAgICAgICksXG4gICAgKS50b0JlKGByb3V0ZS1jYWNoZS9BUFBfUEFHRS8ke2hhc2h9LyQvYmxvZy9hLmJgKTtcbiAgfSk7XG5cbiAgaXQoXCJzdHJpcHMgb25seSB0aGUgb3V0cHV0J3Mgb3duIGV4dGVuc2lvblwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgcm91dGVDYWNoZUtleUZyb21GaWxlUGF0aChcbiAgICAgICAgYC9hcHAvLm5leHQvc2VydmVyL3JvdXRlLWNhY2hlL0FQUF9ST1VURS8ke2hhc2h9LyQvcm9ib3RzLnR4dC5ib2R5YCxcbiAgICAgICksXG4gICAgKS50b0JlKGByb3V0ZS1jYWNoZS9BUFBfUk9VVEUvJHtoYXNofS8kL3JvYm90cy50eHRgKTtcbiAgfSk7XG5cbiAgaXQoXCJpcyB1bmRlZmluZWQgZm9yIHRoZSBwYXRobmFtZSBsYXlvdXQgYmVmb3JlIDE2LjMuOFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgcm91dGVDYWNoZUtleUZyb21GaWxlUGF0aChcIi9hcHAvLm5leHQvc2VydmVyL2FwcC9ibG9nL2EuaHRtbFwiKSxcbiAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qocm91dGVDYWNoZUtleUZyb21GaWxlUGF0aCh1bmRlZmluZWQpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmVhZHMgdGhlIGtleSBvZmYgdGhlIGZpcnN0IHJvdXRlLWNhY2hlIGRpcmVjdG9yeSwgbm90IG9uZSBpbiB0aGUgcm91dGVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIHJvdXRlQ2FjaGVLZXlGcm9tRmlsZVBhdGgoXG4gICAgICAgIGAvYXBwLy5uZXh0L3NlcnZlci9yb3V0ZS1jYWNoZS9BUFBfUEFHRS8ke2hhc2h9LyQvZG9jcy9zZXJ2ZXIvcm91dGUtY2FjaGUvQVBQX1BBR0UvJHtoYXNofS8kL3guaHRtbGAsXG4gICAgICApLFxuICAgICkudG9CZShcbiAgICAgIGByb3V0ZS1jYWNoZS9BUFBfUEFHRS8ke2hhc2h9LyQvZG9jcy9zZXJ2ZXIvcm91dGUtY2FjaGUvQVBQX1BBR0UvJHtoYXNofS8kL3hgLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiaXMgdW5kZWZpbmVkIGZvciBhbiBvbGRlciBhcHAncyByb3V0ZSBuYW1lZCAvc2VydmVyL3JvdXRlLWNhY2hlXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICByb3V0ZUNhY2hlS2V5RnJvbUZpbGVQYXRoKFxuICAgICAgICBcIi9hcHAvLm5leHQvc2VydmVyL2FwcC9zZXJ2ZXIvcm91dGUtY2FjaGUveC5odG1sXCIsXG4gICAgICApLFxuICAgICkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImNhY2hlT2JqZWN0TmFtZVwiLCAoKSA9PiB7XG4gIGl0KFwiaXMgdGhlIGtleSdzIG93biBuYW1lIHdoaWxlIHRoZSB3aG9sZSBTMyBrZXkgZml0c1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNhY2hlT2JqZWN0TmFtZShcIi9cIikpLnRvQmUoXCJpbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChjYWNoZU9iamVjdE5hbWUoXCIvaXNyLzFcIikpLnRvQmUoXCJpc3IvMS5qc29uXCIpO1xuICAgIGV4cGVjdChjYWNoZU9iamVjdE5hbWUoYC8ke1wicFwiLnJlcGVhdCg4OTApfWApKS50b0JlKFxuICAgICAgYCR7XCJwXCIucmVwZWF0KDg5MCl9Lmpzb25gLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiaGFzaGVzIGEgbmFtZSB0aGF0IHdvdWxkIGxlYXZlIHRoZSBTMyBrZXkgcGFzdCAxMDI0IGJ5dGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBuYW1lID0gY2FjaGVPYmplY3ROYW1lKGAvJHtcInBcIi5yZXBlYXQoOTAwKX1gKTtcbiAgICBleHBlY3QobmFtZSkudG9NYXRjaCgvXl9sb25nLWtleVxcL1swLTlhLWZdezY0fVxcLmxvbmckLyk7XG4gICAgLy8gTGVhZGluZyBzbGFzaCBvciBub3QsIG9uZSBrZXkgbmFtZXMgb25lIG9iamVjdC5cbiAgICBleHBlY3QoY2FjaGVPYmplY3ROYW1lKFwicFwiLnJlcGVhdCg5MDApKSkudG9CZShuYW1lKTtcbiAgfSk7XG5cbiAgaXQoXCJjb3VudHMgYnl0ZXMgcmF0aGVyIHRoYW4gY2hhcmFjdGVyc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNhY2hlT2JqZWN0TmFtZShgLyR7XCLDqVwiLnJlcGVhdCg0NTApfWApKS50b01hdGNoKC9eX2xvbmcta2V5XFwvLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiZGVub3JtYWxpemVQYWdlUGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmV2ZXJzZXMgbm9ybWFsaXplUGFnZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChkZW5vcm1hbGl6ZVBhZ2VQYXRoKFwiL2luZGV4XCIpKS50b0JlKFwiL1wiKTtcbiAgICBleHBlY3QoZGVub3JtYWxpemVQYWdlUGF0aChcIi9pbmRleC9pbmRleFwiKSkudG9CZShcIi9pbmRleFwiKTtcbiAgICBleHBlY3QoZGVub3JtYWxpemVQYWdlUGF0aChcIi9pbmRleC9pbmRleC9hXCIpKS50b0JlKFwiL2luZGV4L2FcIik7XG4gICAgZXhwZWN0KGRlbm9ybWFsaXplUGFnZVBhdGgoXCIvYWJvdXRcIikpLnRvQmUoXCIvYWJvdXRcIik7XG4gICAgZXhwZWN0KGRlbm9ybWFsaXplUGFnZVBhdGgoXCIvaW5kZXhlc1wiKSkudG9CZShcIi9pbmRleGVzXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImdyb3VwUHJlcmVuZGVyc1wiLCAoKSA9PiB7XG4gIGNvbnN0IGF0ID0gKC4uLnBhdGhuYW1lczogc3RyaW5nW10pID0+XG4gICAgcGF0aG5hbWVzLm1hcCgocGF0aG5hbWUpID0+ICh7XG4gICAgICBwYXRobmFtZSxcbiAgICB9KSk7XG5cbiAgaXQoXCJncm91cHMgYSByb3V0ZSdzIGh0bWwsIHJzYyBhbmQgc2VnbWVudCBvdXRwdXRzIHRvZ2V0aGVyXCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoXG4gICAgICBhdChcbiAgICAgICAgXCIvYmxvZy9oZWxsb1wiLFxuICAgICAgICBcIi9ibG9nL2hlbGxvLnJzY1wiLFxuICAgICAgICBcIi9ibG9nL2hlbGxvLnNlZ21lbnRzLyRjJC5zZWdtZW50LnJzY1wiLFxuICAgICAgICBcIi9ibG9nL2hlbGxvLnNlZ21lbnRzLyRjJC9fX1BBR0VfXy5zZWdtZW50LnJzY1wiLFxuICAgICAgKSxcbiAgICApO1xuICAgIGV4cGVjdChncm91cHMuc2l6ZSkudG9CZSgxKTtcbiAgICBjb25zdCB2YXJpYW50cyA9IGdyb3Vwcy5nZXQoXCIvYmxvZy9oZWxsb1wiKTtcbiAgICBleHBlY3QodmFyaWFudHM/Lmh0bWw/LnBhdGhuYW1lKS50b0JlKFwiL2Jsb2cvaGVsbG9cIik7XG4gICAgZXhwZWN0KHZhcmlhbnRzPy5yc2M/LnBhdGhuYW1lKS50b0JlKFwiL2Jsb2cvaGVsbG8ucnNjXCIpO1xuICAgIGV4cGVjdCh2YXJpYW50cz8uc2VnbWVudHMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdyZXNzaW9uOiB0aGUgcm9vdCByb3V0ZSdzIEhUTUwgaXMgZW1pdHRlZCBhcyBgL2AgYnV0IGl0cyBmbGlnaHQgcGF5bG9hZFxuICAgKiBhcyBgL2luZGV4LnJzY2AsIHNvIGdyb3VwaW5nIGJ5IGEgcmVjb25zdHJ1Y3RlZCBgJHtyb3V0ZX0ucnNjYCBsZWZ0IGAvYCB3aXRoIG5vXG4gICAqIGByc2NEYXRhYCBhbmQgZXZlcnkgY2xpZW50LXNpZGUgbmF2aWdhdGlvbiB0byB0aGUgaG9tZSBwYWdlIDQwNCdkLlxuICAgKi9cbiAgaXQoXCJnaXZlcyB0aGUgcm9vdCByb3V0ZSB0aGUgL2luZGV4LnJzYyBwYXlsb2FkXCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoXG4gICAgICBhdChcIi9cIiwgXCIvaW5kZXgucnNjXCIsIFwiL2luZGV4LnNlZ21lbnRzLyRjJC5zZWdtZW50LnJzY1wiKSxcbiAgICApO1xuICAgIGV4cGVjdChBcnJheS5mcm9tKGdyb3Vwcy5rZXlzKCkpKS50b0VxdWFsKFtcIi9cIl0pO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL1wiKT8ucnNjPy5wYXRobmFtZSkudG9CZShcIi9pbmRleC5yc2NcIik7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvXCIpPy5zZWdtZW50cykudG9IYXZlTGVuZ3RoKDEpO1xuICB9KTtcblxuICAvKiogV2l0aCBhIGBiYXNlUGF0aGAgdGhlIHNwbGl0IGlzIGAvcHJvZGAgdnMgYC9wcm9kL2luZGV4YC4gKi9cbiAgaXQoXCJnaXZlcyB0aGUgYmFzZVBhdGggcm9vdCBpdHMgL2luZGV4LnJzYyBwYXlsb2FkXCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoXG4gICAgICBhdChcIi9wcm9kXCIsIFwiL3Byb2QvaW5kZXgucnNjXCIsIFwiL3Byb2QvaW5kZXguc2VnbWVudHMvJGMkLnNlZ21lbnQucnNjXCIpLFxuICAgICk7XG4gICAgZXhwZWN0KEFycmF5LmZyb20oZ3JvdXBzLmtleXMoKSkpLnRvRXF1YWwoW1wiL3Byb2RcIl0pO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL3Byb2RcIik/LnJzYz8ucGF0aG5hbWUpLnRvQmUoXCIvcHJvZC9pbmRleC5yc2NcIik7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvcHJvZFwiKT8uc2VnbWVudHMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgLyoqIEFuIGFwcCB3aXRoIGEgcmVhbCBgYXBwL2luZGV4L3BhZ2UudHN4YCBrZWVwcyBpdHMgb3duIGdyb3VwLiAqL1xuICBpdChcImxlYXZlcyBhIGdlbnVpbmUgL2luZGV4IHJvdXRlIGFsb25lXCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoYXQoXCIvXCIsIFwiL2luZGV4XCIsIFwiL2luZGV4LnJzY1wiKSk7XG4gICAgZXhwZWN0KEFycmF5LmZyb20oZ3JvdXBzLmtleXMoKSkuc29ydCgpKS50b0VxdWFsKFtcIi9cIiwgXCIvaW5kZXhcIl0pO1xuICAgIGV4cGVjdChncm91cHMuZ2V0KFwiL1wiKT8ucnNjKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvaW5kZXhcIik/LnJzYz8ucGF0aG5hbWUpLnRvQmUoXCIvaW5kZXgucnNjXCIpO1xuICB9KTtcblxuICAvKiogYC9uZXN0ZWQvaW5kZXgucnNjYCB3aXRoIG5vIGAvbmVzdGVkYCBIVE1MIGlzIGl0cyBvd24gcm91dGUsIG5vdCBhIHJlbWFwLiAqL1xuICBpdChcIm9ubHkgcmVtYXBzIHdoZW4gdGhlIHBhcmVudCByZWFsbHkgaXMgYSBwcmVyZW5kZXJlZCByb3V0ZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKGF0KFwiL25lc3RlZC9pbmRleC5yc2NcIikpO1xuICAgIGV4cGVjdChBcnJheS5mcm9tKGdyb3Vwcy5rZXlzKCkpKS50b0VxdWFsKFtcIi9uZXN0ZWQvaW5kZXhcIl0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIHNlZ21lbnRzIHdob3NlIHJvdXRlIGhhcyBubyBvdGhlciBvdXRwdXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwUHJlcmVuZGVycyhhdChcIi9wcHIuc2VnbWVudHMvJGMkLnNlZ21lbnQucnNjXCIpKTtcbiAgICBleHBlY3QoZ3JvdXBzLmdldChcIi9wcHJcIik/LnNlZ21lbnRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvcHByXCIpPy5odG1sKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBIFBhZ2VzIFJvdXRlciByb3V0ZSdzIGBwYWdlRGF0YWAgbGl2ZXMgYXQgYSBwYXRobmFtZSBvZiBpdHMgb3duIHJhdGhlciB0aGFuXG4gICAqIGF0IGEgc3VmZml4IG9mIHRoZSBwYWdlJ3MsIHNvIGFuIHVubWF0Y2hlZCBvbmUgd291bGQgYmVjb21lIGEgZ3JvdXAgbmFtZWRcbiAgICogYC9fbmV4dC9kYXRhLy4uLmAgLSB3aGljaCBnZXRzIG5vIGNhY2hlIGtpbmQsIGFuZCBzbyBzaWxlbnRseSBkcm9wcyB0aGUgZGF0YVxuICAgKiBldmVyeSBzZWVkZWQgZW50cnkgbmVlZHMuXG4gICAqL1xuICBpdChcImF0dGFjaGVzIGEgUGFnZXMgUm91dGVyIHJvdXRlJ3MgL19uZXh0L2RhdGEgb3V0cHV0XCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoXG4gICAgICBhdChcIi9ibG9nL2hlbGxvXCIsIFwiL19uZXh0L2RhdGEvYnVpbGQtYWJjMTIzL2Jsb2cvaGVsbG8uanNvblwiKSxcbiAgICApO1xuICAgIGV4cGVjdChBcnJheS5mcm9tKGdyb3Vwcy5rZXlzKCkpKS50b0VxdWFsKFtcIi9ibG9nL2hlbGxvXCJdKTtcbiAgICBleHBlY3QoZ3JvdXBzLmdldChcIi9ibG9nL2hlbGxvXCIpPy5kYXRhPy5wYXRobmFtZSkudG9CZShcbiAgICAgIFwiL19uZXh0L2RhdGEvYnVpbGQtYWJjMTIzL2Jsb2cvaGVsbG8uanNvblwiLFxuICAgICk7XG4gIH0pO1xuXG4gIC8qKiBUaGUgYGZhbGxiYWNrOiB0cnVlYCB0ZW1wbGF0ZSwgd2hvc2UgZGF0YSByb3V0ZSBoYXMgbm8gZmlsZSBiZWhpbmQgaXQuICovXG4gIGl0KFwiYXR0YWNoZXMgdGhlIGRhdGEgb3V0cHV0IG9mIGEgZHluYW1pYyByb3V0ZSdzIGZhbGxiYWNrIHRlbXBsYXRlXCIsICgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBncm91cFByZXJlbmRlcnMoXG4gICAgICBhdChcIi9bc2x1Z11cIiwgXCIvX25leHQvZGF0YS9idWlsZC1hYmMxMjMvW3NsdWddLmpzb25cIiksXG4gICAgKTtcbiAgICBleHBlY3QoQXJyYXkuZnJvbShncm91cHMua2V5cygpKSkudG9FcXVhbChbXCIvW3NsdWddXCJdKTtcbiAgICBleHBlY3QoZ3JvdXBzLmdldChcIi9bc2x1Z11cIik/LmRhdGE/LnBhdGhuYW1lKS50b0JlKFxuICAgICAgXCIvX25leHQvZGF0YS9idWlsZC1hYmMxMjMvW3NsdWddLmpzb25cIixcbiAgICApO1xuICB9KTtcblxuICAvKiogYC9pbmRleC5qc29uYCBpcyB0aGUgcm9vdCBwYWdlJ3MgZGF0YSByb3V0ZSwgdGhlIHNhbWUgcmVtYXAgYXMgYC9pbmRleC5yc2NgLiAqL1xuICBpdChcImdpdmVzIHRoZSByb290IHJvdXRlIGl0cyAvaW5kZXguanNvbiBkYXRhIG91dHB1dFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKFxuICAgICAgYXQoXCIvcHJvZFwiLCBcIi9wcm9kL19uZXh0L2RhdGEvYnVpbGQtYWJjMTIzL2luZGV4Lmpzb25cIiksXG4gICAgKTtcbiAgICBleHBlY3QoQXJyYXkuZnJvbShncm91cHMua2V5cygpKSkudG9FcXVhbChbXCIvcHJvZFwiXSk7XG4gICAgZXhwZWN0KGdyb3Vwcy5nZXQoXCIvcHJvZFwiKT8uZGF0YT8ucGF0aG5hbWUpLnRvQmUoXG4gICAgICBcIi9wcm9kL19uZXh0L2RhdGEvYnVpbGQtYWJjMTIzL2luZGV4Lmpzb25cIixcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImFwcFBhZ2VDYWNoZUhlYWRlcnNcIiwgKCkgPT4ge1xuICAvKiogRXhhY3RseSB3aGF0IGBvbkJ1aWxkQ29tcGxldGVgIGlzIGhhbmRlZCBmb3IgYSBwcmVyZW5kZXJlZCBhcHAgcGFnZS4gKi9cbiAgY29uc3QgaW5pdGlhbEhlYWRlcnMgPSB7XG4gICAgdmFyeTogXCJyc2MsIG5leHQtcm91dGVyLXN0YXRlLXRyZWUsIG5leHQtcm91dGVyLXByZWZldGNoLCBuZXh0LXJvdXRlci1zZWdtZW50LXByZWZldGNoXCIsXG4gICAgXCJjb250ZW50LXR5cGVcIjogXCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBcIngtbmV4dGpzLXN0YWxlLXRpbWVcIjogXCIzMDBcIixcbiAgICBcIngtbmV4dGpzLXByZXJlbmRlclwiOiBcIjFcIixcbiAgICBcIngtbmV4dC1jYWNoZS10YWdzXCI6IFwiX05fVF8vbGF5b3V0LF9OX1RfL3BhZ2UsX05fVF8vLF9OX1RfL2luZGV4XCIsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSByZWdyZXNzaW9uOiBhIHNlZWRlZCBgY29udGVudC10eXBlOiB0ZXh0L2h0bWxgIHN1cnZpdmVzIGludG8gdGhlIHJlc3BvbnNlXG4gICAqIGFuZCBgc2VuZC1wYXlsb2FkLmpzYCB3aWxsIG5vdCBvdmVyd3JpdGUgaXQsIHNvIGFuIFJTQyByZXF1ZXN0IHRvIGFcbiAgICogcHJlcmVuZGVyZWQgcGFnZSBnZXRzIHRoZSBmbGlnaHQgcGF5bG9hZCBsYWJlbGVkIGFzIEhUTUwuXG4gICAqL1xuICBpdChcImRyb3BzIGNvbnRlbnQtdHlwZSwgd2hpY2ggd291bGQgbWlzbGFiZWwgZXZlcnkgUlNDIHJlc3BvbnNlXCIsICgpID0+IHtcbiAgICBleHBlY3QoYXBwUGFnZUNhY2hlSGVhZGVycyhpbml0aWFsSGVhZGVycykpLm5vdC50b0hhdmVQcm9wZXJ0eShcbiAgICAgIFwiY29udGVudC10eXBlXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgaGVhZGVycyBhIHJlbmRlciB3b3VsZCByZWFsbHkgaGF2ZSBzdG9yZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChhcHBQYWdlQ2FjaGVIZWFkZXJzKGluaXRpYWxIZWFkZXJzKSkudG9FcXVhbCh7XG4gICAgICBcIngtbmV4dGpzLXN0YWxlLXRpbWVcIjogXCIzMDBcIixcbiAgICAgIFwieC1uZXh0LWNhY2hlLXRhZ3NcIjogXCJfTl9UXy9sYXlvdXQsX05fVF8vcGFnZSxfTl9UXy8sX05fVF8vaW5kZXhcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJkcm9wcyB0aGUgaGVhZGVycyB0aGUgZW50cnlwb2ludCBzZXRzIGl0c2VsZiwgd2hpY2ggd291bGQgZG91YmxlIHVwXCIsICgpID0+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gYXBwUGFnZUNhY2hlSGVhZGVycyh7XG4gICAgICAuLi5pbml0aWFsSGVhZGVycyxcbiAgICAgIFwieC1uZXh0anMtcG9zdHBvbmVkXCI6IFwiMVwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChPYmplY3Qua2V5cyhoZWFkZXJzKSkubm90LnRvQ29udGFpbihcInZhcnlcIik7XG4gICAgZXhwZWN0KE9iamVjdC5rZXlzKGhlYWRlcnMpKS5ub3QudG9Db250YWluKFwieC1uZXh0anMtcHJlcmVuZGVyXCIpO1xuICAgIGV4cGVjdChPYmplY3Qua2V5cyhoZWFkZXJzKSkubm90LnRvQ29udGFpbihcIngtbmV4dGpzLXBvc3Rwb25lZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJtYXRjaGVzIGNhc2UtaW5zZW5zaXRpdmVseVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGFwcFBhZ2VDYWNoZUhlYWRlcnMoeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pKS50b0VxdWFsKHt9KTtcbiAgfSk7XG5cbiAgaXQoXCJwYXNzZXMgdGhyb3VnaCBhbnl0aGluZyB0aGUgYXBwIHNldCBpdHNlbGZcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFwcFBhZ2VDYWNoZUhlYWRlcnMoeyBcIngtY3VzdG9tXCI6IFwiMVwiLCBcInNldC1jb29raWVcIjogXCJhPWJcIiB9KSxcbiAgICApLnRvRXF1YWwoeyBcIngtY3VzdG9tXCI6IFwiMVwiLCBcInNldC1jb29raWVcIjogXCJhPWJcIiB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJzZXJpYWxpemVDYWNoZVZhbHVlIC8gcGFyc2VDYWNoZVZhbHVlXCIsICgpID0+IHtcbiAgaXQoXCJyb3VuZC10cmlwcyBhIEJ1ZmZlclwiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB7IHJzY0RhdGE6IEJ1ZmZlci5mcm9tKFwiaGVsbG8sIGNhY2hlXCIpIH07XG5cbiAgICBjb25zdCByZXN0b3JlZCA9IHBhcnNlQ2FjaGVWYWx1ZShzZXJpYWxpemVDYWNoZVZhbHVlKHZhbHVlKSk7XG5cbiAgICBleHBlY3QoQnVmZmVyLmlzQnVmZmVyKHJlc3RvcmVkLnJzY0RhdGEpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChyZXN0b3JlZC5yc2NEYXRhLnRvU3RyaW5nKCkpLnRvQmUoXCJoZWxsbywgY2FjaGVcIik7XG4gIH0pO1xuXG4gIGl0KFwicm91bmQtdHJpcHMgYnl0ZXMgdGhhdCBhcmUgbm90IHZhbGlkIFVURi04XCIsICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweGZmLCAweGZlLCAweDgwLCAweDdmXSk7XG5cbiAgICBjb25zdCByZXN0b3JlZCA9IHBhcnNlQ2FjaGVWYWx1ZShzZXJpYWxpemVDYWNoZVZhbHVlKHsgdmFsdWUgfSkpLnZhbHVlO1xuXG4gICAgZXhwZWN0KHJlc3RvcmVkLmVxdWFscyh2YWx1ZSkpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KFwicm91bmQtdHJpcHMgYSBNYXAsIGluY2x1ZGluZyBCdWZmZXJzIGluc2lkZSBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgTWFwKFtbXCIvX2luZGV4XCIsIEJ1ZmZlci5mcm9tKFwic2VnbWVudFwiKV1dKTtcblxuICAgIGNvbnN0IHJlc3RvcmVkID0gcGFyc2VDYWNoZVZhbHVlKHNlcmlhbGl6ZUNhY2hlVmFsdWUoeyB2YWx1ZSB9KSkudmFsdWU7XG5cbiAgICBleHBlY3QocmVzdG9yZWQpLnRvQmVJbnN0YW5jZU9mKE1hcCk7XG4gICAgZXhwZWN0KHJlc3RvcmVkLmdldChcIi9faW5kZXhcIikudG9TdHJpbmcoKSkudG9CZShcInNlZ21lbnRcIik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBiYXNlNjQsIG5vdCB0aGUgYXJyYXkgb2YgcGVyLWJ5dGUgaW50ZWdlcnMgYEJ1ZmZlci50b0pTT04oKWAgcHJvZHVjZXM6IHRoYXRcbiAgICogYXJyYXkgaXMgfjMgYnl0ZXMgb2YgSlNPTiBwZXIgYnl0ZSBvZiBwYXlsb2FkICphbmQqIG1ha2VzIGBKU09OLnBhcnNlYCdzXG4gICAqIHJldml2ZXIgcnVuIG9uY2UgcGVyIGVsZW1lbnQsIHdoaWNoIGNvc3QgNC44cyBvZiBMYW1iZGEgdGltZSB0byBhbnN3ZXIgYVxuICAgKiBzaW5nbGUgMSBNaUIgc2VnbWVudCBwcmVmZXRjaCBvbiBhIHJlYWwgZGVwbG95bWVudC5cbiAgICovXG4gIGl0KFwid3JpdGVzIGEgQnVmZmVyIGFzIGJhc2U2NCByYXRoZXIgdGhhbiBhbiBhcnJheSBvZiBieXRlc1wiLCAoKSA9PiB7XG4gICAgY29uc3QganNvbiA9IHNlcmlhbGl6ZUNhY2hlVmFsdWUoeyByc2NEYXRhOiBCdWZmZXIuZnJvbShcImhlbGxvXCIpIH0pO1xuXG4gICAgZXhwZWN0KEpTT04ucGFyc2UoanNvbikucnNjRGF0YSkudG9FcXVhbCh7XG4gICAgICBfX3R5cGU6IFwiQnVmZmVyXCIsXG4gICAgICBiYXNlNjQ6IFwiYUdWc2JHOD1cIixcbiAgICB9KTtcbiAgICAvLyBDb21mb3J0YWJseSB1bmRlciB0aGUgfjUgYnl0ZXMgcGVyIHBheWxvYWQgYnl0ZSBhbiBpbnRlZ2VyIGFycmF5IGNvc3RzLlxuICAgIGV4cGVjdChqc29uLmxlbmd0aCkudG9CZUxlc3NUaGFuKDYwKTtcbiAgfSk7XG5cbiAgaXQoXCJzdGlsbCByZWFkcyB0aGUgaW50ZWdlci1hcnJheSBmb3JtYXQgYW4gb2xkZXIgYnVpbGQgd3JvdGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGxlZ2FjeSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG91cnM6IHsgX190eXBlOiBcIkJ1ZmZlclwiLCBkYXRhOiBbMTA0LCAxMDVdIH0sXG4gICAgICBub2RlczogeyB0eXBlOiBcIkJ1ZmZlclwiLCBkYXRhOiBbMTA0LCAxMDVdIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN0b3JlZCA9IHBhcnNlQ2FjaGVWYWx1ZShsZWdhY3kpO1xuXG4gICAgZXhwZWN0KHJlc3RvcmVkLm91cnMudG9TdHJpbmcoKSkudG9CZShcImhpXCIpO1xuICAgIGV4cGVjdChyZXN0b3JlZC5ub2Rlcy50b1N0cmluZygpKS50b0JlKFwiaGlcIik7XG4gIH0pO1xufSk7XG4iXX0=
@@ -3,4 +3,4 @@ import type { BuildCompleteContext } from "./build-outputs";
3
3
  * Write a `<cacheKey>.json` per prerendered route under `cacheDir`, plus
4
4
  * {@link INIT_CACHE_TAG_MANIFEST} when any entry carries tags.
5
5
  */
6
- export declare function writeInitCache(ctx: Pick<BuildCompleteContext, "config" | "outputs">, cacheDir: string): Promise<void>;
6
+ export declare function writeInitCache(ctx: Pick<BuildCompleteContext, "config" | "outputs" | "nextVersion" | "projectDir">, cacheDir: string): Promise<void>;
@@ -15,8 +15,10 @@ exports.writeInitCache = writeInitCache;
15
15
  */
16
16
  const node_fs_1 = require("node:fs");
17
17
  const promises_1 = require("node:fs/promises");
18
+ const node_module_1 = require("node:module");
18
19
  const node_path_1 = require("node:path");
19
20
  const debug_1 = __importDefault(require("debug"));
21
+ const constants_1 = require("../constants");
20
22
  const cache_kinds_1 = require("./cache-kinds");
21
23
  const cache_utils_1 = require("./cache-utils");
22
24
  const debug = (0, debug_1.default)("cdk-nextjs:adapter");
@@ -35,6 +37,10 @@ async function writeInitCache(ctx, cacheDir) {
35
37
  // Tag -> cache keys, standing in for the mapping rows a runtime `set` writes.
36
38
  // See `INIT_CACHE_TAG_MANIFEST`.
37
39
  const tagManifest = {};
40
+ // Routes seeded under their pathname by a `next` that reads route-cache keys:
41
+ // see the `cacheKey` below.
42
+ const scopesKeysByRoute = nextScopesKeysByRoute(ctx.projectDir);
43
+ const unscopedRoutes = [];
38
44
  // Process each group and create cache entries
39
45
  for (const [basePath, variants] of prerenderGroups) {
40
46
  try {
@@ -70,13 +76,13 @@ async function writeInitCache(ctx, cacheDir) {
70
76
  let cacheEntry;
71
77
  if (kind === "APP_PAGE" /* CachedRouteKind.APP_PAGE */) {
72
78
  // Read HTML file
73
- const html = await readPrerenderAsText(htmlPrerender);
79
+ const html = (await readPrerender(htmlPrerender))?.toString();
74
80
  if (!html) {
75
81
  debug(`SKIP: No HTML content for APP_PAGE ${basePath}`);
76
82
  continue; // Skip if no HTML content
77
83
  }
78
84
  // Read RSC data
79
- const rscData = await readPrerenderAsBuffer(rscPrerender);
85
+ const rscData = await readPrerender(rscPrerender);
80
86
  // Read segment data
81
87
  const segmentData = await getSegmentData(segmentPrerenders);
82
88
  // Extract headers from the HTML or RSC prerender
@@ -100,7 +106,7 @@ async function writeInitCache(ctx, cacheDir) {
100
106
  };
101
107
  }
102
108
  else if (kind === "APP_ROUTE" /* CachedRouteKind.APP_ROUTE */) {
103
- const body = await readPrerenderAsBuffer(htmlPrerender);
109
+ const body = await readPrerender(htmlPrerender);
104
110
  if (!body) {
105
111
  debug(`SKIP: No body content for APP_ROUTE ${basePath}`);
106
112
  continue; // Skip if no content
@@ -139,7 +145,7 @@ async function writeInitCache(ctx, cacheDir) {
139
145
  debug(`SKIP: PAGES ${basePath} prerendered with status ${initialStatus} (build-time notFound)`);
140
146
  continue;
141
147
  }
142
- const html = await readPrerenderAsText(htmlPrerender);
148
+ const html = (await readPrerender(htmlPrerender))?.toString();
143
149
  if (!html) {
144
150
  debug(`SKIP: No HTML content for PAGES ${basePath}`);
145
151
  continue;
@@ -150,7 +156,7 @@ async function writeInitCache(ctx, cacheDir) {
150
156
  // there are no params to run `getStaticProps` with yet - and
151
157
  // `FileSystemCache` skips the read for one too (`if (!ctx.isFallback)`),
152
158
  // leaving `pageData` an empty object.
153
- const pageDataJson = await readPrerenderAsText(dataPrerender);
159
+ const pageDataJson = (await readPrerender(dataPrerender))?.toString();
154
160
  cacheEntry = {
155
161
  lastModified: Date.now(),
156
162
  value: {
@@ -173,14 +179,23 @@ async function writeInitCache(ctx, cacheDir) {
173
179
  debug(`SKIP: Unsupported route kind ${kind} for ${basePath}`);
174
180
  continue;
175
181
  }
176
- // Write cache entry to file, under the route rather than the URL it is
177
- // served at - see `prerenderPathToCacheKey`.
178
- const cacheKey = (0, cache_utils_1.prerenderPathToCacheKey)(basePath, ctx.config.basePath || "");
179
- const cacheFilePath = (0, node_path_1.join)(cacheDir, `${cacheKey}.json`);
182
+ // Write cache entry to file, under the key Next.js reads it back with:
183
+ // from next 16.3.8 the one `next build` filed the prerender under (see
184
+ // `routeCacheKeyFromFilePath`), before that the route rather than the
185
+ // URL it is served at (see `prerenderPathToCacheKey`).
186
+ // Every kind seeded here has read its HTML prerender, so that is the
187
+ // file to read the key off.
188
+ const routeCacheKey = (0, cache_utils_1.routeCacheKeyFromFilePath)(prerenderFilePath(htmlPrerender));
189
+ if (!routeCacheKey && scopesKeysByRoute) {
190
+ // Never read under any other key; the build fails below.
191
+ unscopedRoutes.push(basePath);
192
+ continue;
193
+ }
194
+ const cacheKey = routeCacheKey ??
195
+ (0, cache_utils_1.prerenderPathToCacheKey)(basePath, ctx.config.basePath || "");
196
+ const cacheFilePath = (0, node_path_1.join)(cacheDir, (0, cache_utils_1.cacheObjectName)(cacheKey));
180
197
  // Ensure parent directory exists
181
- await (0, promises_1.mkdir)((0, node_path_1.join)(cacheDir, cacheKey.split("/").slice(0, -1).join("/")), {
182
- recursive: true,
183
- });
198
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(cacheFilePath), { recursive: true });
184
199
  await (0, promises_1.writeFile)(cacheFilePath, (0, cache_utils_1.serializeCacheValue)(cacheEntry));
185
200
  for (const tag of (0, cache_utils_1.headerTags)(cacheEntry.value)) {
186
201
  (tagManifest[tag] ??= []).push(cacheKey);
@@ -191,6 +206,16 @@ async function writeInitCache(ctx, cacheDir) {
191
206
  console.error(`Error processing prerender group ${basePath}:`, error);
192
207
  }
193
208
  }
209
+ // A pathname key is one 16.3.8+ never reads, so each of these would be a
210
+ // MISS until it is first rendered - the regression the route-cache key fixed
211
+ // - with a deploy that otherwise succeeds. Fail the build instead.
212
+ if (unscopedRoutes.length > 0) {
213
+ throw new Error(`${constants_1.LOG_PREFIX} Next.js ${ctx.nextVersion} wrote ${unscopedRoutes.length} ` +
214
+ `prerender(s) outside <distDir>/server/route-cache/, so cdk-nextjs ` +
215
+ `cannot tell the cache key it reads them back with: ` +
216
+ `${unscopedRoutes.slice(0, 5).join(", ")}` +
217
+ `${unscopedRoutes.length > 5 ? ", ..." : ""}`);
218
+ }
194
219
  const taggedKeys = Object.keys(tagManifest).length;
195
220
  if (taggedKeys > 0) {
196
221
  await (0, promises_1.writeFile)((0, node_path_1.join)(cacheDir, cache_utils_1.INIT_CACHE_TAG_MANIFEST), JSON.stringify(tagManifest));
@@ -198,28 +223,29 @@ async function writeInitCache(ctx, cacheDir) {
198
223
  }
199
224
  }
200
225
  /**
201
- * Read file content from a prerender as UTF-8 string
226
+ * Whether the app's `next` scopes response-cache keys by source route (16.3.8
227
+ * on), found by whether it has the module that derives them, since a canary's
228
+ * version says nothing of what it contains.
202
229
  */
203
- async function readPrerenderAsText(prerender) {
204
- if (prerender?.fallback &&
205
- "filePath" in prerender.fallback &&
206
- prerender.fallback.filePath &&
207
- (0, node_fs_1.existsSync)(prerender.fallback.filePath)) {
208
- return (0, promises_1.readFile)(prerender.fallback.filePath, "utf-8");
230
+ function nextScopesKeysByRoute(projectDir) {
231
+ try {
232
+ (0, node_module_1.createRequire)((0, node_path_1.join)(projectDir, "package.json")).resolve("next/dist/server/lib/route-cache-key.js");
233
+ return true;
209
234
  }
210
- return undefined;
211
- }
212
- /**
213
- * Read file content from a prerender as Buffer
214
- */
215
- async function readPrerenderAsBuffer(prerender) {
216
- if (prerender?.fallback &&
217
- "filePath" in prerender.fallback &&
218
- prerender.fallback.filePath &&
219
- (0, node_fs_1.existsSync)(prerender.fallback.filePath)) {
220
- return (0, promises_1.readFile)(prerender.fallback.filePath);
235
+ catch {
236
+ return false;
221
237
  }
222
- return undefined;
238
+ }
239
+ /** The file `next build` wrote a prerender to, if it wrote one. */
240
+ function prerenderFilePath(prerender) {
241
+ return prerender?.fallback && "filePath" in prerender.fallback
242
+ ? prerender.fallback.filePath
243
+ : undefined;
244
+ }
245
+ /** The content of the file `next build` wrote a prerender to, if it exists. */
246
+ async function readPrerender(prerender) {
247
+ const filePath = prerenderFilePath(prerender);
248
+ return filePath && (0, node_fs_1.existsSync)(filePath) ? (0, promises_1.readFile)(filePath) : undefined;
223
249
  }
224
250
  /**
225
251
  * Read segment data from segment prerenders
@@ -227,11 +253,8 @@ async function readPrerenderAsBuffer(prerender) {
227
253
  async function getSegmentData(segmentPrerenders) {
228
254
  const segmentData = new Map();
229
255
  for (const segmentPrerender of segmentPrerenders) {
230
- if (segmentPrerender.fallback &&
231
- "filePath" in segmentPrerender.fallback &&
232
- segmentPrerender.fallback.filePath &&
233
- (0, node_fs_1.existsSync)(segmentPrerender.fallback.filePath)) {
234
- const segmentContent = await (0, promises_1.readFile)(segmentPrerender.fallback.filePath);
256
+ const segmentContent = await readPrerender(segmentPrerender);
257
+ if (segmentContent) {
235
258
  // Extract segment name from pathname
236
259
  const segmentName = "/" +
237
260
  segmentPrerender.pathname
@@ -242,4 +265,4 @@ async function getSegmentData(segmentPrerenders) {
242
265
  }
243
266
  return segmentData;
244
267
  }
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2luaXQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFpQ0Esd0NBcU5DO0FBdFBELHNEQUFzRDtBQUN0RDs7Ozs7OztHQU9HO0FBQ0gscUNBQXFDO0FBQ3JDLCtDQUE4RDtBQUM5RCx5Q0FBaUM7QUFDakMsa0RBQTZCO0FBSTdCLCtDQUFrRDtBQUNsRCwrQ0FRdUI7QUFFdkIsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUU3Qzs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUNsQyxHQUFxRCxFQUNyRCxRQUFnQjtJQUVoQixnQ0FBZ0M7SUFDaEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0MsS0FBSyxDQUFDLHlCQUF5QixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRTNDLDBFQUEwRTtJQUMxRSxNQUFNLGVBQWUsR0FBRyxJQUFBLDZCQUFlLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxLQUFLLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBRTFELE1BQU0sV0FBVyxHQUFHLElBQUEsK0JBQWlCLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRW5ELDhFQUE4RTtJQUM5RSxpQ0FBaUM7SUFDakMsTUFBTSxXQUFXLEdBQXlCLEVBQUUsQ0FBQztJQUU3Qyw4Q0FBOEM7SUFDOUMsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQztZQUNILDBFQUEwRTtZQUMxRSx3RUFBd0U7WUFDeEUsNkRBQTZEO1lBQzdELDBFQUEwRTtZQUMxRSwwRUFBMEU7WUFD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ZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qKlxuICogVGhlIGluaXQgY2FjaGU6IG9uZSByZXNwb25zZS1jYWNoZSBlbnRyeSBwZXIgcHJlcmVuZGVyZWQgcm91dGUsIHdyaXR0ZW4gYnlcbiAqIGBvbkJ1aWxkQ29tcGxldGVgIGFuZCBzZWVkZWQgaW50byBTMyBhdCBkZXBsb3ksIHNvIGEgZnJlc2hcbiAqIGRlcGxveW1lbnQgc3RhcnRzIHdpdGggd2hhdCBgbmV4dCBidWlsZGAgcmVuZGVyZWQgaW5zdGVhZCBvZiBhIGNvbGQgY2FjaGUuXG4gKlxuICogU2VwYXJhdGUgZnJvbSBgYWRhcHRlci5tdHNgIG9ubHkgc28gaXQgY2FuIGJlIHRlc3RlZCB3aXRob3V0IGxvYWRpbmcgdGhlXG4gKiBhZGFwdGVyIGl0c2VsZiAod2hpY2ggcmVzb2x2ZXMgY2RrLW5leHRqcydzIG93biBoYW5kbGVycyBvZmYgYGltcG9ydC5tZXRhYCkuXG4gKi9cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7IENhY2hlSGFuZGxlclZhbHVlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQgeyBDYWNoZWRSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZS9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZENvbXBsZXRlQ29udGV4dCB9IGZyb20gXCIuL2J1aWxkLW91dHB1dHNcIjtcbmltcG9ydCB7IGNhY2hlS2luZFJlc29sdmVyIH0gZnJvbSBcIi4vY2FjaGUta2luZHNcIjtcbmltcG9ydCB7XG4gIGFwcFBhZ2VDYWNoZUhlYWRlcnMsXG4gIGdyb3VwUHJlcmVuZGVycyxcbiAgaGVhZGVyVGFncyxcbiAgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1QsXG4gIEluaXRDYWNoZVRhZ01hbmlmZXN0LFxuICBwcmVyZW5kZXJQYXRoVG9DYWNoZUtleSxcbiAgc2VyaWFsaXplQ2FjaGVWYWx1ZSxcbn0gZnJvbSBcIi4vY2FjaGUtdXRpbHNcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6YWRhcHRlclwiKTtcblxuLyoqXG4gKiBXcml0ZSBhIGA8Y2FjaGVLZXk+Lmpzb25gIHBlciBwcmVyZW5kZXJlZCByb3V0ZSB1bmRlciBgY2FjaGVEaXJgLCBwbHVzXG4gKiB7QGxpbmsgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1R9IHdoZW4gYW55IGVudHJ5IGNhcnJpZXMgdGFncy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSW5pdENhY2hlKFxuICBjdHg6IFBpY2s8QnVpbGRDb21wbGV0ZUNvbnRleHQsIFwiY29uZmlnXCIgfCBcIm91dHB1dHNcIj4sXG4gIGNhY2hlRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRW5zdXJlIGNhY2hlIGRpcmVjdG9yeSBleGlzdHNcbiAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBkZWJ1ZyhgSW5pdCBjYWNoZSBkaXJlY3Rvcnk6ICR7Y2FjaGVEaXJ9YCk7XG5cbiAgLy8gT25lIGVudHJ5IHBlciByb3V0ZSwgd2l0aCBpdHMgSFRNTCwgYC5yc2NgIGFuZCBzZWdtZW50IG91dHB1dHMgdG9nZXRoZXJcbiAgY29uc3QgcHJlcmVuZGVyR3JvdXBzID0gZ3JvdXBQcmVyZW5kZXJzKGN0eC5vdXRwdXRzLnByZXJlbmRlcnMpO1xuICBkZWJ1ZyhgUHJlcmVuZGVyIGdyb3VwczogJHtwcmVyZW5kZXJHcm91cHMuc2l6ZX0gZ3JvdXBzYCk7XG5cbiAgY29uc3QgY2FjaGVLaW5kT2YgPSBjYWNoZUtpbmRSZXNvbHZlcihjdHgub3V0cHV0cyk7XG5cbiAgLy8gVGFnIC0+IGNhY2hlIGtleXMsIHN0YW5kaW5nIGluIGZvciB0aGUgbWFwcGluZyByb3dzIGEgcnVudGltZSBgc2V0YCB3cml0ZXMuXG4gIC8vIFNlZSBgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1RgLlxuICBjb25zdCB0YWdNYW5pZmVzdDogSW5pdENhY2hlVGFnTWFuaWZlc3QgPSB7fTtcblxuICAvLyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNyZWF0ZSBjYWNoZSBlbnRyaWVzXG4gIGZvciAoY29uc3QgW2Jhc2VQYXRoLCB2YXJpYW50c10gb2YgcHJlcmVuZGVyR3JvdXBzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEEgZHluYW1pYyByb3V0ZSB0ZW1wbGF0ZSDigJQgYC9bbGFuZ10vW3NsdWddYCDigJQgaXMgbm90IGEgZGVhZCBlbnRyeTogd2l0aFxuICAgICAgLy8gUFBSIGl0IGlzIHRoZSByb3V0ZSdzICpmYWxsYmFjayBzaGVsbCosIGFuZCB0aGUgc2VydmVyIGxvb2tzIGl0IHVwIGluXG4gICAgICAvLyB0aGUgY2FjaGUgdW5kZXIgZXhhY3RseSB0aGF0IGtleS4gYGFwcC1wYWdlLXJ1bnRpbWVgIHJlYWRzXG4gICAgICAvLyBgcHJlcmVuZGVyTWFuaWZlc3QuZHluYW1pY1JvdXRlc1tyb3V0ZV0uZmFsbGJhY2tgICh0aGUgbGl0ZXJhbCB0ZW1wbGF0ZVxuICAgICAgLy8gc3RyaW5nKSBhbmQgY2FsbHMgYGhhbmRsZVJlc3BvbnNlKHsgY2FjaGVLZXksIGlzRmFsbGJhY2s6IHRydWUgfSlgOyB0aGVcbiAgICAgIC8vIFBhZ2VzIFJvdXRlciBkb2VzIHRoZSBzYW1lIHdpdGggYHNyY1BhZ2VgIGZvciBhbiBJU1IgZmFsbGJhY2suIFNraXBwaW5nXG4gICAgICAvLyB0aGVzZSBncm91cHMgbWFkZSBldmVyeSBzdWNoIGxvb2t1cCBhIE1JU1MsIHNvIHRoZSBzaGVsbCB3YXMgcmVuZGVyZWRcbiAgICAgIC8vIHBlciByZXF1ZXN0IGluc3RlYWQgb2YgcmVzdW1lZCBmcm9tIHRoZSBidWlsZCAtIHZpc2libGUgaW5cbiAgICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL3N1Yi1zaGVsbC1nZW5lcmF0aW9uYCwgd2hlcmUgYSBgJ3VzZSBjYWNoZSdgIHJvb3RcbiAgICAgIC8vIGxheW91dCByZXBvcnRlZCBgKHJ1bnRpbWUpYCB3aGVyZSBuZXh0IHN0YXJ0IHJlcG9ydHMgYChidWlsZHRpbWUpYC5cbiAgICAgIC8vXG4gICAgICAvLyBBIFBhZ2VzIFJvdXRlciB0ZW1wbGF0ZSBpcyBzZWVkZWQgZm9yIHRoZSBzYW1lIHJlYXNvbjogaW4gcHJvZHVjdGlvblxuICAgICAgLy8gaXRzIGZpbGwgZnVuY3Rpb24gb25seSByZXR1cm5zIHdoYXQgdGhlIGNhY2hlIGFscmVhZHkgaG9sZHMsIHNvIHdpdGhcbiAgICAgIC8vIG5vdGhpbmcgc2VlZGVkIHRoZXJlIGlzIG5vIGBmYWxsYmFjazogdHJ1ZWAgc2hlbGwgdG8gc2VydmUgYW5kXG4gICAgICAvLyBgcm91dGVyLmlzRmFsbGJhY2tgIGlzIG5ldmVyIHRydWUgKGB0ZXN0L2UyZS9mYWxsYmFjay1yb3V0ZS1wYXJhbXNgKS5cbiAgICAgIC8vIE5vdGhpbmcgZXh0cmEgaXMgbmVlZGVkIHRvIGtlZXAgbm9uLVBQUiB0ZW1wbGF0ZXMgb3V0OiBhIHJvdXRlIHdpdGggbm9cbiAgICAgIC8vIHNoZWxsIGVtaXRzIG5vIHByZXJlbmRlciBvdXRwdXQuXG4gICAgICBjb25zdCBraW5kID0gY2FjaGVLaW5kT2YodmFyaWFudHMpO1xuICAgICAgaWYgKCFraW5kKSB7XG4gICAgICAgIGRlYnVnKGBTS0lQOiBObyByb3V0ZSBraW5kIGZvdW5kIGZvciAke2Jhc2VQYXRofWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoYFByb2Nlc3NpbmcgJHtiYXNlUGF0aH0gKCR7a2luZH0pYCk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaHRtbDogaHRtbFByZXJlbmRlcixcbiAgICAgICAgcnNjOiByc2NQcmVyZW5kZXIsXG4gICAgICAgIHNlZ21lbnRzOiBzZWdtZW50UHJlcmVuZGVycyxcbiAgICAgICAgZGF0YTogZGF0YVByZXJlbmRlcixcbiAgICAgIH0gPSB2YXJpYW50cztcblxuICAgICAgaWYgKCFodG1sUHJlcmVuZGVyICYmICFyc2NQcmVyZW5kZXIgJiYgIWRhdGFQcmVyZW5kZXIpIHtcbiAgICAgICAgZGVidWcoYFNLSVA6IE5vIHByZXJlbmRlciBmaWxlcyBmb3VuZCBmb3IgJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFpbiBmaWxlc1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgY2FjaGUgZW50cnkgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlIGJhc2VkIG9uIGtpbmRcbiAgICAgIGxldCBjYWNoZUVudHJ5OiBDYWNoZUhhbmRsZXJWYWx1ZTtcblxuICAgICAgaWYgKGtpbmQgPT09IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSkge1xuICAgICAgICAvLyBSZWFkIEhUTUwgZmlsZVxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVhZFByZXJlbmRlckFzVGV4dChodG1sUHJlcmVuZGVyKTtcblxuICAgICAgICBpZiAoIWh0bWwpIHtcbiAgICAgICAgICBkZWJ1ZyhgU0tJUDogTm8gSFRNTCBjb250ZW50IGZvciBBUFBfUEFHRSAke2Jhc2VQYXRofWApO1xuICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGlmIG5vIEhUTUwgY29udGVudFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVhZCBSU0MgZGF0YVxuICAgICAgICBjb25zdCByc2NEYXRhID0gYXdhaXQgcmVhZFByZXJlbmRlckFzQnVmZmVyKHJzY1ByZXJlbmRlcik7XG5cbiAgICAgICAgLy8gUmVhZCBzZWdtZW50IGRhdGFcbiAgICAgICAgY29uc3Qgc2VnbWVudERhdGEgPSBhd2FpdCBnZXRTZWdtZW50RGF0YShzZWdtZW50UHJlcmVuZGVycyk7XG5cbiAgICAgICAgLy8gRXh0cmFjdCBoZWFkZXJzIGZyb20gdGhlIEhUTUwgb3IgUlNDIHByZXJlbmRlclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXBwUGFnZUNhY2hlSGVhZGVycyhcbiAgICAgICAgICBodG1sUHJlcmVuZGVyPy5mYWxsYmFjaz8uaW5pdGlhbEhlYWRlcnMgfHxcbiAgICAgICAgICAgIHJzY1ByZXJlbmRlcj8uZmFsbGJhY2s/LmluaXRpYWxIZWFkZXJzIHx8XG4gICAgICAgICAgICB7fSxcbiAgICAgICAgKTtcblxuICAgICAgICBjYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgIHJzY0RhdGEsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgc2VnbWVudERhdGE6IHNlZ21lbnREYXRhLFxuICAgICAgICAgICAgLy8gcG9zdHBvbmVkU3RhdGUgZnJvbSBmYWxsYmFjayBhcHBlYXJzIHRvIGJlIHRoZSBSZWFjdCBwb3N0cG9uZWQgc3RhdGVcbiAgICAgICAgICAgIC8vIHdoaWNoIG1hdGNoZXMgd2hhdCB0aGUgY2FjaGUgZXhwZWN0cyBmb3IgcG9zdHBvbmVkXG4gICAgICAgICAgICBwb3N0cG9uZWQ6IGh0bWxQcmVyZW5kZXI/LmZhbGxiYWNrPy5wb3N0cG9uZWRTdGF0ZSxcbiAgICAgICAgICAgIC8vIGluaXRpYWxTdGF0dXMgZnJvbSBwcmVyZW5kZXIgaXMgdGhlIEhUVFAgc3RhdHVzIG9mIHRoZSBwcmVyZW5kZXJlZCBwYWdlXG4gICAgICAgICAgICBzdGF0dXM6IGh0bWxQcmVyZW5kZXI/LmZhbGxiYWNrPy5pbml0aWFsU3RhdHVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IENhY2hlZFJvdXRlS2luZC5BUFBfUk9VVEUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRQcmVyZW5kZXJBc0J1ZmZlcihodG1sUHJlcmVuZGVyKTtcblxuICAgICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgICBkZWJ1ZyhgU0tJUDogTm8gYm9keSBjb250ZW50IGZvciBBUFBfUk9VVEUgJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBpZiBubyBjb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IGhlYWRlcnNcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGh0bWxQcmVyZW5kZXI/LmZhbGxiYWNrPy5pbml0aWFsSGVhZGVycyB8fCB7fTtcblxuICAgICAgICBjYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9ST1VURSxcbiAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgc3RhdHVzOiBodG1sUHJlcmVuZGVyPy5mYWxsYmFjaz8uaW5pdGlhbFN0YXR1cyB8fCAyMDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gQ2FjaGVkUm91dGVLaW5kLlBBR0VTKSB7XG4gICAgICAgIC8vIEEgYnVpbGQtdGltZSBgbm90Rm91bmQ6IHRydWVgLiBOZXh0LmpzIHJlcG9ydHMgdGhlIHJvdXRlIGFzXG4gICAgICAgIC8vIHByZXJlbmRlcmVkIGFuZCBoYW5kcyB1cyBhIHByZXJlbmRlciB3aG9zZSBgZmlsZVBhdGhgIGlzXG4gICAgICAgIC8vIGBwYWdlcy80MDQuaHRtbGAgYW5kIHdob3NlIGBpbml0aWFsU3RhdHVzYCBpcyA0MDQgLSBidXQgaXQgd3JpdGVzXG4gICAgICAgIC8vICpubyogb3V0cHV0IGZvciBpdCAobm8gYGZpcnN0Lmh0bWxgLCBgLmpzb25gIG9yIGAubWV0YWApLCBiZWNhdXNlIGFcbiAgICAgICAgLy8gUGFnZXMgUm91dGVyIGBub3RGb3VuZGAgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIGNhY2hlIGFzIGFuIGVudHJ5XG4gICAgICAgIC8vIHdob3NlIGB2YWx1ZWAgaXMgYG51bGxgIChgcGFnZXMtaGFuZGxlci50c2AsIFwiaXNOb3RGb3VuZCBpblxuICAgICAgICAvLyBtZXRhZGF0YVwiKSwgYW5kIGBGaWxlU3lzdGVtQ2FjaGUuc2V0YCBrZWVwcyBhIG51bGwgdmFsdWUgaW4gaXRzIExSVVxuICAgICAgICAvLyBvbmx5LCBuZXZlciBvbiBkaXNrLiBTbyBgbmV4dCBzdGFydGAgbWlzc2VzLCByZS1ydW5zXG4gICAgICAgIC8vIGBnZXRTdGF0aWNQcm9wc2AsIGFuZCBhbnN3ZXJzIDQwNCBmcm9tIGByZW5kZXI0MDQoKWAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZWRpbmcgaXQgYXMgYW4gb3JkaW5hcnkgYFBBR0VTYCBlbnRyeSBtYWRlIHRoYXQgYSAyMDA6IHRoZSBlbnRyeVxuICAgICAgICAvLyBpcyBhIEhJVCBjYXJyeWluZyB0aGUgNDA0IHBhZ2UncyBIVE1MLCBhbmQgdGhlIHBhZ2VzIGhhbmRsZXIgbmV2ZXJcbiAgICAgICAgLy8gcmVhZHMgYHZhbHVlLnN0YXR1c2Agb24gdGhlIEhJVCBwYXRoLCBzbyB0aGUgc3RhdHVzIHN0YXllZCAyMDAgd2hpbGVcbiAgICAgICAgLy8gdGhlIGJvZHkgc2FpZCBcIjQwNCBwYWdlXCIuIFNraXBwaW5nIGl0IHJlc3RvcmVzIHRoZSBtaXNzLCBhbmQgd2l0aCBpdFxuICAgICAgICAvLyBgbmV4dCBzdGFydGAncyBzdGF0dXMuIENvc3RzIG9uZSByZW5kZXIgcGVyIHJldmFsaWRhdGUgd2luZG93LCB3aGljaFxuICAgICAgICAvLyBpcyB3aGF0IGBuZXh0IHN0YXJ0YCBwYXlzIHRvby5cbiAgICAgICAgY29uc3QgaW5pdGlhbFN0YXR1cyA9IGh0bWxQcmVyZW5kZXI/LmZhbGxiYWNrPy5pbml0aWFsU3RhdHVzO1xuICAgICAgICBpZiAoaW5pdGlhbFN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIGluaXRpYWxTdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYFNLSVA6IFBBR0VTICR7YmFzZVBhdGh9IHByZXJlbmRlcmVkIHdpdGggc3RhdHVzICR7aW5pdGlhbFN0YXR1c30gKGJ1aWxkLXRpbWUgbm90Rm91bmQpYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlYWRQcmVyZW5kZXJBc1RleHQoaHRtbFByZXJlbmRlcik7XG5cbiAgICAgICAgaWYgKCFodG1sKSB7XG4gICAgICAgICAgZGVidWcoYFNLSVA6IE5vIEhUTUwgY29udGVudCBmb3IgUEFHRVMgJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGBnZXRTdGF0aWNQcm9wc2AnIHJlc3VsdCwgd2hpY2ggdGhlIGVudHJ5cG9pbnQgYW5zd2Vyc1xuICAgICAgICAvLyBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCB3aXRoIGFuZCB0aGUgY2xpZW50IHJvdXRlciByZWFkc1xuICAgICAgICAvLyBvbiBhIG5hdmlnYXRpb24uIEEgcm91dGUncyAqZmFsbGJhY2sqIHRlbXBsYXRlIGhhcyBubyBkYXRhIGZpbGUgLVxuICAgICAgICAvLyB0aGVyZSBhcmUgbm8gcGFyYW1zIHRvIHJ1biBgZ2V0U3RhdGljUHJvcHNgIHdpdGggeWV0IC0gYW5kXG4gICAgICAgIC8vIGBGaWxlU3lzdGVtQ2FjaGVgIHNraXBzIHRoZSByZWFkIGZvciBvbmUgdG9vIChgaWYgKCFjdHguaXNGYWxsYmFjaylgKSxcbiAgICAgICAgLy8gbGVhdmluZyBgcGFnZURhdGFgIGFuIGVtcHR5IG9iamVjdC5cbiAgICAgICAgY29uc3QgcGFnZURhdGFKc29uID0gYXdhaXQgcmVhZFByZXJlbmRlckFzVGV4dChkYXRhUHJlcmVuZGVyKTtcblxuICAgICAgICBjYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLlBBR0VTLFxuICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgIHBhZ2VEYXRhOiBwYWdlRGF0YUpzb24gPyBKU09OLnBhcnNlKHBhZ2VEYXRhSnNvbikgOiB7fSxcbiAgICAgICAgICAgIC8vIEJvdGggYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYEZpbGVTeXN0ZW1DYWNoZWAgaGFuZHMgYmFjayBmb3JcbiAgICAgICAgICAgIC8vIGEgYFBBR0VTYCBlbnRyeTogaXQgcmVhZHMgYSBgLm1ldGFgIHNpZGVjYXIgZm9yIHRoZSBBcHAgUm91dGVyXG4gICAgICAgICAgICAvLyBraW5kcyBvbmx5LCBhbmQgYHNlbmRSZW5kZXJSZXN1bHRgIHN1cHBsaWVzIHRoZSBjb250ZW50IHR5cGUuXG4gICAgICAgICAgICAvLyBTZWVkaW5nIGBmYWxsYmFjay5pbml0aWFsSGVhZGVyc2AgaW5zdGVhZCB3b3VsZCBwdXRcbiAgICAgICAgICAgIC8vIGBjb250ZW50LXR5cGU6IHRleHQvaHRtbGAgb24gdGhlIEpTT04gZGF0YSByZXNwb25zZXMgc2VydmVkIGZyb21cbiAgICAgICAgICAgIC8vIHRoaXMgc2FtZSBlbnRyeS5cbiAgICAgICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTa2lwIHVuc3VwcG9ydGVkIGtpbmRzXG4gICAgICAgIGRlYnVnKGBTS0lQOiBVbnN1cHBvcnRlZCByb3V0ZSBraW5kICR7a2luZH0gZm9yICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSBjYWNoZSBlbnRyeSB0byBmaWxlLCB1bmRlciB0aGUgcm91dGUgcmF0aGVyIHRoYW4gdGhlIFVSTCBpdCBpc1xuICAgICAgLy8gc2VydmVkIGF0IC0gc2VlIGBwcmVyZW5kZXJQYXRoVG9DYWNoZUtleWAuXG4gICAgICBjb25zdCBjYWNoZUtleSA9IHByZXJlbmRlclBhdGhUb0NhY2hlS2V5KFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgY3R4LmNvbmZpZy5iYXNlUGF0aCB8fCBcIlwiLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBqb2luKGNhY2hlRGlyLCBgJHtjYWNoZUtleX0uanNvbmApO1xuXG4gICAgICAvLyBFbnN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IG1rZGlyKGpvaW4oY2FjaGVEaXIsIGNhY2hlS2V5LnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIikpLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgc2VyaWFsaXplQ2FjaGVWYWx1ZShjYWNoZUVudHJ5KSk7XG5cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGhlYWRlclRhZ3MoY2FjaGVFbnRyeS52YWx1ZSkpIHtcbiAgICAgICAgKHRhZ01hbmlmZXN0W3RhZ10gPz89IFtdKS5wdXNoKGNhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoYENyZWF0ZWQgY2FjaGUgZW50cnk6ICR7Y2FjaGVGaWxlUGF0aH1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcHJvY2Vzc2luZyBwcmVyZW5kZXIgZ3JvdXAgJHtiYXNlUGF0aH06YCwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRhZ2dlZEtleXMgPSBPYmplY3Qua2V5cyh0YWdNYW5pZmVzdCkubGVuZ3RoO1xuICBpZiAodGFnZ2VkS2V5cyA+IDApIHtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGNhY2hlRGlyLCBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCksXG4gICAgICBKU09OLnN0cmluZ2lmeSh0YWdNYW5pZmVzdCksXG4gICAgKTtcbiAgICBkZWJ1ZyhgV3JvdGUgJHtJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH0gd2l0aCAke3RhZ2dlZEtleXN9IHRhZ3NgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWQgZmlsZSBjb250ZW50IGZyb20gYSBwcmVyZW5kZXIgYXMgVVRGLTggc3RyaW5nXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQcmVyZW5kZXJBc1RleHQoXG4gIHByZXJlbmRlcjpcbiAgICB8IHsgZmFsbGJhY2s/OiB7IGZpbGVQYXRoPzogc3RyaW5nIH0gfCB7IHBvc3Rwb25lZFN0YXRlOiBzdHJpbmcgfSB9XG4gICAgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoXG4gICAgcHJlcmVuZGVyPy5mYWxsYmFjayAmJlxuICAgIFwiZmlsZVBhdGhcIiBpbiBwcmVyZW5kZXIuZmFsbGJhY2sgJiZcbiAgICBwcmVyZW5kZXIuZmFsbGJhY2suZmlsZVBhdGggJiZcbiAgICBleGlzdHNTeW5jKHByZXJlbmRlci5mYWxsYmFjay5maWxlUGF0aClcbiAgKSB7XG4gICAgcmV0dXJuIHJlYWRGaWxlKHByZXJlbmRlci5mYWxsYmFjay5maWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWQgZmlsZSBjb250ZW50IGZyb20gYSBwcmVyZW5kZXIgYXMgQnVmZmVyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQcmVyZW5kZXJBc0J1ZmZlcihcbiAgcHJlcmVuZGVyOlxuICAgIHwgeyBmYWxsYmFjaz86IHsgZmlsZVBhdGg/OiBzdHJpbmcgfSB8IHsgcG9zdHBvbmVkU3RhdGU6IHN0cmluZyB9IH1cbiAgICB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChcbiAgICBwcmVyZW5kZXI/LmZhbGxiYWNrICYmXG4gICAgXCJmaWxlUGF0aFwiIGluIHByZXJlbmRlci5mYWxsYmFjayAmJlxuICAgIHByZXJlbmRlci5mYWxsYmFjay5maWxlUGF0aCAmJlxuICAgIGV4aXN0c1N5bmMocHJlcmVuZGVyLmZhbGxiYWNrLmZpbGVQYXRoKVxuICApIHtcbiAgICByZXR1cm4gcmVhZEZpbGUocHJlcmVuZGVyLmZhbGxiYWNrLmZpbGVQYXRoKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWQgc2VnbWVudCBkYXRhIGZyb20gc2VnbWVudCBwcmVyZW5kZXJzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFNlZ21lbnREYXRhPFxuICBUIGV4dGVuZHMge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgZmFsbGJhY2s/OiB7IGZpbGVQYXRoPzogc3RyaW5nIH0gfCB7IHBvc3Rwb25lZFN0YXRlOiBzdHJpbmcgfTtcbiAgfSxcbj4oc2VnbWVudFByZXJlbmRlcnM6IFRbXSk6IFByb21pc2U8TWFwPHN0cmluZywgQnVmZmVyPj4ge1xuICBjb25zdCBzZWdtZW50RGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXI+KCk7XG5cbiAgZm9yIChjb25zdCBzZWdtZW50UHJlcmVuZGVyIG9mIHNlZ21lbnRQcmVyZW5kZXJzKSB7XG4gICAgaWYgKFxuICAgICAgc2VnbWVudFByZXJlbmRlci5mYWxsYmFjayAmJlxuICAgICAgXCJmaWxlUGF0aFwiIGluIHNlZ21lbnRQcmVyZW5kZXIuZmFsbGJhY2sgJiZcbiAgICAgIHNlZ21lbnRQcmVyZW5kZXIuZmFsbGJhY2suZmlsZVBhdGggJiZcbiAgICAgIGV4aXN0c1N5bmMoc2VnbWVudFByZXJlbmRlci5mYWxsYmFjay5maWxlUGF0aClcbiAgICApIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoc2VnbWVudFByZXJlbmRlci5mYWxsYmFjay5maWxlUGF0aCk7XG4gICAgICAvLyBFeHRyYWN0IHNlZ21lbnQgbmFtZSBmcm9tIHBhdGhuYW1lXG4gICAgICBjb25zdCBzZWdtZW50TmFtZSA9XG4gICAgICAgIFwiL1wiICtcbiAgICAgICAgc2VnbWVudFByZXJlbmRlci5wYXRobmFtZVxuICAgICAgICAgIC5zcGxpdChcIi5zZWdtZW50cy9cIilbMV1cbiAgICAgICAgICAucmVwbGFjZSgvXFwuc2VnbWVudFxcLnJzYyQvLCBcIlwiKTtcbiAgICAgIHNlZ21lbnREYXRhLnNldChzZWdtZW50TmFtZSwgc2VnbWVudENvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZWdtZW50RGF0YTtcbn1cbiJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2luaXQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFxQ0Esd0NBbVBDO0FBeFJELHNEQUFzRDtBQUN0RDs7Ozs7OztHQU9HO0FBQ0gscUNBQXFDO0FBQ3JDLCtDQUE4RDtBQUM5RCw2Q0FBNEM7QUFDNUMseUNBQTBDO0FBQzFDLGtEQUE2QjtBQUc3Qiw0Q0FBMEM7QUFFMUMsK0NBQWtEO0FBQ2xELCtDQVV1QjtBQUV2QixNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRTdDOzs7R0FHRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQ2xDLEdBR0MsRUFDRCxRQUFnQjtJQUVoQixnQ0FBZ0M7SUFDaEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0MsS0FBSyxDQUFDLHlCQUF5QixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRTNDLDBFQUEwRTtJQUMxRSxNQUFNLGVBQWUsR0FBRyxJQUFBLDZCQUFlLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoRSxLQUFLLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBRTFELE1BQU0sV0FBVyxHQUFHLElBQUEsK0JBQWlCLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRW5ELDhFQUE4RTtJQUM5RSxpQ0FBaUM7SUFDakMsTUFBTSxXQUFXLEdBQXlCLEVBQUUsQ0FBQztJQUU3Qyw4RUFBOEU7SUFDOUUsNEJBQTRCO0lBQzVCLE1BQU0saUJBQWlCLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUVwQyw4Q0FBOEM7SUFD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QUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsbUJBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNFLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxjQUFjLENBRTNCLGlCQUFzQjtJQUN0QixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUU5QyxLQUFLLE1BQU0sZ0JBQWdCLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGNBQWMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIscUNBQXFDO1lBQ3JDLE1BQU0sV0FBVyxHQUNmLEdBQUc7Z0JBQ0gsZ0JBQWdCLENBQUMsUUFBUTtxQkFDdEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEIsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBUaGUgaW5pdCBjYWNoZTogb25lIHJlc3BvbnNlLWNhY2hlIGVudHJ5IHBlciBwcmVyZW5kZXJlZCByb3V0ZSwgd3JpdHRlbiBieVxuICogYG9uQnVpbGRDb21wbGV0ZWAgYW5kIHNlZWRlZCBpbnRvIFMzIGF0IGRlcGxveSwgc28gYSBmcmVzaFxuICogZGVwbG95bWVudCBzdGFydHMgd2l0aCB3aGF0IGBuZXh0IGJ1aWxkYCByZW5kZXJlZCBpbnN0ZWFkIG9mIGEgY29sZCBjYWNoZS5cbiAqXG4gKiBTZXBhcmF0ZSBmcm9tIGBhZGFwdGVyLm10c2Agb25seSBzbyBpdCBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgbG9hZGluZyB0aGVcbiAqIGFkYXB0ZXIgaXRzZWxmICh3aGljaCByZXNvbHZlcyBjZGstbmV4dGpzJ3Mgb3duIGhhbmRsZXJzIG9mZiBgaW1wb3J0Lm1ldGFgKS5cbiAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgQ2FjaGVIYW5kbGVyVmFsdWUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvaW5jcmVtZW50YWwtY2FjaGVcIjtcbmltcG9ydCB7IENhY2hlZFJvdXRlS2luZCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZENvbXBsZXRlQ29udGV4dCB9IGZyb20gXCIuL2J1aWxkLW91dHB1dHNcIjtcbmltcG9ydCB7IGNhY2hlS2luZFJlc29sdmVyIH0gZnJvbSBcIi4vY2FjaGUta2luZHNcIjtcbmltcG9ydCB7XG4gIGFwcFBhZ2VDYWNoZUhlYWRlcnMsXG4gIGNhY2hlT2JqZWN0TmFtZSxcbiAgZ3JvdXBQcmVyZW5kZXJzLFxuICBoZWFkZXJUYWdzLFxuICBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCxcbiAgSW5pdENhY2hlVGFnTWFuaWZlc3QsXG4gIHByZXJlbmRlclBhdGhUb0NhY2hlS2V5LFxuICByb3V0ZUNhY2hlS2V5RnJvbUZpbGVQYXRoLFxuICBzZXJpYWxpemVDYWNoZVZhbHVlLFxufSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczphZGFwdGVyXCIpO1xuXG4vKipcbiAqIFdyaXRlIGEgYDxjYWNoZUtleT4uanNvbmAgcGVyIHByZXJlbmRlcmVkIHJvdXRlIHVuZGVyIGBjYWNoZURpcmAsIHBsdXNcbiAqIHtAbGluayBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH0gd2hlbiBhbnkgZW50cnkgY2FycmllcyB0YWdzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVJbml0Q2FjaGUoXG4gIGN0eDogUGljazxcbiAgICBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgICBcImNvbmZpZ1wiIHwgXCJvdXRwdXRzXCIgfCBcIm5leHRWZXJzaW9uXCIgfCBcInByb2plY3REaXJcIlxuICA+LFxuICBjYWNoZURpcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEVuc3VyZSBjYWNoZSBkaXJlY3RvcnkgZXhpc3RzXG4gIGF3YWl0IG1rZGlyKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZGVidWcoYEluaXQgY2FjaGUgZGlyZWN0b3J5OiAke2NhY2hlRGlyfWApO1xuXG4gIC8vIE9uZSBlbnRyeSBwZXIgcm91dGUsIHdpdGggaXRzIEhUTUwsIGAucnNjYCBhbmQgc2VnbWVudCBvdXRwdXRzIHRvZ2V0aGVyXG4gIGNvbnN0IHByZXJlbmRlckdyb3VwcyA9IGdyb3VwUHJlcmVuZGVycyhjdHgub3V0cHV0cy5wcmVyZW5kZXJzKTtcbiAgZGVidWcoYFByZXJlbmRlciBncm91cHM6ICR7cHJlcmVuZGVyR3JvdXBzLnNpemV9IGdyb3Vwc2ApO1xuXG4gIGNvbnN0IGNhY2hlS2luZE9mID0gY2FjaGVLaW5kUmVzb2x2ZXIoY3R4Lm91dHB1dHMpO1xuXG4gIC8vIFRhZyAtPiBjYWNoZSBrZXlzLCBzdGFuZGluZyBpbiBmb3IgdGhlIG1hcHBpbmcgcm93cyBhIHJ1bnRpbWUgYHNldGAgd3JpdGVzLlxuICAvLyBTZWUgYElOSVRfQ0FDSEVfVEFHX01BTklGRVNUYC5cbiAgY29uc3QgdGFnTWFuaWZlc3Q6IEluaXRDYWNoZVRhZ01hbmlmZXN0ID0ge307XG5cbiAgLy8gUm91dGVzIHNlZWRlZCB1bmRlciB0aGVpciBwYXRobmFtZSBieSBhIGBuZXh0YCB0aGF0IHJlYWRzIHJvdXRlLWNhY2hlIGtleXM6XG4gIC8vIHNlZSB0aGUgYGNhY2hlS2V5YCBiZWxvdy5cbiAgY29uc3Qgc2NvcGVzS2V5c0J5Um91dGUgPSBuZXh0U2NvcGVzS2V5c0J5Um91dGUoY3R4LnByb2plY3REaXIpO1xuICBjb25zdCB1bnNjb3BlZFJvdXRlczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBQcm9jZXNzIGVhY2ggZ3JvdXAgYW5kIGNyZWF0ZSBjYWNoZSBlbnRyaWVzXG4gIGZvciAoY29uc3QgW2Jhc2VQYXRoLCB2YXJpYW50c10gb2YgcHJlcmVuZGVyR3JvdXBzKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEEgZHluYW1pYyByb3V0ZSB0ZW1wbGF0ZSDigJQgYC9bbGFuZ10vW3NsdWddYCDigJQgaXMgbm90IGEgZGVhZCBlbnRyeTogd2l0aFxuICAgICAgLy8gUFBSIGl0IGlzIHRoZSByb3V0ZSdzICpmYWxsYmFjayBzaGVsbCosIGFuZCB0aGUgc2VydmVyIGxvb2tzIGl0IHVwIGluXG4gICAgICAvLyB0aGUgY2FjaGUgdW5kZXIgZXhhY3RseSB0aGF0IGtleS4gYGFwcC1wYWdlLXJ1bnRpbWVgIHJlYWRzXG4gICAgICAvLyBgcHJlcmVuZGVyTWFuaWZlc3QuZHluYW1pY1JvdXRlc1tyb3V0ZV0uZmFsbGJhY2tgICh0aGUgbGl0ZXJhbCB0ZW1wbGF0ZVxuICAgICAgLy8gc3RyaW5nKSBhbmQgY2FsbHMgYGhhbmRsZVJlc3BvbnNlKHsgY2FjaGVLZXksIGlzRmFsbGJhY2s6IHRydWUgfSlgOyB0aGVcbiAgICAgIC8vIFBhZ2VzIFJvdXRlciBkb2VzIHRoZSBzYW1lIHdpdGggYHNyY1BhZ2VgIGZvciBhbiBJU1IgZmFsbGJhY2suIFNraXBwaW5nXG4gICAgICAvLyB0aGVzZSBncm91cHMgbWFkZSBldmVyeSBzdWNoIGxvb2t1cCBhIE1JU1MsIHNvIHRoZSBzaGVsbCB3YXMgcmVuZGVyZWRcbiAgICAgIC8vIHBlciByZXF1ZXN0IGluc3RlYWQgb2YgcmVzdW1lZCBmcm9tIHRoZSBidWlsZCAtIHZpc2libGUgaW5cbiAgICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL3N1Yi1zaGVsbC1nZW5lcmF0aW9uYCwgd2hlcmUgYSBgJ3VzZSBjYWNoZSdgIHJvb3RcbiAgICAgIC8vIGxheW91dCByZXBvcnRlZCBgKHJ1bnRpbWUpYCB3aGVyZSBuZXh0IHN0YXJ0IHJlcG9ydHMgYChidWlsZHRpbWUpYC5cbiAgICAgIC8vXG4gICAgICAvLyBBIFBhZ2VzIFJvdXRlciB0ZW1wbGF0ZSBpcyBzZWVkZWQgZm9yIHRoZSBzYW1lIHJlYXNvbjogaW4gcHJvZHVjdGlvblxuICAgICAgLy8gaXRzIGZpbGwgZnVuY3Rpb24gb25seSByZXR1cm5zIHdoYXQgdGhlIGNhY2hlIGFscmVhZHkgaG9sZHMsIHNvIHdpdGhcbiAgICAgIC8vIG5vdGhpbmcgc2VlZGVkIHRoZXJlIGlzIG5vIGBmYWxsYmFjazogdHJ1ZWAgc2hlbGwgdG8gc2VydmUgYW5kXG4gICAgICAvLyBgcm91dGVyLmlzRmFsbGJhY2tgIGlzIG5ldmVyIHRydWUgKGB0ZXN0L2UyZS9mYWxsYmFjay1yb3V0ZS1wYXJhbXNgKS5cbiAgICAgIC8vIE5vdGhpbmcgZXh0cmEgaXMgbmVlZGVkIHRvIGtlZXAgbm9uLVBQUiB0ZW1wbGF0ZXMgb3V0OiBhIHJvdXRlIHdpdGggbm9cbiAgICAgIC8vIHNoZWxsIGVtaXRzIG5vIHByZXJlbmRlciBvdXRwdXQuXG4gICAgICBjb25zdCBraW5kID0gY2FjaGVLaW5kT2YodmFyaWFudHMpO1xuICAgICAgaWYgKCFraW5kKSB7XG4gICAgICAgIGRlYnVnKGBTS0lQOiBObyByb3V0ZSBraW5kIGZvdW5kIGZvciAke2Jhc2VQYXRofWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoYFByb2Nlc3NpbmcgJHtiYXNlUGF0aH0gKCR7a2luZH0pYCk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaHRtbDogaHRtbFByZXJlbmRlcixcbiAgICAgICAgcnNjOiByc2NQcmVyZW5kZXIsXG4gICAgICAgIHNlZ21lbnRzOiBzZWdtZW50UHJlcmVuZGVycyxcbiAgICAgICAgZGF0YTogZGF0YVByZXJlbmRlcixcbiAgICAgIH0gPSB2YXJpYW50cztcblxuICAgICAgaWYgKCFodG1sUHJlcmVuZGVyICYmICFyc2NQcmVyZW5kZXIgJiYgIWRhdGFQcmVyZW5kZXIpIHtcbiAgICAgICAgZGVidWcoYFNLSVA6IE5vIHByZXJlbmRlciBmaWxlcyBmb3VuZCBmb3IgJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgbWFpbiBmaWxlc1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgY2FjaGUgZW50cnkgd2l0aCB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlIGJhc2VkIG9uIGtpbmRcbiAgICAgIGxldCBjYWNoZUVudHJ5OiBDYWNoZUhhbmRsZXJWYWx1ZTtcblxuICAgICAgaWYgKGtpbmQgPT09IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSkge1xuICAgICAgICAvLyBSZWFkIEhUTUwgZmlsZVxuICAgICAgICBjb25zdCBodG1sID0gKGF3YWl0IHJlYWRQcmVyZW5kZXIoaHRtbFByZXJlbmRlcikpPy50b1N0cmluZygpO1xuXG4gICAgICAgIGlmICghaHRtbCkge1xuICAgICAgICAgIGRlYnVnKGBTS0lQOiBObyBIVE1MIGNvbnRlbnQgZm9yIEFQUF9QQUdFICR7YmFzZVBhdGh9YCk7XG4gICAgICAgICAgY29udGludWU7IC8vIFNraXAgaWYgbm8gSFRNTCBjb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFkIFJTQyBkYXRhXG4gICAgICAgIGNvbnN0IHJzY0RhdGEgPSBhd2FpdCByZWFkUHJlcmVuZGVyKHJzY1ByZXJlbmRlcik7XG5cbiAgICAgICAgLy8gUmVhZCBzZWdtZW50IGRhdGFcbiAgICAgICAgY29uc3Qgc2VnbWVudERhdGEgPSBhd2FpdCBnZXRTZWdtZW50RGF0YShzZWdtZW50UHJlcmVuZGVycyk7XG5cbiAgICAgICAgLy8gRXh0cmFjdCBoZWFkZXJzIGZyb20gdGhlIEhUTUwgb3IgUlNDIHByZXJlbmRlclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXBwUGFnZUNhY2hlSGVhZGVycyhcbiAgICAgICAgICBodG1sUHJlcmVuZGVyPy5mYWxsYmFjaz8uaW5pdGlhbEhlYWRlcnMgfHxcbiAgICAgICAgICAgIHJzY1ByZXJlbmRlcj8uZmFsbGJhY2s/LmluaXRpYWxIZWFkZXJzIHx8XG4gICAgICAgICAgICB7fSxcbiAgICAgICAgKTtcblxuICAgICAgICBjYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgIHJzY0RhdGEsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgc2VnbWVudERhdGE6IHNlZ21lbnREYXRhLFxuICAgICAgICAgICAgLy8gcG9zdHBvbmVkU3RhdGUgZnJvbSBmYWxsYmFjayBhcHBlYXJzIHRvIGJlIHRoZSBSZWFjdCBwb3N0cG9uZWQgc3RhdGVcbiAgICAgICAgICAgIC8vIHdoaWNoIG1hdGNoZXMgd2hhdCB0aGUgY2FjaGUgZXhwZWN0cyBmb3IgcG9zdHBvbmVkXG4gICAgICAgICAgICBwb3N0cG9uZWQ6IGh0bWxQcmVyZW5kZXI/LmZhbGxiYWNrPy5wb3N0cG9uZWRTdGF0ZSxcbiAgICAgICAgICAgIC8vIGluaXRpYWxTdGF0dXMgZnJvbSBwcmVyZW5kZXIgaXMgdGhlIEhUVFAgc3RhdHVzIG9mIHRoZSBwcmVyZW5kZXJlZCBwYWdlXG4gICAgICAgICAgICBzdGF0dXM6IGh0bWxQcmVyZW5kZXI/LmZhbGxiYWNrPy5pbml0aWFsU3RhdHVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IENhY2hlZFJvdXRlS2luZC5BUFBfUk9VVEUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRQcmVyZW5kZXIoaHRtbFByZXJlbmRlcik7XG5cbiAgICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgICAgZGVidWcoYFNLSVA6IE5vIGJvZHkgY29udGVudCBmb3IgQVBQX1JPVVRFICR7YmFzZVBhdGh9YCk7XG4gICAgICAgICAgY29udGludWU7IC8vIFNraXAgaWYgbm8gY29udGVudFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmFjdCBoZWFkZXJzXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBodG1sUHJlcmVuZGVyPy5mYWxsYmFjaz8uaW5pdGlhbEhlYWRlcnMgfHwge307XG5cbiAgICAgICAgY2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksXG4gICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUk9VVEUsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIHN0YXR1czogaHRtbFByZXJlbmRlcj8uZmFsbGJhY2s/LmluaXRpYWxTdGF0dXMgfHwgMjAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IENhY2hlZFJvdXRlS2luZC5QQUdFUykge1xuICAgICAgICAvLyBBIGJ1aWxkLXRpbWUgYG5vdEZvdW5kOiB0cnVlYC4gTmV4dC5qcyByZXBvcnRzIHRoZSByb3V0ZSBhc1xuICAgICAgICAvLyBwcmVyZW5kZXJlZCBhbmQgaGFuZHMgdXMgYSBwcmVyZW5kZXIgd2hvc2UgYGZpbGVQYXRoYCBpc1xuICAgICAgICAvLyBgcGFnZXMvNDA0Lmh0bWxgIGFuZCB3aG9zZSBgaW5pdGlhbFN0YXR1c2AgaXMgNDA0IC0gYnV0IGl0IHdyaXRlc1xuICAgICAgICAvLyAqbm8qIG91dHB1dCBmb3IgaXQgKG5vIGBmaXJzdC5odG1sYCwgYC5qc29uYCBvciBgLm1ldGFgKSwgYmVjYXVzZSBhXG4gICAgICAgIC8vIFBhZ2VzIFJvdXRlciBgbm90Rm91bmRgIGlzIHJlcHJlc2VudGVkIGluIHRoZSBjYWNoZSBhcyBhbiBlbnRyeVxuICAgICAgICAvLyB3aG9zZSBgdmFsdWVgIGlzIGBudWxsYCAoYHBhZ2VzLWhhbmRsZXIudHNgLCBcImlzTm90Rm91bmQgaW5cbiAgICAgICAgLy8gbWV0YWRhdGFcIiksIGFuZCBgRmlsZVN5c3RlbUNhY2hlLnNldGAga2VlcHMgYSBudWxsIHZhbHVlIGluIGl0cyBMUlVcbiAgICAgICAgLy8gb25seSwgbmV2ZXIgb24gZGlzay4gU28gYG5leHQgc3RhcnRgIG1pc3NlcywgcmUtcnVuc1xuICAgICAgICAvLyBgZ2V0U3RhdGljUHJvcHNgLCBhbmQgYW5zd2VycyA0MDQgZnJvbSBgcmVuZGVyNDA0KClgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWVkaW5nIGl0IGFzIGFuIG9yZGluYXJ5IGBQQUdFU2AgZW50cnkgbWFkZSB0aGF0IGEgMjAwOiB0aGUgZW50cnlcbiAgICAgICAgLy8gaXMgYSBISVQgY2FycnlpbmcgdGhlIDQwNCBwYWdlJ3MgSFRNTCwgYW5kIHRoZSBwYWdlcyBoYW5kbGVyIG5ldmVyXG4gICAgICAgIC8vIHJlYWRzIGB2YWx1ZS5zdGF0dXNgIG9uIHRoZSBISVQgcGF0aCwgc28gdGhlIHN0YXR1cyBzdGF5ZWQgMjAwIHdoaWxlXG4gICAgICAgIC8vIHRoZSBib2R5IHNhaWQgXCI0MDQgcGFnZVwiLiBTa2lwcGluZyBpdCByZXN0b3JlcyB0aGUgbWlzcywgYW5kIHdpdGggaXRcbiAgICAgICAgLy8gYG5leHQgc3RhcnRgJ3Mgc3RhdHVzLiBDb3N0cyBvbmUgcmVuZGVyIHBlciByZXZhbGlkYXRlIHdpbmRvdywgd2hpY2hcbiAgICAgICAgLy8gaXMgd2hhdCBgbmV4dCBzdGFydGAgcGF5cyB0b28uXG4gICAgICAgIGNvbnN0IGluaXRpYWxTdGF0dXMgPSBodG1sUHJlcmVuZGVyPy5mYWxsYmFjaz8uaW5pdGlhbFN0YXR1cztcbiAgICAgICAgaWYgKGluaXRpYWxTdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBpbml0aWFsU3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBTS0lQOiBQQUdFUyAke2Jhc2VQYXRofSBwcmVyZW5kZXJlZCB3aXRoIHN0YXR1cyAke2luaXRpYWxTdGF0dXN9IChidWlsZC10aW1lIG5vdEZvdW5kKWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSAoYXdhaXQgcmVhZFByZXJlbmRlcihodG1sUHJlcmVuZGVyKSk/LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaWYgKCFodG1sKSB7XG4gICAgICAgICAgZGVidWcoYFNLSVA6IE5vIEhUTUwgY29udGVudCBmb3IgUEFHRVMgJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGBnZXRTdGF0aWNQcm9wc2AnIHJlc3VsdCwgd2hpY2ggdGhlIGVudHJ5cG9pbnQgYW5zd2Vyc1xuICAgICAgICAvLyBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCB3aXRoIGFuZCB0aGUgY2xpZW50IHJvdXRlciByZWFkc1xuICAgICAgICAvLyBvbiBhIG5hdmlnYXRpb24uIEEgcm91dGUncyAqZmFsbGJhY2sqIHRlbXBsYXRlIGhhcyBubyBkYXRhIGZpbGUgLVxuICAgICAgICAvLyB0aGVyZSBhcmUgbm8gcGFyYW1zIHRvIHJ1biBgZ2V0U3RhdGljUHJvcHNgIHdpdGggeWV0IC0gYW5kXG4gICAgICAgIC8vIGBGaWxlU3lzdGVtQ2FjaGVgIHNraXBzIHRoZSByZWFkIGZvciBvbmUgdG9vIChgaWYgKCFjdHguaXNGYWxsYmFjaylgKSxcbiAgICAgICAgLy8gbGVhdmluZyBgcGFnZURhdGFgIGFuIGVtcHR5IG9iamVjdC5cbiAgICAgICAgY29uc3QgcGFnZURhdGFKc29uID0gKGF3YWl0IHJlYWRQcmVyZW5kZXIoZGF0YVByZXJlbmRlcikpPy50b1N0cmluZygpO1xuXG4gICAgICAgIGNhY2hlRW50cnkgPSB7XG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuUEFHRVMsXG4gICAgICAgICAgICBodG1sLFxuICAgICAgICAgICAgcGFnZURhdGE6IHBhZ2VEYXRhSnNvbiA/IEpTT04ucGFyc2UocGFnZURhdGFKc29uKSA6IHt9LFxuICAgICAgICAgICAgLy8gQm90aCBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgd2hhdCBgRmlsZVN5c3RlbUNhY2hlYCBoYW5kcyBiYWNrIGZvclxuICAgICAgICAgICAgLy8gYSBgUEFHRVNgIGVudHJ5OiBpdCByZWFkcyBhIGAubWV0YWAgc2lkZWNhciBmb3IgdGhlIEFwcCBSb3V0ZXJcbiAgICAgICAgICAgIC8vIGtpbmRzIG9ubHksIGFuZCBgc2VuZFJlbmRlclJlc3VsdGAgc3VwcGxpZXMgdGhlIGNvbnRlbnQgdHlwZS5cbiAgICAgICAgICAgIC8vIFNlZWRpbmcgYGZhbGxiYWNrLmluaXRpYWxIZWFkZXJzYCBpbnN0ZWFkIHdvdWxkIHB1dFxuICAgICAgICAgICAgLy8gYGNvbnRlbnQtdHlwZTogdGV4dC9odG1sYCBvbiB0aGUgSlNPTiBkYXRhIHJlc3BvbnNlcyBzZXJ2ZWQgZnJvbVxuICAgICAgICAgICAgLy8gdGhpcyBzYW1lIGVudHJ5LlxuICAgICAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNraXAgdW5zdXBwb3J0ZWQga2luZHNcbiAgICAgICAgZGVidWcoYFNLSVA6IFVuc3VwcG9ydGVkIHJvdXRlIGtpbmQgJHtraW5kfSBmb3IgJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIGNhY2hlIGVudHJ5IHRvIGZpbGUsIHVuZGVyIHRoZSBrZXkgTmV4dC5qcyByZWFkcyBpdCBiYWNrIHdpdGg6XG4gICAgICAvLyBmcm9tIG5leHQgMTYuMy44IHRoZSBvbmUgYG5leHQgYnVpbGRgIGZpbGVkIHRoZSBwcmVyZW5kZXIgdW5kZXIgKHNlZVxuICAgICAgLy8gYHJvdXRlQ2FjaGVLZXlGcm9tRmlsZVBhdGhgKSwgYmVmb3JlIHRoYXQgdGhlIHJvdXRlIHJhdGhlciB0aGFuIHRoZVxuICAgICAgLy8gVVJMIGl0IGlzIHNlcnZlZCBhdCAoc2VlIGBwcmVyZW5kZXJQYXRoVG9DYWNoZUtleWApLlxuICAgICAgLy8gRXZlcnkga2luZCBzZWVkZWQgaGVyZSBoYXMgcmVhZCBpdHMgSFRNTCBwcmVyZW5kZXIsIHNvIHRoYXQgaXMgdGhlXG4gICAgICAvLyBmaWxlIHRvIHJlYWQgdGhlIGtleSBvZmYuXG4gICAgICBjb25zdCByb3V0ZUNhY2hlS2V5ID0gcm91dGVDYWNoZUtleUZyb21GaWxlUGF0aChcbiAgICAgICAgcHJlcmVuZGVyRmlsZVBhdGgoaHRtbFByZXJlbmRlciksXG4gICAgICApO1xuICAgICAgaWYgKCFyb3V0ZUNhY2hlS2V5ICYmIHNjb3Blc0tleXNCeVJvdXRlKSB7XG4gICAgICAgIC8vIE5ldmVyIHJlYWQgdW5kZXIgYW55IG90aGVyIGtleTsgdGhlIGJ1aWxkIGZhaWxzIGJlbG93LlxuICAgICAgICB1bnNjb3BlZFJvdXRlcy5wdXNoKGJhc2VQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZUtleSA9XG4gICAgICAgIHJvdXRlQ2FjaGVLZXkgPz9cbiAgICAgICAgcHJlcmVuZGVyUGF0aFRvQ2FjaGVLZXkoYmFzZVBhdGgsIGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIik7XG4gICAgICBjb25zdCBjYWNoZUZpbGVQYXRoID0gam9pbihjYWNoZURpciwgY2FjaGVPYmplY3ROYW1lKGNhY2hlS2V5KSk7XG5cbiAgICAgIC8vIEVuc3VyZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShjYWNoZUZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBzZXJpYWxpemVDYWNoZVZhbHVlKGNhY2hlRW50cnkpKTtcblxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgaGVhZGVyVGFncyhjYWNoZUVudHJ5LnZhbHVlKSkge1xuICAgICAgICAodGFnTWFuaWZlc3RbdGFnXSA/Pz0gW10pLnB1c2goY2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICBkZWJ1ZyhgQ3JlYXRlZCBjYWNoZSBlbnRyeTogJHtjYWNoZUZpbGVQYXRofWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBwcm9jZXNzaW5nIHByZXJlbmRlciBncm91cCAke2Jhc2VQYXRofTpgLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBwYXRobmFtZSBrZXkgaXMgb25lIDE2LjMuOCsgbmV2ZXIgcmVhZHMsIHNvIGVhY2ggb2YgdGhlc2Ugd291bGQgYmUgYVxuICAvLyBNSVNTIHVudGlsIGl0IGlzIGZpcnN0IHJlbmRlcmVkIC0gdGhlIHJlZ3Jlc3Npb24gdGhlIHJvdXRlLWNhY2hlIGtleSBmaXhlZFxuICAvLyAtIHdpdGggYSBkZXBsb3kgdGhhdCBvdGhlcndpc2Ugc3VjY2VlZHMuIEZhaWwgdGhlIGJ1aWxkIGluc3RlYWQuXG4gIGlmICh1bnNjb3BlZFJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gTmV4dC5qcyAke2N0eC5uZXh0VmVyc2lvbn0gd3JvdGUgJHt1bnNjb3BlZFJvdXRlcy5sZW5ndGh9IGAgK1xuICAgICAgICBgcHJlcmVuZGVyKHMpIG91dHNpZGUgPGRpc3REaXI+L3NlcnZlci9yb3V0ZS1jYWNoZS8sIHNvIGNkay1uZXh0anMgYCArXG4gICAgICAgIGBjYW5ub3QgdGVsbCB0aGUgY2FjaGUga2V5IGl0IHJlYWRzIHRoZW0gYmFjayB3aXRoOiBgICtcbiAgICAgICAgYCR7dW5zY29wZWRSb3V0ZXMuc2xpY2UoMCwgNSkuam9pbihcIiwgXCIpfWAgK1xuICAgICAgICBgJHt1bnNjb3BlZFJvdXRlcy5sZW5ndGggPiA1ID8gXCIsIC4uLlwiIDogXCJcIn1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0YWdnZWRLZXlzID0gT2JqZWN0LmtleXModGFnTWFuaWZlc3QpLmxlbmd0aDtcbiAgaWYgKHRhZ2dlZEtleXMgPiAwKSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgam9pbihjYWNoZURpciwgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1QpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodGFnTWFuaWZlc3QpLFxuICAgICk7XG4gICAgZGVidWcoYFdyb3RlICR7SU5JVF9DQUNIRV9UQUdfTUFOSUZFU1R9IHdpdGggJHt0YWdnZWRLZXlzfSB0YWdzYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBhcHAncyBgbmV4dGAgc2NvcGVzIHJlc3BvbnNlLWNhY2hlIGtleXMgYnkgc291cmNlIHJvdXRlICgxNi4zLjhcbiAqIG9uKSwgZm91bmQgYnkgd2hldGhlciBpdCBoYXMgdGhlIG1vZHVsZSB0aGF0IGRlcml2ZXMgdGhlbSwgc2luY2UgYSBjYW5hcnknc1xuICogdmVyc2lvbiBzYXlzIG5vdGhpbmcgb2Ygd2hhdCBpdCBjb250YWlucy5cbiAqL1xuZnVuY3Rpb24gbmV4dFNjb3Blc0tleXNCeVJvdXRlKHByb2plY3REaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNyZWF0ZVJlcXVpcmUoam9pbihwcm9qZWN0RGlyLCBcInBhY2thZ2UuanNvblwiKSkucmVzb2x2ZShcbiAgICAgIFwibmV4dC9kaXN0L3NlcnZlci9saWIvcm91dGUtY2FjaGUta2V5LmpzXCIsXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBBIHByZXJlbmRlciBvdXRwdXQsIG9mIHdoaWNoIG9ubHkgdGhlIGZpbGUgaXQgd2FzIHdyaXR0ZW4gdG8gaXMgcmVhZC4gKi9cbnR5cGUgUHJlcmVuZGVyT3V0cHV0ID1cbiAgeyBmYWxsYmFjaz86IHsgZmlsZVBhdGg/OiBzdHJpbmcgfSB8IHsgcG9zdHBvbmVkU3RhdGU6IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBUaGUgZmlsZSBgbmV4dCBidWlsZGAgd3JvdGUgYSBwcmVyZW5kZXIgdG8sIGlmIGl0IHdyb3RlIG9uZS4gKi9cbmZ1bmN0aW9uIHByZXJlbmRlckZpbGVQYXRoKHByZXJlbmRlcjogUHJlcmVuZGVyT3V0cHV0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByZXJlbmRlcj8uZmFsbGJhY2sgJiYgXCJmaWxlUGF0aFwiIGluIHByZXJlbmRlci5mYWxsYmFja1xuICAgID8gcHJlcmVuZGVyLmZhbGxiYWNrLmZpbGVQYXRoXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgY29udGVudCBvZiB0aGUgZmlsZSBgbmV4dCBidWlsZGAgd3JvdGUgYSBwcmVyZW5kZXIgdG8sIGlmIGl0IGV4aXN0cy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQcmVyZW5kZXIoXG4gIHByZXJlbmRlcjogUHJlcmVuZGVyT3V0cHV0LFxuKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwcmVyZW5kZXJGaWxlUGF0aChwcmVyZW5kZXIpO1xuICByZXR1cm4gZmlsZVBhdGggJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkgPyByZWFkRmlsZShmaWxlUGF0aCkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVhZCBzZWdtZW50IGRhdGEgZnJvbSBzZWdtZW50IHByZXJlbmRlcnNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0U2VnbWVudERhdGE8XG4gIFQgZXh0ZW5kcyB7IHBhdGhuYW1lOiBzdHJpbmcgfSAmIE5vbk51bGxhYmxlPFByZXJlbmRlck91dHB1dD4sXG4+KHNlZ21lbnRQcmVyZW5kZXJzOiBUW10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIEJ1ZmZlcj4+IHtcbiAgY29uc3Qgc2VnbWVudERhdGEgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyPigpO1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudFByZXJlbmRlciBvZiBzZWdtZW50UHJlcmVuZGVycykge1xuICAgIGNvbnN0IHNlZ21lbnRDb250ZW50ID0gYXdhaXQgcmVhZFByZXJlbmRlcihzZWdtZW50UHJlcmVuZGVyKTtcbiAgICBpZiAoc2VnbWVudENvbnRlbnQpIHtcbiAgICAgIC8vIEV4dHJhY3Qgc2VnbWVudCBuYW1lIGZyb20gcGF0aG5hbWVcbiAgICAgIGNvbnN0IHNlZ21lbnROYW1lID1cbiAgICAgICAgXCIvXCIgK1xuICAgICAgICBzZWdtZW50UHJlcmVuZGVyLnBhdGhuYW1lXG4gICAgICAgICAgLnNwbGl0KFwiLnNlZ21lbnRzL1wiKVsxXVxuICAgICAgICAgIC5yZXBsYWNlKC9cXC5zZWdtZW50XFwucnNjJC8sIFwiXCIpO1xuICAgICAgc2VnbWVudERhdGEuc2V0KHNlZ21lbnROYW1lLCBzZWdtZW50Q29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnREYXRhO1xufVxuIl19