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.
- package/.jsii +38 -38
- package/.jsii.tabl.json +1 -1
- package/README.md +12 -3
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
- package/docs/adapter-runtime.md +1 -1
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +11 -9
- package/lib/adapter/adapter.mjs +220 -149
- package/lib/adapter/aws-cache-store.d.ts +242 -7
- package/lib/adapter/aws-cache-store.js +520 -54
- package/lib/adapter/aws-cache-store.test.js +710 -3
- package/lib/adapter/build-outputs.js +23 -1
- package/lib/adapter/build-outputs.test.js +18 -1
- package/lib/adapter/cache-handler.d.ts +4 -3
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-handler.mjs +552 -91
- package/lib/adapter/cache-handler.test.js +31 -1
- package/lib/adapter/cache-utils.d.ts +68 -2
- package/lib/adapter/cache-utils.js +108 -2
- package/lib/adapter/cache-utils.test.js +45 -1
- package/lib/adapter/init-cache.d.ts +1 -1
- package/lib/adapter/init-cache.js +60 -37
- package/lib/adapter/init-cache.test.js +55 -2
- package/lib/adapter/local-file-cache-handler.d.ts +2 -2
- package/lib/adapter/local-file-cache-handler.js +4 -5
- package/lib/adapter/s3-cache-handler.d.ts +23 -7
- package/lib/adapter/s3-cache-handler.js +63 -27
- package/lib/adapter/s3-cache-handler.test.js +168 -1
- package/lib/adapter/use-cache-common.d.ts +53 -1
- package/lib/adapter/use-cache-common.js +121 -14
- package/lib/adapter/use-cache-common.test.js +138 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +557 -51
- package/lib/adapter/use-cache-handlers.test.js +247 -7
- package/lib/adapter/use-cache-remote-handler.js +10 -9
- package/lib/adapter/use-cache-remote-handler.mjs +597 -101
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +0 -7
- package/lib/nextjs-build/nextjs-build.js +4 -11
- package/lib/nextjs-build/nextjs-build.test.js +4 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +18 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/image.d.ts +19 -0
- package/lib/runtime/image.js +28 -2
- package/lib/runtime/image.test.js +43 -1
- package/lib/runtime/lambda.mjs +30 -6
- package/lib/runtime/server.mjs +30 -6
- package/lib/runtime/tag-manifest.d.ts +15 -0
- package/lib/runtime/tag-manifest.js +24 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +21 -0
- package/lib/utils/deployment-build-id.d.ts +11 -0
- package/lib/utils/deployment-build-id.js +15 -0
- package/package.json +3 -3
- package/scripts/e2e-harness/README.md +1 -1
|
@@ -8,6 +8,7 @@ const fs_1 = require("fs");
|
|
|
8
8
|
const os_1 = require("os");
|
|
9
9
|
const path_1 = require("path");
|
|
10
10
|
const cache_handler_1 = __importDefault(require("./cache-handler"));
|
|
11
|
+
const cache_utils_1 = require("./cache-utils");
|
|
11
12
|
// Mock AWS SDK clients
|
|
12
13
|
jest.mock("@aws-sdk/client-s3");
|
|
13
14
|
jest.mock("@aws-sdk/client-dynamodb");
|
|
@@ -345,6 +346,35 @@ describe("CdkNextjsCacheHandler - Orchestrator Pattern", () => {
|
|
|
345
346
|
delete process.env.CDK_NEXTJS_INIT_CACHE_DIR;
|
|
346
347
|
}
|
|
347
348
|
});
|
|
349
|
+
// The seed is uploaded as written, so it must be filed under the name the
|
|
350
|
+
// runtime's `get` reads: for a name too long for S3, `cacheObjectName`'s.
|
|
351
|
+
it("files an over-long key where the runtime reads it", async () => {
|
|
352
|
+
process.env.NEXT_PHASE = "phase-production-build";
|
|
353
|
+
const cacheDir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), "cdk-nextjs-init-cache-"));
|
|
354
|
+
process.env.CDK_NEXTJS_INIT_CACHE_DIR = cacheDir;
|
|
355
|
+
try {
|
|
356
|
+
const key = `/route-cache/APP_PAGE/${"a".repeat(64)}/$/${"x".repeat(900)}`;
|
|
357
|
+
expect((0, cache_utils_1.cacheObjectName)(key)).toMatch(/^_long-key\//);
|
|
358
|
+
const data = {
|
|
359
|
+
kind: "FETCH" /* CachedRouteKind.FETCH */,
|
|
360
|
+
data: { headers: {}, body: "e30=", status: 200, url: "" },
|
|
361
|
+
revalidate: 60,
|
|
362
|
+
};
|
|
363
|
+
const setCtx = { fetchCache: true, tags: [] };
|
|
364
|
+
await new cache_handler_1.default(createMockContext()).set(key, data, setCtx);
|
|
365
|
+
expect((0, fs_1.existsSync)((0, path_1.join)(cacheDir, (0, cache_utils_1.cacheObjectName)(key)))).toBe(true);
|
|
366
|
+
const getCtx = {
|
|
367
|
+
kind: "FETCH" /* IncrementalCacheKind.FETCH */,
|
|
368
|
+
revalidate: 60,
|
|
369
|
+
tags: [],
|
|
370
|
+
};
|
|
371
|
+
expect(await new cache_handler_1.default(createMockContext()).get(key, getCtx)).toMatchObject({ value: data });
|
|
372
|
+
}
|
|
373
|
+
finally {
|
|
374
|
+
delete process.env.NEXT_PHASE;
|
|
375
|
+
delete process.env.CDK_NEXTJS_INIT_CACHE_DIR;
|
|
376
|
+
}
|
|
377
|
+
});
|
|
348
378
|
});
|
|
349
379
|
});
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvY2FjaGUtaGFuZGxlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQXNEO0FBQ3RELDJCQUFpQztBQUNqQywyQkFBNEI7QUFDNUIsK0JBQTRCO0FBUTVCLG9FQUFvRDtBQUVwRCx1QkFBdUI7QUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUV0QyxRQUFRLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO0lBQzVELElBQUksWUFBbUMsQ0FBQztJQUV4QyxNQUFNLGlCQUFpQixHQUFHLEdBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELEdBQUcsRUFBRSxLQUFLO1FBQ1YsZUFBZSxFQUFFLEVBQUU7UUFDbkIsZUFBZSxFQUFFLEVBQUU7S0FDcEIsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUV6RCxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLFlBQVksR0FBRyxJQUFJLHVCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsb0JBQW9CO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQztRQUNsRCxzRUFBc0U7UUFDdEUsNkNBQTZDO1FBQzVDLHVC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RSxDQUFDO1lBQ3BFLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUM5QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgbWtkdGVtcFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDYWNoZUhhbmRsZXJDb250ZXh0IH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQge1xuICBJbmNyZW1lbnRhbENhY2hlVmFsdWUsXG4gIENhY2hlZFJvdXRlS2luZCxcbiAgSW5jcmVtZW50YWxDYWNoZUtpbmQsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQgdHlwZSB7IEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZVwiO1xuaW1wb3J0IENka05leHRqc0NhY2hlSGFuZGxlciBmcm9tIFwiLi9jYWNoZS1oYW5kbGVyXCI7XG5cbi8vIE1vY2sgQVdTIFNESyBjbGllbnRzXG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtczNcIik7XG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7XG5cbmRlc2NyaWJlKFwiQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyIC0gT3JjaGVzdHJhdG9yIFBhdHRlcm5cIiwgKCkgPT4ge1xuICBsZXQgY2FjaGVIYW5kbGVyOiBDZGtOZXh0anNDYWNoZUhhbmRsZXI7XG5cbiAgY29uc3QgY3JlYXRlTW9ja0NvbnRleHQgPSAoKTogQ2FjaGVIYW5kbGVyQ29udGV4dCA9PiAoe1xuICAgIGRldjogZmFsc2UsXG4gICAgcmV2YWxpZGF0ZWRUYWdzOiBbXSxcbiAgICBfcmVxdWVzdEhlYWRlcnM6IHt9LFxuICB9KTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAvLyBTdXBwcmVzcyBleHBlY3RlZCB3YXJuaW5ncyB3aGVuIGVudiB2YXJzIGFyZSBub3Qgc2V0XG4gICAgamVzdC5zcHlPbihjb25zb2xlLCBcIndhcm5cIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuICAgIGNvbnN0IG1vY2tDb250ZXh0ID0gY3JlYXRlTW9ja0NvbnRleHQoKTtcbiAgICBjYWNoZUhhbmRsZXIgPSBuZXcgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyKG1vY2tDb250ZXh0KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpO1xuICAgIC8vIENsZWFuIHVwIGVudiB2YXJzXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfTUVNT1JZX0NBQ0hFX1RUTF9NUztcbiAgICAvLyBSZXNldCBzaW5nbGV0b24gaGFuZGxlcnMgYnkgYWNjZXNzaW5nIHRoZSBjbGFzcydzIHN0YXRpYyBwcm9wZXJ0aWVzXG4gICAgLy8gVGhpcyBlbnN1cmVzIGVhY2ggdGVzdCBnZXRzIGZyZXNoIGhhbmRsZXJzXG4gICAgKENka05leHRqc0NhY2hlSGFuZGxlciBhcyBhbnkpLnNoYXJlZE1lbW9yeUhhbmRsZXIgPSBudWxsO1xuICAgIChDZGtOZXh0anNDYWNoZUhhbmRsZXIgYXMgYW55KS5zaGFyZWRTM0R5bmFtb0hhbmRsZXIgPSBudWxsO1xuICB9KTtcblxuICBkZXNjcmliZShcIk9yY2hlc3RyYXRvcjogTWVtb3J5ICsgUzMvRHluYW1vREJcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHdyaXRlIHRvIGJvdGggbWVtb3J5IGFuZCBTMy9EeW5hbW9EQiBvbiBzZXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPnRlc3Q8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgc2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgY29uc3Qgc2V0Q3R4ID0geyBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LCB0YWdzOiBbXSB9O1xuXG4gICAgICAvLyBTZXQgY2FjaGUgZW50cnlcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJ0ZXN0LWtleVwiLCB0ZXN0RGF0YSwgc2V0Q3R4KTtcblxuICAgICAgLy8gUzMvRHluYW1vREIgZ290IHRoZSB3cml0ZSwgd2l0aCB0aGUgY29udGV4dCBpdCBuZWVkcyBmb3IgdGFncy5cbiAgICAgIGV4cGVjdChzMy5zZXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwidGVzdC1rZXlcIiwgdGVzdERhdGEsIHNldEN0eCk7XG5cbiAgICAgIC8vIEdldCBzaG91bGQgcmV0dXJuIGZyb20gbWVtb3J5LCB3aXRob3V0IGFza2luZyBTMy5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJ0ZXN0LWtleVwiLCB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZU51bGwoKTtcbiAgICAgIGV4cGVjdChyZXN1bHQ/LnZhbHVlKS50b0VxdWFsKHRlc3REYXRhKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImRlbGV0ZXMgZnJvbSBib3RoIGxheWVycyBvbiBzZXQoa2V5LCBudWxsKVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+Z29uZTwvaHRtbD5cIixcbiAgICAgICAgcnNjRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIHBvc3Rwb25lZDogdW5kZWZpbmVkLFxuICAgICAgICBzZWdtZW50RGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgc2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgY29uc3Qgc2V0Q3R4ID0geyBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LCB0YWdzOiBbXSB9O1xuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnNldChcImdvbmUta2V5XCIsIHRlc3REYXRhLCBzZXRDdHgpO1xuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwiZ29uZS1rZXlcIiwgbnVsbCwgc2V0Q3R4KTtcblxuICAgICAgLy8gVGhlIFMzIGxheWVyIGlzIHRvbGQgdG8gZGVsZXRlLCBub3Qgc2tpcHBlZC5cbiAgICAgIGV4cGVjdChzMy5zZXQpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChcImdvbmUta2V5XCIsIG51bGwsIHNldEN0eCk7XG4gICAgICAvLyBBbmQgbWVtb3J5IG5vIGxvbmdlciBhbnN3ZXJzOiB0aGUgcmVhZCBmYWxscyB0aHJvdWdoIHRvIFMzLlxuICAgICAgZXhwZWN0KFxuICAgICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiZ29uZS1rZXlcIiwge1xuICAgICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICkudG9CZU51bGwoKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmV2YWxpZGF0ZXMgYSB0YWcgaW4gUzMvRHluYW1vREIsIHBhc3NpbmcgdGhlIGR1cmF0aW9ucyB0aHJvdWdoXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD50YWdnZWQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogeyBcIngtbmV4dC1jYWNoZS10YWdzXCI6IFwicG9zdHNcIiB9LFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIHNldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgICByZXZhbGlkYXRlVGFnOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG5cbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJ0YWdnZWQta2V5XCIsIHRlc3REYXRhLCB7XG4gICAgICAgIGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsXG4gICAgICAgIHRhZ3M6IFtcInBvc3RzXCJdLFxuICAgICAgfSk7XG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZyh0YWcsIHByb2ZpbGUpYDogdGhlIGR1cmF0aW9ucyBkZWNpZGUgc3RhbGUgdnMgZXhwaXJlZCxcbiAgICAgIC8vIHNvIGRyb3BwaW5nIHRoZW0gdHVybnMgZXZlcnkgc29mdCByZXZhbGlkYXRpb24gaW50byBhIGhhcmQgb25lLlxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnJldmFsaWRhdGVUYWcoW1wicG9zdHNcIl0sIHsgZXhwaXJlOiA2MCB9KTtcblxuICAgICAgZXhwZWN0KHMzLnJldmFsaWRhdGVUYWcpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFtcInBvc3RzXCJdLCB7IGV4cGlyZTogNjAgfSk7XG5cbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5yZXZhbGlkYXRlVGFnKFwicG9zdHNcIik7XG4gICAgICBleHBlY3QoczMucmV2YWxpZGF0ZVRhZykudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKFwicG9zdHNcIiwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBjYWNoZSBtaXNzZXMgZ3JhY2VmdWxseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBHZXQgbm9uLWV4aXN0ZW50IGtleVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcIm1pc3Npbmcta2V5XCIsIHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gbnVsbCAoYm90aCBtZW1vcnkgYW5kIFMzIG1pc3MpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJkb2VzIG5vdCBjb3B5IGEgdGFnLWV4cGlyZWQgUzMgZW50cnkgaW50byBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYGxhc3RNb2RpZmllZDogLTFgIGlzIHRoZSBTMyBsYXllciBzYXlpbmcgXCJhIHRhZyByZXZhbGlkYXRpb24gZXhwaXJlZFxuICAgICAgLy8gdGhpcywgcmUtcmVuZGVyIGJlZm9yZSBhbnN3ZXJpbmdcIi4gQ29waWVkIGludG8gbWVtb3J5LCB0aGUgZXhwaXJlZCBib2R5XG4gICAgICAvLyB3b3VsZCBiZSBhbnN3ZXJlZCBmcm9tIHRoZXJlIGluc3RlYWQgb2YgZnJvbSB0aGUgcmUtcmVuZGVyLlxuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPmV4cGlyZWQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogLTEsIHZhbHVlIH0pLFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiaXNyLzFcIiwgZ2V0Q3R4KSkudG9FcXVhbCh7XG4gICAgICAgIGxhc3RNb2RpZmllZDogLTEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFdpdGggdGhlIFMzIGxheWVyIG5vdyBzaWxlbnQsIGEgbWVtb3J5IGNvcHkgd291bGQgYW5zd2VyIHRoaXMgYXMgYSBoaXQuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgIH07XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8xXCIsIGdldEN0eCkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImNvcGllcyBhIGxpdmUgUzMgZW50cnkgaW50byBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPmxpdmU8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSksXG4gICAgICB9O1xuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8yXCIsIGdldEN0eCk7XG5cbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgICAgaXNSZXZhbGlkYXRlZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8yXCIsIGdldEN0eCkpLnRvTWF0Y2hPYmplY3QoeyB2YWx1ZSB9KTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImtlZXBzIHRoZSBTMyBlbnRyeSdzIGxhc3RNb2RpZmllZCB3aGVuIGNvcHlpbmcgaXQgaW50byBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTmV4dC5qcyBhZ2VzIHRoZSBlbnRyeSBmcm9tIGBsYXN0TW9kaWZpZWRgLCBhbmQgdGhlIHRhZyBtYXJrZXJzIGFyZVxuICAgICAgLy8gY29tcGFyZWQgYWdhaW5zdCBpdC4gU3RhbXBpbmcgdGhlIHRpbWUgb2YgdGhlIGNvcHkgbWFkZSBhIHBhZ2UgYSBzb2Z0XG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgaGFkIG1hZGUgc3RhbGUgbG9vayBuZXdlciB0aGFuIHRoZSBzdGFsZSBtYXJrLlxuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPm9sZDwvaHRtbD5cIixcbiAgICAgICAgcnNjRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIHBvc3Rwb25lZDogdW5kZWZpbmVkLFxuICAgICAgICBzZWdtZW50RGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCBnZXRDdHggPSB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBjb25zdCByZW5kZXJlZEF0ID0gRGF0ZS5ub3coKSAtIDYwXzAwMDtcblxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyBsYXN0TW9kaWZpZWQ6IHJlbmRlcmVkQXQsIHZhbHVlIH0pLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvM1wiLCBnZXRDdHgpO1xuXG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvM1wiLCBnZXRDdHgpKS50b0VxdWFsKHtcbiAgICAgICAgbGFzdE1vZGlmaWVkOiByZW5kZXJlZEF0LFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHMzLmlzUmV2YWxpZGF0ZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICB7IGxhc3RNb2RpZmllZDogcmVuZGVyZWRBdCwgdmFsdWUgfSxcbiAgICAgICAgZ2V0Q3R4LFxuICAgICAgICBcImlzci8zXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJkb2VzIG5vdCBzZXJ2ZSBhIG1lbW9yeSBoaXQgYW5vdGhlciBpbnN0YW5jZSdzIHJldmFsaWRhdGVUYWcgZXhwaXJlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgY2xlYXJzIG9ubHkgdGhlIG1lbW9yeSBvZiB0aGUgaW5zdGFuY2UgdGhhdCByYW4gaXQuIEFueVxuICAgICAgLy8gb3RoZXIgaW5zdGFuY2UgaG9sZGluZyB0aGUgcGFnZSBpbiBtZW1vcnkgYW5zd2VyZWQgZnJvbSBpdCBmb3IgdGhlXG4gICAgICAvLyB3aG9sZSBtZW1vcnkgVFRMLCBhbmQgQ2xvdWRGcm9udCAtIGp1c3QgaW52YWxpZGF0ZWQgLSBjYWNoZWQgdGhlIHN0YWxlXG4gICAgICAvLyBwYWdlIGFnYWluLiBTbyBhIG1lbW9yeSBoaXQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSB0YWcgbWFya2VycyB0b28uXG4gICAgICBjb25zdCB2YWx1ZTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+c3RhbGU8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogeyBcIngtbmV4dC1jYWNoZS10YWdzXCI6IFwiX05fVF8vYmxvZ1wiIH0sXG4gICAgICAgIHBvc3Rwb25lZDogdW5kZWZpbmVkLFxuICAgICAgICBzZWdtZW50RGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCBnZXRDdHggPSB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0gYXMgY29uc3Q7XG5cbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCB2YWx1ZSB9KSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiYmxvZ1wiLCBnZXRDdHgpO1xuXG4gICAgICAvLyBBbm90aGVyIGluc3RhbmNlIHJldmFsaWRhdGVkIGBfTl9UXy9ibG9nYDogdGhlIG1hcmtlciBpcyBuZXdlciB0aGFuIHRoZVxuICAgICAgLy8gbWVtb3J5IGNvcHksIGFuZCBTMyBub3cgYW5zd2VycyB3aXRoIHRoZSBlbnRyeSBleHBpcmVkLlxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgbGFzdE1vZGlmaWVkOiAtMSwgdmFsdWUgfSksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh0cnVlKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImJsb2dcIiwgZ2V0Q3R4KSkudG9FcXVhbCh7XG4gICAgICAgIGxhc3RNb2RpZmllZDogLTEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoczMuaXNSZXZhbGlkYXRlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgdmFsdWUgfSksXG4gICAgICAgIGdldEN0eCxcbiAgICAgICAgXCJibG9nXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHMzLmdldCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXG4gICAgICAvLyBBbmQgdGhlIG1lbW9yeSBjb3B5IGlzIGdvbmUgcmF0aGVyIHRoYW4gY2hlY2tlZCBhZ2FpbiBuZXh0IHRpbWUuXG4gICAgICBzMy5nZXQubW9ja1Jlc29sdmVkVmFsdWUobnVsbCk7XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImJsb2dcIiwgZ2V0Q3R4KSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KFwia2VlcHMgbWVtb3J5IGVudHJpZXMgYWNyb3NzIHJlc2V0UmVxdWVzdENhY2hlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE5leHQuanMgY2FsbHMgaXQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IHJlcXVlc3Q7IGNsZWFyaW5nIHRoZSBzaGFyZWRcbiAgICAgIC8vIG1lbW9yeSBjYWNoZSB0aGVyZSBzZW50IGV2ZXJ5IHJlYWQgdG8gUzMuXG4gICAgICBjb25zdCB0ZXN0RGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+cmVzZXQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgZW50cnlcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJyZXNldC1rZXlcIiwgdGVzdERhdGEsIHtcbiAgICAgICAgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgdGFnczogW1wicmVzZXQtdGFnXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlc2V0XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIucmVzZXRSZXF1ZXN0Q2FjaGUoKTtcblxuICAgICAgLy8gU3RpbGwgYW5zd2VyZWQgZnJvbSBtZW1vcnksIHdpdGhvdXQgYXNraW5nIFMzLlxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJyZXNldC1rZXlcIiwge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQ/LnZhbHVlKS50b0VxdWFsKHRlc3REYXRhKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiQnVpbGQtdGltZSBiZWhhdmlvclwiLCAoKSA9PiB7XG4gICAgaXQoXCJyZWFkcyBiYWNrIGEgZmV0Y2ggZW50cnkgaXQgd3JvdGUsIGZyb20gbWVtb3J5IGFuZCBmcm9tIGRpc2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYGNhY2hlQ29tcG9uZW50c2AgcHJlcmVuZGVycyBlYWNoIHBhZ2UgdHdpY2U6IHRoZSBmaXJzdCBwYXNzIHJ1bnMgdGhlXG4gICAgICAvLyBgZmV0Y2hgIGFuZCBgc2V0YHMgaXQsIHRoZSBzZWNvbmQgbXVzdCBmaW5kIGl0IGFscmVhZHkgY2FjaGVkIG9yIE5leHQuanNcbiAgICAgIC8vIGZhaWxzIHRoZSBidWlsZCB3aXRoIFwiZW5jb3VudGVyZWQgdW5jYWNoZWQgb3IgcnVudGltZSBkYXRhIGR1cmluZ1xuICAgICAgLy8gcHJlcmVuZGVyaW5nXCIuIEEgd3JpdGUtb25seSBidWlsZC10aW1lIGhhbmRsZXIgdGhlcmVmb3JlIG1ha2VzXG4gICAgICAvLyBgY2FjaGU6ICdmb3JjZS1jYWNoZSdgIHVuYnVpbGRhYmxlIC0gbWVhc3VyZWQgYWdhaW5zdCBuZXh0LmpzJ3NcbiAgICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL3Jlc3VtZS1kYXRhLWNhY2hlYC5cbiAgICAgIHByb2Nlc3MuZW52Lk5FWFRfUEhBU0UgPSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbiAgICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVIgPSBta2R0ZW1wU3luYyhcbiAgICAgICAgam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLWluaXQtY2FjaGUtXCIpLFxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuRkVUQ0gsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICBib2R5OiBcImV5SnlZVzVrYjIwaU9qRjlcIixcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgdXJsOiBcImh0dHBzOi8vZXhhbXBsZS50ZXN0L2FwaS9yYW5kb21cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJldmFsaWRhdGU6IDMxNTM2MDAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmZXRjaFVybCA9IFwiaHR0cHM6Ly9leGFtcGxlLnRlc3QvYXBpL3JhbmRvbVwiO1xuICAgICAgICBjb25zdCBzZXRDdHggPSB7XG4gICAgICAgICAgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICB0YWdzOiBbXCJ0ZXN0XCJdLFxuICAgICAgICAgIGZldGNoVXJsLFxuICAgICAgICAgIGZldGNoSWR4OiAxLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnZXRDdHg6IEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQgPSB7XG4gICAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuRkVUQ0gsXG4gICAgICAgICAgcmV2YWxpZGF0ZTogMzE1MzYwMDAsXG4gICAgICAgICAgZmV0Y2hVcmwsXG4gICAgICAgICAgZmV0Y2hJZHg6IDEsXG4gICAgICAgICAgdGFnczogW1widGVzdFwiXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYnVpbGRIYW5kbGVyID0gbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihjcmVhdGVNb2NrQ29udGV4dCgpKTtcbiAgICAgICAgYXdhaXQgYnVpbGRIYW5kbGVyLnNldChcImZldGNoLWtleVwiLCBkYXRhLCBzZXRDdHgpO1xuICAgICAgICBleHBlY3QoYXdhaXQgYnVpbGRIYW5kbGVyLmdldChcImZldGNoLWtleVwiLCBnZXRDdHgpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQSBzZWNvbmQgaW5zdGFuY2UgcmVhZHMgdGhlIGZpbGUgcmF0aGVyIHRoYW4gdGhlIG1hcDogYG5leHQgYnVpbGRgXG4gICAgICAgIC8vIHJlbmRlcnMgcGFnZXMgaW4gd29ya2VyIHByb2Nlc3Nlcywgc28gdGhlIHBhc3MgdGhhdCB3cml0ZXMgYW5kIHRoZVxuICAgICAgICAvLyBwYXNzIHRoYXQgcmVhZHMgYXJlIG5vdCBhbHdheXMgdGhlIHNhbWUgcHJvY2Vzcy5cbiAgICAgICAgY29uc3Qgb3RoZXJXb3JrZXIgPSBuZXcgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyKGNyZWF0ZU1vY2tDb250ZXh0KCkpO1xuICAgICAgICBleHBlY3QoYXdhaXQgb3RoZXJXb3JrZXIuZ2V0KFwiZmV0Y2gta2V5XCIsIGdldEN0eCkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KGF3YWl0IG90aGVyV29ya2VyLmdldChcIm5ldmVyLXdyaXR0ZW5cIiwgZ2V0Q3R4KSkudG9CZU51bGwoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ORVhUX1BIQVNFO1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19JTklUX0NBQ0hFX0RJUjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvY2FjaGUtaGFuZGxlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQXNEO0FBQ3RELDJCQUE2QztBQUM3QywyQkFBNEI7QUFDNUIsK0JBQTRCO0FBUTVCLG9FQUFvRDtBQUNwRCwrQ0FBZ0Q7QUFFaEQsdUJBQXVCO0FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFdEMsUUFBUSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtJQUM1RCxJQUFJLFlBQW1DLENBQUM7SUFFeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUF3QixFQUFFLENBQUMsQ0FBQztRQUNwRCxHQUFHLEVBQUUsS0FBSztRQUNWLGVBQWUsRUFBRSxFQUFFO1FBQ25CLGVBQWUsRUFBRSxFQUFFO0tBQ3BCLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztRQUN4QyxZQUFZLEdBQUcsSUFBSSx1QkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLG9CQUFvQjtRQUNwQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUM7UUFDbEQsc0VBQXNFO1FBQ3RFLDZD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RSxDQUFDLENBQUMsR0FBRyxDQUN0RCxHQUFHLEVBQ0gsSUFBSSxFQUNKLE1BQU0sQ0FDUCxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxJQUFBLGVBQVUsRUFBQyxJQUFBLFdBQUksRUFBQyxRQUFRLEVBQUUsSUFBQSw2QkFBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQW9DO29CQUM5QyxJQUFJLDBDQUE0QjtvQkFDaEMsVUFBVSxFQUFFLEVBQUU7b0JBQ2QsSUFBSSxFQUFFLEVBQUU7aUJBQ1QsQ0FBQztnQkFDRixNQUFNLENBQ0osTUFBTSxJQUFJLHVCQUFxQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUN0RSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUM5QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkdGVtcFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDYWNoZUhhbmRsZXJDb250ZXh0IH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQge1xuICBJbmNyZW1lbnRhbENhY2hlVmFsdWUsXG4gIENhY2hlZFJvdXRlS2luZCxcbiAgSW5jcmVtZW50YWxDYWNoZUtpbmQsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQgdHlwZSB7IEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZVwiO1xuaW1wb3J0IENka05leHRqc0NhY2hlSGFuZGxlciBmcm9tIFwiLi9jYWNoZS1oYW5kbGVyXCI7XG5pbXBvcnQgeyBjYWNoZU9iamVjdE5hbWUgfSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuXG4vLyBNb2NrIEFXUyBTREsgY2xpZW50c1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpO1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCIpO1xuXG5kZXNjcmliZShcIkNka05leHRqc0NhY2hlSGFuZGxlciAtIE9yY2hlc3RyYXRvciBQYXR0ZXJuXCIsICgpID0+IHtcbiAgbGV0IGNhY2hlSGFuZGxlcjogQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyO1xuXG4gIGNvbnN0IGNyZWF0ZU1vY2tDb250ZXh0ID0gKCk6IENhY2hlSGFuZGxlckNvbnRleHQgPT4gKHtcbiAgICBkZXY6IGZhbHNlLFxuICAgIHJldmFsaWRhdGVkVGFnczogW10sXG4gICAgX3JlcXVlc3RIZWFkZXJzOiB7fSxcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgLy8gU3VwcHJlc3MgZXhwZWN0ZWQgd2FybmluZ3Mgd2hlbiBlbnYgdmFycyBhcmUgbm90IHNldFxuICAgIGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBtb2NrQ29udGV4dCA9IGNyZWF0ZU1vY2tDb250ZXh0KCk7XG4gICAgY2FjaGVIYW5kbGVyID0gbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihtb2NrQ29udGV4dCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgamVzdC5yZXN0b3JlQWxsTW9ja3MoKTtcbiAgICAvLyBDbGVhbiB1cCBlbnYgdmFyc1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX01FTU9SWV9DQUNIRV9UVExfTVM7XG4gICAgLy8gUmVzZXQgc2luZ2xldG9uIGhhbmRsZXJzIGJ5IGFjY2Vzc2luZyB0aGUgY2xhc3MncyBzdGF0aWMgcHJvcGVydGllc1xuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIHRlc3QgZ2V0cyBmcmVzaCBoYW5kbGVyc1xuICAgIChDZGtOZXh0anNDYWNoZUhhbmRsZXIgYXMgYW55KS5zaGFyZWRNZW1vcnlIYW5kbGVyID0gbnVsbDtcbiAgICAoQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyIGFzIGFueSkuc2hhcmVkUzNEeW5hbW9IYW5kbGVyID0gbnVsbDtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJPcmNoZXN0cmF0b3I6IE1lbW9yeSArIFMzL0R5bmFtb0RCXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCB3cml0ZSB0byBib3RoIG1lbW9yeSBhbmQgUzMvRHluYW1vREIgb24gc2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD50ZXN0PC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIHNldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGNvbnN0IHNldEN0eCA9IHsgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCwgdGFnczogW10gfTtcblxuICAgICAgLy8gU2V0IGNhY2hlIGVudHJ5XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwidGVzdC1rZXlcIiwgdGVzdERhdGEsIHNldEN0eCk7XG5cbiAgICAgIC8vIFMzL0R5bmFtb0RCIGdvdCB0aGUgd3JpdGUsIHdpdGggdGhlIGNvbnRleHQgaXQgbmVlZHMgZm9yIHRhZ3MuXG4gICAgICBleHBlY3QoczMuc2V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcInRlc3Qta2V5XCIsIHRlc3REYXRhLCBzZXRDdHgpO1xuXG4gICAgICAvLyBHZXQgc2hvdWxkIHJldHVybiBmcm9tIG1lbW9yeSwgd2l0aG91dCBhc2tpbmcgUzMuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwidGVzdC1rZXlcIiwge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmVOdWxsKCk7XG4gICAgICBleHBlY3QocmVzdWx0Py52YWx1ZSkudG9FcXVhbCh0ZXN0RGF0YSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJkZWxldGVzIGZyb20gYm90aCBsYXllcnMgb24gc2V0KGtleSwgbnVsbClcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPmdvbmU8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIHNldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGNvbnN0IHNldEN0eCA9IHsgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCwgdGFnczogW10gfTtcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJnb25lLWtleVwiLCB0ZXN0RGF0YSwgc2V0Q3R4KTtcblxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnNldChcImdvbmUta2V5XCIsIG51bGwsIHNldEN0eCk7XG5cbiAgICAgIC8vIFRoZSBTMyBsYXllciBpcyB0b2xkIHRvIGRlbGV0ZSwgbm90IHNraXBwZWQuXG4gICAgICBleHBlY3QoczMuc2V0KS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgoXCJnb25lLWtleVwiLCBudWxsLCBzZXRDdHgpO1xuICAgICAgLy8gQW5kIG1lbW9yeSBubyBsb25nZXIgYW5zd2VyczogdGhlIHJlYWQgZmFsbHMgdGhyb3VnaCB0byBTMy5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImdvbmUta2V5XCIsIHtcbiAgICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApLnRvQmVOdWxsKCk7XG4gICAgICBleHBlY3QoczMuZ2V0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgfSk7XG5cbiAgICBpdChcInJldmFsaWRhdGVzIGEgdGFnIGluIFMzL0R5bmFtb0RCLCBwYXNzaW5nIHRoZSBkdXJhdGlvbnMgdGhyb3VnaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+dGFnZ2VkPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJ4LW5leHQtY2FjaGUtdGFnc1wiOiBcInBvc3RzXCIgfSxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBzZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgICAgaXNSZXZhbGlkYXRlZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKSxcbiAgICAgICAgcmV2YWxpZGF0ZVRhZzogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwidGFnZ2VkLWtleVwiLCB0ZXN0RGF0YSwge1xuICAgICAgICBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICB0YWdzOiBbXCJwb3N0c1wiXSxcbiAgICAgIH0pO1xuICAgICAgLy8gYHJldmFsaWRhdGVUYWcodGFnLCBwcm9maWxlKWA6IHRoZSBkdXJhdGlvbnMgZGVjaWRlIHN0YWxlIHZzIGV4cGlyZWQsXG4gICAgICAvLyBzbyBkcm9wcGluZyB0aGVtIHR1cm5zIGV2ZXJ5IHNvZnQgcmV2YWxpZGF0aW9uIGludG8gYSBoYXJkIG9uZS5cbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5yZXZhbGlkYXRlVGFnKFtcInBvc3RzXCJdLCB7IGV4cGlyZTogNjAgfSk7XG5cbiAgICAgIGV4cGVjdChzMy5yZXZhbGlkYXRlVGFnKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDYwIH0pO1xuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIucmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIpO1xuICAgICAgZXhwZWN0KHMzLnJldmFsaWRhdGVUYWcpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChcInBvc3RzXCIsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgY2FjaGUgbWlzc2VzIGdyYWNlZnVsbHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gR2V0IG5vbi1leGlzdGVudCBrZXlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJtaXNzaW5nLWtleVwiLCB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaG91bGQgcmV0dXJuIG51bGwgKGJvdGggbWVtb3J5IGFuZCBTMyBtaXNzKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZG9lcyBub3QgY29weSBhIHRhZy1leHBpcmVkIFMzIGVudHJ5IGludG8gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGBsYXN0TW9kaWZpZWQ6IC0xYCBpcyB0aGUgUzMgbGF5ZXIgc2F5aW5nIFwiYSB0YWcgcmV2YWxpZGF0aW9uIGV4cGlyZWRcbiAgICAgIC8vIHRoaXMsIHJlLXJlbmRlciBiZWZvcmUgYW5zd2VyaW5nXCIuIENvcGllZCBpbnRvIG1lbW9yeSwgdGhlIGV4cGlyZWQgYm9keVxuICAgICAgLy8gd291bGQgYmUgYW5zd2VyZWQgZnJvbSB0aGVyZSBpbnN0ZWFkIG9mIGZyb20gdGhlIHJlLXJlbmRlci5cbiAgICAgIGNvbnN0IHZhbHVlOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD5leHBpcmVkPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdldEN0eCA9IHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyBsYXN0TW9kaWZpZWQ6IC0xLCB2YWx1ZSB9KSxcbiAgICAgIH07XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8xXCIsIGdldEN0eCkpLnRvRXF1YWwoe1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IC0xLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBXaXRoIHRoZSBTMyBsYXllciBub3cgc2lsZW50LCBhIG1lbW9yeSBjb3B5IHdvdWxkIGFuc3dlciB0aGlzIGFzIGEgaGl0LlxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICB9O1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvMVwiLCBnZXRDdHgpKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJjb3BpZXMgYSBsaXZlIFMzIGVudHJ5IGludG8gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD5saXZlPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdldEN0eCA9IHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksIHZhbHVlIH0pLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvMlwiLCBnZXRDdHgpO1xuXG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvMlwiLCBnZXRDdHgpKS50b01hdGNoT2JqZWN0KHsgdmFsdWUgfSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJrZWVwcyB0aGUgUzMgZW50cnkncyBsYXN0TW9kaWZpZWQgd2hlbiBjb3B5aW5nIGl0IGludG8gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE5leHQuanMgYWdlcyB0aGUgZW50cnkgZnJvbSBgbGFzdE1vZGlmaWVkYCwgYW5kIHRoZSB0YWcgbWFya2VycyBhcmVcbiAgICAgIC8vIGNvbXBhcmVkIGFnYWluc3QgaXQuIFN0YW1waW5nIHRoZSB0aW1lIG9mIHRoZSBjb3B5IG1hZGUgYSBwYWdlIGEgc29mdFxuICAgICAgLy8gYHJldmFsaWRhdGVUYWdgIGhhZCBtYWRlIHN0YWxlIGxvb2sgbmV3ZXIgdGhhbiB0aGUgc3RhbGUgbWFyay5cbiAgICAgIGNvbnN0IHZhbHVlOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD5vbGQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuICAgICAgY29uc3QgcmVuZGVyZWRBdCA9IERhdGUubm93KCkgLSA2MF8wMDA7XG5cbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgbGFzdE1vZGlmaWVkOiByZW5kZXJlZEF0LCB2YWx1ZSB9KSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiaXNyLzNcIiwgZ2V0Q3R4KTtcblxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGV4cGVjdChhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiaXNyLzNcIiwgZ2V0Q3R4KSkudG9FcXVhbCh7XG4gICAgICAgIGxhc3RNb2RpZmllZDogcmVuZGVyZWRBdCxcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChzMy5pc1JldmFsaWRhdGVkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyBsYXN0TW9kaWZpZWQ6IHJlbmRlcmVkQXQsIHZhbHVlIH0sXG4gICAgICAgIGdldEN0eCxcbiAgICAgICAgXCJpc3IvM1wiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZG9lcyBub3Qgc2VydmUgYSBtZW1vcnkgaGl0IGFub3RoZXIgaW5zdGFuY2UncyByZXZhbGlkYXRlVGFnIGV4cGlyZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYHJldmFsaWRhdGVUYWdgIGNsZWFycyBvbmx5IHRoZSBtZW1vcnkgb2YgdGhlIGluc3RhbmNlIHRoYXQgcmFuIGl0LiBBbnlcbiAgICAgIC8vIG90aGVyIGluc3RhbmNlIGhvbGRpbmcgdGhlIHBhZ2UgaW4gbWVtb3J5IGFuc3dlcmVkIGZyb20gaXQgZm9yIHRoZVxuICAgICAgLy8gd2hvbGUgbWVtb3J5IFRUTCwgYW5kIENsb3VkRnJvbnQgLSBqdXN0IGludmFsaWRhdGVkIC0gY2FjaGVkIHRoZSBzdGFsZVxuICAgICAgLy8gcGFnZSBhZ2Fpbi4gU28gYSBtZW1vcnkgaGl0IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgdGFnIG1hcmtlcnMgdG9vLlxuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPnN0YWxlPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJ4LW5leHQtY2FjaGUtdGFnc1wiOiBcIl9OX1RfL2Jsb2dcIiB9LFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSksXG4gICAgICB9O1xuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImJsb2dcIiwgZ2V0Q3R4KTtcblxuICAgICAgLy8gQW5vdGhlciBpbnN0YW5jZSByZXZhbGlkYXRlZCBgX05fVF8vYmxvZ2A6IHRoZSBtYXJrZXIgaXMgbmV3ZXIgdGhhbiB0aGVcbiAgICAgIC8vIG1lbW9yeSBjb3B5LCBhbmQgUzMgbm93IGFuc3dlcnMgd2l0aCB0aGUgZW50cnkgZXhwaXJlZC5cbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogLTEsIHZhbHVlIH0pLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJibG9nXCIsIGdldEN0eCkpLnRvRXF1YWwoe1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IC0xLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHMzLmlzUmV2YWxpZGF0ZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHZhbHVlIH0pLFxuICAgICAgICBnZXRDdHgsXG4gICAgICAgIFwiYmxvZ1wiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcblxuICAgICAgLy8gQW5kIHRoZSBtZW1vcnkgY29weSBpcyBnb25lIHJhdGhlciB0aGFuIGNoZWNrZWQgYWdhaW4gbmV4dCB0aW1lLlxuICAgICAgczMuZ2V0Lm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJibG9nXCIsIGdldEN0eCkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImtlZXBzIG1lbW9yeSBlbnRyaWVzIGFjcm9zcyByZXNldFJlcXVlc3RDYWNoZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBOZXh0LmpzIGNhbGxzIGl0IGF0IHRoZSBzdGFydCBvZiBldmVyeSByZXF1ZXN0OyBjbGVhcmluZyB0aGUgc2hhcmVkXG4gICAgICAvLyBtZW1vcnkgY2FjaGUgdGhlcmUgc2VudCBldmVyeSByZWFkIHRvIFMzLlxuICAgICAgY29uc3QgdGVzdERhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPnJlc2V0PC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIGVudHJ5XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwicmVzZXQta2V5XCIsIHRlc3REYXRhLCB7XG4gICAgICAgIGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsXG4gICAgICAgIHRhZ3M6IFtcInJlc2V0LXRhZ1wiXSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZXNldFxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnJlc2V0UmVxdWVzdENhY2hlKCk7XG5cbiAgICAgIC8vIFN0aWxsIGFuc3dlcmVkIGZyb20gbWVtb3J5LCB3aXRob3V0IGFza2luZyBTMy5cbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgICAgaXNSZXZhbGlkYXRlZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwicmVzZXQta2V5XCIsIHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocmVzdWx0Py52YWx1ZSkudG9FcXVhbCh0ZXN0RGF0YSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkJ1aWxkLXRpbWUgYmVoYXZpb3JcIiwgKCkgPT4ge1xuICAgIGl0KFwicmVhZHMgYmFjayBhIGZldGNoIGVudHJ5IGl0IHdyb3RlLCBmcm9tIG1lbW9yeSBhbmQgZnJvbSBkaXNrXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGBjYWNoZUNvbXBvbmVudHNgIHByZXJlbmRlcnMgZWFjaCBwYWdlIHR3aWNlOiB0aGUgZmlyc3QgcGFzcyBydW5zIHRoZVxuICAgICAgLy8gYGZldGNoYCBhbmQgYHNldGBzIGl0LCB0aGUgc2Vjb25kIG11c3QgZmluZCBpdCBhbHJlYWR5IGNhY2hlZCBvciBOZXh0LmpzXG4gICAgICAvLyBmYWlscyB0aGUgYnVpbGQgd2l0aCBcImVuY291bnRlcmVkIHVuY2FjaGVkIG9yIHJ1bnRpbWUgZGF0YSBkdXJpbmdcbiAgICAgIC8vIHByZXJlbmRlcmluZ1wiLiBBIHdyaXRlLW9ubHkgYnVpbGQtdGltZSBoYW5kbGVyIHRoZXJlZm9yZSBtYWtlc1xuICAgICAgLy8gYGNhY2hlOiAnZm9yY2UtY2FjaGUnYCB1bmJ1aWxkYWJsZSAtIG1lYXN1cmVkIGFnYWluc3QgbmV4dC5qcydzXG4gICAgICAvLyBgdGVzdC9lMmUvYXBwLWRpci9yZXN1bWUtZGF0YS1jYWNoZWAuXG4gICAgICBwcm9jZXNzLmVudi5ORVhUX1BIQVNFID0gXCJwaGFzZS1wcm9kdWN0aW9uLWJ1aWxkXCI7XG4gICAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0lOSVRfQ0FDSEVfRElSID0gbWtkdGVtcFN5bmMoXG4gICAgICAgIGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1pbml0LWNhY2hlLVwiKSxcbiAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkZFVENILFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgYm9keTogXCJleUp5WVc1a2IyMGlPakY5XCIsXG4gICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgIHVybDogXCJodHRwczovL2V4YW1wbGUudGVzdC9hcGkvcmFuZG9tXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXZhbGlkYXRlOiAzMTUzNjAwMCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmV0Y2hVcmwgPSBcImh0dHBzOi8vZXhhbXBsZS50ZXN0L2FwaS9yYW5kb21cIjtcbiAgICAgICAgY29uc3Qgc2V0Q3R4ID0ge1xuICAgICAgICAgIGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgdGFnczogW1widGVzdFwiXSxcbiAgICAgICAgICBmZXRjaFVybCxcbiAgICAgICAgICBmZXRjaElkeDogMSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2V0Q3R4OiBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0ID0ge1xuICAgICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkZFVENILFxuICAgICAgICAgIHJldmFsaWRhdGU6IDMxNTM2MDAwLFxuICAgICAgICAgIGZldGNoVXJsLFxuICAgICAgICAgIGZldGNoSWR4OiAxLFxuICAgICAgICAgIHRhZ3M6IFtcInRlc3RcIl0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1aWxkSGFuZGxlciA9IG5ldyBDZGtOZXh0anNDYWNoZUhhbmRsZXIoY3JlYXRlTW9ja0NvbnRleHQoKSk7XG4gICAgICAgIGF3YWl0IGJ1aWxkSGFuZGxlci5zZXQoXCJmZXRjaC1rZXlcIiwgZGF0YSwgc2V0Q3R4KTtcbiAgICAgICAgZXhwZWN0KGF3YWl0IGJ1aWxkSGFuZGxlci5nZXQoXCJmZXRjaC1rZXlcIiwgZ2V0Q3R4KSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEEgc2Vjb25kIGluc3RhbmNlIHJlYWRzIHRoZSBmaWxlIHJhdGhlciB0aGFuIHRoZSBtYXA6IGBuZXh0IGJ1aWxkYFxuICAgICAgICAvLyByZW5kZXJzIHBhZ2VzIGluIHdvcmtlciBwcm9jZXNzZXMsIHNvIHRoZSBwYXNzIHRoYXQgd3JpdGVzIGFuZCB0aGVcbiAgICAgICAgLy8gcGFzcyB0aGF0IHJlYWRzIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1lIHByb2Nlc3MuXG4gICAgICAgIGNvbnN0IG90aGVyV29ya2VyID0gbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihjcmVhdGVNb2NrQ29udGV4dCgpKTtcbiAgICAgICAgZXhwZWN0KGF3YWl0IG90aGVyV29ya2VyLmdldChcImZldGNoLWtleVwiLCBnZXRDdHgpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChhd2FpdCBvdGhlcldvcmtlci5nZXQoXCJuZXZlci13cml0dGVuXCIsIGdldEN0eCkpLnRvQmVOdWxsKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTkVYVF9QSEFTRTtcbiAgICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VlZCBpcyB1cGxvYWRlZCBhcyB3cml0dGVuLCBzbyBpdCBtdXN0IGJlIGZpbGVkIHVuZGVyIHRoZSBuYW1lIHRoZVxuICAgIC8vIHJ1bnRpbWUncyBgZ2V0YCByZWFkczogZm9yIGEgbmFtZSB0b28gbG9uZyBmb3IgUzMsIGBjYWNoZU9iamVjdE5hbWVgJ3MuXG4gICAgaXQoXCJmaWxlcyBhbiBvdmVyLWxvbmcga2V5IHdoZXJlIHRoZSBydW50aW1lIHJlYWRzIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIHByb2Nlc3MuZW52Lk5FWFRfUEhBU0UgPSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLWluaXQtY2FjaGUtXCIpKTtcbiAgICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVIgPSBjYWNoZURpcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAvcm91dGUtY2FjaGUvQVBQX1BBR0UvJHtcImFcIi5yZXBlYXQoNjQpfS8kLyR7XCJ4XCIucmVwZWF0KDkwMCl9YDtcbiAgICAgICAgZXhwZWN0KGNhY2hlT2JqZWN0TmFtZShrZXkpKS50b01hdGNoKC9eX2xvbmcta2V5XFwvLyk7XG4gICAgICAgIGNvbnN0IGRhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuRkVUQ0gsXG4gICAgICAgICAgZGF0YTogeyBoZWFkZXJzOiB7fSwgYm9keTogXCJlMzA9XCIsIHN0YXR1czogMjAwLCB1cmw6IFwiXCIgfSxcbiAgICAgICAgICByZXZhbGlkYXRlOiA2MCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc2V0Q3R4ID0geyBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LCB0YWdzOiBbXSB9O1xuICAgICAgICBhd2FpdCBuZXcgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyKGNyZWF0ZU1vY2tDb250ZXh0KCkpLnNldChcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBzZXRDdHgsXG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4oY2FjaGVEaXIsIGNhY2hlT2JqZWN0TmFtZShrZXkpKSkpLnRvQmUodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGdldEN0eDogR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCA9IHtcbiAgICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5GRVRDSCxcbiAgICAgICAgICByZXZhbGlkYXRlOiA2MCxcbiAgICAgICAgICB0YWdzOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIGF3YWl0IG5ldyBDZGtOZXh0anNDYWNoZUhhbmRsZXIoY3JlYXRlTW9ja0NvbnRleHQoKSkuZ2V0KGtleSwgZ2V0Q3R4KSxcbiAgICAgICAgKS50b01hdGNoT2JqZWN0KHsgdmFsdWU6IGRhdGEgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTkVYVF9QSEFTRTtcbiAgICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CacheHandler } from "next/dist/server/lib/incremental-cache";
|
|
2
2
|
/**
|
|
3
3
|
* Serialize cache value with custom handling for Map and Buffer objects
|
|
4
4
|
*/
|
|
@@ -30,6 +30,64 @@ export declare function parseCacheValue(jsonString: string): any;
|
|
|
30
30
|
* first request, and the page is only "static" from the second visit onwards.
|
|
31
31
|
*/
|
|
32
32
|
export declare function prerenderPathToCacheKey(pathname: string, basePath: string): string;
|
|
33
|
+
/** `buildS3Key` under the build prefix: `{cacheKey}.json`. */
|
|
34
|
+
export declare function cacheKeyFileName(cacheKey: string): string;
|
|
35
|
+
/** `value`'s SHA-256 digest, in hex: 64 characters. */
|
|
36
|
+
export declare function sha256Hex(value: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* The longest build ID cache entries are stored under, which
|
|
39
|
+
* {@link cacheObjectName} leaves room for in front of it with its `/`: a
|
|
40
|
+
* Next.js build ID is 21 characters, and the `-<deploymentId>` cdk-nextjs
|
|
41
|
+
* appends is the app's own, so the adapter fails a build whose ID is longer
|
|
42
|
+
* (see `assertBuildIdFits`) rather than leave long names unwritable.
|
|
43
|
+
*/
|
|
44
|
+
export declare const MAX_BUILD_ID_BYTES = 127;
|
|
45
|
+
/**
|
|
46
|
+
* The folder under the build prefix that entries with an over-long key are
|
|
47
|
+
* stored in. @see cacheObjectName
|
|
48
|
+
*/
|
|
49
|
+
export declare const LONG_KEY_PREFIX = "_long-key";
|
|
50
|
+
/**
|
|
51
|
+
* Where the entry `buildS3Key` names is stored, under the build prefix:
|
|
52
|
+
* its own name, or `_long-key/{sha256}.long` for a name that would leave the
|
|
53
|
+
* whole object key past S3's 1024 bytes. next 16.3.8's route-scoped keys are
|
|
54
|
+
* ~88 bytes longer than a pathname, enough to push a long one over, and a
|
|
55
|
+
* rejected `PutObject` meant the page was never cached.
|
|
56
|
+
*
|
|
57
|
+
* Only the object is moved: `buildS3Key` stays the entry's name for tag
|
|
58
|
+
* mappings and CloudFront paths, since a hash names no route. Decided on the
|
|
59
|
+
* name alone rather than the whole key so the init cache, which is written
|
|
60
|
+
* without the build ID it is deployed under, files a seed where the runtime
|
|
61
|
+
* reads it. The `.long` suffix keeps these disjoint from every `.json` name.
|
|
62
|
+
*/
|
|
63
|
+
export declare function cacheObjectName(cacheKey: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* The response-cache key next >= 16.3.8 stores a prerender under, read back off
|
|
66
|
+
* the file `next build` wrote it to, or `undefined` before 16.3.8.
|
|
67
|
+
*
|
|
68
|
+
* From 16.3.8 Next.js scopes every page's cache key by its source route -
|
|
69
|
+
* `/route-cache/<kind>/<sha256(sourceRoute)>/$<pathname>` (`getRouteCacheKey`
|
|
70
|
+
* in `next/dist/server/lib/route-cache-key.js`) - and, with an adapter, writes
|
|
71
|
+
* each prerender to `<distDir>/server/<key><ext>`. The file path is the only
|
|
72
|
+
* place an adapter is handed that key, and re-deriving it would mean re-picking
|
|
73
|
+
* the source route the way `build-complete.js` does.
|
|
74
|
+
*/
|
|
75
|
+
export declare function routeCacheKeyFromFilePath(filePath: string | undefined): string | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* The start of a next >= 16.3.8 response-cache key, leading slash dropped:
|
|
78
|
+
* `route-cache/<kind>/<sha256(sourceRoute)>/$` (`getRouteCacheKey`), followed
|
|
79
|
+
* by the pathname. Matched whole, so an older app's route that happens to be
|
|
80
|
+
* named `/route-cache/...` is not read as one.
|
|
81
|
+
*/
|
|
82
|
+
export declare const ROUTE_CACHE_KEY_PREFIX: RegExp;
|
|
83
|
+
/**
|
|
84
|
+
* `denormalizePagePath` (`next/dist/shared/lib/page-path/denormalize-page-path.js`),
|
|
85
|
+
* the inverse of the `normalizePagePath` a route-cache key's pathname goes
|
|
86
|
+
* through: `/index` back to `/`, and `/index/...` - how `/index` itself and
|
|
87
|
+
* every path under it are spelled - back to `/...`. Restated without its
|
|
88
|
+
* dynamic-route check: `s3KeyToInvalidationPath` has dropped those already.
|
|
89
|
+
*/
|
|
90
|
+
export declare function denormalizePagePath(pagePath: string): string;
|
|
33
91
|
/** The outputs one route contributes to `ctx.outputs.prerenders`. */
|
|
34
92
|
export interface PrerenderVariants<T> {
|
|
35
93
|
/** The HTML render. Its pathname is the route, with no suffix. */
|
|
@@ -97,7 +155,15 @@ export declare function headerTags(value: unknown): string[];
|
|
|
97
155
|
export declare const INIT_CACHE_TAG_MANIFEST = "_cdk-nextjs-tag-manifest.json";
|
|
98
156
|
/** Contents of {@link INIT_CACHE_TAG_MANIFEST}: tag -> init cache keys. */
|
|
99
157
|
export type InitCacheTagManifest = Record<string, string[]>;
|
|
158
|
+
/**
|
|
159
|
+
* The `ctx` Next.js passes a `CacheHandler`'s `get`, taken off its interface:
|
|
160
|
+
* the fetch cache's, a route response's, or - since this handler is also
|
|
161
|
+
* `ImageOptimizerCache`'s - an optimized image's.
|
|
162
|
+
*/
|
|
163
|
+
export type GetCacheHandlerContext = Parameters<CacheHandler["get"]>[1];
|
|
164
|
+
/** The `ctx` Next.js passes a `CacheHandler`'s `set`. See {@link GetCacheHandlerContext}. */
|
|
165
|
+
export type SetCacheHandlerContext = Parameters<CacheHandler["set"]>[2];
|
|
100
166
|
/**
|
|
101
167
|
* Helper to safely extract tags from context
|
|
102
168
|
*/
|
|
103
|
-
export declare function getTags(ctx:
|
|
169
|
+
export declare function getTags(ctx: SetCacheHandlerContext): string[] | undefined;
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.INIT_CACHE_TAG_MANIFEST = void 0;
|
|
3
|
+
exports.INIT_CACHE_TAG_MANIFEST = exports.ROUTE_CACHE_KEY_PREFIX = exports.LONG_KEY_PREFIX = exports.MAX_BUILD_ID_BYTES = void 0;
|
|
4
4
|
exports.serializeCacheValue = serializeCacheValue;
|
|
5
5
|
exports.parseCacheValue = parseCacheValue;
|
|
6
6
|
exports.prerenderPathToCacheKey = prerenderPathToCacheKey;
|
|
7
|
+
exports.cacheKeyFileName = cacheKeyFileName;
|
|
8
|
+
exports.sha256Hex = sha256Hex;
|
|
9
|
+
exports.cacheObjectName = cacheObjectName;
|
|
10
|
+
exports.routeCacheKeyFromFilePath = routeCacheKeyFromFilePath;
|
|
11
|
+
exports.denormalizePagePath = denormalizePagePath;
|
|
7
12
|
exports.groupPrerenders = groupPrerenders;
|
|
8
13
|
exports.appPageCacheHeaders = appPageCacheHeaders;
|
|
9
14
|
exports.headerTags = headerTags;
|
|
10
15
|
exports.getTags = getTags;
|
|
16
|
+
/*
|
|
17
|
+
Shared cache utility functions
|
|
18
|
+
*/
|
|
19
|
+
const node_crypto_1 = require("node:crypto");
|
|
20
|
+
const node_path_1 = require("node:path");
|
|
11
21
|
const base_path_1 = require("../utils/base-path");
|
|
12
22
|
/**
|
|
13
23
|
* Pre-process value to convert Buffers and Maps before JSON.stringify
|
|
@@ -120,6 +130,102 @@ function prerenderPathToCacheKey(pathname, basePath) {
|
|
|
120
130
|
.replace(/^\/+/, "");
|
|
121
131
|
return route === "" ? "index" : route;
|
|
122
132
|
}
|
|
133
|
+
/** `buildS3Key` under the build prefix: `{cacheKey}.json`. */
|
|
134
|
+
function cacheKeyFileName(cacheKey) {
|
|
135
|
+
let cleanCacheKey = cacheKey;
|
|
136
|
+
if (cacheKey === "/" || cacheKey === "") {
|
|
137
|
+
cleanCacheKey = "index";
|
|
138
|
+
}
|
|
139
|
+
else if (cacheKey.startsWith("/")) {
|
|
140
|
+
cleanCacheKey = cacheKey.slice(1);
|
|
141
|
+
}
|
|
142
|
+
return `${cleanCacheKey}.json`;
|
|
143
|
+
}
|
|
144
|
+
/** `value`'s SHA-256 digest, in hex: 64 characters. */
|
|
145
|
+
function sha256Hex(value) {
|
|
146
|
+
return (0, node_crypto_1.createHash)("sha256").update(value).digest("hex");
|
|
147
|
+
}
|
|
148
|
+
/** S3's limit on an object key, in UTF-8 bytes. */
|
|
149
|
+
const MAX_S3_KEY_BYTES = 1024;
|
|
150
|
+
/**
|
|
151
|
+
* The longest build ID cache entries are stored under, which
|
|
152
|
+
* {@link cacheObjectName} leaves room for in front of it with its `/`: a
|
|
153
|
+
* Next.js build ID is 21 characters, and the `-<deploymentId>` cdk-nextjs
|
|
154
|
+
* appends is the app's own, so the adapter fails a build whose ID is longer
|
|
155
|
+
* (see `assertBuildIdFits`) rather than leave long names unwritable.
|
|
156
|
+
*/
|
|
157
|
+
exports.MAX_BUILD_ID_BYTES = 127;
|
|
158
|
+
/**
|
|
159
|
+
* The folder under the build prefix that entries with an over-long key are
|
|
160
|
+
* stored in. @see cacheObjectName
|
|
161
|
+
*/
|
|
162
|
+
exports.LONG_KEY_PREFIX = "_long-key";
|
|
163
|
+
/**
|
|
164
|
+
* Where the entry `buildS3Key` names is stored, under the build prefix:
|
|
165
|
+
* its own name, or `_long-key/{sha256}.long` for a name that would leave the
|
|
166
|
+
* whole object key past S3's 1024 bytes. next 16.3.8's route-scoped keys are
|
|
167
|
+
* ~88 bytes longer than a pathname, enough to push a long one over, and a
|
|
168
|
+
* rejected `PutObject` meant the page was never cached.
|
|
169
|
+
*
|
|
170
|
+
* Only the object is moved: `buildS3Key` stays the entry's name for tag
|
|
171
|
+
* mappings and CloudFront paths, since a hash names no route. Decided on the
|
|
172
|
+
* name alone rather than the whole key so the init cache, which is written
|
|
173
|
+
* without the build ID it is deployed under, files a seed where the runtime
|
|
174
|
+
* reads it. The `.long` suffix keeps these disjoint from every `.json` name.
|
|
175
|
+
*/
|
|
176
|
+
function cacheObjectName(cacheKey) {
|
|
177
|
+
const name = cacheKeyFileName(cacheKey);
|
|
178
|
+
if (Buffer.byteLength(name) <= MAX_S3_KEY_BYTES - (exports.MAX_BUILD_ID_BYTES + 1)) {
|
|
179
|
+
return name;
|
|
180
|
+
}
|
|
181
|
+
return `${exports.LONG_KEY_PREFIX}/${sha256Hex(name)}.long`;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The response-cache key next >= 16.3.8 stores a prerender under, read back off
|
|
185
|
+
* the file `next build` wrote it to, or `undefined` before 16.3.8.
|
|
186
|
+
*
|
|
187
|
+
* From 16.3.8 Next.js scopes every page's cache key by its source route -
|
|
188
|
+
* `/route-cache/<kind>/<sha256(sourceRoute)>/$<pathname>` (`getRouteCacheKey`
|
|
189
|
+
* in `next/dist/server/lib/route-cache-key.js`) - and, with an adapter, writes
|
|
190
|
+
* each prerender to `<distDir>/server/<key><ext>`. The file path is the only
|
|
191
|
+
* place an adapter is handed that key, and re-deriving it would mean re-picking
|
|
192
|
+
* the source route the way `build-complete.js` does.
|
|
193
|
+
*/
|
|
194
|
+
function routeCacheKeyFromFilePath(filePath) {
|
|
195
|
+
// The first `/server/route-cache/`: a route's own pathname can contain one
|
|
196
|
+
// after it. Before 16.3.8 a route of that name is all there is, which the
|
|
197
|
+
// prefix check below rejects.
|
|
198
|
+
const path = filePath?.split(node_path_1.sep).join("/");
|
|
199
|
+
const at = path?.indexOf(ROUTE_CACHE_DIR) ?? -1;
|
|
200
|
+
if (at < 0) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
const key = path.slice(at + "/server/".length).replace(/\.[^./]+$/, "");
|
|
204
|
+
return exports.ROUTE_CACHE_KEY_PREFIX.test(key) ? key : undefined;
|
|
205
|
+
}
|
|
206
|
+
const ROUTE_CACHE_DIR = "/server/route-cache/";
|
|
207
|
+
/**
|
|
208
|
+
* The start of a next >= 16.3.8 response-cache key, leading slash dropped:
|
|
209
|
+
* `route-cache/<kind>/<sha256(sourceRoute)>/$` (`getRouteCacheKey`), followed
|
|
210
|
+
* by the pathname. Matched whole, so an older app's route that happens to be
|
|
211
|
+
* named `/route-cache/...` is not read as one.
|
|
212
|
+
*/
|
|
213
|
+
exports.ROUTE_CACHE_KEY_PREFIX = /^route-cache\/[A-Z_]+\/[0-9a-f]{64}\/\$(?=\/)/;
|
|
214
|
+
/**
|
|
215
|
+
* `denormalizePagePath` (`next/dist/shared/lib/page-path/denormalize-page-path.js`),
|
|
216
|
+
* the inverse of the `normalizePagePath` a route-cache key's pathname goes
|
|
217
|
+
* through: `/index` back to `/`, and `/index/...` - how `/index` itself and
|
|
218
|
+
* every path under it are spelled - back to `/...`. Restated without its
|
|
219
|
+
* dynamic-route check: `s3KeyToInvalidationPath` has dropped those already.
|
|
220
|
+
*/
|
|
221
|
+
function denormalizePagePath(pagePath) {
|
|
222
|
+
if (pagePath === "/index") {
|
|
223
|
+
return "/";
|
|
224
|
+
}
|
|
225
|
+
return pagePath.startsWith("/index/")
|
|
226
|
+
? pagePath.slice("/index".length)
|
|
227
|
+
: pagePath;
|
|
228
|
+
}
|
|
123
229
|
const INDEX_SUFFIX = "/index";
|
|
124
230
|
/**
|
|
125
231
|
* A Pages Router data route: `/_next/data/<buildId>/<page>.json`, optionally
|
|
@@ -279,4 +385,4 @@ exports.INIT_CACHE_TAG_MANIFEST = "_cdk-nextjs-tag-manifest.json";
|
|
|
279
385
|
function getTags(ctx) {
|
|
280
386
|
return "tags" in ctx ? ctx.tags : undefined;
|
|
281
387
|
}
|
|
282
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9jYWNoZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4REEsa0RBS0M7QUFnQkQsMENBd0JDO0FBYUQsMERBY0M7QUFtREQsMENBb0RDO0FBc0NELGtEQVVDO0FBY0QsZ0NBS0M7QUF1QkQsMEJBSUM7QUFwVUQsa0RBQW1EO0FBRW5EOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQVU7SUFDakMsd0JBQXdCO0lBQ3hCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx3RUFBd0U7SUFDeEUseURBQXlEO0lBQ3pELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU87WUFDTCxNQUFNLEVBQUUsUUFBUTtZQUNoQixNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDakMsQ0FBQztJQUNKLENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsSUFBSSxLQUFLLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztRQUN4QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELDZCQUE2QjtJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQVU7SUFDNUMsZ0VBQWdFO0lBQ2hFLGlEQUFpRDtJQUNqRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFVBQWtCO0lBQ2hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDMUMsOERBQThEO1FBQzlELElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QscUZBQXFGO1FBQ3JGLElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlELE9BQU8sT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVE7Z0JBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2dCQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELDBGQUEwRjtRQUMxRixpRUFBaUU7UUFDakUsSUFDRSxHQUFHO1lBQ0gsT0FBTyxHQUFHLEtBQUssUUFBUTtZQUN2QixHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDckIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQ3ZCLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsUUFBZ0IsRUFDaEIsUUFBZ0I7SUFFaEIsMkVBQTJFO0lBQzNFLDBDQUEwQztJQUMxQyxNQUFNLEtBQUssR0FBRyxDQUNaLElBQUEseUJBQWEsRUFBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDakMsQ0FBQyxDQUFDLFFBQVEsQ0FDYjtRQUNDLG9FQUFvRTtTQUNuRSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDeEMsQ0FBQztBQWNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixVQUFlO0lBRWYsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQzNCLFVBQVU7U0FDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDdEIsTUFBTSxDQUNMLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDekIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQy9CLENBQ0osQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFnQyxDQUFDO0lBRXZELE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUF3QixFQUFFO1FBQ3pELElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsUUFBUSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRixpRUFBaUU7SUFDakUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtRQUN2QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQzFELElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUYsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBQy9CLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0MsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNqRSxTQUFTLENBQ1YsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQzFFLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sOEJBQThCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDN0MsY0FBYztJQUNkLE1BQU07SUFDTixvQkFBb0I7SUFDcEIsb0JBQW9CO0NBQ3JCLENBQUMsQ0FBQztBQUVILGtEQUFrRDtBQUNsRCxTQUFnQixtQkFBbUIsQ0FDakMsY0FBaUM7SUFFakMsTUFBTSxPQUFPLEdBQXNCLEVBQUUsQ0FBQztJQUN0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0FBRW5EOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLEtBQWM7SUFDdkMsTUFBTSxPQUFPLEdBQUksS0FBc0Q7UUFDckUsRUFBRSxPQUFPLENBQUM7SUFDWixNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDVSxRQUFBLHVCQUF1QixHQUFHLCtCQUErQixDQUFDO0FBS3ZFOztHQUVHO0FBQ0gsU0FBZ0IsT0FBTyxDQUNyQixHQUF5RTtJQUV6RSxPQUFPLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgU2hhcmVkIGNhY2hlIHV0aWxpdHkgZnVuY3Rpb25zXG4qL1xuaW1wb3J0IHR5cGUge1xuICBTZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0LFxuICBTZXRJbmNyZW1lbnRhbFJlc3BvbnNlQ2FjaGVDb250ZXh0LFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZVwiO1xuaW1wb3J0IHsgaGFzUGF0aFByZWZpeCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuLyoqXG4gKiBQcmUtcHJvY2VzcyB2YWx1ZSB0byBjb252ZXJ0IEJ1ZmZlcnMgYW5kIE1hcHMgYmVmb3JlIEpTT04uc3RyaW5naWZ5XG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEJ1ZmZlci50b0pTT04oKSBpcyBjYWxsZWQgYmVmb3JlIHJlcGxhY2VyIGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBwcmVwcm9jZXNzVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgQnVmZmVyIHRvIG91ciBjdXN0b20gZm9ybWF0LiBiYXNlNjQsIG5vdCB0aGUgYXJyYXkgb2YgcGVyLWJ5dGVcbiAgLy8gaW50ZWdlcnMgdGhpcyB1c2VkIHRvIHdyaXRlIChhbmQgdGhhdCBgQnVmZmVyLnRvSlNPTigpYCB3cml0ZXMpIOKAlCBzZWVcbiAgLy8ge0BsaW5rIHBhcnNlQ2FjaGVWYWx1ZX0gZm9yIHdoeSB0aGF0IG1hdHRlcmVkIHNvIG11Y2guXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogXCJCdWZmZXJcIixcbiAgICAgIGJhc2U2NDogdmFsdWUudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgfTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgTWFwIHRvIG91ciBjdXN0b20gZm9ybWF0XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICBlbnRyaWVzW2tleV0gPSBwcmVwcm9jZXNzVmFsdWUodmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogXCJNYXBcIixcbiAgICAgIGRhdGE6IGVudHJpZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHByZXByb2Nlc3NWYWx1ZShpdGVtKSk7XG4gIH1cblxuICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIG9iamVjdHNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHByb2Nlc3NlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3NlZFtrZXldID0gcHJlcHJvY2Vzc1ZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gIH1cblxuICAvLyBSZXR1cm4gcHJpbWl0aXZlcyBhcy1pc1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGNhY2hlIHZhbHVlIHdpdGggY3VzdG9tIGhhbmRsaW5nIGZvciBNYXAgYW5kIEJ1ZmZlciBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDYWNoZVZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAvLyBQcmUtcHJvY2VzcyB0byBjb252ZXJ0IEJ1ZmZlcnMgYW5kIE1hcHMgYmVmb3JlIEpTT04uc3RyaW5naWZ5XG4gIC8vIFRoaXMgZW5zdXJlcyBCdWZmZXIudG9KU09OKCkgZG9lc24ndCBpbnRlcmZlcmVcbiAgY29uc3QgcHJvY2Vzc2VkID0gcHJlcHJvY2Vzc1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb2Nlc3NlZCk7XG59XG5cbi8qKlxuICogUGFyc2UgY2FjaGUgdmFsdWUgd2l0aCBjdXN0b20gaGFuZGxpbmcgZm9yIE1hcCBhbmQgQnVmZmVyIG9iamVjdHNcbiAqXG4gKiBCdWZmZXJzIGFyZSByZWFkIGJhY2sgZnJvbSBiYXNlNjQgd2hlbiB0aGF0IGlzIGhvdyB0aGV5IHdlcmUgd3JpdHRlbiwgYW5kIGZyb21cbiAqIGFuIGFycmF5IG9mIHBlci1ieXRlIGludGVnZXJzIHdoZW4gdGhleSB3ZXJlIG5vdC4gVGhhdCBhcnJheSBpcyB0aGUgZm9ybWF0XG4gKiBgQnVmZmVyLnRvSlNPTigpYCBwcm9kdWNlcyBhbmQgdGhlIG9uZSB0aGlzIGNvZGUgdXNlZCB0byB3cml0ZSwgYW5kIGl0IGlzXG4gKiBydWlub3VzIGZvciBhIHBhZ2Ugd2l0aCBhIGxhcmdlIHBheWxvYWQ6IGEgMSBNaUIgcHJlcmVuZGVyIGJlY2FtZSB+MyBNaUIgb2ZcbiAqIEpTT04gdGV4dCwgYW4gMTEuNiBNaUIgY2FjaGUgZW50cnkgb25jZSBodG1sIGFuZCB0aGUgcGVyLXNlZ21lbnQgY29waWVzIGFyZVxuICogY291bnRlZCwgYW5kIOKAlCBiZWNhdXNlIGBKU09OLnBhcnNlYCdzIHJldml2ZXIgcnVucyBmb3IgKmV2ZXJ5IGFycmF5IGVsZW1lbnQqIOKAlFxuICogdXB3YXJkcyBvZiB0aHJlZSBtaWxsaW9uIHJldml2ZXIgY2FsbHMgdG8gcmVhZCBvbmUgcGFnZS4gTWVhc3VyZWQgYWdhaW5zdCBhXG4gKiBkZXBsb3ltZW50OiA0LjhzIG9mIExhbWJkYSB0aW1lIHRvIGFuc3dlciBhIDEgTWlCIHNlZ21lbnQgcHJlZmV0Y2gsIGFnYWluc3RcbiAqIDQ1bXMgZm9yIGEgc21hbGwgb25lIGZyb20gdGhlIHNhbWUgY2FjaGUuIGJhc2U2NCBpcyA0LzMgdGhlIGJ5dGVzIHJhdGhlciB0aGFuXG4gKiB+M3gsIGFuZCBgQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKWAgaXMgb25lIG5hdGl2ZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDYWNoZVZhbHVlKGpzb25TdHJpbmc6IHN0cmluZyk6IGFueSB7XG4gIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcsIChfa2V5LCB2YWwpID0+IHtcbiAgICAvLyBSZXN0b3JlIE1hcCBvYmplY3RzIHRoYXQgd2VyZSBzZXJpYWxpemVkIHdpdGggX190eXBlIG1hcmtlclxuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiB2YWwuX190eXBlID09PSBcIk1hcFwiKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcChPYmplY3QuZW50cmllcyh2YWwuZGF0YSkpO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIEJ1ZmZlciBvYmplY3RzIHRoYXQgd2VyZSBzZXJpYWxpemVkIHdpdGggX190eXBlIG1hcmtlciAob3VyIGN1c3RvbSBmb3JtYXQpXG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbC5fX3R5cGUgPT09IFwiQnVmZmVyXCIpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsLmJhc2U2NCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IEJ1ZmZlci5mcm9tKHZhbC5iYXNlNjQsIFwiYmFzZTY0XCIpXG4gICAgICAgIDogQnVmZmVyLmZyb20odmFsLmRhdGEpO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIEJ1ZmZlciBvYmplY3RzIHRoYXQgd2VyZSBzZXJpYWxpemVkIHdpdGggTm9kZS5qcyBkZWZhdWx0IEJ1ZmZlci50b0pTT04oKSBmb3JtYXRcbiAgICAvLyBUaGlzIGhhbmRsZXMgbGVnYWN5IGNhY2hlIGVudHJpZXMgb3IgcnVudGltZS1nZW5lcmF0ZWQgZW50cmllc1xuICAgIGlmIChcbiAgICAgIHZhbCAmJlxuICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsLnR5cGUgPT09IFwiQnVmZmVyXCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsLmRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgY2FjaGUga2V5IGEgcHJlcmVuZGVyZWQgcm91dGUncyBzZWVkZWQgZW50cnkgaGFzIHRvIGJlIHdyaXR0ZW4gdW5kZXIuXG4gKlxuICogYGN0eC5vdXRwdXRzLnByZXJlbmRlcnNbXS5wYXRobmFtZWAgaXMgdGhlICpVUkwqIHRoZSBwYWdlIGlzIHNlcnZlZCBhdCwgc28gaXRcbiAqIGNhcnJpZXMgdGhlIGFwcCdzIGBiYXNlUGF0aGAuIFRoZSBrZXkgdGhlIHNlcnZlciBsYXRlciBsb29rcyBlbnRyaWVzIHVwIHVuZGVyXG4gKiBpcyB0aGUgcm91dGUsIHdoaWNoIGRvZXMgbm90IOKAlCBOZXh0LmpzIHN0cmlwcyBgYmFzZVBhdGhgIGJlZm9yZSByb3V0aW5nLCBzbyB0aGVcbiAqIGNhY2hlIGhhbmRsZXIgbmV2ZXIgc2VlcyBpdCBhdCByZXF1ZXN0IHRpbWUuIFNlZWRpbmcgYC9wcm9kL3NzZy8xYCB2ZXJiYXRpbVxuICogdGhlcmVmb3JlIHdyaXRlcyBgPGJ1aWxkSWQ+L3Byb2Qvc3NnLzEuanNvbmAgd2hpbGUgdGhlIHNlcnZlciBhc2tzIGZvclxuICogYDxidWlsZElkPi9zc2cvMS5qc29uYDogZXZlcnkgYnVpbGQtdGltZSBwcmVyZW5kZXIgaXMgYSBNSVNTIHRoYXQgcmUtcmVuZGVycyBvblxuICogZmlyc3QgcmVxdWVzdCwgYW5kIHRoZSBwYWdlIGlzIG9ubHkgXCJzdGF0aWNcIiBmcm9tIHRoZSBzZWNvbmQgdmlzaXQgb253YXJkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXJlbmRlclBhdGhUb0NhY2hlS2V5KFxuICBwYXRobmFtZTogc3RyaW5nLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgLy8gTWF0Y2hpbmcgb24gYSBwYXRoIGJvdW5kYXJ5IHNvIGEgc2libGluZyByb3V0ZSBsaWtlIGAvcHJvZHVjdGlvbmAgaXMgbm90XG4gIC8vIHJlYWQgYXMgYmFzZVBhdGggYC9wcm9kYCBwbHVzIGB1Y3Rpb25gLlxuICBjb25zdCByb3V0ZSA9IChcbiAgICBoYXNQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aClcbiAgICAgID8gcGF0aG5hbWUuc2xpY2UoYmFzZVBhdGgubGVuZ3RoKVxuICAgICAgOiBwYXRobmFtZVxuICApXG4gICAgLy8gTGVhZGluZyBzbGFzaGVzIHdvdWxkIG1ha2UgYW4gUzMga2V5IHdpdGggYW4gZW1wdHkgZmlyc3Qgc2VnbWVudC5cbiAgICAucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgcmV0dXJuIHJvdXRlID09PSBcIlwiID8gXCJpbmRleFwiIDogcm91dGU7XG59XG5cbi8qKiBUaGUgb3V0cHV0cyBvbmUgcm91dGUgY29udHJpYnV0ZXMgdG8gYGN0eC5vdXRwdXRzLnByZXJlbmRlcnNgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVyZW5kZXJWYXJpYW50czxUPiB7XG4gIC8qKiBUaGUgSFRNTCByZW5kZXIuIEl0cyBwYXRobmFtZSBpcyB0aGUgcm91dGUsIHdpdGggbm8gc3VmZml4LiAqL1xuICBodG1sPzogVDtcbiAgLyoqIFRoZSBmbGlnaHQgcGF5bG9hZCwgYnVpbHQgYXMgYDxyb3V0ZT4ucnNjYCDigJQgYnV0IHNlZSB7QGxpbmsgZ3JvdXBQcmVyZW5kZXJzfS4gKi9cbiAgcnNjPzogVDtcbiAgLyoqIFBlci1zZWdtZW50IGZsaWdodCBwYXlsb2FkcywgdW5kZXIgYDxyb3V0ZT4uc2VnbWVudHMvYC4gKi9cbiAgc2VnbWVudHM6IFRbXTtcbiAgLyoqIEEgUGFnZXMgUm91dGVyIHJvdXRlJ3MgYHBhZ2VEYXRhYCwgYnVpbHQgYXMgaXRzIGAvX25leHQvZGF0YS9gIHJvdXRlLiAqL1xuICBkYXRhPzogVDtcbn1cblxuY29uc3QgSU5ERVhfU1VGRklYID0gXCIvaW5kZXhcIjtcblxuLyoqXG4gKiBBIFBhZ2VzIFJvdXRlciBkYXRhIHJvdXRlOiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCwgb3B0aW9uYWxseVxuICogYmVoaW5kIGEgYGJhc2VQYXRoYCAoYG5vcm1hbGl6ZVBhdGhuYW1lYCBpbiBOZXh0LmpzJ3MgYGJ1aWxkLWNvbXBsZXRlYCBwcmVmaXhlc1xuICogZXZlcnkgb3V0cHV0IHBhdGhuYW1lLCB0aGlzIG9uZSBpbmNsdWRlZCkuXG4gKlxuICogQ2FwdHVyZSAxIGlzIHRoYXQgcHJlZml4IGFuZCBjYXB0dXJlIDIgdGhlIHBhZ2UgcGF0aCB3aXRob3V0IGl0cyBgLmpzb25gLCBzb1xuICogYC9wcm9kL19uZXh0L2RhdGEvYWJjMTIzL2Jsb2cvaGVsbG8uanNvbmAgcmVjb21wb3NlcyB0byBgL3Byb2QvYmxvZy9oZWxsb2AuXG4gKi9cbmNvbnN0IFBBR0VTX0RBVEFfUEFUSE5BTUUgPSAvXiguKilcXC9fbmV4dFxcL2RhdGFcXC9bXi9dK1xcLyguKylcXC5qc29uJC87XG5cbi8qKlxuICogQ29sbGVjdCBgY3R4Lm91dHB1dHMucHJlcmVuZGVyc2AgaW50byBvbmUgZW50cnkgcGVyIHJvdXRlLlxuICpcbiAqIE5leHQuanMgZW1pdHMgdXAgdG8gdGhyZWUgc2hhcGVzIHBlciBwcmVyZW5kZXJlZCBBcHAgUm91dGVyIHJvdXRlIOKAlCBgL2Jsb2cvaGVsbG9gLFxuICogYC9ibG9nL2hlbGxvLnJzY2AsIGFuZCBgL2Jsb2cvaGVsbG8uc2VnbWVudHMvKi5zZWdtZW50LnJzY2Ag4oCUIGFuZCBhIGNhY2hlIGVudHJ5XG4gKiBuZWVkcyBhbGwgb2YgdGhlbSB0b2dldGhlciwgc28gdGhleSBoYXZlIHRvIGJlIGdyb3VwZWQgYnkgcm91dGUgYmVmb3JlIGFueXRoaW5nXG4gKiBjYW4gYmUgc2VlZGVkLiBBIFBhZ2VzIFJvdXRlciByb3V0ZSBlbWl0cyB0d286IHRoZSBIVE1MLCBhbmQgaXRzIGBwYWdlRGF0YWAgYXRcbiAqIHRoZSByb3V0ZSdzIGAvX25leHQvZGF0YS88YnVpbGRJZD4vPHBhZ2U+Lmpzb25gIHBhdGhuYW1lXG4gKiAoe0BsaW5rIFBBR0VTX0RBVEFfUEFUSE5BTUV9KS4gVGhhdCBvbmUgaXMgbm90IGEgc3VmZml4IG9mIHRoZSBwYWdlJ3Mgb3duXG4gKiBwYXRobmFtZSwgc28gaXQgaXMgbWF0Y2hlZCByYXRoZXIgdGhhbiBzdHJpcHBlZC5cbiAqXG4gKiBUaGUgb25lIGNhc2UgdGhhdCBpcyBub3QgYSBzdWZmaXggc3RyaXAgaXMgdGhlICoqcm9vdCByb3V0ZSoqLCB3aGljaCBjYW5ub3QgYmVcbiAqIG5hbWVkIGAvLnJzY2A6IGl0cyBwYXlsb2FkcyBhcmUgZW1pdHRlZCB1bmRlciBgL2luZGV4LnJzY2AgYW5kXG4gKiBgL2luZGV4LnNlZ21lbnRzL2Agd2hpbGUgaXRzIEhUTUwgc3RheXMgYXQgYC9gIChvciBhdCB0aGUgYGJhc2VQYXRoYCwgZS5nLlxuICogYC9wcm9kYCBhbmQgYC9wcm9kL2luZGV4LnJzY2ApLiBSZWNvbnN0cnVjdGluZyBuYW1lcyBieSBjb25jYXRlbmF0aW9uIHRoZXJlZm9yZVxuICogc2lsZW50bHkgbG9zZXMgdGhlIGhvbWUgcGFnZSdzIGByc2NEYXRhYCDigJQgYW5kIHdpdGggYSBgYmFzZVBhdGhgIGFsc28gaXRzXG4gKiBgc2VnbWVudERhdGFgLCBiZWNhdXNlIGAvcHJvZGAgYW5kIGAvcHJvZC9pbmRleGAgZ3JvdXAgYXBhcnQuIFRoYXQgaXMgbm90IGFcbiAqIGNvc21ldGljIGdhcDogYGFwcC1wYWdlLXJ1bnRpbWUuanNgIGFuc3dlcnMgYW4gUlNDIHJlcXVlc3QgZm9yIGFuIGVudHJ5IHdpdGggbm9cbiAqIGByc2NEYXRhYCBieSBjaGVja2luZyBgY2FjaGVkRGF0YS5odG1sLmNvbnRlbnRUeXBlYCwgYW5kIHVuZGVyIGBjYWNoZUNvbXBvbmVudHNgXG4gKiBzZW5kcyBhbiBlbXB0eSBgNDA0YC4gRXZlcnkgY2xpZW50LXNpZGUgbmF2aWdhdGlvbiB0byBgL2AgYnJlYWtzLlxuICpcbiAqIFRoZSByZW1hcCBpcyBjb25kaXRpb25hbCByYXRoZXIgdGhhbiB1bmNvbmRpdGlvbmFsIHNvIHRoYXQgYW4gYXBwIHdpdGggYSByZWFsXG4gKiBwYWdlIGF0IGBhcHAvaW5kZXgvcGFnZS50c3hgIOKAlCB3aG9zZSBIVE1MIHByZXJlbmRlciBnZW51aW5lbHkgaXMgYC9pbmRleGAg4oCUIGtlZXBzXG4gKiBpdHMgb3duIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBQcmVyZW5kZXJzPFQgZXh0ZW5kcyB7IHBhdGhuYW1lOiBzdHJpbmcgfT4oXG4gIHByZXJlbmRlcnM6IFRbXSxcbik6IE1hcDxzdHJpbmcsIFByZXJlbmRlclZhcmlhbnRzPFQ+PiB7XG4gIGNvbnN0IGh0bWxQYXRobmFtZXMgPSBuZXcgU2V0KFxuICAgIHByZXJlbmRlcnNcbiAgICAgIC5tYXAoKHApID0+IHAucGF0aG5hbWUpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcC5lbmRzV2l0aChcIi5yc2NcIikgJiZcbiAgICAgICAgICAhcC5pbmNsdWRlcyhcIi5zZWdtZW50cy9cIikgJiZcbiAgICAgICAgICAhUEFHRVNfREFUQV9QQVRITkFNRS50ZXN0KHApLFxuICAgICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFByZXJlbmRlclZhcmlhbnRzPFQ+PigpO1xuXG4gIGNvbnN0IHZhcmlhbnRzRm9yID0gKGJhc2U6IHN0cmluZyk6IFByZXJlbmRlclZhcmlhbnRzPFQ+ID0+IHtcbiAgICBsZXQgdmFyaWFudHMgPSBncm91cHMuZ2V0KGJhc2UpO1xuICAgIGlmICghdmFyaWFudHMpIHtcbiAgICAgIHZhcmlhbnRzID0geyBzZWdtZW50czogW10gfTtcbiAgICAgIGdyb3Vwcy5zZXQoYmFzZSwgdmFyaWFudHMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFyaWFudHM7XG4gIH07XG5cbiAgLyoqIGAvaW5kZXgucnNjYCBiZWxvbmdzIHRvIGAvYCwgYC9wcm9kL2luZGV4LnJzY2AgdG8gYC9wcm9kYC4gKi9cbiAgY29uc3Qgcm91dGVPZiA9IChiYXNlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmIChiYXNlLmVuZHNXaXRoKElOREVYX1NVRkZJWCkgJiYgIWh0bWxQYXRobmFtZXMuaGFzKGJhc2UpKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBiYXNlLnNsaWNlKDAsIC1JTkRFWF9TVUZGSVgubGVuZ3RoKSB8fCBcIi9cIjtcbiAgICAgIGlmIChodG1sUGF0aG5hbWVzLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9O1xuXG4gIGZvciAoY29uc3QgcHJlcmVuZGVyIG9mIHByZXJlbmRlcnMpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwcmVyZW5kZXI7XG4gICAgY29uc3QgZGF0YVJvdXRlID0gUEFHRVNfREFUQV9QQVRITkFNRS5leGVjKHBhdGhuYW1lKTtcbiAgICBpZiAoZGF0YVJvdXRlKSB7XG4gICAgICB2YXJpYW50c0Zvcihyb3V0ZU9mKGAke2RhdGFSb3V0ZVsxXX0vJHtkYXRhUm91dGVbMl19YCkpLmRhdGEgPSBwcmVyZW5kZXI7XG4gICAgfSBlbHNlIGlmIChwYXRobmFtZS5pbmNsdWRlcyhcIi5zZWdtZW50cy9cIikpIHtcbiAgICAgIHZhcmlhbnRzRm9yKHJvdXRlT2YocGF0aG5hbWUuc3BsaXQoXCIuc2VnbWVudHMvXCIpWzBdKSkuc2VnbWVudHMucHVzaChcbiAgICAgICAgcHJlcmVuZGVyLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKFwiLnJzY1wiKSkge1xuICAgICAgdmFyaWFudHNGb3Iocm91dGVPZihwYXRobmFtZS5zbGljZSgwLCAtXCIucnNjXCIubGVuZ3RoKSkpLnJzYyA9IHByZXJlbmRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyaWFudHNGb3IocGF0aG5hbWUpLmh0bWwgPSBwcmVyZW5kZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuLyoqXG4gKiBIZWFkZXJzIHRoYXQgbXVzdCBub3QgYmUgc2VlZGVkIGludG8gYW4gYEFQUF9QQUdFYCBjYWNoZSBlbnRyeSwgZXZlbiB0aG91Z2ggdGhlXG4gKiBhZGFwdGVyIG91dHB1dCBsaXN0cyB0aGVtIGluIGBmYWxsYmFjay5pbml0aWFsSGVhZGVyc2AuXG4gKlxuICogYGluaXRpYWxIZWFkZXJzYCBkZXNjcmliZXMgaG93IGEgcGxhdGZvcm0gc2hvdWxkIHNlcnZlIHRoZSBwcmVyZW5kZXJlZCAqZmlsZSpcbiAqIHN0cmFpZ2h0IG9mZiBhIENETi4gQSBjYWNoZSBlbnRyeSBpcyBhIGRpZmZlcmVudCB0aGluZzogYGFwcC1wYWdlLXJ1bnRpbWUuanNgXG4gKiBgYXBwZW5kSGVhZGVyYHMgYGNhY2hlZERhdGEuaGVhZGVyc2Agb250byB0aGUgcmVzcG9uc2UgYW5kICp0aGVuKiBzZXJ2ZXMgdGhlXG4gKiB2YXJpYW50IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGFza2VkIGZvciwgc28gYW55dGhpbmcgcHJlc2VudGF0aW9uYWwgaW4gdGhlcmUgaXNcbiAqIGVpdGhlciB3cm9uZyBvciBkb3VibGVkLiBBdCByZXF1ZXN0IHRpbWUgTmV4dC5qcyBzdG9yZXMgb25seSB3aGF0IHRoZSByZW5kZXJcbiAqIHB1dCBpbiBgbWV0YWRhdGEuaGVhZGVyc2Ag4oCUIGB4LW5leHRqcy1zdGFsZS10aW1lYCwgYHgtbmV4dC1jYWNoZS10YWdzYCwgYW5kXG4gKiB3aGF0ZXZlciB0aGUgYXBwIHNldCB0aHJvdWdoIGBoZWFkZXJzKClgL2Bjb29raWVzKClgIOKAlCBhbmQgbmV2ZXIgdGhlc2UgZm91ci5cbiAqXG4gKiBgY29udGVudC10eXBlYCBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYnJlYWtzLiBgc2VuZC1wYXlsb2FkLmpzYCBzZXRzIHRoZSB0eXBlXG4gKiBvbmx5IHdoZW4gdGhlIHJlc3BvbnNlIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmVcbiAqIChgaWYgKCFyZXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSAmJiByZXN1bHQuY29udGVudFR5cGUpYCksIHNvIGEgc2VlZGVkXG4gKiBgdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04YCBtYWtlcyBldmVyeSBSU0MgcmVxdWVzdCB0byBhIHByZXJlbmRlcmVkIHBhZ2UgYW5zd2VyXG4gKiB0aGUgZmxpZ2h0IHBheWxvYWQgbGFiZWxlZCBhcyBIVE1MLiBUaGUgY2xpZW50IHJvdXRlciByZWplY3RzIHRoYXQsIGFuZCBzbyBkb2VzXG4gKiBOZXh0LmpzIGl0c2VsZjogYGNyZWF0ZVJlZGlyZWN0UmVuZGVyUmVzdWx0YCBjaGVja3MgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGVcbiAqIHN1Yi1yZXNwb25zZSBpdCBmZXRjaGVzIHRvIHN0cmVhbSBhbiBhY3Rpb24gYHJlZGlyZWN0KClgLCBhbmQgb24gYSBtaXNtYXRjaFxuICogY2FuY2VscyB0aGUgYm9keSBhbmQgcmV0dXJucyBhbiBlbXB0eSByZXN1bHQuXG4gKlxuICogYHZhcnlgLCBgeC1uZXh0anMtcHJlcmVuZGVyYCwgYW5kIGB4LW5leHRqcy1wb3N0cG9uZWRgIGFyZSBhbGwgc2V0IGJ5IHRoZVxuICogZW50cnlwb2ludCBpdHNlbGYsIHNvIHNlZWRpbmcgdGhlbSBvbmx5IHByb2R1Y2VzIHR3byBvZiBlYWNoLlxuICpcbiAqIGBBUFBfUk9VVEVgIGVudHJpZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBmaWx0ZXJlZDogYSByb3V0ZSBoYW5kbGVyJ3NcbiAqIGBjb250ZW50LXR5cGVgIGlzIHBhcnQgb2YgaXRzIGNhY2hlZCByZXNwb25zZSwgYW5kIGBhcHAtcm91dGUuanNgIHJlcGxheXMgdGhvc2VcbiAqIGhlYWRlcnMgdmVyYmF0aW0uXG4gKi9cbmNvbnN0IE5PTl9DQUNIRUFCTEVfQVBQX1BBR0VfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImNvbnRlbnQtdHlwZVwiLFxuICBcInZhcnlcIixcbiAgXCJ4LW5leHRqcy1wcmVyZW5kZXJcIixcbiAgXCJ4LW5leHRqcy1wb3N0cG9uZWRcIixcbl0pO1xuXG4vKiogU2VlIHtAbGluayBOT05fQ0FDSEVBQkxFX0FQUF9QQUdFX0hFQURFUlN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcFBhZ2VDYWNoZUhlYWRlcnM8VD4oXG4gIGluaXRpYWxIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBUPixcbik6IFJlY29yZDxzdHJpbmcsIFQ+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgVD4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxIZWFkZXJzKSkge1xuICAgIGlmICghTk9OX0NBQ0hFQUJMRV9BUFBfUEFHRV9IRUFERVJTLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBoZWFkZXJzW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKiogYE5FWFRfQ0FDSEVfVEFHU19IRUFERVJgLCBpbmxpbmVkIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG5vIE5leHQuanMgaW50ZXJuYWxzLiAqL1xuY29uc3QgTkVYVF9DQUNIRV9UQUdTX0hFQURFUiA9IFwieC1uZXh0LWNhY2hlLXRhZ3NcIjtcblxuLyoqXG4gKiBUaGUgdGFncyBhIGNhY2hlIHZhbHVlJ3MgcmVuZGVyIHdhcyB0YWdnZWQgd2l0aCwgYXMgTmV4dC5qcyByZWNvcmRzIHRoZW06IGluXG4gKiBpdHMgYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIsIGNvbW1hIHNlcGFyYXRlZCwgaW5jbHVkaW5nIHRoZSBpbXBsaWNpdFxuICogYF9OX1RfL+KApmAgcGF0aCBjaGFpbiBgcmV2YWxpZGF0ZVBhdGhgIHVzZXMuIE9uZSBwYXJzZXIgZm9yIHRoZSBidWlsZCdzIHRhZ1xuICogbWFuaWZlc3QgYW5kIHRoZSBydW50aW1lJ3MgbWFwcGluZyByb3dzLCB3aGljaCBoYXZlIHRvIGFncmVlLlxuICpcbiAqIGB2YWx1ZWAgaXMgYHVua25vd25gIGJlY2F1c2UgaXQgYXJyaXZlcyBib3RoIGFzIGEgc3RvcmVkIGVudHJ5IHJlYWQgYmFjayBmcm9tXG4gKiBTMyBhbmQgYXMgdGhlIGBJbmNyZW1lbnRhbENhY2hlVmFsdWVgIHVuaW9uOyBvbmx5IHNvbWUgbWVtYmVycyBoYXZlIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXJUYWdzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBoZWFkZXJzID0gKHZhbHVlIGFzIHsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsKVxuICAgID8uaGVhZGVycztcbiAgY29uc3QgaGVhZGVyID0gaGVhZGVycz8uW05FWFRfQ0FDSEVfVEFHU19IRUFERVJdO1xuICByZXR1cm4gdHlwZW9mIGhlYWRlciA9PT0gXCJzdHJpbmdcIiA/IGhlYWRlci5zcGxpdChcIixcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG59XG5cbi8qKlxuICogTmFtZSBvZiB0aGUgZmlsZSB0aGUgYWRhcHRlciB3cml0ZXMgaW50byB0aGUgaW5pdCBjYWNoZSBkaXJlY3RvcnkgbWFwcGluZyBlYWNoXG4gKiBjYWNoZSB0YWcgdG8gdGhlIGNhY2hlIGtleXMgb2YgdGhlIGJ1aWxkLXRpbWUgcHJlcmVuZGVycyBjYXJyeWluZyBpdC5cbiAqXG4gKiBJdCByaWRlcyB0byBTMyB3aXRoIHRoZSByZXN0IG9mIHRoZSBpbml0IGNhY2hlLCBhbmQgYFMzQ2FjaGVIYW5kbGVyYCdzXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgcmVhZHMgaXQgYWxvbmdzaWRlIHRoZSBgdGFnI2NhY2hlS2V5YCByb3dzIGEgcnVudGltZSBgc2V0YFxuICogd3JpdGVzLiBXaXRob3V0IGl0IGByZXZhbGlkYXRlVGFnYCBrbm93cyBhIHByZXJlbmRlciBpcyBzdGFsZSAoc2VlXG4gKiBgY2hlY2tJZlJldmFsaWRhdGVkYCkgYnV0IG5vdCB3aGljaCBDbG91ZEZyb250IHBhdGhzIHRvIGludmFsaWRhdGUsIHNvIHRoZSBDRE5cbiAqIGtlZXBzIHNlcnZpbmcgdGhlIG9sZCByZXNwb25zZSB1bnRpbCBpdHMgVFRMIGV4cGlyZXMgLSBhIHllYXIsIGZvciBhXG4gKiBwcmVyZW5kZXIuXG4gKlxuICogVGhlIGxlYWRpbmcgdW5kZXJzY29yZSBrZWVwcyBpdCBjbGVhciBvZiBjYWNoZSBrZXlzLCB3aGljaCBhcmUgcm91dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCA9IFwiX2Nkay1uZXh0anMtdGFnLW1hbmlmZXN0Lmpzb25cIjtcblxuLyoqIENvbnRlbnRzIG9mIHtAbGluayBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH06IHRhZyAtPiBpbml0IGNhY2hlIGtleXMuICovXG5leHBvcnQgdHlwZSBJbml0Q2FjaGVUYWdNYW5pZmVzdCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuLyoqXG4gKiBIZWxwZXIgdG8gc2FmZWx5IGV4dHJhY3QgdGFncyBmcm9tIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhZ3MoXG4gIGN0eDogU2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCB8IFNldEluY3JlbWVudGFsUmVzcG9uc2VDYWNoZUNvbnRleHQsXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBcInRhZ3NcIiBpbiBjdHggPyBjdHgudGFncyA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9jYWNoZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2REEsa0RBS0M7QUFnQkQsMENBd0JDO0FBYUQsMERBY0M7QUFHRCw0Q0FRQztBQUdELDhCQUVDO0FBaUNELDBDQU1DO0FBYUQsOERBYUM7QUFvQkQsa0RBT0M7QUFtREQsMENBb0RDO0FBc0NELGtEQVVDO0FBY0QsZ0NBS0M7QUFpQ0QsMEJBRUM7QUE5YkQ7O0VBRUU7QUFDRiw2Q0FBeUM7QUFDekMseUNBQWdDO0FBRWhDLGtEQUFtRDtBQUVuRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFVO0lBQ2pDLHdCQUF3QjtJQUN4QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLHlEQUF5RDtJQUN6RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUF3QixFQUFFLENBQUM7UUFDeEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxPQUFPO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQXdCLEVBQUUsQ0FBQztRQUMxQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFVO0lBQzVDLGdFQUFnRTtJQUNoRSxpREFBaUQ7SUFDakQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxVQUFrQjtJQUNoRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzFDLDhEQUE4RDtRQUM5RCxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzRCxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELHFGQUFxRjtRQUNyRixJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5RCxPQUFPLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRO2dCQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztnQkFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsaUVBQWlFO1FBQ2pFLElBQ0UsR0FBRztZQUNILE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFDdkIsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUN2QixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQWdCLEVBQ2hCLFFBQWdCO0lBRWhCLDJFQUEyRTtJQUMzRSwwQ0FBMEM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FDWixJQUFBLHlCQUFhLEVBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztRQUMvQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxRQUFRLENBQ2I7UUFDQyxvRUFBb0U7U0FDbkUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QixPQUFPLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hDLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDO0lBQzdCLElBQUksUUFBUSxLQUFLLEdBQUcsSUFBSSxRQUFRLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEMsYUFBYSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO1NBQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sR0FBRyxhQUFhLE9BQU8sQ0FBQztBQUNqQyxDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELFNBQWdCLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE9BQU8sSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELG1EQUFtRDtBQUNuRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUU5Qjs7Ozs7O0dBTUc7QUFDVSxRQUFBLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUV0Qzs7O0dBR0c7QUFDVSxRQUFBLGVBQWUsR0FBRyxXQUFXLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLDBCQUFrQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxHQUFHLHVCQUFlLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FDdkMsUUFBNEI7SUFFNUIsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSw4QkFBOEI7SUFDOUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxFQUFFLEtBQUssQ0FBQyxlQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RSxPQUFPLDhCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDO0FBRS9DOzs7OztHQUtHO0FBQ1UsUUFBQSxzQkFBc0IsR0FDakMsK0NBQStDLENBQUM7QUFFbEQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsUUFBZ0I7SUFDbEQsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDZixDQUFDO0FBY0QsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDO0FBRTlCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHLHdDQUF3QyxDQUFDO0FBRXJFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxTQUFnQixlQUFlLENBQzdCLFVBQWU7SUFFZixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsVUFBVTtTQUNQLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztTQUN0QixNQUFNLENBQ0wsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUN6QixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDL0IsQ0FDSixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFFdkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQXdCLEVBQUU7UUFDekQsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxRQUFRLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUVGLGlFQUFpRTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDMUQsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDL0IsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQzNFLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2pFLFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM3QyxjQUFjO0lBQ2QsTUFBTTtJQUNOLG9CQUFvQjtJQUNwQixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFDO0FBRUgsa0RBQWtEO0FBQ2xELFNBQWdCLG1CQUFtQixDQUNqQyxjQUFpQztJQUVqQyxNQUFNLE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sc0JBQXNCLEdBQUcsbUJBQW1CLENBQUM7QUFFbkQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixVQUFVLENBQUMsS0FBYztJQUN2QyxNQUFNLE9BQU8sR0FBSSxLQUFzRDtRQUNyRSxFQUFFLE9BQU8sQ0FBQztJQUNaLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDakQsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDN0UsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNVLFFBQUEsdUJBQXVCLEdBQUcsK0JBQStCLENBQUM7QUFldkU7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQUMsR0FBMkI7SUFDakQsT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFNoYXJlZCBjYWNoZSB1dGlsaXR5IGZ1bmN0aW9uc1xuKi9cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQgeyBoYXNQYXRoUHJlZml4IH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIFByZS1wcm9jZXNzIHZhbHVlIHRvIGNvbnZlcnQgQnVmZmVycyBhbmQgTWFwcyBiZWZvcmUgSlNPTi5zdHJpbmdpZnlcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgQnVmZmVyLnRvSlNPTigpIGlzIGNhbGxlZCBiZWZvcmUgcmVwbGFjZXIgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHByZXByb2Nlc3NWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gQ29udmVydCBCdWZmZXIgdG8gb3VyIGN1c3RvbSBmb3JtYXQuIGJhc2U2NCwgbm90IHRoZSBhcnJheSBvZiBwZXItYnl0ZVxuICAvLyBpbnRlZ2VycyB0aGlzIHVzZWQgdG8gd3JpdGUgKGFuZCB0aGF0IGBCdWZmZXIudG9KU09OKClgIHdyaXRlcykg4oCUIHNlZVxuICAvLyB7QGxpbmsgcGFyc2VDYWNoZVZhbHVlfSBmb3Igd2h5IHRoYXQgbWF0dGVyZWQgc28gbXVjaC5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiBcIkJ1ZmZlclwiLFxuICAgICAgYmFzZTY0OiB2YWx1ZS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ29udmVydCBNYXAgdG8gb3VyIGN1c3RvbSBmb3JtYXRcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgIGVudHJpZXNba2V5XSA9IHByZXByb2Nlc3NWYWx1ZSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiBcIk1hcFwiLFxuICAgICAgZGF0YTogZW50cmllcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBhcnJheXNcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gcHJlcHJvY2Vzc1ZhbHVlKGl0ZW0pKTtcbiAgfVxuXG4gIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3Mgb2JqZWN0c1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcmVwcm9jZXNzVmFsdWUodmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIFJldHVybiBwcmltaXRpdmVzIGFzLWlzXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgY2FjaGUgdmFsdWUgd2l0aCBjdXN0b20gaGFuZGxpbmcgZm9yIE1hcCBhbmQgQnVmZmVyIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNhY2hlVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIC8vIFByZS1wcm9jZXNzIHRvIGNvbnZlcnQgQnVmZmVycyBhbmQgTWFwcyBiZWZvcmUgSlNPTi5zdHJpbmdpZnlcbiAgLy8gVGhpcyBlbnN1cmVzIEJ1ZmZlci50b0pTT04oKSBkb2Vzbid0IGludGVyZmVyZVxuICBjb25zdCBwcm9jZXNzZWQgPSBwcmVwcm9jZXNzVmFsdWUodmFsdWUpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJvY2Vzc2VkKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBjYWNoZSB2YWx1ZSB3aXRoIGN1c3RvbSBoYW5kbGluZyBmb3IgTWFwIGFuZCBCdWZmZXIgb2JqZWN0c1xuICpcbiAqIEJ1ZmZlcnMgYXJlIHJlYWQgYmFjayBmcm9tIGJhc2U2NCB3aGVuIHRoYXQgaXMgaG93IHRoZXkgd2VyZSB3cml0dGVuLCBhbmQgZnJvbVxuICogYW4gYXJyYXkgb2YgcGVyLWJ5dGUgaW50ZWdlcnMgd2hlbiB0aGV5IHdlcmUgbm90LiBUaGF0IGFycmF5IGlzIHRoZSBmb3JtYXRcbiAqIGBCdWZmZXIudG9KU09OKClgIHByb2R1Y2VzIGFuZCB0aGUgb25lIHRoaXMgY29kZSB1c2VkIHRvIHdyaXRlLCBhbmQgaXQgaXNcbiAqIHJ1aW5vdXMgZm9yIGEgcGFnZSB3aXRoIGEgbGFyZ2UgcGF5bG9hZDogYSAxIE1pQiBwcmVyZW5kZXIgYmVjYW1lIH4zIE1pQiBvZlxuICogSlNPTiB0ZXh0LCBhbiAxMS42IE1pQiBjYWNoZSBlbnRyeSBvbmNlIGh0bWwgYW5kIHRoZSBwZXItc2VnbWVudCBjb3BpZXMgYXJlXG4gKiBjb3VudGVkLCBhbmQg4oCUIGJlY2F1c2UgYEpTT04ucGFyc2VgJ3MgcmV2aXZlciBydW5zIGZvciAqZXZlcnkgYXJyYXkgZWxlbWVudCog4oCUXG4gKiB1cHdhcmRzIG9mIHRocmVlIG1pbGxpb24gcmV2aXZlciBjYWxscyB0byByZWFkIG9uZSBwYWdlLiBNZWFzdXJlZCBhZ2FpbnN0IGFcbiAqIGRlcGxveW1lbnQ6IDQuOHMgb2YgTGFtYmRhIHRpbWUgdG8gYW5zd2VyIGEgMSBNaUIgc2VnbWVudCBwcmVmZXRjaCwgYWdhaW5zdFxuICogNDVtcyBmb3IgYSBzbWFsbCBvbmUgZnJvbSB0aGUgc2FtZSBjYWNoZS4gYmFzZTY0IGlzIDQvMyB0aGUgYnl0ZXMgcmF0aGVyIHRoYW5cbiAqIH4zeCwgYW5kIGBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpYCBpcyBvbmUgbmF0aXZlIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNhY2hlVmFsdWUoanNvblN0cmluZzogc3RyaW5nKTogYW55IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZywgKF9rZXksIHZhbCkgPT4ge1xuICAgIC8vIFJlc3RvcmUgTWFwIG9iamVjdHMgdGhhdCB3ZXJlIHNlcmlhbGl6ZWQgd2l0aCBfX3R5cGUgbWFya2VyXG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbC5fX3R5cGUgPT09IFwiTWFwXCIpIHtcbiAgICAgIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbC5kYXRhKSk7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgQnVmZmVyIG9iamVjdHMgdGhhdCB3ZXJlIHNlcmlhbGl6ZWQgd2l0aCBfX3R5cGUgbWFya2VyIChvdXIgY3VzdG9tIGZvcm1hdClcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsLl9fdHlwZSA9PT0gXCJCdWZmZXJcIikge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWwuYmFzZTY0ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gQnVmZmVyLmZyb20odmFsLmJhc2U2NCwgXCJiYXNlNjRcIilcbiAgICAgICAgOiBCdWZmZXIuZnJvbSh2YWwuZGF0YSk7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgQnVmZmVyIG9iamVjdHMgdGhhdCB3ZXJlIHNlcmlhbGl6ZWQgd2l0aCBOb2RlLmpzIGRlZmF1bHQgQnVmZmVyLnRvSlNPTigpIGZvcm1hdFxuICAgIC8vIFRoaXMgaGFuZGxlcyBsZWdhY3kgY2FjaGUgZW50cmllcyBvciBydW50aW1lLWdlbmVyYXRlZCBlbnRyaWVzXG4gICAgaWYgKFxuICAgICAgdmFsICYmXG4gICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWwudHlwZSA9PT0gXCJCdWZmZXJcIiAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh2YWwuZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWwuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBjYWNoZSBrZXkgYSBwcmVyZW5kZXJlZCByb3V0ZSdzIHNlZWRlZCBlbnRyeSBoYXMgdG8gYmUgd3JpdHRlbiB1bmRlci5cbiAqXG4gKiBgY3R4Lm91dHB1dHMucHJlcmVuZGVyc1tdLnBhdGhuYW1lYCBpcyB0aGUgKlVSTCogdGhlIHBhZ2UgaXMgc2VydmVkIGF0LCBzbyBpdFxuICogY2FycmllcyB0aGUgYXBwJ3MgYGJhc2VQYXRoYC4gVGhlIGtleSB0aGUgc2VydmVyIGxhdGVyIGxvb2tzIGVudHJpZXMgdXAgdW5kZXJcbiAqIGlzIHRoZSByb3V0ZSwgd2hpY2ggZG9lcyBub3Qg4oCUIE5leHQuanMgc3RyaXBzIGBiYXNlUGF0aGAgYmVmb3JlIHJvdXRpbmcsIHNvIHRoZVxuICogY2FjaGUgaGFuZGxlciBuZXZlciBzZWVzIGl0IGF0IHJlcXVlc3QgdGltZS4gU2VlZGluZyBgL3Byb2Qvc3NnLzFgIHZlcmJhdGltXG4gKiB0aGVyZWZvcmUgd3JpdGVzIGA8YnVpbGRJZD4vcHJvZC9zc2cvMS5qc29uYCB3aGlsZSB0aGUgc2VydmVyIGFza3MgZm9yXG4gKiBgPGJ1aWxkSWQ+L3NzZy8xLmpzb25gOiBldmVyeSBidWlsZC10aW1lIHByZXJlbmRlciBpcyBhIE1JU1MgdGhhdCByZS1yZW5kZXJzIG9uXG4gKiBmaXJzdCByZXF1ZXN0LCBhbmQgdGhlIHBhZ2UgaXMgb25seSBcInN0YXRpY1wiIGZyb20gdGhlIHNlY29uZCB2aXNpdCBvbndhcmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcmVuZGVyUGF0aFRvQ2FjaGVLZXkoXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICAvLyBNYXRjaGluZyBvbiBhIHBhdGggYm91bmRhcnkgc28gYSBzaWJsaW5nIHJvdXRlIGxpa2UgYC9wcm9kdWN0aW9uYCBpcyBub3RcbiAgLy8gcmVhZCBhcyBiYXNlUGF0aCBgL3Byb2RgIHBsdXMgYHVjdGlvbmAuXG4gIGNvbnN0IHJvdXRlID0gKFxuICAgIGhhc1BhdGhQcmVmaXgocGF0aG5hbWUsIGJhc2VQYXRoKVxuICAgICAgPyBwYXRobmFtZS5zbGljZShiYXNlUGF0aC5sZW5ndGgpXG4gICAgICA6IHBhdGhuYW1lXG4gIClcbiAgICAvLyBMZWFkaW5nIHNsYXNoZXMgd291bGQgbWFrZSBhbiBTMyBrZXkgd2l0aCBhbiBlbXB0eSBmaXJzdCBzZWdtZW50LlxuICAgIC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICByZXR1cm4gcm91dGUgPT09IFwiXCIgPyBcImluZGV4XCIgOiByb3V0ZTtcbn1cblxuLyoqIGBidWlsZFMzS2V5YCB1bmRlciB0aGUgYnVpbGQgcHJlZml4OiBge2NhY2hlS2V5fS5qc29uYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUtleUZpbGVOYW1lKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY2xlYW5DYWNoZUtleSA9IGNhY2hlS2V5O1xuICBpZiAoY2FjaGVLZXkgPT09IFwiL1wiIHx8IGNhY2hlS2V5ID09PSBcIlwiKSB7XG4gICAgY2xlYW5DYWNoZUtleSA9IFwiaW5kZXhcIjtcbiAgfSBlbHNlIGlmIChjYWNoZUtleS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGNsZWFuQ2FjaGVLZXkgPSBjYWNoZUtleS5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gYCR7Y2xlYW5DYWNoZUtleX0uanNvbmA7XG59XG5cbi8qKiBgdmFsdWVgJ3MgU0hBLTI1NiBkaWdlc3QsIGluIGhleDogNjQgY2hhcmFjdGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGEyNTZIZXgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG4vKiogUzMncyBsaW1pdCBvbiBhbiBvYmplY3Qga2V5LCBpbiBVVEYtOCBieXRlcy4gKi9cbmNvbnN0IE1BWF9TM19LRVlfQllURVMgPSAxMDI0O1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGJ1aWxkIElEIGNhY2hlIGVudHJpZXMgYXJlIHN0b3JlZCB1bmRlciwgd2hpY2hcbiAqIHtAbGluayBjYWNoZU9iamVjdE5hbWV9IGxlYXZlcyByb29tIGZvciBpbiBmcm9udCBvZiBpdCB3aXRoIGl0cyBgL2A6IGFcbiAqIE5leHQuanMgYnVpbGQgSUQgaXMgMjEgY2hhcmFjdGVycywgYW5kIHRoZSBgLTxkZXBsb3ltZW50SWQ+YCBjZGstbmV4dGpzXG4gKiBhcHBlbmRzIGlzIHRoZSBhcHAncyBvd24sIHNvIHRoZSBhZGFwdGVyIGZhaWxzIGEgYnVpbGQgd2hvc2UgSUQgaXMgbG9uZ2VyXG4gKiAoc2VlIGBhc3NlcnRCdWlsZElkRml0c2ApIHJhdGhlciB0aGFuIGxlYXZlIGxvbmcgbmFtZXMgdW53cml0YWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CVUlMRF9JRF9CWVRFUyA9IDEyNztcblxuLyoqXG4gKiBUaGUgZm9sZGVyIHVuZGVyIHRoZSBidWlsZCBwcmVmaXggdGhhdCBlbnRyaWVzIHdpdGggYW4gb3Zlci1sb25nIGtleSBhcmVcbiAqIHN0b3JlZCBpbi4gQHNlZSBjYWNoZU9iamVjdE5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IExPTkdfS0VZX1BSRUZJWCA9IFwiX2xvbmcta2V5XCI7XG5cbi8qKlxuICogV2hlcmUgdGhlIGVudHJ5IGBidWlsZFMzS2V5YCBuYW1lcyBpcyBzdG9yZWQsIHVuZGVyIHRoZSBidWlsZCBwcmVmaXg6XG4gKiBpdHMgb3duIG5hbWUsIG9yIGBfbG9uZy1rZXkve3NoYTI1Nn0ubG9uZ2AgZm9yIGEgbmFtZSB0aGF0IHdvdWxkIGxlYXZlIHRoZVxuICogd2hvbGUgb2JqZWN0IGtleSBwYXN0IFMzJ3MgMTAyNCBieXRlcy4gbmV4dCAxNi4zLjgncyByb3V0ZS1zY29wZWQga2V5cyBhcmVcbiAqIH44OCBieXRlcyBsb25nZXIgdGhhbiBhIHBhdGhuYW1lLCBlbm91Z2ggdG8gcHVzaCBhIGxvbmcgb25lIG92ZXIsIGFuZCBhXG4gKiByZWplY3RlZCBgUHV0T2JqZWN0YCBtZWFudCB0aGUgcGFnZSB3YXMgbmV2ZXIgY2FjaGVkLlxuICpcbiAqIE9ubHkgdGhlIG9iamVjdCBpcyBtb3ZlZDogYGJ1aWxkUzNLZXlgIHN0YXlzIHRoZSBlbnRyeSdzIG5hbWUgZm9yIHRhZ1xuICogbWFwcGluZ3MgYW5kIENsb3VkRnJvbnQgcGF0aHMsIHNpbmNlIGEgaGFzaCBuYW1lcyBubyByb3V0ZS4gRGVjaWRlZCBvbiB0aGVcbiAqIG5hbWUgYWxvbmUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGtleSBzbyB0aGUgaW5pdCBjYWNoZSwgd2hpY2ggaXMgd3JpdHRlblxuICogd2l0aG91dCB0aGUgYnVpbGQgSUQgaXQgaXMgZGVwbG95ZWQgdW5kZXIsIGZpbGVzIGEgc2VlZCB3aGVyZSB0aGUgcnVudGltZVxuICogcmVhZHMgaXQuIFRoZSBgLmxvbmdgIHN1ZmZpeCBrZWVwcyB0aGVzZSBkaXNqb2ludCBmcm9tIGV2ZXJ5IGAuanNvbmAgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlT2JqZWN0TmFtZShjYWNoZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbmFtZSA9IGNhY2hlS2V5RmlsZU5hbWUoY2FjaGVLZXkpO1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgobmFtZSkgPD0gTUFYX1MzX0tFWV9CWVRFUyAtIChNQVhfQlVJTERfSURfQllURVMgKyAxKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtMT05HX0tFWV9QUkVGSVh9LyR7c2hhMjU2SGV4KG5hbWUpfS5sb25nYDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UtY2FjaGUga2V5IG5leHQgPj0gMTYuMy44IHN0b3JlcyBhIHByZXJlbmRlciB1bmRlciwgcmVhZCBiYWNrIG9mZlxuICogdGhlIGZpbGUgYG5leHQgYnVpbGRgIHdyb3RlIGl0IHRvLCBvciBgdW5kZWZpbmVkYCBiZWZvcmUgMTYuMy44LlxuICpcbiAqIEZyb20gMTYuMy44IE5leHQuanMgc2NvcGVzIGV2ZXJ5IHBhZ2UncyBjYWNoZSBrZXkgYnkgaXRzIHNvdXJjZSByb3V0ZSAtXG4gKiBgL3JvdXRlLWNhY2hlLzxraW5kPi88c2hhMjU2KHNvdXJjZVJvdXRlKT4vJDxwYXRobmFtZT5gIChgZ2V0Um91dGVDYWNoZUtleWBcbiAqIGluIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9yb3V0ZS1jYWNoZS1rZXkuanNgKSAtIGFuZCwgd2l0aCBhbiBhZGFwdGVyLCB3cml0ZXNcbiAqIGVhY2ggcHJlcmVuZGVyIHRvIGA8ZGlzdERpcj4vc2VydmVyLzxrZXk+PGV4dD5gLiBUaGUgZmlsZSBwYXRoIGlzIHRoZSBvbmx5XG4gKiBwbGFjZSBhbiBhZGFwdGVyIGlzIGhhbmRlZCB0aGF0IGtleSwgYW5kIHJlLWRlcml2aW5nIGl0IHdvdWxkIG1lYW4gcmUtcGlja2luZ1xuICogdGhlIHNvdXJjZSByb3V0ZSB0aGUgd2F5IGBidWlsZC1jb21wbGV0ZS5qc2AgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlQ2FjaGVLZXlGcm9tRmlsZVBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBUaGUgZmlyc3QgYC9zZXJ2ZXIvcm91dGUtY2FjaGUvYDogYSByb3V0ZSdzIG93biBwYXRobmFtZSBjYW4gY29udGFpbiBvbmVcbiAgLy8gYWZ0ZXIgaXQuIEJlZm9yZSAxNi4zLjggYSByb3V0ZSBvZiB0aGF0IG5hbWUgaXMgYWxsIHRoZXJlIGlzLCB3aGljaCB0aGVcbiAgLy8gcHJlZml4IGNoZWNrIGJlbG93IHJlamVjdHMuXG4gIGNvbnN0IHBhdGggPSBmaWxlUGF0aD8uc3BsaXQoc2VwKS5qb2luKFwiL1wiKTtcbiAgY29uc3QgYXQgPSBwYXRoPy5pbmRleE9mKFJPVVRFX0NBQ0hFX0RJUikgPz8gLTE7XG4gIGlmIChhdCA8IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGtleSA9IHBhdGghLnNsaWNlKGF0ICsgXCIvc2VydmVyL1wiLmxlbmd0aCkucmVwbGFjZSgvXFwuW14uL10rJC8sIFwiXCIpO1xuICByZXR1cm4gUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWC50ZXN0KGtleSkgPyBrZXkgOiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFJPVVRFX0NBQ0hFX0RJUiA9IFwiL3NlcnZlci9yb3V0ZS1jYWNoZS9cIjtcblxuLyoqXG4gKiBUaGUgc3RhcnQgb2YgYSBuZXh0ID49IDE2LjMuOCByZXNwb25zZS1jYWNoZSBrZXksIGxlYWRpbmcgc2xhc2ggZHJvcHBlZDpcbiAqIGByb3V0ZS1jYWNoZS88a2luZD4vPHNoYTI1Nihzb3VyY2VSb3V0ZSk+LyRgIChgZ2V0Um91dGVDYWNoZUtleWApLCBmb2xsb3dlZFxuICogYnkgdGhlIHBhdGhuYW1lLiBNYXRjaGVkIHdob2xlLCBzbyBhbiBvbGRlciBhcHAncyByb3V0ZSB0aGF0IGhhcHBlbnMgdG8gYmVcbiAqIG5hbWVkIGAvcm91dGUtY2FjaGUvLi4uYCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBST1VURV9DQUNIRV9LRVlfUFJFRklYID1cbiAgL15yb3V0ZS1jYWNoZVxcL1tBLVpfXStcXC9bMC05YS1mXXs2NH1cXC9cXCQoPz1cXC8pLztcblxuLyoqXG4gKiBgZGVub3JtYWxpemVQYWdlUGF0aGAgKGBuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9wYWdlLXBhdGgvZGVub3JtYWxpemUtcGFnZS1wYXRoLmpzYCksXG4gKiB0aGUgaW52ZXJzZSBvZiB0aGUgYG5vcm1hbGl6ZVBhZ2VQYXRoYCBhIHJvdXRlLWNhY2hlIGtleSdzIHBhdGhuYW1lIGdvZXNcbiAqIHRocm91Z2g6IGAvaW5kZXhgIGJhY2sgdG8gYC9gLCBhbmQgYC9pbmRleC8uLi5gIC0gaG93IGAvaW5kZXhgIGl0c2VsZiBhbmRcbiAqIGV2ZXJ5IHBhdGggdW5kZXIgaXQgYXJlIHNwZWxsZWQgLSBiYWNrIHRvIGAvLi4uYC4gUmVzdGF0ZWQgd2l0aG91dCBpdHNcbiAqIGR5bmFtaWMtcm91dGUgY2hlY2s6IGBzM0tleVRvSW52YWxpZGF0aW9uUGF0aGAgaGFzIGRyb3BwZWQgdGhvc2UgYWxyZWFkeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbm9ybWFsaXplUGFnZVBhdGgocGFnZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwYWdlUGF0aCA9PT0gXCIvaW5kZXhcIikge1xuICAgIHJldHVybiBcIi9cIjtcbiAgfVxuICByZXR1cm4gcGFnZVBhdGguc3RhcnRzV2l0aChcIi9pbmRleC9cIilcbiAgICA/IHBhZ2VQYXRoLnNsaWNlKFwiL2luZGV4XCIubGVuZ3RoKVxuICAgIDogcGFnZVBhdGg7XG59XG5cbi8qKiBUaGUgb3V0cHV0cyBvbmUgcm91dGUgY29udHJpYnV0ZXMgdG8gYGN0eC5vdXRwdXRzLnByZXJlbmRlcnNgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVyZW5kZXJWYXJpYW50czxUPiB7XG4gIC8qKiBUaGUgSFRNTCByZW5kZXIuIEl0cyBwYXRobmFtZSBpcyB0aGUgcm91dGUsIHdpdGggbm8gc3VmZml4LiAqL1xuICBodG1sPzogVDtcbiAgLyoqIFRoZSBmbGlnaHQgcGF5bG9hZCwgYnVpbHQgYXMgYDxyb3V0ZT4ucnNjYCDigJQgYnV0IHNlZSB7QGxpbmsgZ3JvdXBQcmVyZW5kZXJzfS4gKi9cbiAgcnNjPzogVDtcbiAgLyoqIFBlci1zZWdtZW50IGZsaWdodCBwYXlsb2FkcywgdW5kZXIgYDxyb3V0ZT4uc2VnbWVudHMvYC4gKi9cbiAgc2VnbWVudHM6IFRbXTtcbiAgLyoqIEEgUGFnZXMgUm91dGVyIHJvdXRlJ3MgYHBhZ2VEYXRhYCwgYnVpbHQgYXMgaXRzIGAvX25leHQvZGF0YS9gIHJvdXRlLiAqL1xuICBkYXRhPzogVDtcbn1cblxuY29uc3QgSU5ERVhfU1VGRklYID0gXCIvaW5kZXhcIjtcblxuLyoqXG4gKiBBIFBhZ2VzIFJvdXRlciBkYXRhIHJvdXRlOiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCwgb3B0aW9uYWxseVxuICogYmVoaW5kIGEgYGJhc2VQYXRoYCAoYG5vcm1hbGl6ZVBhdGhuYW1lYCBpbiBOZXh0LmpzJ3MgYGJ1aWxkLWNvbXBsZXRlYCBwcmVmaXhlc1xuICogZXZlcnkgb3V0cHV0IHBhdGhuYW1lLCB0aGlzIG9uZSBpbmNsdWRlZCkuXG4gKlxuICogQ2FwdHVyZSAxIGlzIHRoYXQgcHJlZml4IGFuZCBjYXB0dXJlIDIgdGhlIHBhZ2UgcGF0aCB3aXRob3V0IGl0cyBgLmpzb25gLCBzb1xuICogYC9wcm9kL19uZXh0L2RhdGEvYWJjMTIzL2Jsb2cvaGVsbG8uanNvbmAgcmVjb21wb3NlcyB0byBgL3Byb2QvYmxvZy9oZWxsb2AuXG4gKi9cbmNvbnN0IFBBR0VTX0RBVEFfUEFUSE5BTUUgPSAvXiguKilcXC9fbmV4dFxcL2RhdGFcXC9bXi9dK1xcLyguKylcXC5qc29uJC87XG5cbi8qKlxuICogQ29sbGVjdCBgY3R4Lm91dHB1dHMucHJlcmVuZGVyc2AgaW50byBvbmUgZW50cnkgcGVyIHJvdXRlLlxuICpcbiAqIE5leHQuanMgZW1pdHMgdXAgdG8gdGhyZWUgc2hhcGVzIHBlciBwcmVyZW5kZXJlZCBBcHAgUm91dGVyIHJvdXRlIOKAlCBgL2Jsb2cvaGVsbG9gLFxuICogYC9ibG9nL2hlbGxvLnJzY2AsIGFuZCBgL2Jsb2cvaGVsbG8uc2VnbWVudHMvKi5zZWdtZW50LnJzY2Ag4oCUIGFuZCBhIGNhY2hlIGVudHJ5XG4gKiBuZWVkcyBhbGwgb2YgdGhlbSB0b2dldGhlciwgc28gdGhleSBoYXZlIHRvIGJlIGdyb3VwZWQgYnkgcm91dGUgYmVmb3JlIGFueXRoaW5nXG4gKiBjYW4gYmUgc2VlZGVkLiBBIFBhZ2VzIFJvdXRlciByb3V0ZSBlbWl0cyB0d286IHRoZSBIVE1MLCBhbmQgaXRzIGBwYWdlRGF0YWAgYXRcbiAqIHRoZSByb3V0ZSdzIGAvX25leHQvZGF0YS88YnVpbGRJZD4vPHBhZ2U+Lmpzb25gIHBhdGhuYW1lXG4gKiAoe0BsaW5rIFBBR0VTX0RBVEFfUEFUSE5BTUV9KS4gVGhhdCBvbmUgaXMgbm90IGEgc3VmZml4IG9mIHRoZSBwYWdlJ3Mgb3duXG4gKiBwYXRobmFtZSwgc28gaXQgaXMgbWF0Y2hlZCByYXRoZXIgdGhhbiBzdHJpcHBlZC5cbiAqXG4gKiBUaGUgb25lIGNhc2UgdGhhdCBpcyBub3QgYSBzdWZmaXggc3RyaXAgaXMgdGhlICoqcm9vdCByb3V0ZSoqLCB3aGljaCBjYW5ub3QgYmVcbiAqIG5hbWVkIGAvLnJzY2A6IGl0cyBwYXlsb2FkcyBhcmUgZW1pdHRlZCB1bmRlciBgL2luZGV4LnJzY2AgYW5kXG4gKiBgL2luZGV4LnNlZ21lbnRzL2Agd2hpbGUgaXRzIEhUTUwgc3RheXMgYXQgYC9gIChvciBhdCB0aGUgYGJhc2VQYXRoYCwgZS5nLlxuICogYC9wcm9kYCBhbmQgYC9wcm9kL2luZGV4LnJzY2ApLiBSZWNvbnN0cnVjdGluZyBuYW1lcyBieSBjb25jYXRlbmF0aW9uIHRoZXJlZm9yZVxuICogc2lsZW50bHkgbG9zZXMgdGhlIGhvbWUgcGFnZSdzIGByc2NEYXRhYCDigJQgYW5kIHdpdGggYSBgYmFzZVBhdGhgIGFsc28gaXRzXG4gKiBgc2VnbWVudERhdGFgLCBiZWNhdXNlIGAvcHJvZGAgYW5kIGAvcHJvZC9pbmRleGAgZ3JvdXAgYXBhcnQuIFRoYXQgaXMgbm90IGFcbiAqIGNvc21ldGljIGdhcDogYGFwcC1wYWdlLXJ1bnRpbWUuanNgIGFuc3dlcnMgYW4gUlNDIHJlcXVlc3QgZm9yIGFuIGVudHJ5IHdpdGggbm9cbiAqIGByc2NEYXRhYCBieSBjaGVja2luZyBgY2FjaGVkRGF0YS5odG1sLmNvbnRlbnRUeXBlYCwgYW5kIHVuZGVyIGBjYWNoZUNvbXBvbmVudHNgXG4gKiBzZW5kcyBhbiBlbXB0eSBgNDA0YC4gRXZlcnkgY2xpZW50LXNpZGUgbmF2aWdhdGlvbiB0byBgL2AgYnJlYWtzLlxuICpcbiAqIFRoZSByZW1hcCBpcyBjb25kaXRpb25hbCByYXRoZXIgdGhhbiB1bmNvbmRpdGlvbmFsIHNvIHRoYXQgYW4gYXBwIHdpdGggYSByZWFsXG4gKiBwYWdlIGF0IGBhcHAvaW5kZXgvcGFnZS50c3hgIOKAlCB3aG9zZSBIVE1MIHByZXJlbmRlciBnZW51aW5lbHkgaXMgYC9pbmRleGAg4oCUIGtlZXBzXG4gKiBpdHMgb3duIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBQcmVyZW5kZXJzPFQgZXh0ZW5kcyB7IHBhdGhuYW1lOiBzdHJpbmcgfT4oXG4gIHByZXJlbmRlcnM6IFRbXSxcbik6IE1hcDxzdHJpbmcsIFByZXJlbmRlclZhcmlhbnRzPFQ+PiB7XG4gIGNvbnN0IGh0bWxQYXRobmFtZXMgPSBuZXcgU2V0KFxuICAgIHByZXJlbmRlcnNcbiAgICAgIC5tYXAoKHApID0+IHAucGF0aG5hbWUpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcC5lbmRzV2l0aChcIi5yc2NcIikgJiZcbiAgICAgICAgICAhcC5pbmNsdWRlcyhcIi5zZWdtZW50cy9cIikgJiZcbiAgICAgICAgICAhUEFHRVNfREFUQV9QQVRITkFNRS50ZXN0KHApLFxuICAgICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFByZXJlbmRlclZhcmlhbnRzPFQ+PigpO1xuXG4gIGNvbnN0IHZhcmlhbnRzRm9yID0gKGJhc2U6IHN0cmluZyk6IFByZXJlbmRlclZhcmlhbnRzPFQ+ID0+IHtcbiAgICBsZXQgdmFyaWFudHMgPSBncm91cHMuZ2V0KGJhc2UpO1xuICAgIGlmICghdmFyaWFudHMpIHtcbiAgICAgIHZhcmlhbnRzID0geyBzZWdtZW50czogW10gfTtcbiAgICAgIGdyb3Vwcy5zZXQoYmFzZSwgdmFyaWFudHMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFyaWFudHM7XG4gIH07XG5cbiAgLyoqIGAvaW5kZXgucnNjYCBiZWxvbmdzIHRvIGAvYCwgYC9wcm9kL2luZGV4LnJzY2AgdG8gYC9wcm9kYC4gKi9cbiAgY29uc3Qgcm91dGVPZiA9IChiYXNlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmIChiYXNlLmVuZHNXaXRoKElOREVYX1NVRkZJWCkgJiYgIWh0bWxQYXRobmFtZXMuaGFzKGJhc2UpKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBiYXNlLnNsaWNlKDAsIC1JTkRFWF9TVUZGSVgubGVuZ3RoKSB8fCBcIi9cIjtcbiAgICAgIGlmIChodG1sUGF0aG5hbWVzLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9O1xuXG4gIGZvciAoY29uc3QgcHJlcmVuZGVyIG9mIHByZXJlbmRlcnMpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwcmVyZW5kZXI7XG4gICAgY29uc3QgZGF0YVJvdXRlID0gUEFHRVNfREFUQV9QQVRITkFNRS5leGVjKHBhdGhuYW1lKTtcbiAgICBpZiAoZGF0YVJvdXRlKSB7XG4gICAgICB2YXJpYW50c0Zvcihyb3V0ZU9mKGAke2RhdGFSb3V0ZVsxXX0vJHtkYXRhUm91dGVbMl19YCkpLmRhdGEgPSBwcmVyZW5kZXI7XG4gICAgfSBlbHNlIGlmIChwYXRobmFtZS5pbmNsdWRlcyhcIi5zZWdtZW50cy9cIikpIHtcbiAgICAgIHZhcmlhbnRzRm9yKHJvdXRlT2YocGF0aG5hbWUuc3BsaXQoXCIuc2VnbWVudHMvXCIpWzBdKSkuc2VnbWVudHMucHVzaChcbiAgICAgICAgcHJlcmVuZGVyLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKFwiLnJzY1wiKSkge1xuICAgICAgdmFyaWFudHNGb3Iocm91dGVPZihwYXRobmFtZS5zbGljZSgwLCAtXCIucnNjXCIubGVuZ3RoKSkpLnJzYyA9IHByZXJlbmRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyaWFudHNGb3IocGF0aG5hbWUpLmh0bWwgPSBwcmVyZW5kZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuLyoqXG4gKiBIZWFkZXJzIHRoYXQgbXVzdCBub3QgYmUgc2VlZGVkIGludG8gYW4gYEFQUF9QQUdFYCBjYWNoZSBlbnRyeSwgZXZlbiB0aG91Z2ggdGhlXG4gKiBhZGFwdGVyIG91dHB1dCBsaXN0cyB0aGVtIGluIGBmYWxsYmFjay5pbml0aWFsSGVhZGVyc2AuXG4gKlxuICogYGluaXRpYWxIZWFkZXJzYCBkZXNjcmliZXMgaG93IGEgcGxhdGZvcm0gc2hvdWxkIHNlcnZlIHRoZSBwcmVyZW5kZXJlZCAqZmlsZSpcbiAqIHN0cmFpZ2h0IG9mZiBhIENETi4gQSBjYWNoZSBlbnRyeSBpcyBhIGRpZmZlcmVudCB0aGluZzogYGFwcC1wYWdlLXJ1bnRpbWUuanNgXG4gKiBgYXBwZW5kSGVhZGVyYHMgYGNhY2hlZERhdGEuaGVhZGVyc2Agb250byB0aGUgcmVzcG9uc2UgYW5kICp0aGVuKiBzZXJ2ZXMgdGhlXG4gKiB2YXJpYW50IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGFza2VkIGZvciwgc28gYW55dGhpbmcgcHJlc2VudGF0aW9uYWwgaW4gdGhlcmUgaXNcbiAqIGVpdGhlciB3cm9uZyBvciBkb3VibGVkLiBBdCByZXF1ZXN0IHRpbWUgTmV4dC5qcyBzdG9yZXMgb25seSB3aGF0IHRoZSByZW5kZXJcbiAqIHB1dCBpbiBgbWV0YWRhdGEuaGVhZGVyc2Ag4oCUIGB4LW5leHRqcy1zdGFsZS10aW1lYCwgYHgtbmV4dC1jYWNoZS10YWdzYCwgYW5kXG4gKiB3aGF0ZXZlciB0aGUgYXBwIHNldCB0aHJvdWdoIGBoZWFkZXJzKClgL2Bjb29raWVzKClgIOKAlCBhbmQgbmV2ZXIgdGhlc2UgZm91ci5cbiAqXG4gKiBgY29udGVudC10eXBlYCBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYnJlYWtzLiBgc2VuZC1wYXlsb2FkLmpzYCBzZXRzIHRoZSB0eXBlXG4gKiBvbmx5IHdoZW4gdGhlIHJlc3BvbnNlIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmVcbiAqIChgaWYgKCFyZXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSAmJiByZXN1bHQuY29udGVudFR5cGUpYCksIHNvIGEgc2VlZGVkXG4gKiBgdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04YCBtYWtlcyBldmVyeSBSU0MgcmVxdWVzdCB0byBhIHByZXJlbmRlcmVkIHBhZ2UgYW5zd2VyXG4gKiB0aGUgZmxpZ2h0IHBheWxvYWQgbGFiZWxlZCBhcyBIVE1MLiBUaGUgY2xpZW50IHJvdXRlciByZWplY3RzIHRoYXQsIGFuZCBzbyBkb2VzXG4gKiBOZXh0LmpzIGl0c2VsZjogYGNyZWF0ZVJlZGlyZWN0UmVuZGVyUmVzdWx0YCBjaGVja3MgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGVcbiAqIHN1Yi1yZXNwb25zZSBpdCBmZXRjaGVzIHRvIHN0cmVhbSBhbiBhY3Rpb24gYHJlZGlyZWN0KClgLCBhbmQgb24gYSBtaXNtYXRjaFxuICogY2FuY2VscyB0aGUgYm9keSBhbmQgcmV0dXJucyBhbiBlbXB0eSByZXN1bHQuXG4gKlxuICogYHZhcnlgLCBgeC1uZXh0anMtcHJlcmVuZGVyYCwgYW5kIGB4LW5leHRqcy1wb3N0cG9uZWRgIGFyZSBhbGwgc2V0IGJ5IHRoZVxuICogZW50cnlwb2ludCBpdHNlbGYsIHNvIHNlZWRpbmcgdGhlbSBvbmx5IHByb2R1Y2VzIHR3byBvZiBlYWNoLlxuICpcbiAqIGBBUFBfUk9VVEVgIGVudHJpZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBmaWx0ZXJlZDogYSByb3V0ZSBoYW5kbGVyJ3NcbiAqIGBjb250ZW50LXR5cGVgIGlzIHBhcnQgb2YgaXRzIGNhY2hlZCByZXNwb25zZSwgYW5kIGBhcHAtcm91dGUuanNgIHJlcGxheXMgdGhvc2VcbiAqIGhlYWRlcnMgdmVyYmF0aW0uXG4gKi9cbmNvbnN0IE5PTl9DQUNIRUFCTEVfQVBQX1BBR0VfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImNvbnRlbnQtdHlwZVwiLFxuICBcInZhcnlcIixcbiAgXCJ4LW5leHRqcy1wcmVyZW5kZXJcIixcbiAgXCJ4LW5leHRqcy1wb3N0cG9uZWRcIixcbl0pO1xuXG4vKiogU2VlIHtAbGluayBOT05fQ0FDSEVBQkxFX0FQUF9QQUdFX0hFQURFUlN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcFBhZ2VDYWNoZUhlYWRlcnM8VD4oXG4gIGluaXRpYWxIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBUPixcbik6IFJlY29yZDxzdHJpbmcsIFQ+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgVD4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxIZWFkZXJzKSkge1xuICAgIGlmICghTk9OX0NBQ0hFQUJMRV9BUFBfUEFHRV9IRUFERVJTLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBoZWFkZXJzW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKiogYE5FWFRfQ0FDSEVfVEFHU19IRUFERVJgLCBpbmxpbmVkIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG5vIE5leHQuanMgaW50ZXJuYWxzLiAqL1xuY29uc3QgTkVYVF9DQUNIRV9UQUdTX0hFQURFUiA9IFwieC1uZXh0LWNhY2hlLXRhZ3NcIjtcblxuLyoqXG4gKiBUaGUgdGFncyBhIGNhY2hlIHZhbHVlJ3MgcmVuZGVyIHdhcyB0YWdnZWQgd2l0aCwgYXMgTmV4dC5qcyByZWNvcmRzIHRoZW06IGluXG4gKiBpdHMgYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIsIGNvbW1hIHNlcGFyYXRlZCwgaW5jbHVkaW5nIHRoZSBpbXBsaWNpdFxuICogYF9OX1RfL+KApmAgcGF0aCBjaGFpbiBgcmV2YWxpZGF0ZVBhdGhgIHVzZXMuIE9uZSBwYXJzZXIgZm9yIHRoZSBidWlsZCdzIHRhZ1xuICogbWFuaWZlc3QgYW5kIHRoZSBydW50aW1lJ3MgbWFwcGluZyByb3dzLCB3aGljaCBoYXZlIHRvIGFncmVlLlxuICpcbiAqIGB2YWx1ZWAgaXMgYHVua25vd25gIGJlY2F1c2UgaXQgYXJyaXZlcyBib3RoIGFzIGEgc3RvcmVkIGVudHJ5IHJlYWQgYmFjayBmcm9tXG4gKiBTMyBhbmQgYXMgdGhlIGBJbmNyZW1lbnRhbENhY2hlVmFsdWVgIHVuaW9uOyBvbmx5IHNvbWUgbWVtYmVycyBoYXZlIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXJUYWdzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBoZWFkZXJzID0gKHZhbHVlIGFzIHsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsKVxuICAgID8uaGVhZGVycztcbiAgY29uc3QgaGVhZGVyID0gaGVhZGVycz8uW05FWFRfQ0FDSEVfVEFHU19IRUFERVJdO1xuICByZXR1cm4gdHlwZW9mIGhlYWRlciA9PT0gXCJzdHJpbmdcIiA/IGhlYWRlci5zcGxpdChcIixcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG59XG5cbi8qKlxuICogTmFtZSBvZiB0aGUgZmlsZSB0aGUgYWRhcHRlciB3cml0ZXMgaW50byB0aGUgaW5pdCBjYWNoZSBkaXJlY3RvcnkgbWFwcGluZyBlYWNoXG4gKiBjYWNoZSB0YWcgdG8gdGhlIGNhY2hlIGtleXMgb2YgdGhlIGJ1aWxkLXRpbWUgcHJlcmVuZGVycyBjYXJyeWluZyBpdC5cbiAqXG4gKiBJdCByaWRlcyB0byBTMyB3aXRoIHRoZSByZXN0IG9mIHRoZSBpbml0IGNhY2hlLCBhbmQgYFMzQ2FjaGVIYW5kbGVyYCdzXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgcmVhZHMgaXQgYWxvbmdzaWRlIHRoZSBgdGFnI2NhY2hlS2V5YCByb3dzIGEgcnVudGltZSBgc2V0YFxuICogd3JpdGVzLiBXaXRob3V0IGl0IGByZXZhbGlkYXRlVGFnYCBrbm93cyBhIHByZXJlbmRlciBpcyBzdGFsZSAoc2VlXG4gKiBgY2hlY2tJZlJldmFsaWRhdGVkYCkgYnV0IG5vdCB3aGljaCBDbG91ZEZyb250IHBhdGhzIHRvIGludmFsaWRhdGUsIHNvIHRoZSBDRE5cbiAqIGtlZXBzIHNlcnZpbmcgdGhlIG9sZCByZXNwb25zZSB1bnRpbCBpdHMgVFRMIGV4cGlyZXMgLSBhIHllYXIsIGZvciBhXG4gKiBwcmVyZW5kZXIuXG4gKlxuICogVGhlIGxlYWRpbmcgdW5kZXJzY29yZSBrZWVwcyBpdCBjbGVhciBvZiBjYWNoZSBrZXlzLCB3aGljaCBhcmUgcm91dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCA9IFwiX2Nkay1uZXh0anMtdGFnLW1hbmlmZXN0Lmpzb25cIjtcblxuLyoqIENvbnRlbnRzIG9mIHtAbGluayBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH06IHRhZyAtPiBpbml0IGNhY2hlIGtleXMuICovXG5leHBvcnQgdHlwZSBJbml0Q2FjaGVUYWdNYW5pZmVzdCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuLyoqXG4gKiBUaGUgYGN0eGAgTmV4dC5qcyBwYXNzZXMgYSBgQ2FjaGVIYW5kbGVyYCdzIGBnZXRgLCB0YWtlbiBvZmYgaXRzIGludGVyZmFjZTpcbiAqIHRoZSBmZXRjaCBjYWNoZSdzLCBhIHJvdXRlIHJlc3BvbnNlJ3MsIG9yIC0gc2luY2UgdGhpcyBoYW5kbGVyIGlzIGFsc29cbiAqIGBJbWFnZU9wdGltaXplckNhY2hlYCdzIC0gYW4gb3B0aW1pemVkIGltYWdlJ3MuXG4gKi9cbmV4cG9ydCB0eXBlIEdldENhY2hlSGFuZGxlckNvbnRleHQgPSBQYXJhbWV0ZXJzPENhY2hlSGFuZGxlcltcImdldFwiXT5bMV07XG5cbi8qKiBUaGUgYGN0eGAgTmV4dC5qcyBwYXNzZXMgYSBgQ2FjaGVIYW5kbGVyYCdzIGBzZXRgLiBTZWUge0BsaW5rIEdldENhY2hlSGFuZGxlckNvbnRleHR9LiAqL1xuZXhwb3J0IHR5cGUgU2V0Q2FjaGVIYW5kbGVyQ29udGV4dCA9IFBhcmFtZXRlcnM8Q2FjaGVIYW5kbGVyW1wic2V0XCJdPlsyXTtcblxuLyoqXG4gKiBIZWxwZXIgdG8gc2FmZWx5IGV4dHJhY3QgdGFncyBmcm9tIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhZ3MoY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0KTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gXCJ0YWdzXCIgaW4gY3R4ID8gY3R4LnRhZ3MgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|