sliftutils 1.7.140 → 1.7.142
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/index.d.ts +4 -0
- package/misc/dist/ownIPs.ts.cache +2 -2
- package/package.json +1 -1
- package/security/authorizedKeys/dist/secureSSH.ts.cache +6 -4
- package/security/machines/identity2.ts +46 -51
- package/security/notifications/dist/setupNotify.ts.cache +6 -4
- package/security/signedFiles/dist/signFilesCli.ts.cache +52 -0
- package/storage/IArchives.d.ts +4 -0
- package/storage/IArchives.ts +9 -0
- package/storage/backblaze.ts +6 -1
- package/storage/dist/IArchives.ts.cache +12 -3
- package/storage/dist/backblaze.ts.cache +7 -2
- package/storage/remoteStorage/createArchives.ts +8 -1
- package/storage/remoteStorage/dist/createArchives.ts.cache +9 -2
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
-
//exports.main = void 0;
|
|
4
3
|
const discord_1 = require("./discord");
|
|
5
4
|
const remoteWebhook_1 = require("./remoteWebhook");
|
|
6
5
|
const remoteSSH_1 = require("../helpers/remoteSSH");
|
|
@@ -34,6 +33,9 @@ async function main() {
|
|
|
34
33
|
}
|
|
35
34
|
console.log(`Wrote ${filePath} on ${(0, remoteSSH_1.describeHost)(host)} (mode 600), and confirmed on the new webhook.`);
|
|
36
35
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
main().catch(e => {
|
|
37
|
+
console.error(`${e}`);
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
}).finally(() => process.exit());
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBOb3RpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzZXR1cE5vdGlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUE2QztBQUM3QyxtREFBdUU7QUFDdkUsb0RBQWtFO0FBRWxFLE1BQU0sS0FBSyxHQUFHLHlEQUF5RCwrQkFBZTs7cURBRWpDLENBQUM7QUFFdEQsU0FBUyxTQUFTLENBQUMsSUFBYztJQUM3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLCtCQUFlLENBQUMsQ0FBQztJQUM3QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLCtCQUFlLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ1gsZ0VBQWdFLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Y0FDakYsaUJBQWlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxLQUFLLEtBQUssRUFBRSxDQUNsRSxDQUFDO0lBQ04sQ0FBQztJQUNELDZGQUE2RjtJQUM3Rix5QkFBeUI7SUFDekIsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLHdCQUFZLENBQUM7SUFDbEUsZ0ZBQWdGO0lBQ2hGLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDM0UsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDekMsQ0FBQztBQUVELEtBQUssVUFBVSxJQUFJO0lBQ2YsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUEsbUNBQW1CLEVBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckYsSUFBSSxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsc0NBQXNDLFFBQVEsa0JBQWtCLENBQUMsQ0FBQztRQUNuRyxPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFFBQVEsT0FBTyxJQUFBLHdCQUFZLEVBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhcnNlV2ViaG9va0ZpbGUgfSBmcm9tIFwiLi9kaXNjb3JkXCI7XG5pbXBvcnQgeyBlbnN1cmVSZW1vdGVXZWJob29rLCBSRVBMQUNFX0tFWVdPUkQgfSBmcm9tIFwiLi9yZW1vdGVXZWJob29rXCI7XG5pbXBvcnQgeyBkZXNjcmliZUhvc3QsIFRISVNfTUFDSElORSB9IGZyb20gXCIuLi9oZWxwZXJzL3JlbW90ZVNTSFwiO1xuXG5jb25zdCBVU0FHRSA9IGBVc2FnZTogeWFybiBzZXR1cG5vdGlmeSBbaG9zdF0gPGRpc2NvcmQtd2ViaG9vay11cmw+IFske1JFUExBQ0VfS0VZV09SRH1dXG5cbldpdGggbm8gaG9zdCBpdCBzZXRzIHRoZSB3ZWJob29rIHVwIG9uIHRoaXMgbWFjaGluZS5gO1xuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgcmVwbGFjZSA9IGFyZ3YuaW5jbHVkZXMoUkVQTEFDRV9LRVlXT1JEKTtcbiAgICBsZXQgcG9zaXRpb25hbCA9IGFyZ3YuZmlsdGVyKGFyZyA9PiBhcmcgIT09IFJFUExBQ0VfS0VZV09SRCk7XG4gICAgaWYgKCFwb3NpdGlvbmFsLmxlbmd0aCB8fCBwb3NpdGlvbmFsLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIGEgd2ViaG9vayBVUkwsIGFuZCBvcHRpb25hbGx5IGEgaG9zdCBiZWZvcmUgaXQsIHdhcyAke3Bvc2l0aW9uYWwubGVuZ3RofWBcbiAgICAgICAgICAgICsgYCBhcmd1bWVudChzKTogJHtwb3NpdGlvbmFsLmpvaW4oXCIgXCIpIHx8IFwiKG5vbmUpXCJ9XFxuJHtVU0FHRX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSB3ZWJob29rIHVybCBpcyB0aGUgbGFzdCBvbmUsIHNvIHdoYXRldmVyIGNvbWVzIGJlZm9yZSBpdCBpcyB0aGUgaG9zdC4gV2l0aG91dCBvbmUgdGhpc1xuICAgIC8vIG1hY2hpbmUgaXMgdGhlIHRhcmdldC5cbiAgICBsZXQgd2ViaG9va1VSTCA9IHBvc2l0aW9uYWxbcG9zaXRpb25hbC5sZW5ndGggLSAxXTtcbiAgICBsZXQgaG9zdCA9IHBvc2l0aW9uYWwubGVuZ3RoID4gMSAmJiBwb3NpdGlvbmFsWzBdIHx8IFRISVNfTUFDSElORTtcbiAgICAvLyBWYWxpZGF0ZXMgdGhlIFVSTCBzaGFwZSB1cCBmcm9udCwgc28gd2UgbmV2ZXIgZ28gYW55d2hlcmUgd2l0aCBhIGJhZCB3ZWJob29rLlxuICAgIHBhcnNlV2ViaG9va0ZpbGUoeyBjb250ZW50czogd2ViaG9va1VSTCwgc291cmNlTmFtZTogXCJ0aGUgY29tbWFuZCBsaW5lXCIgfSk7XG4gICAgcmV0dXJuIHsgaG9zdCwgd2ViaG9va1VSTCwgcmVwbGFjZSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCB7IGhvc3QsIHdlYmhvb2tVUkwsIHJlcGxhY2UgfSA9IHBhcnNlQXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuICAgIGxldCB7IG91dGNvbWUsIGZpbGVQYXRoIH0gPSBhd2FpdCBlbnN1cmVSZW1vdGVXZWJob29rKHsgaG9zdCwgd2ViaG9va1VSTCwgcmVwbGFjZSB9KTtcbiAgICBpZiAob3V0Y29tZSA9PT0gXCJ1bmNoYW5nZWRcIikge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtkZXNjcmliZUhvc3QoaG9zdCl9IGFscmVhZHkgaGFzIHRoaXMgZXhhY3Qgd2ViaG9vayBpbiAke2ZpbGVQYXRofSwgbm90aGluZyB0byBkby5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3V0Y29tZSA9PT0gXCJyZXBsYWNlZFwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZXBsYWNlZCB0aGUgd2ViaG9vayBvbiAke2Rlc2NyaWJlSG9zdChob3N0KX0gYW5kIG5vdGlmaWVkIHRoZSBvbGQgb25lLmApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgV3JvdGUgJHtmaWxlUGF0aH0gb24gJHtkZXNjcmliZUhvc3QoaG9zdCl9IChtb2RlIDYwMCksIGFuZCBjb25maXJtZWQgb24gdGhlIG5ldyB3ZWJob29rLmApO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlfWApO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSkuZmluYWxseSgoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG4iXX0//=
|
|
41
|
+
/* _JS_SOURCE_HASH = "d4a31662fa6c9caeddb12ab92635074aa9376318ae3f044fd2bbcc850ecbf83e"; */
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
const runPromise_1 = require("socket-function/src/runPromise");
|
|
4
|
+
const spawn_1 = require("../helpers/spawn");
|
|
5
|
+
const keysRepo_1 = require("../authorizedKeys/keysRepo");
|
|
6
|
+
const manifest_1 = require("./manifest");
|
|
7
|
+
const signFiles_1 = require("./signFiles");
|
|
8
|
+
const GIT_KEYWORD = "git";
|
|
9
|
+
const COMMIT_MESSAGE = "deploying signed files";
|
|
10
|
+
const USAGE = `Usage: yarn signfiles [signing-key] [${GIT_KEYWORD}]
|
|
11
|
+
|
|
12
|
+
Signs the files of the repo in the current directory. With no key, a hardware backed
|
|
13
|
+
${signFiles_1.DEFAULT_KEY_TYPE} key at ${signFiles_1.DEFAULT_KEY_PATH} is used, and created if it does not exist.
|
|
14
|
+
Pass ${GIT_KEYWORD} to also commit and push the result.`;
|
|
15
|
+
function parseArgs(argv) {
|
|
16
|
+
let pushToGit = argv.includes(GIT_KEYWORD);
|
|
17
|
+
let positional = argv.filter(arg => arg !== GIT_KEYWORD);
|
|
18
|
+
if (positional.length > 1) {
|
|
19
|
+
throw new Error(`Expected at most a signing key, was ${positional.length} argument(s): ${positional.join(" ")}\n${USAGE}`);
|
|
20
|
+
}
|
|
21
|
+
return { keyPath: positional[0], pushToGit };
|
|
22
|
+
}
|
|
23
|
+
async function main() {
|
|
24
|
+
let { keyPath, pushToGit } = parseArgs(process.argv.slice(2));
|
|
25
|
+
// The keys repo, which is this one when it holds keys and this machine's otherwise. Signing
|
|
26
|
+
// whatever repo the terminal happened to be in is how you end up signing something that is not
|
|
27
|
+
// a keys repo at all.
|
|
28
|
+
let { repoPath } = await (0, keysRepo_1.resolveKeysRepo)();
|
|
29
|
+
console.log(`Signing ${repoPath}`);
|
|
30
|
+
await (0, signFiles_1.signRepo)({ repoPath, keyPath });
|
|
31
|
+
if (!pushToGit) {
|
|
32
|
+
console.log(`Commit and push ${manifest_1.MANIFEST_NAME} and ${manifest_1.SIGNATURE_NAME} for anything to see them.`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await (0, runPromise_1.runPromise)(`git add -A`, { cwd: repoPath });
|
|
36
|
+
// Nothing staged is not worth stopping on. git commit calls that a failure, but it only means
|
|
37
|
+
// the signature matches the one already committed, so there is nothing to deploy.
|
|
38
|
+
let status = await (0, spawn_1.spawnPromise)({ command: "git", args: ["status", "--porcelain"], cwd: repoPath });
|
|
39
|
+
if (!status.stdout.trim()) {
|
|
40
|
+
console.log(`Nothing changed, ${manifest_1.MANIFEST_NAME} and ${manifest_1.SIGNATURE_NAME} are already committed.`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
await (0, runPromise_1.runPromise)(`git commit -m "${COMMIT_MESSAGE}"`, { cwd: repoPath });
|
|
44
|
+
await (0, runPromise_1.runPromise)(`git push`, { cwd: repoPath });
|
|
45
|
+
console.log(`Committed and pushed.`);
|
|
46
|
+
}
|
|
47
|
+
main().catch(e => {
|
|
48
|
+
console.error(`${e}`);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
}).finally(() => process.exit());
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbkZpbGVzQ2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2lnbkZpbGVzQ2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0RBQTREO0FBQzVELDRDQUFnRDtBQUNoRCx5REFBNkQ7QUFDN0QseUNBQTJEO0FBQzNELDJDQUEyRTtBQUUzRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDMUIsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUM7QUFDaEQsTUFBTSxLQUFLLEdBQUcsd0NBQXdDLFdBQVc7OztFQUcvRCw0QkFBZ0IsV0FBVyw0QkFBZ0I7T0FDdEMsV0FBVyxzQ0FBc0MsQ0FBQztBQUV6RCxTQUFTLFNBQVMsQ0FBQyxJQUFjO0lBQzdCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsQ0FBQztJQUN6RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLE1BQU0saUJBQWlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELEtBQUssVUFBVSxJQUFJO0lBQ2YsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RCw0RkFBNEY7SUFDNUYsK0ZBQStGO0lBQy9GLHNCQUFzQjtJQUN0QixJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFBLDBCQUFlLEdBQUUsQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNuQyxNQUFNLElBQUEsb0JBQVEsRUFBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLHdCQUFhLFFBQVEseUJBQWMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRyxPQUFPO0lBQ1gsQ0FBQztJQUNELE1BQU0sSUFBQSx1QkFBVSxFQUFDLFlBQVksRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELDhGQUE4RjtJQUM5RixrRkFBa0Y7SUFDbEYsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9CQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLHdCQUFhLFFBQVEseUJBQWMseUJBQXlCLENBQUMsQ0FBQztRQUM5RixPQUFPO0lBQ1gsQ0FBQztJQUNELE1BQU0sSUFBQSx1QkFBVSxFQUFDLGtCQUFrQixjQUFjLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sSUFBQSx1QkFBVSxFQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuUHJvbWlzZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL3J1blByb21pc2VcIjtcbmltcG9ydCB7IHNwYXduUHJvbWlzZSB9IGZyb20gXCIuLi9oZWxwZXJzL3NwYXduXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMva2V5c1JlcG9cIjtcbmltcG9ydCB7IE1BTklGRVNUX05BTUUsIFNJR05BVFVSRV9OQU1FIH0gZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IERFRkFVTFRfS0VZX1BBVEgsIERFRkFVTFRfS0VZX1RZUEUsIHNpZ25SZXBvIH0gZnJvbSBcIi4vc2lnbkZpbGVzXCI7XG5cbmNvbnN0IEdJVF9LRVlXT1JEID0gXCJnaXRcIjtcbmNvbnN0IENPTU1JVF9NRVNTQUdFID0gXCJkZXBsb3lpbmcgc2lnbmVkIGZpbGVzXCI7XG5jb25zdCBVU0FHRSA9IGBVc2FnZTogeWFybiBzaWduZmlsZXMgW3NpZ25pbmcta2V5XSBbJHtHSVRfS0VZV09SRH1dXG5cblNpZ25zIHRoZSBmaWxlcyBvZiB0aGUgcmVwbyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIFdpdGggbm8ga2V5LCBhIGhhcmR3YXJlIGJhY2tlZFxuJHtERUZBVUxUX0tFWV9UWVBFfSBrZXkgYXQgJHtERUZBVUxUX0tFWV9QQVRIfSBpcyB1c2VkLCBhbmQgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblBhc3MgJHtHSVRfS0VZV09SRH0gdG8gYWxzbyBjb21taXQgYW5kIHB1c2ggdGhlIHJlc3VsdC5gO1xuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pIHtcbiAgICBsZXQgcHVzaFRvR2l0ID0gYXJndi5pbmNsdWRlcyhHSVRfS0VZV09SRCk7XG4gICAgbGV0IHBvc2l0aW9uYWwgPSBhcmd2LmZpbHRlcihhcmcgPT4gYXJnICE9PSBHSVRfS0VZV09SRCk7XG4gICAgaWYgKHBvc2l0aW9uYWwubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgYSBzaWduaW5nIGtleSwgd2FzICR7cG9zaXRpb25hbC5sZW5ndGh9IGFyZ3VtZW50KHMpOiAke3Bvc2l0aW9uYWwuam9pbihcIiBcIil9XFxuJHtVU0FHRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsga2V5UGF0aDogcG9zaXRpb25hbFswXSwgcHVzaFRvR2l0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gICAgbGV0IHsga2V5UGF0aCwgcHVzaFRvR2l0IH0gPSBwYXJzZUFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcblxuICAgIC8vIFRoZSBrZXlzIHJlcG8sIHdoaWNoIGlzIHRoaXMgb25lIHdoZW4gaXQgaG9sZHMga2V5cyBhbmQgdGhpcyBtYWNoaW5lJ3Mgb3RoZXJ3aXNlLiBTaWduaW5nXG4gICAgLy8gd2hhdGV2ZXIgcmVwbyB0aGUgdGVybWluYWwgaGFwcGVuZWQgdG8gYmUgaW4gaXMgaG93IHlvdSBlbmQgdXAgc2lnbmluZyBzb21ldGhpbmcgdGhhdCBpcyBub3RcbiAgICAvLyBhIGtleXMgcmVwbyBhdCBhbGwuXG4gICAgbGV0IHsgcmVwb1BhdGggfSA9IGF3YWl0IHJlc29sdmVLZXlzUmVwbygpO1xuICAgIGNvbnNvbGUubG9nKGBTaWduaW5nICR7cmVwb1BhdGh9YCk7XG4gICAgYXdhaXQgc2lnblJlcG8oeyByZXBvUGF0aCwga2V5UGF0aCB9KTtcblxuICAgIGlmICghcHVzaFRvR2l0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb21taXQgYW5kIHB1c2ggJHtNQU5JRkVTVF9OQU1FfSBhbmQgJHtTSUdOQVRVUkVfTkFNRX0gZm9yIGFueXRoaW5nIHRvIHNlZSB0aGVtLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJ1blByb21pc2UoYGdpdCBhZGQgLUFgLCB7IGN3ZDogcmVwb1BhdGggfSk7XG4gICAgLy8gTm90aGluZyBzdGFnZWQgaXMgbm90IHdvcnRoIHN0b3BwaW5nIG9uLiBnaXQgY29tbWl0IGNhbGxzIHRoYXQgYSBmYWlsdXJlLCBidXQgaXQgb25seSBtZWFuc1xuICAgIC8vIHRoZSBzaWduYXR1cmUgbWF0Y2hlcyB0aGUgb25lIGFscmVhZHkgY29tbWl0dGVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRlcGxveS5cbiAgICBsZXQgc3RhdHVzID0gYXdhaXQgc3Bhd25Qcm9taXNlKHsgY29tbWFuZDogXCJnaXRcIiwgYXJnczogW1wic3RhdHVzXCIsIFwiLS1wb3JjZWxhaW5cIl0sIGN3ZDogcmVwb1BhdGggfSk7XG4gICAgaWYgKCFzdGF0dXMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgTm90aGluZyBjaGFuZ2VkLCAke01BTklGRVNUX05BTUV9IGFuZCAke1NJR05BVFVSRV9OQU1FfSBhcmUgYWxyZWFkeSBjb21taXR0ZWQuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgcnVuUHJvbWlzZShgZ2l0IGNvbW1pdCAtbSBcIiR7Q09NTUlUX01FU1NBR0V9XCJgLCB7IGN3ZDogcmVwb1BhdGggfSk7XG4gICAgYXdhaXQgcnVuUHJvbWlzZShgZ2l0IHB1c2hgLCB7IGN3ZDogcmVwb1BhdGggfSk7XG4gICAgY29uc29sZS5sb2coYENvbW1pdHRlZCBhbmQgcHVzaGVkLmApO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlfWApO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSkuZmluYWxseSgoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG4iXX0//=
|
|
52
|
+
/* _JS_SOURCE_HASH = "959ac328f0b5493ccf13d6da230b02090ad8636f6981067e2a6bb3aac70cca3e"; */
|
package/storage/IArchives.d.ts
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
export declare const MAX_LAST_MODIFIED_FUTURE: number;
|
|
4
4
|
export declare const IMMUTABLE_CACHE_TIME: number;
|
|
5
5
|
export declare function assertValidLastModified(lastModified: number): void;
|
|
6
|
+
/** Every file-addressed operation checks this at its entry point, so an empty name fails right
|
|
7
|
+
where it was passed - with the caller in the stack - instead of surfacing as a baffling backend
|
|
8
|
+
rejection after the retry loops are done with it. */
|
|
9
|
+
export declare function validateFileName(fileName: string, operation: string): void;
|
|
6
10
|
export type RemoteConfig = {
|
|
7
11
|
version?: number;
|
|
8
12
|
sources: RemoteConfigBase[];
|
package/storage/IArchives.ts
CHANGED
|
@@ -12,6 +12,15 @@ export function assertValidLastModified(lastModified: number): void {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
/** Every file-addressed operation checks this at its entry point, so an empty name fails right
|
|
16
|
+
where it was passed - with the caller in the stack - instead of surfacing as a baffling backend
|
|
17
|
+
rejection after the retry loops are done with it. */
|
|
18
|
+
export function validateFileName(fileName: string, operation: string): void {
|
|
19
|
+
if (!fileName) {
|
|
20
|
+
throw new Error(`${operation} was called with an empty file name`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
15
24
|
|
|
16
25
|
export type RemoteConfig = {
|
|
17
26
|
// NOTE: Version is used when updating the configuration. The newer version is always taken. A missing version counts as version -1.
|
package/storage/backblaze.ts
CHANGED
|
@@ -9,7 +9,7 @@ import debugbreak from "debugbreak";
|
|
|
9
9
|
import dns from "dns";
|
|
10
10
|
import { getSecret } from "../misc/getSecret";
|
|
11
11
|
import { httpsRequest, HttpsResponseInfo } from "socket-function/src/https";
|
|
12
|
-
import { IArchives, ArchivesConfig, ChangesAfterConfig, ArchiveFileInfo, DelConfig, FindConfig, GetConfig, GetInfoConfig, MoveFileConfig, SetConfig, SetLargeFileConfig, SourceConfig, assertValidLastModified, bufferChunkStream, IMMUTABLE_CACHE_TIME } from "./IArchives";
|
|
12
|
+
import { IArchives, ArchivesConfig, ChangesAfterConfig, ArchiveFileInfo, DelConfig, FindConfig, GetConfig, GetInfoConfig, MoveFileConfig, SetConfig, SetLargeFileConfig, SourceConfig, assertValidLastModified, validateFileName, bufferChunkStream, IMMUTABLE_CACHE_TIME } from "./IArchives";
|
|
13
13
|
import { filterChanges } from "./remoteStorage/remoteConfig";
|
|
14
14
|
|
|
15
15
|
type BackblazeCreds = {
|
|
@@ -652,6 +652,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
652
652
|
return result && result.data || undefined;
|
|
653
653
|
}
|
|
654
654
|
public async get2(fileName: string, config?: GetConfig): Promise<{ data: Buffer; writeTime: number; size: number } | undefined> {
|
|
655
|
+
validateFileName(fileName, "get2");
|
|
655
656
|
let downloading = true;
|
|
656
657
|
try {
|
|
657
658
|
let time = Date.now();
|
|
@@ -746,6 +747,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
746
747
|
return false;
|
|
747
748
|
}
|
|
748
749
|
public async set(fileName: string, data: Buffer, config?: SetConfig): Promise<string> {
|
|
750
|
+
validateFileName(fileName, "set");
|
|
749
751
|
if (!data.length) {
|
|
750
752
|
throw new Error(`set was called with an empty buffer for ${JSON.stringify(fileName)} on ${this.getDebugName()}: an empty file IS a deletion in this system and would read back as missing - call del instead`);
|
|
751
753
|
}
|
|
@@ -779,6 +781,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
779
781
|
return fileName;
|
|
780
782
|
}
|
|
781
783
|
public async del(fileName: string, config?: DelConfig): Promise<void> {
|
|
784
|
+
validateFileName(fileName, "del");
|
|
782
785
|
if (config?.lastModified) {
|
|
783
786
|
// A synchronized deletion: b2's hide removes the file from listings entirely, so peers scanning the bucket could never learn of it. Instead the tombstone is stored as a REAL empty file (an empty file IS a missing file), which listings show and scans ingest as a deletion. (b2 stamps its own upload time, so the exact deletion time is not preserved here - same as every b2 write.)
|
|
784
787
|
// The comparison ignores noChecks for the same reason as in set: on b2 it IS the ordering guard
|
|
@@ -804,6 +807,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
804
807
|
|
|
805
808
|
// lastModified is accepted but cannot be honored - b2 stamps its own uploadTimestamp, which is what our getInfo/findInfo report as the write time. fallbacks means nothing here: a single bucket has nowhere to fall back to.
|
|
806
809
|
public async setLargeFile(config: SetLargeFileConfig): Promise<void> {
|
|
810
|
+
validateFileName(config.path, "setLargeFile");
|
|
807
811
|
// Checked before a single byte moves: an upload that is already superseded must not be started at all (a cancelled large upload still costs the transfer)
|
|
808
812
|
if (await this.writeIsSuperseded(config.path, config)) return;
|
|
809
813
|
|
|
@@ -938,6 +942,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
938
942
|
}
|
|
939
943
|
|
|
940
944
|
public async getInfo(fileName: string, config?: GetInfoConfig): Promise<{ writeTime: number; size: number; } | undefined> {
|
|
945
|
+
validateFileName(fileName, "getInfo");
|
|
941
946
|
return await this.apiRetryLogic(`getInfo ${fileName}`, async (api) => {
|
|
942
947
|
try {
|
|
943
948
|
let file = await api.headFileByName({ bucketName: this.bucketName, fileName });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
// The important operations of an archive bucket (extracted from ArchivesBackblaze), so other backends (e.g. our own remote storage server) can be used interchangeably.
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
4
|
-
//exports.copyArchiveFile = exports.bufferChunkStream = exports.LARGE_SET_THRESHOLD = exports.windowsAcceptWrites = exports.windowAcceptsWrites = exports.VARIABLE_SHARD = exports.FULL_ROUTE = exports.STORAGE_NOT_CONFIGURED = exports.STORAGE_WRONG_ROUTE = exports.STORAGE_WRONG_VALID_WINDOW = exports.FULL_VALID_WINDOW = exports.assertValidLastModified = exports.IMMUTABLE_CACHE_TIME = exports.MAX_LAST_MODIFIED_FUTURE = void 0;
|
|
4
|
+
//exports.copyArchiveFile = exports.bufferChunkStream = exports.LARGE_SET_THRESHOLD = exports.windowsAcceptWrites = exports.windowAcceptsWrites = exports.VARIABLE_SHARD = exports.FULL_ROUTE = exports.STORAGE_NOT_CONFIGURED = exports.STORAGE_WRONG_ROUTE = exports.STORAGE_WRONG_VALID_WINDOW = exports.FULL_VALID_WINDOW = exports.validateFileName = exports.assertValidLastModified = exports.IMMUTABLE_CACHE_TIME = exports.MAX_LAST_MODIFIED_FUTURE = void 0;
|
|
5
5
|
// A write may not be stamped more than this far in the future, or clock skew between machines would let a bad timestamp block writes for a long time.
|
|
6
6
|
exports.MAX_LAST_MODIFIED_FUTURE = 15 * 60 * 1000;
|
|
7
7
|
// How long browsers may cache files from immutable buckets (the Cache-Control max-age), shared by every hosting path (backblaze bucket settings and our own storage server's HTTP route)
|
|
@@ -13,6 +13,15 @@ function assertValidLastModified(lastModified) {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
exports.assertValidLastModified = assertValidLastModified;
|
|
16
|
+
/** Every file-addressed operation checks this at its entry point, so an empty name fails right
|
|
17
|
+
where it was passed - with the caller in the stack - instead of surfacing as a baffling backend
|
|
18
|
+
rejection after the retry loops are done with it. */
|
|
19
|
+
function validateFileName(fileName, operation) {
|
|
20
|
+
if (!fileName) {
|
|
21
|
+
throw new Error(`${operation} was called with an empty file name`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.validateFileName = validateFileName;
|
|
16
25
|
exports.FULL_VALID_WINDOW = [0, Number.MAX_SAFE_INTEGER];
|
|
17
26
|
// Error marker a server includes when a freshly-stamped write reaches it outside its valid windows (the client resolved its target, then time crossed a window boundary before the write landed). Clients detect this marker and re-resolve the currently-valid source, retrying ONCE - boundaries are far apart, so hitting it twice in one attempt means something is actually wrong.
|
|
18
27
|
exports.STORAGE_WRONG_VALID_WINDOW = "REMOTE_STORAGE_WRONG_VALID_WINDOW_a7c1f04e";
|
|
@@ -58,5 +67,5 @@ exports.bufferChunkStream = bufferChunkStream;
|
|
|
58
67
|
// Re-exported for the existing importers - the implementations (and moveArchiveFile) live in archiveHelpers.ts, beside this interface rather than in it
|
|
59
68
|
var archiveHelpers_1 = require("./archiveHelpers");
|
|
60
69
|
Object.defineProperty(exports, "copyArchiveFile", { enumerable: true, get: function () { return archiveHelpers_1.copyArchiveFile; } , configurable: true});
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUFyY2hpdmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSUFyY2hpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3S0FBd0s7OztBQUV4SyxzSkFBc0o7QUFDekksUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2RCx5TEFBeUw7QUFDNUssUUFBQSxvQkFBb0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pELFNBQWdCLHVCQUF1QixDQUFDLFlBQW9CO0lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQ0FBd0IsQ0FBQztJQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxZQUFZLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7QUFDTCxDQUFDO0FBTEQsMERBS0M7QUF1RlksUUFBQSxpQkFBaUIsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUE0SWhGLHdYQUF3WDtBQUMzVyxRQUFBLDBCQUEwQixHQUFHLDRDQUE0QyxDQUFDO0FBRXZGLDhMQUE4TDtBQUNqTCxRQUFBLG1CQUFtQixHQUFHLHFDQUFxQyxDQUFDO0FBRXpFLHVXQUF1VztBQUMxVixRQUFBLHNCQUFzQixHQUFHLHdDQUF3QyxDQUFDO0FBRWxFLFFBQUEsVUFBVSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVuRCwyUkFBMlI7QUFDOVEsUUFBQSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFDNUUsb0xBQW9MO0FBQ3BMLDhKQUE4SjtBQUM5SixTQUFnQixtQkFBbUIsQ0FBQyxXQUF5QztJQUN6RSxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBSEQsa0RBR0M7QUFDRCxpTkFBaU47QUFDak4sU0FBZ0IsbUJBQW1CLENBQUMsWUFBZ0M7SUFDaEUsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUZELGtEQUVDO0FBRUQsd0tBQXdLO0FBQzNKLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFbkQsbVJBQW1SO0FBQ25SLFNBQWdCLGlCQUFpQixDQUFDLElBQVk7SUFDMUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsT0FBTztRQUNILFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwQixJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM1QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsMkJBQW1CLENBQUMsQ0FBQztZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsYUFBYSxFQUFFLEdBQUcsRUFBRTtZQUNoQixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDO0FBYkQsOENBYUM7QUFFRCx3SkFBd0o7QUFDeEosbURBQW1EO0FBQTFDLGlIQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBpbXBvcnRhbnQgb3BlcmF0aW9ucyBvZiBhbiBhcmNoaXZlIGJ1Y2tldCAoZXh0cmFjdGVkIGZyb20gQXJjaGl2ZXNCYWNrYmxhemUpLCBzbyBvdGhlciBiYWNrZW5kcyAoZS5nLiBvdXIgb3duIHJlbW90ZSBzdG9yYWdlIHNlcnZlcikgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LlxuXG4vLyBBIHdyaXRlIG1heSBub3QgYmUgc3RhbXBlZCBtb3JlIHRoYW4gdGhpcyBmYXIgaW4gdGhlIGZ1dHVyZSwgb3IgY2xvY2sgc2tldyBiZXR3ZWVuIG1hY2hpbmVzIHdvdWxkIGxldCBhIGJhZCB0aW1lc3RhbXAgYmxvY2sgd3JpdGVzIGZvciBhIGxvbmcgdGltZS5cbmV4cG9ydCBjb25zdCBNQVhfTEFTVF9NT0RJRklFRF9GVVRVUkUgPSAxNSAqIDYwICogMTAwMDtcblxuLy8gSG93IGxvbmcgYnJvd3NlcnMgbWF5IGNhY2hlIGZpbGVzIGZyb20gaW1tdXRhYmxlIGJ1Y2tldHMgKHRoZSBDYWNoZS1Db250cm9sIG1heC1hZ2UpLCBzaGFyZWQgYnkgZXZlcnkgaG9zdGluZyBwYXRoIChiYWNrYmxhemUgYnVja2V0IHNldHRpbmdzIGFuZCBvdXIgb3duIHN0b3JhZ2Ugc2VydmVyJ3MgSFRUUCByb3V0ZSlcbmV4cG9ydCBjb25zdCBJTU1VVEFCTEVfQ0FDSEVfVElNRSA9IDg2NDAwICogMTAwMDtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBtYXggPSBEYXRlLm5vdygpICsgTUFYX0xBU1RfTU9ESUZJRURfRlVUVVJFO1xuICAgIGlmIChsYXN0TW9kaWZpZWQgPiBtYXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBsYXN0TW9kaWZpZWQgaXMgdG9vIGZhciBpbiB0aGUgZnV0dXJlOiAke2xhc3RNb2RpZmllZH0gPiAke21heH0gKG5vdyArIDE1IG1pbnV0ZXMpYCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBOT1RFOiBWZXJzaW9uIGlzIHVzZWQgd2hlbiB1cGRhdGluZyB0aGUgY29uZmlndXJhdGlvbi4gVGhlIG5ld2VyIHZlcnNpb24gaXMgYWx3YXlzIHRha2VuLiBBIG1pc3NpbmcgdmVyc2lvbiBjb3VudHMgYXMgdmVyc2lvbiAtMS5cbiAgICB2ZXJzaW9uPzogbnVtYmVyO1xuICAgIHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXTtcbn07XG5cbi8qKlxuICAgIHN0cmluZyBhcmd1bWVudHMgd2lsbCBiZSBhIHVybCwgbG9va2luZyBsaWtlOlxuICAgICAgICBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvcXVlcnlzdWJ0ZXN0LWNvbS1wdWJsaWMtaW1tdXRhYmxlL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICAtIFRoZXNlIG1hcCB0byB7IHVybCB9LCB3aXRoIHRoZSB0eXBlIGluZmVycmVkIGZyb20gdGhlIHVybFxuICAgICAgICAtIEhvc3RlZCB1cmxzIGFyZSAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiwgYmFja2JsYXplIHVybHMgYXJlIC9maWxlLzxidWNrZXROYW1lPi8uLi5cblxuICAgIE5PVEU6IElmIHdlIGRvIG5vdCBoYXZlIHJpZ2h0IGFjY2VzcyB0byB0aGVzZSwgdGhlbiBpdCBiZWNvbWVzIGEgcmVhZC1vbmx5IElBcmNoaXZlcywgd2hlcmUgd2Ugc29sZWx5IHJlYWQgdXNpbmcgdGhlIHVybCBmb3JtICh3aGljaCBtaWdodCB0aHJvdyBkdWUgdG8gbm90IGhhdmluZyBhY2Nlc3MgYXMgd2VsbCkuIFVOTEVTUyBPdXIgY29uZmlndXJhdGlvbiBleHBsaWNpdGx5IGhhcyBwdWJsaWM6IGZhbHNlLCBpbiB3aGljaCBjYXNlLCB3ZSBkb24ndCBldmVuIGhpdCB0aGUgVVJMIGFuZCB3ZSB0aHJvdyBvbiBhY2Nlc3MuXG5cbiAgICBOT1RFOiBJZiB3ZSdyZSBpbiB0aGUgYnJvd3Nlciwgd2Ugc2hvdWxkIGFsbG93IGRvd25sb2FkaW5nIHRoZSBmaWxlcyB2aWEgdGhlIFVSTCBmb3JtIChpZiBpdCdzIGEgcHVibGljIGJ1Y2tldCksIGhvd2V2ZXIsIHdlIHdvbid0IGFsbG93IHdyaXRpbmcsIGJlY2F1c2UgdGhlaXIgc2VydmVycyBkbyBub3QgYWxsb3cgc2VjdXJlIGJyb3dzZXIgd3JpdGVzLlxuKi9cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZ0Jhc2UgPSBzdHJpbmcgfCBTb3VyY2VDb25maWc7XG5cbi8qKiBPbmUgY29uZmlndXJlZCBzb3VyY2UgaW4gYSByb3V0aW5nIGNvbmZpZzogYSBob3N0ZWQgKG91ciBzdG9yYWdlIHNlcnZlcikgb3IgYmFja2JsYXplIGVudHJ5LiBSZXF1ZXN0cyBjYXJyeSB0aGUgZXhhY3QgU291cmNlQ29uZmlnIHRoZXkgc2VsZWN0ZWQsIGFuZCB0aGUgc2VydmVyIG1hdGNoZXMgaXQgYWdhaW5zdCBpdHMgb3duIGVudHJpZXMgdG8gcGljayB0aGUgYmFja2luZyBzdG9yZS4gKi9cbmV4cG9ydCB0eXBlIFNvdXJjZUNvbmZpZyA9IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZztcblxuZXhwb3J0IHR5cGUgQ29tbW9uQ29uZmlnID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdG9yYWdlIHRoaXMgZW50cnkgbmFtZXMsIGFzIG9wcG9zZWQgdG8gdGhlIHJ1bGVzIGZvciB1c2luZyBpdC4gRXZlcnkgZW50cnkgd2l0aCB0aGUgc2FtZVxuICAgICAqIG5hbWUgKGZvciB0aGUgc2FtZSBhY2NvdW50IGFuZCBidWNrZXQpIElTIHRoZSBzYW1lIHN0b3JhZ2U6IG9uZSBmb2xkZXIgb24gdGhlIHNlcnZlciwgb25lXG4gICAgICogc3RvcmUsIG9uZSBpbmRleCAtIGhvd2V2ZXIgbWFueSBlbnRyaWVzIHRoZXJlIGFyZSBhbmQgd2hhdGV2ZXIgdGhlaXIgd2luZG93cyBhbmQgcm91dGVzIHNheS5cbiAgICAgKiBFdmVyeXRoaW5nIGFib3V0IFdIRU4gYW5kIFdISUNIIEtFWVMgKHZhbGlkV2luZG93LCByb3V0ZSkgaXMgcG9saWN5IGxheWVyZWQgb24gdG9wIG9mIGl0LCBhbmRcbiAgICAgKiBjaGFuZ2luZyB0aGF0IHBvbGljeSBuZXZlciBtb3ZlcyBkYXRhLlxuICAgICAqXG4gICAgICogTGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZSwgZGFzaCBhbmQgcGVyaW9kcywgdXAgdG8gNjQgY2hhcmFjdGVycyAtIHNvIGEgaG9zdCBvciBhIHZlcnNpb25cbiAgICAgKiBjYW4gYmUgdXNlZCBhcy1pcy4gSXQgaXMgdGhlIGZvbGRlciBuYW1lLCBzbyBpdCBtdXN0IHN0YXkgdW5pcXVlIGFuZCBtdXN0IG5ldmVyIGJlIHJldXNlZCBmb3JcbiAgICAgKiBkaWZmZXJlbnQgc3RvcmFnZTpcbiAgICAgKiBwb2ludGluZyB0d28gdW5yZWxhdGVkIGVudHJpZXMgYXQgb25lIG5hbWUgbWVyZ2VzIHRoZWlyIGRhdGEsIGFuZCByZS11c2luZyBhIHJldGlyZWQgbmFtZVxuICAgICAqIGhhbmRzIHRoZSBuZXcgZW50cnkgdGhlIHJldGlyZWQgb25lJ3MgZmlsZXMuIERlY2lkaW5nIHRoYXQgaXMgdGhlIGRldmVsb3BlcidzIGpvYiAtIHRoZSBzZXJ2ZXJcbiAgICAgKiBvbmx5IGV2ZXIgZG9lcyB3aGF0IHRoZSBuYW1lIHNheXMuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBCeSBkZWZhdWx0IGEgc2VydmVyIGhvc3RpbmcgdGhpcyBidWNrZXQgZWFnZXJseSBjb3BpZXMgdGhpcyBzb3VyY2UncyBmdWxsIGNvbnRlbnRzIG9udG8gaXRzIG93biBkaXNrIChvbiB0b3Agb2YgdGhlIGxhenkgcmVhZC10aHJvdWdoIGNhY2hpbmcpLiBTZXQgdGhpcyB0byBiZSBhIGZyb250IGVuZCBmb3IgYSB2ZXJ5IGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyB0aGUgZnVsbCBkYXRhYmFzZSAtIHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgaW5kaXZpZHVhbCBmaWxlcyBvbiBkZW1hbmQuICovXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQtY2FjaGUgdGhpcyBzZXJ2ZXIncyBkaXNrIG1heSBob2xkOyBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gZGlzayB0byBzdGF5IHVuZGVyIGl0IChvbmx5IGV2ZXIgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIHRoZSBmaWxlIC0gdGhlIG9ubHkgY29weSBpcyBuZXZlciBkZWxldGVkKS4gUmVxdWlyZXMgbm9GdWxsU3luYyAoYSBmdWxsIGNvcHkgY2FuJ3QgYmUgYm91bmRlZCkuICovXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgd3JpdGUgdGltZXMgKFtzdGFydE1zLCBlbmRNc10pIHRoaXMgc291cmNlIGlzIHZhbGlkIGZvciAoc2VlIEFyY2hpdmVzU291cmNlLnZhbGlkV2luZG93IGZvciB0aGUgc3luY2hyb25pemF0aW9uIHNlbWFudGljcykuIFJlcXVpcmVkIG9uIG9iamVjdCBjb25maWdzOiBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBTQ0hFRFVMRUQgKGEgbmV3IHNvdXJjZSBiZWNvbWVzIHZhbGlkIGF0IGEgZnV0dXJlIHRpbWUgd2hpbGUgdGhlIG9sZCBvbmUncyB3aW5kb3cgZW5kcyksIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gUGxhaW4gVVJMLXN0cmluZyBzb3VyY2VzIGRlZmF1bHQgdG8gRlVMTF9WQUxJRF9XSU5ET1cgLSBvbmNlIHlvdSdyZSB3cml0aW5nIG9iamVjdCBjb25maWdzLCB5b3UncmUgZG9pbmcgc29tZXRoaW5nIGNvbXBsaWNhdGVkIGVub3VnaCB0byB0aGluayBhYm91dCB3aGVuIHRoaW5ncyBjaGFuZ2UuICovXG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLyoqIFNoYXJkaW5nOiB0aGUgZnJhY3Rpb24gb2YgdGhlIGtleSBzcGFjZSB0aGlzIHNvdXJjZSBoYW5kbGVzLCBhcyBbc3RhcnQsIGVuZCkgb3ZlciBbMCwgMSkgKGtleXMgYXJlIHJvdXRlZCBieSBnZXRSb3V0ZSBpbiByZW1vdGVDb25maWcudHMpLiBEZWZhdWx0cyB0byBGVUxMX1JPVVRFICh1bnNoYXJkZWQpLiBBdCBldmVyeSBwb2ludCBpbiB0aW1lIHRoZSBzb3VyY2VzJyByb3V0ZXMgbXVzdCBmdWxseSBjb3ZlciBbMCwgMSksIG9yIHNvbWUga2V5cyBjb3VsZCBuZXZlciBiZSByZWFkLiAqL1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICAvKiogU2V0IG9uIGVudHJpZXMgaW5qZWN0ZWQgaW50byB0aGUgaW4tbWVtb3J5IGNvbmZpZyBieSBhbiBvdmVybGF5IChhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgd2luZG93KS4gTmV2ZXIgd3JpdHRlbiB0byBkaXNrOiByZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyBzdHJpcHMgdGhlc2UgYW5kIHJlam9pbnMgdGhlIHdpbmRvd3MgYXJvdW5kIHRoZW0sIHdoaWNoIGlzIGFsc28gaG93IGEgY2xpZW50IHRlbGxzIHdoZXRoZXIgYW4gdXBkYXRlIGlzIGEgcmVhbCBjb25maWd1cmF0aW9uIGNoYW5nZSBvciBqdXN0IGFuIG92ZXJsYXkuIFRoZSBWQUxVRSBpcyB0aGUgdXJsIG9mIHRoZSBzb3VyY2UgdGhpcyBpbnRlcm1lZGlhdGUgd2FzIHNwbGl0IG91dCBvZiAoaXRzIGFsdGVybmF0ZS1wb3J0IHZpZXcpIC0gc28gYSByZXF1ZXN0IG5hbWluZyB0aGUgaW50ZXJtZWRpYXRlIHN0aWxsIHJlc29sdmVzIHRvIHRoZSBPUklHSU5BTCBzb3VyY2UsIGV2ZW4gYWZ0ZXIgdGhlIGludGVybWVkaWF0ZSByZWpvaW5zIGFuZCB0aGUgZW50cnkgaXMgZ29uZS4gKi9cbiAgICBpbnRlcm1lZGlhdGU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBIb3N0ZWRDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJyZW1vdGVcIjtcblxuICAgIC8vIEV4OiBodHRwczovLzk5LTI1MC0xMjQtOTEucXVlcnlzdWJ0ZXN0LmNvbTo1MjMzL2ZpbGUvcm9vdC91bmlxdWVidWNrZXRuYW1lL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIC8vIE5PVEU6IFRoZSBhY2NvdW50IGFuZCBidWNrZXQgbmFtZSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuXG4gICAgLy8gTk9URTogQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCBieSBjZXJ0LnRzLCB2aWEgaGF2aW5nIHlvdXIgbWFjaGluZSB0cnVzdGVkIHRvIGFjY2VzcyB0aGlzIGFjY291bnQuIFxuXG4gICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAvLyBGYXN0IG1vZGU6IHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHdyaXRlcyBvbmNlIHRoZXkgYXJlIGluIG1lbW9yeSwgZmx1c2hpbmcgdG8gZGlzayBhZnRlciB3cml0ZURlbGF5IChkZWZhdWx0IDUgbWludXRlcykgYW5kIGNvYWxlc2Npbmcgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUuIEEgc2VydmVyIGNyYXNoIGxvc2VzIHdyaXRlcyB0aGF0IGhhdmVuJ3QgZmx1c2hlZCB5ZXQuXG4gICAgZmFzdD86IGJvb2xlYW47XG4gICAgd3JpdGVEZWxheT86IG51bWJlcjtcbiAgICAvLyBXcml0ZXMgdG8gcGF0aHMgdGhhdCBhbHJlYWR5IGV4aXN0IGFyZSBkaXNhbGxvd2VkIChkZWxldGVzIHN0aWxsIHdvcmspLlxuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrYmxhemVDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJiYWNrYmxhemVcIjtcbiAgICAvLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbiAgICAvLyBOT1RFOiBUaGUgYnVja2V0IG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIFB1YmxpYyBidWNrZXRzIGFyZSBzZXJ2ZWQgb3ZlciBwbGFpbiBIVFRQUyBHRVRzIChnZXRVUkwpLiBQcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seS5cbiAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgIC8vIE5PVEU6IFRoaXMgaXNuJ3QgZW5mb3JjZWQgb24gdGhlIGJhY2tibGF6ZSBsZXZlbCwgc28gdGhpcyBpcyBqdXN0IGEgY2xpZW50LXNpZGUgZ3VhcmFudGVlLiBUaGlzIGNhbiBjaGFuZ2UgaG93IHdlIGNhY2hlIGZpbGVzLlxuICAgIC8vICAtIEJhY2tibGF6ZSBkb2VzIHN1cHBvcnQgaW1tdXRhYmlsaXR5LiBIb3dldmVyLCBhcHBhcmVudGx5LCBvbmNlIHdlIGVuYWJsZSBpdCBvbiBhIGJ1Y2tldCwgd2UgY2FuJ3QgZGlzYWJsZSBpdCwgd2hpY2ggaXMgcmVhbGx5IGJhZCwgYXMgaXQgbWVhbnMgaWYgb3VyIGNvZGUgY291bGQgZXZlciBlbmFibGUgaXQgYW5kIHdlIGFjY2lkZW50YWxseSBlbmFibGUgaXQgb24gYW4gaW1wb3J0YW50IGJ1Y2tldCwgd2UgZXNzZW50aWFsbHkganVzdCBicmlja2VkIHRoYXQgYnVja2V0LiBTbyB3ZSBzaG91bGQgbmV2ZXIgd3JpdGUgYW55IGNvZGUgdGhhdCBldmVyIHRyaWVzIHRvIHVzZSBiYWNrYmxhemUgdG8gbWFrZSB0aGluZ3MgaW1tdXRhYmxlLiBcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIC8vIENPUlMgb3JpZ2lucyBhbGxvd2VkIHRvIGNvbnN1bWUgdGhlIGJ1Y2tldCdzIGZpbGVzIGluIGEgYnJvd3Nlci4gTm90IGEgc2VjdXJpdHkgYm91bmRhcnkgKGFjY2VzcyBpcyBnYXRlZCBieSB0aGUgQVBJIGtleSAvIHNpZ25lZCBVUkxzLCBuZWl0aGVyIG9mIHdoaWNoIHJpZGVzIGluIGNvb2tpZXMpIC0gaXQgb25seSBjb250cm9scyB3aGljaCBzaXRlcycgaW4tcGFnZSBKYXZhU2NyaXB0IGNhbiByZWFkIHJlc3BvbnNlcy4gRGVmYXVsdHMgdG8gYW55IEhUVFBTIG9yaWdpbi5cbiAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuXG4gICAgLy8gTk9URTogV2Ugd2lsbCBhY2Nlc3MgdGhlIGFwaSBrZXkgZnJvbSBnZXRTZWNyZXQsIHNlZSBiYWNrYmxhemUudHMgZm9yIHRoZSBzcGVjaWZpYyBrZXlzLlxufTtcblxuXG5leHBvcnQgY29uc3QgRlVMTF9WQUxJRF9XSU5ET1c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdO1xuXG5cblxuXG5leHBvcnQgdHlwZSBHZXRDb25maWcgPSB7XG4gICAgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gICAgLyoqIFJlYWQgT05MWSBmcm9tIHRoZSBwcmltYXJ5IHNvdXJjZSAtIHRoZSBvbmUgd3JpdGVzIHdvdWxkIHRhcmdldCAtIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMuIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgeW91ciByZWFkcyBhbmQgd3JpdGVzIHRvIGJlIHNvbWV3aGF0IGF0b21pYzogdGhlcmUgd2lsbCBzdGlsbCBiZSBpc3N1ZXMgd2l0aCB0aGUgcm91bmQgdHJpcCwgYnV0IHdpdGhvdXQgaXQgeW91IGNvdWxkIHRhbGsgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBub2RlIGFuZCBnZXQgYSBtdWNoIG9sZGVyIHZhbHVlLiBNb3N0IHJlYWRzIGFyZW4ndCBmb2xsb3dlZCBieSBhIHdyaXRlIHRob3VnaCwgc28gZm9yIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIgdG8gZ2V0IGEgdmFsdWUgdGhhbiB0byBoYXZlIHRvIHdhaXQgKG9yIGV2ZW4gdGhyb3cpIHdoZW4gdGhlIHByaW1hcnkgbm9kZSBpcyBub3QgYXZhaWxhYmxlLiAqL1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU3RvcmUtdG8tc3RvcmUgY2FsbDogdGhlIHNlcnZpbmcgbm9kZSBuZXZlciBjb25zdWx0cyBpdHMgT1RIRVIgc291cmNlcyAtIGNoYXNpbmcgaXRzIG93biByZW1vdGUgaG9sZGVycyB3aGlsZSBhbnN3ZXJpbmcgYW5vdGhlciBzdG9yZSBpcyBob3cgaW5maW5pdGUgZ2V0IGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0gKEEgYXNrcyBCLCBCJ3MgaW5kZXggcG9pbnRzIGJhY2sgYXQgQSwgLi4uKS4gVGhhdCBpcyB0aGUgZmxhZydzIEVOVElSRSBtZWFuaW5nOiBubyBmYWxsYmFja3MsIG5vdGhpbmcgZWxzZS4gVGhlIHJlYWQgaXMgb3RoZXJ3aXNlIGZ1bGx5IGNvcnJlY3QgLSB0aGUgbm9kZSdzIGluZGV4IHN0aWxsIGdhdGVzIGl0IChhIGtleSBpdHMgaW5kZXggc2F5cyBpcyBkZWxldGVkIGFuc3dlcnMgYXMgZGVsZXRlZCwgbmV2ZXIgYXMgdGhlIGhpc3RvcnkgYnl0ZXMgc3RpbGwgc2l0dGluZyBvbiBpdHMgZGlzaykuIE5vIHdpbmRvdyBvciByb3V0ZSBjaGVja3Mgb24gcmVhZHMuICovXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8qKiBBbHNvIHJldHVybiBzaXplLTAgcmVzdWx0cyAodG9tYnN0b25lcyAtIGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpIGluc3RlYWQgb2YgdHJlYXRpbmcgdGhlbSBhcyBhYnNlbnQuIE9mZiBieSBkZWZhdWx0LCBtYXRjaGluZyBnZXRJbmZvJ3MgZmxhZyBvZiB0aGUgc2FtZSBuYW1lLiBTeW5jaHJvbml6YXRpb24gcGFzc2VzIHRoaXMgc28gYSBERUxFVEVEIGZpbGUgKHdpdGggaXRzIHdyaXRlIHRpbWUpIGlzIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZmlsZSB0aGF0IG5ldmVyIGV4aXN0ZWQuICovXG4gICAgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuO1xuICAgIC8qKiBSZWFkcyBmaWxlcyB0aGF0IGFyZSBNQVJLRUQgZm9yIGRlbGV0aW9uIChkZWxldGVkLCBidXQgd2l0aCB0aGVpciBieXRlcyBzdGlsbCBpbiB0aGUgZGVsZXRpb24gaGlzdG9yeSAtIHNlZSBTZXRDb25maWcudW5kZWxldGUgZm9yIHJlc3RvcmluZyB0aGVtKS4gVGhlIGFjdHVhbCBjb250ZW50IGNvbWVzIGJhY2ssIHVubGlrZSBpbmNsdWRlVG9tYnN0b25lcywgd2hpY2ggb25seSByZXBvcnRzIHRoYXQgYSBkZWxldGlvbiBoYXBwZW5lZC4gKi9cbiAgICBpbmNsdWRlTWFya2VkPzogYm9vbGVhbjtcbiAgICAvKiogUmVhZCBmcm9tIEVYQUNUTFkgdGhpcyBzb3VyY2UgLSBpdHMgY29uZmlnIHVybCwgYXMgQXJjaGl2ZXNDaGFpbi5nZXRGaWxlU291cmNlcyBsaXN0cyB0aGVtIC0gd2l0aCBubyBmYWxsYmFjayB0byBhbnkgb3RoZXIuIEZvciBjb21wYXJpbmcgdGhlIGNvcGllcyBkaWZmZXJlbnQgc291cmNlcyBob2xkIChjb21iaW5lIHdpdGggaW50ZXJuYWwgdG8gcmVhZCBvbmx5IHRoYXQgc2VydmVyJ3Mgb3duIGRpc2ssIHNraXBwaW5nIGl0cyBob2xkZXIgcmVzb2x1dGlvbikuIE11bHRpLXNvdXJjZSBhcmNoaXZlcyBvbmx5OyB0aHJvd3Mgd2hlbiBubyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhlIHVybC4gKi9cbiAgICBzb3VyY2VVcmw/OiBzdHJpbmc7XG4gICAgLyoqIEhvdyBtYW55IGV4dHJhIHRpbWVzIHRoZSBXSE9MRSBvcGVyYXRpb24gaXMgcmV0cmllZCBhZnRlciBldmVyeSBzb3VyY2UgaW4gYSBwYXNzIGZhaWxlZCAtIGFueSBlcnJvciBjb3VudHMgKHRoZSB3cm9uZy13aW5kb3cvcm91dGUgbWFya2VycyBzdGlsbCBnZXQgdGhlaXIgY29uZmlnIHJlLXJlc29sdmUgZmlyc3QpLiBPbmx5IGFwcGxpZXMgdG8gZmFsbGJhY2sgZGlzcGF0Y2ggKG11bHRpLXNvdXJjZSwgbm90IG5vRmFsbGJhY2tzKSwgd2hlcmUgaXQgZGVmYXVsdHMgdG8gMzsgdGhlIG5vRmFsbGJhY2tzL3dyaXRlLW5vZGUgcGF0aCBhbHJlYWR5IHJldHJpZXMgb24gaXRzIG93biBkZWFkbGluZS4gTXVsdGktcGFydCB1cGxvYWRzIGFkZGl0aW9uYWxseSByZXRyeSBwZXIgcGFydCByZWdhcmRsZXNzIG9mIHRoaXMuICovXG4gICAgcmV0cmllcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbmRDb25maWcgPSB7XG4gICAgc2hhbGxvdz86IGJvb2xlYW47XG4gICAgdHlwZT86IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiO1xuICAgIC8qKiBBbHNvIGxpc3QgZmlsZXMgTUFSS0VEIGZvciBkZWxldGlvbiAoc2VlIEdldENvbmZpZy5pbmNsdWRlTWFya2VkKS4gKi9cbiAgICBpbmNsdWRlTWFya2VkPzogYm9vbGVhbjtcbiAgICAvKiogTGlzdGluZ3Mgbm9ybWFsbHkgY29tZSBPTkxZIGZyb20gdGhlIGF1dGhvcml0YXRpdmUgc291cmNlcyAodGhlIHNhbWUgbm9kZXMgd3JpdGVzIGdvIHRvIC0gcmVhZC15b3VyLXdyaXRlcykuIFdpdGggZmFsbGJhY2tzLCBhIGZhaWxpbmcgc2hhcmQncyByb3V0ZXMgYXJlIGNvdmVyZWQgYnkgdGhlIG5leHQgc291cmNlIGhvbGRpbmcgdGhlbSAoZS5nLiBhIHdpZGUgcmVhZCByZXBsaWNhKSBpbnN0ZWFkIG9mIHRoZSBjYWxsIGZhaWxpbmcgLSBoaWdoIGF2YWlsYWJpbGl0eSBhdCB0aGUgY29zdCBvZiBwb3NzaWJseSBtaXNzaW5nIGp1c3Qtd3JpdHRlbiBkYXRhLiBTaW5nbGUtc291cmNlIGFyY2hpdmVzIGlnbm9yZSB0aGUgZmxhZy4gKi9cbiAgICBmYWxsYmFja3M/OiBib29sZWFuO1xuICAgIC8qKiBTdG9yZS10by1zdG9yZSBsaXN0aW5nOiBvbmx5IGVudHJpZXMgd2hvc2UgYnl0ZXMgdGhlIG5vZGUgSVRTRUxGIGhvbGRzIC0gbmV2ZXIgZW50cmllcyBpdHMgaW5kZXggcmVkaXJlY3RzIHRvIGl0cyBvd24gb3RoZXIgc291cmNlcy4gQSBwZWVyIHJlYWRzIHdpdGggR2V0Q29uZmlnLmludGVybmFsICh3aGljaCBuZXZlciBjaGFzZXMgdGhvc2UgcmVkaXJlY3RzKSwgc28gbGlzdGluZyBhIHJlZGlyZWN0IHdvdWxkIGp1c3QgbWFrZSB0aGUgcGVlciBmbGFnIHRoZSBmaWxlIG1pc3NpbmcsIHB1cmdlIGl0LCByZS1saXN0IGl0LCBhbmQgbG9vcCBmb3JldmVyOyB0aGUgcGVlciBoZWFycyBhYm91dCBzdWNoIGZpbGVzIGZyb20gdGhlIHNvdXJjZSBhY3R1YWxseSBob2xkaW5nIHRoZW0gaW5zdGVhZC4gKi9cbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBEZWxDb25maWcgPSB7XG4gICAgLyoqIFN0YW1wcyB0aGUgZGVsZXRpb24gKGl0cyB0b21ic3RvbmUpIHdpdGggdGhpcyB3cml0ZSB0aW1lIGluc3RlYWQgb2Ygbm93LiBTeW5jaHJvbml6YXRpb24gcGFzc2VzIHRoZSBPUklHSU5BTCBkZWxldGlvbiB0aW1lLCBzbyBkZWxldGlvbiBvcmRlcmluZyBzdXJ2aXZlcyBwcm9wYWdhdGlvbiBleGFjdGx5IGxpa2UgYW55IG90aGVyIHdyaXRlJ3Mgb3JkZXJpbmcuICovXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyO1xuICAgIC8qKiBTZWUgU2V0Q29uZmlnLmludGVybmFsLiAqL1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIFNldENvbmZpZy5ub0NoZWNrcy4gKi9cbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBTZXRDb25maWcuZmFsbGJhY2tzLiAqL1xuICAgIGZhbGxiYWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBHZXRDb25maWcucmV0cmllcy4gKi9cbiAgICByZXRyaWVzPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgR2V0SW5mb0NvbmZpZyA9IHtcbiAgICAvKiogQWxzbyByZXBvcnQgc2l6ZS0wIGVudHJpZXMgKHRvbWJzdG9uZXMgLSBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gT2ZmIGJ5IGRlZmF1bHQsIHNvIGEgZGVsZXRlZCBrZXkgcmVwb3J0cyB1bmRlZmluZWQsIG1hdGNoaW5nIGdldC4gU3luY2hyb25pemF0aW9uLXN0eWxlIGNhbGxlcnMgcGFzcyB0aGlzIHdoZW4gdGhleSBuZWVkIGEgZGVsZXRpb24ncyB3cml0ZSB0aW1lIChlLmcuIHRvIGNvbXBhcmUgaXQgYWdhaW5zdCBhIHdyaXRlIHRoZXkgYXJlIGFib3V0IHRvIG1ha2UpLiAqL1xuICAgIGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIEdldENvbmZpZy5ub0ZhbGxiYWNrczogYW5zd2VyIE9OTFkgZnJvbSB0aGUgcHJpbWFyeSBzb3VyY2UgKHRoZSBvbmUgd3JpdGVzIHdvdWxkIHRhcmdldCkgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgYWNyb3NzIHRoZSByZWR1bmRhbnQgc291cmNlcy4gKi9cbiAgICBub0ZhbGxiYWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBHZXRDb25maWcucmV0cmllcy4gKi9cbiAgICByZXRyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBTZWUgR2V0Q29uZmlnLnNvdXJjZVVybDogYW5zd2VyIGZyb20gRVhBQ1RMWSB0aGlzIHNvdXJjZS4gKi9cbiAgICBzb3VyY2VVcmw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzQWZ0ZXJDb25maWcgPSB7XG4gICAgdGltZTogbnVtYmVyO1xuICAgIC8qKiBPbmx5IGtleXMgcm91dGluZyBpbnRvIG9uZSBvZiB0aGVzZSBbc3RhcnQsIGVuZCkgcmFuZ2VzLiBPbmx5IHNjYW5uaW5nIHBhc3NlcyB0aGlzIC0gaXQgbGV0cyBhIHN0b3JlIHN5bmNpbmcgYSBwYXJ0aWFsIHNoYXJkIGFzayBmb3IganVzdCBpdHMgc2xpY2UuICovXG4gICAgcm91dGVzPzogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIC8qKiBTZWUgRmluZENvbmZpZy5pbnRlcm5hbCAtIHRoZSBjaGFuZ2UgZmVlZCBpcyBhIGxpc3RpbmcgdG9vLCBhbmQgcmVkaXJlY3QgZW50cmllcyBmYWlsIGEgcGVlcidzIGludGVybmFsIHJlYWRzIHRoZSBzYW1lIHdheS4gRGVsZXRpb25zIGFyZSBhbHdheXMgcmVwb3J0ZWQgKHRoZXkgYXJlIGluZGV4LW9ubHksIHRoZXJlIGFyZSBubyBieXRlcyB0byBob2xkKS4gKi9cbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZXRDb25maWcgPSB7XG4gICAgLyoqIFRoZSB3cml0ZSB0aW1lIHRvIHN0YW1wIChzZWUgSUFyY2hpdmVzLnNldCkuIFJPVU5ERUQgdG8gd2hvbGUgbWlsbGlzZWNvbmRzIGJ5IGV2ZXJ5IGltcGxlbWVudGF0aW9uIC0gdGhlIGRpc2sgY2FuJ3Qgc3RvcmUgZnJhY3Rpb25hbCBtaWxsaXNlY29uZHMgYW55d2F5ICh1dGltZXMgcm91bmQtdHJpcHMgd2hvbGUgbXMpLCBzbyBhIGZyYWN0aW9uYWwgc3RhbXAgY291bGQgbmV2ZXIgYmUgcmVwcm9kdWNlZCBieSBwcm9wYWdhdGlvbiBhbmQgd291bGQgY29tcGFyZSBcIm5ld2VyXCIgdGhhbiBpdHMgb3duIGNvcGllcyBmb3JldmVyLiBSb3VuZGVkIHJhdGhlciB0aGFuIGZsb29yZWQgYmVjYXVzZSB1dGltZXMgZ29lcyB0aHJvdWdoIGEgc2Vjb25kcyBkb3VibGUgYW5kIGNhbiByZWFkIGJhY2sgYSBoYWlyIGJlbG93IHRoZSBzdGFtcGVkIG1pbGxpc2Vjb25kIChzZWUgQXJjaGl2ZXNEaXNrLmdldDIpLiAqL1xuICAgIGxhc3RNb2RpZmllZD86IG51bWJlcjtcbiAgICAvKiogTWFrZXMgdGhlIHdyaXRlIGFjY2VwdGFibGUgb24gaW1tdXRhYmxlIHRhcmdldHM6IGFuIGV4aXN0aW5nIHBhdGggaXMgc2ltcGx5IGtlcHQgKGltbXV0YWJpbGl0eSB3aW5zIC0gbm90aGluZyBpcyBvdmVyd3JpdHRlbikgaW5zdGVhZCBvZiB0aGUgd3JpdGUgdGhyb3dpbmcuIFJlcXVpcmVzIGxhc3RNb2RpZmllZC4gU3luY2hyb25pemF0aW9uIE1VU1QgcGFzcyB0aGlzIG9uIGV2ZXJ5IHB1c2ggLSBhIHBsYWluIHNldCB0aHJvd3Mgb24gaW1tdXRhYmxlIHRhcmdldHMsIHdoaWNoIHdvdWxkIGFib3J0IHJlY29uY2lsaWF0aW9uIHdoZW5ldmVyIG9uZSBzb3VyY2UgaW4gYSBjaGFpbiBpcyBpbW11dGFibGUuICovXG4gICAgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuO1xuICAgIC8qKiBTa2lwcyBSRURVTkRBTlQgdGFyZ2V0LXNpZGUgc2FmZXR5IHJlYWRzIGFyb3VuZCB0aGUgd3JpdGUgKGJhY2tibGF6ZTogdGhlIHBvc3QtdXBsb2FkIGV4aXN0ZW5jZSBwb2xsKS4gSXQgZG9lcyBOT1Qgc2tpcCBjaGVja3MgdGhhdCBhcmUgdGhlIHRhcmdldCdzIG9ubHkgb3JkZXJpbmcgZ3VhcmQ6IGJhY2tibGF6ZSdzIHByZS13cml0ZSBjb21wYXJpc29uIHN0YXlzLCBiZWNhdXNlIGIyIGhhcyBubyBzZXJ2ZXIgb2Ygb3VycyBlbmZvcmNpbmcgb25seS10YWtlLXRoZS1sYXRlc3QgLSB3aXRob3V0IGl0IGEgc3RhbGUgcHVzaCBsYW5kcyBvdmVyIGEgbmV3ZXIgdmFsdWUgb3IgdG9tYnN0b25lIGFuZCBiMidzIHNlbGYtc3RhbXBlZCB1cGxvYWQgdGltZSBsYXVuZGVycyBpdCBpbnRvIHRoZSBuZXdlc3QgY29weSBpbiB0aGUgc3lzdGVtIChnbG9iYWwgcmVzdXJyZWN0aW9uKS4gSG9zdGVkIHRhcmdldHMgcmUtY2hlY2sgc2VydmVyLXNpZGUsIHNvIHRoZWlyIGNsaWVudC1zaWRlIHNob3J0Y3V0cyBhcmUgc2FmZS4gKi9cbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFN0b3JlLXRvLXN0b3JlIHB1c2g6IHRoZSByZWNlaXZpbmcgbm9kZSB3cml0ZXMgcHVyZWx5IHRvIGl0cyBvd24gZGlzayBhbmQgaW5kZXgsIHdpdGggTk8gZG93bnN0cmVhbSBmYW4tb3V0ICh0aGUgcHVzaGluZyBzdG9yZSBvd25zIHByb3BhZ2F0aW9uIC0gZmFubmluZyBpdHMgcHVzaGVzIGJhY2sgb3V0IGlzIGhvdyB3cml0ZSBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtKS4gV2luZG93IGFuZCByb3V0ZSBBUkUgc3RpbGwgY2hlY2tlZDogdGhlIHN0YW1wIG11c3QgZmFsbCBpbnNpZGUgb25lIG9mIHRoZSByZWNlaXZlcidzIGNvbmZpZ3VyZWQgd2luZG93cyBhbmQgcm91dGVzLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2Fubm90IHN0dWZmIGRhdGEgb250byBhIG5vZGUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdC4gUmVxdWlyZXMgbGFzdE1vZGlmaWVkLiAqL1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICAvKiogV3JpdGVzIG5vcm1hbGx5IGdvIE9OTFkgdG8gdGhlIHdyaXRlIG5vZGUgKHRoZSBmaXJzdCBjdXJyZW50LXdpbmRvdyBzb3VyY2UgY292ZXJpbmcgdGhlIGtleSksIHJldHJ5aW5nIGl0IGV2ZW4gd2hpbGUgaXQgaXMgZG93biAtIGNvbnNpc3RlbnQsIGJ1dCB1bmF2YWlsYWJsZSB3aGVuIHRoYXQgbm9kZSBpcy4gV2l0aCBmYWxsYmFja3MsIHRoZSB3cml0ZSBub2RlIGlzIHN0aWxsIHRyaWVkIGZpcnN0LCBidXQgb24gZmFpbHVyZSB0aGUgd3JpdGUgbGFuZHMgb24gdGhlIG5leHQgY3VycmVudC13aW5kb3cgc291cmNlIGNvdmVyaW5nIHRoZSBrZXkgKHN5bmNocm9uaXphdGlvbiBtb3ZlcyBpdCB0byB0aGUgd3JpdGUgbm9kZSBsYXRlcikgLSBhdmFpbGFiaWxpdHkgYXQgdGhlIGNvc3Qgb2YgcmVhZHMgcG9zc2libHkgbWlzc2luZyB0aGUgd3JpdGUgdW50aWwgaXQgcHJvcGFnYXRlcy4gU2luZ2xlLXNvdXJjZSBhcmNoaXZlcyBpZ25vcmUgdGhlIGZsYWcuICovXG4gICAgZmFsbGJhY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIEdldENvbmZpZy5yZXRyaWVzLiAqL1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBzZXQgaXMgbm90IGEgd3JpdGUgYXQgYWxsOiBpdCBSRVNUT1JFUyBhIGZpbGUgbWFya2VkIGZvciBkZWxldGlvbiwgZmxpcHBpbmcgaXRzIGluZGV4IGVudHJ5IGJhY2sgdG8gbGl2ZSAod2l0aCBhIGZyZXNoIHdyaXRlIHRpbWUsIHNvIHRoZSByZXN0b3JlIG91dHJhbmtzIHRoZSBkZWxldGlvbiBldmVyeXdoZXJlIGl0IHByb3BhZ2F0ZWQpIC0gdGhlIGJ5dGVzIG5ldmVyIGxlZnQgdGhlIGRpc2ssIHNvIHJlYWRzIGp1c3Qgd29yayBhZ2Fpbi4gVGhlIGRhdGEgYnVmZmVyIGlzIGlnbm9yZWQgKGEgMS1ieXRlIHBsYWNlaG9sZGVyIHNhdGlzZmllcyB0aGUgZW1wdHktYnVmZmVyIHJ1bGUpOyB1c2UgSUFyY2hpdmVzLnVuZGVsZXRlIHJhdGhlciB0aGFuIHBhc3NpbmcgdGhpcyB5b3Vyc2VsZi4gVGhyb3dzIHdoZW4gdGhlIGtleSBoYXMgbm8gbWFya2VkIGRlbGV0aW9uIHRvIHJlc3RvcmUgKGl0cyBoaXN0b3J5IHdhcyBkcm9wcGVkLCBvciBpdCB3YXMgbmV2ZXIgZGVsZXRlZCkuICovXG4gICAgdW5kZWxldGU/OiBib29sZWFuO1xufTtcblxuLyoqIHNldExhcmdlRmlsZSdzIGNvbmZpZzogYSBTZXRDb25maWcgKGl0IElTIGEgc2V0IC0gdGhlIHNhbWUgaW1tdXRhYmlsaXR5LCBvcmRlcmluZywgaW50ZXJuYWwsIGFuZCBmYWxsYmFja3MgcnVsZXMgYXBwbHkpIHBsdXMgdGhlIHN0cmVhbSBjYXJyeWluZyB0aGUgYnl0ZXMuICovXG5leHBvcnQgdHlwZSBTZXRMYXJnZUZpbGVDb25maWcgPSBTZXRDb25maWcgJiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjtcbiAgICAvKiogUmV3aW5kcyB0aGUgc3RyZWFtIHRvIGl0cyBmaXJzdCBieXRlLiBXaXRob3V0IGl0IHRoZSB3cml0ZSBnZXRzIGV4YWN0bHkgT05FIGF0dGVtcHQ6IGEgcmV0cnkgKGEgZmFsbGJhY2sgc291cmNlLCBvciB0aGUgd3JpdGUgbm9kZSBjb21pbmcgYmFjaykgd291bGQgdXBsb2FkIHdoYXRldmVyIGlzIGxlZnQgb2YgYW4gYWxyZWFkeS1jb25zdW1lZCBzdHJlYW0gYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgZmlsZS4gQ2FsbGVycyBob2xkaW5nIHRoZSBkYXRhIChhIGJ1ZmZlciwgb3IgYSBzb3VyY2UgdGhleSBjYW4gcmUtcmVhZCkgYWx3YXlzIHBhc3MgaXQgLSBhIGxhcmdlIHNldCB3aXRoIGZhbGxiYWNrcyBpcyBvbmx5IGFzIGF2YWlsYWJsZSBhcyB0aGlzLiAqL1xuICAgIHJlc3RhcnRTdHJlYW0/KCk6IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufTtcblxuLy8gY3JlYXRlVGltZSBpcyBhIG1pc25vbWVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkg4oCUIGl0IGlzIHJlYWxseSB0aGUgTEFTVC1XUklURSB0aW1lLCBzYW1lIGFzIGdldEluZm8ncyB3cml0ZVRpbWUuIE5laXRoZXIgQmFja2JsYXplIG5vciBvdXIgcmVtb3RlIHN0b3JhZ2UgdHJhY2tzIGEgZGlzdGluY3QgY3JlYXRpb24gZGF0ZTogZWFjaCB3cml0ZSBzdGFtcHMgYSBmcmVzaCB0aW1lc3RhbXAgb24gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gYm90aCBmaWVsZHMgYXJlIGp1c3QgXCJ3aGVuIHRoZSBieXRlcyBzZXJ2ZWQgYnkgZ2V0KCkgd2VyZSBtb3N0IHJlY2VudGx5IHdyaXR0ZW5cIi4gQWx3YXlzIFdIT0xFIG1pbGxpc2Vjb25kczogd3JpdGUgdGltZXMgYXJlIHJvdW5kZWQgYXQgZXZlcnkgcHJvZHVjZXIgKHNlZSBTZXRDb25maWcubGFzdE1vZGlmaWVkKS5cbmV4cG9ydCB0eXBlIEFyY2hpdmVGaWxlSW5mbyA9IHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9O1xuXG4vLyBBbiBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbiB0YXNrIChzZWUgQXJjaGl2ZXNDb25maWcuc3luY2luZylcbmV4cG9ydCB0eXBlIFN5bmNBY3Rpdml0eSA9IHtcbiAgICAvLyBBIG1ldGFkYXRhIHNjYW4gaXMgYSBzaW5nbGUgbGlzdGluZyBjYWxsLCBzbyBpdCBoYXMgbm8gaW5jcmVtZW50YWwgcHJvZ3Jlc3MgLSBqdXN0IHRoYXQgaXQncyBydW5uaW5nIGFuZCBzaW5jZSB3aGVuLiBBIGZ1bGwgc3luYyBrbm93cyBpdHMgZXhhY3QgZmlsZS9ieXRlIHByb2dyZXNzLlxuICAgIHR5cGU6IFwibWV0YWRhdGFTY2FuXCIgfCBcImZ1bGxTeW5jXCI7XG4gICAgc291cmNlRGVidWdOYW1lOiBzdHJpbmc7XG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XG4gICAgZG9uZUZpbGVzPzogbnVtYmVyO1xuICAgIHRvdGFsRmlsZXM/OiBudW1iZXI7XG4gICAgZG9uZUJ5dGVzPzogbnVtYmVyO1xuICAgIHRvdGFsQnl0ZXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc0NvbmZpZyA9IHtcbiAgICAvLyBXaGV0aGVyIGdldENoYW5nZXNBZnRlcjIgaXMgbmF0aXZlbHkgaW5kZXgtYmFja2VkIChmYXN0IGNoYW5nZSBwb2xsaW5nOyBldmVyeSBiYWNrZW5kIHN0aWxsIHNlcnZlcyBpdCwgYnV0IHRoZSBvdGhlcnMgZW11bGF0ZSBpdCB3aXRoIGEgZnVsbCBsaXN0aW5nKVxuICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyPzogYm9vbGVhbjtcbiAgICAvLyBUaGUgYnVja2V0J3MgZnVsbCByb3V0aW5nIGNvbmZpZyAoUk9VVElOR19GSUxFKS4gQWJzZW50IGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgaGF2ZSBvbmUgKGEgYmFyZSBkaXNrIHNvdXJjZSwgb3IgYSBidWNrZXQgdGhhdCBkb2Vzbid0IGV4aXN0IHlldCkuXG4gICAgcmVtb3RlQ29uZmlnPzogUmVtb3RlQ29uZmlnO1xuICAgIC8vIExpdmUgaW5kZXggdG90YWxzICh0b21ic3RvbmVzIGV4Y2x1ZGVkKSwga2VwdCB1cCB0byBkYXRlIGluIG1lbW9yeSBvbiBldmVyeSBtdXRhdGlvbiBhbmQgcmVjb21wdXRlZCBvbiBsb2FkIC0gc28gYW55IGRyaWZ0IGhlYWxzIG9uIHJlc3RhcnRcbiAgICBpbmRleD86IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgLyoqIEZpbGVzIE1BUktFRCBmb3IgZGVsZXRpb24gKGRlbGV0ZWQsIGJ5dGVzIHN0aWxsIGtlcHQgYXMgaGlzdG9yeSAtIHNlZSBTZXRDb25maWcudW5kZWxldGUpOiBob3cgbWFueSwgaG93IGJpZywgYW5kIHRoZSBkZWxldGUgdGltZSBvZiB0aGUgb2xkZXN0IG9uZSAtIHdoaWNoIGlzIGhvdyBmYXIgYmFjayB0aGUgZGVsZXRpb24gaGlzdG9yeSByZWFjaGVzLiAqL1xuICAgIG1hcmtlZEluZGV4PzogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IG9sZGVzdERlbGV0ZVRpbWU/OiBudW1iZXIgfTtcbiAgICAvLyBUaGUgc2FtZSB0b3RhbHMgYnJva2VuIGRvd24gYnkgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyBlYWNoIGZpbGUncyBieXRlcyAodGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBzZXJ2ZXIncyBvd24gZGlzaylcbiAgICBpbmRleFNvdXJjZXM/OiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyBjb25maWd1cmVkIHJlYWRlckRpc2tMaW1pdCwgd2hlbiBpdCBydW5zIGFzIGEgYm91bmRlZCByZWFkIGNhY2hlXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8vIEJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAoZW1wdHkgd2hlbiBpZGxlKVxuICAgIHN5bmNpbmc/OiBTeW5jQWN0aXZpdHlbXTtcbn07XG5cbi8vIEEgc3luY2hyb25pemF0aW9uIHNvdXJjZSBvZiBhIEJsb2JTdG9yZSAod2hpY2ggc3luY2hyb25pemVzIGFuIGluZGV4ICsgbG9jYWwgY2FjaGUgZnJvbSB0aGVtKVxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTb3VyY2UgPSB7XG4gICAgc291cmNlOiBJQXJjaGl2ZXM7XG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IGlkZW50aXR5IG9mIHRoZSBlbmRwb2ludDogaXRzIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSwgb3IgdGhlIGRpc2sgZm9sZGVyIHBhdGggZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlLiBUaGUgc3RvcmUgcGVyc2lzdHMgdGhpcyAodmlhIGl0cyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QpIGFzIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCwgc28gaXQgbXVzdCBtZWFuIHRoZSBzYW1lIGVuZHBvaW50IGZvcmV2ZXIuICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnLCBidXQgQUxMIG9mIHRoZW06IHRoZSBzYW1lIGVuZHBvaW50IChzYW1lIHVybCtyb3V0ZSwgaWdub3JpbmcgdGhlIHdpbmRvdykgY2FuIGFwcGVhciBpbiB0aGUgcm91dGluZyBjb25maWcgdW5kZXIgc2V2ZXJhbCB3aW5kb3dzIGF0IG9uY2UgLSBtb3N0IGNvbW1vbmx5IHdoZW4gYSBkZXBsb3kgc3dpdGNob3ZlciBoYXMgc3BsaXQgb25lIHdpbmRvdyBpbiB0d28gYXJvdW5kIGFuIGludGVybWVkaWF0ZS4gSXQgaXMgT05FIHNvdXJjZSB0aGF0IGtub3dzIGFsbCBpdHMgd2luZG93cywgbmV2ZXIgc2V2ZXJhbCBzb3VyY2VzLiBUaGUgd2luZG93IHJvdXRlcyBXUklURVM6IHRoZSBzb3VyY2UgcmVjZWl2ZXMgd3JpdGVzIHdoaWxlIEFOWSBvZiBpdHMgd2luZG93cyBpcyBzdGlsbCBvcGVuIChzZWUgd2luZG93c0FjY2VwdFdyaXRlcykuIFdpbmRvd3MgZG8gTk9UIGZpbHRlciBzY2FubmluZzogYSBzY2FuIGlzIHVzIGFza2luZyB0aGUgc291cmNlIHdoYXQgaXQgYWxyZWFkeSBob2xkcywgYW5kIGV4aXN0aW5nIHZhbHVlcyBzeW5jaHJvbml6ZSByZWdhcmRsZXNzIG9mIHRoZWlyIHdyaXRlIHRpbWVzICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS5cbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICAvLyBGcm9tIHRoZSBzb3VyY2UncyBDb21tb25Db25maWcgKGludGVyc2VjdGVkIHdpdGggdGhlIG93bmluZyBzdG9yZSdzIG93biByb3V0ZSk6IG9ubHkga2V5cyByb3V0aW5nIGludG8gW3N0YXJ0LCBlbmQpIGFyZSBhY2NlcHRlZCBmcm9tIHRoaXMgc291cmNlJ3Mgc2NhbnMgYW5kIHNlbnQgdG8gaXQgaW4gd3JpdGVzL3JlY29uY2lsaWF0aW9uLiBUaGUgcm91dGluZyBmaWxlIGlzIGV4ZW1wdCAtIGNvbmZpZyBmbG93cyBldmVyeXdoZXJlLiBBYnNlbnQgPSBhbGwga2V5cy5cbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOyBzZWUgdGhlcmUuXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOiBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZS1wb3J0IGVudHJ5ICh0aGUgdmFsdWUgaXMgdGhlIHVybCBvZiB0aGUgc291cmNlIGl0IHdhcyBzcGxpdCBvdXQgb2YpLiBPbmNlIGl0cyB3aW5kb3cgaXMgcGFzdCwgdGhlIHBvcnQgaXQgcG9pbnRzIGF0IGlzIGdvbmUgZm9yIGdvb2QgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkIHRoZW4sIGFuZCBzY2FuIGZhaWx1cmVzIGFyZSBuZXZlciByZXRyaWVkLlxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBUaGUgcm91dGluZy1jb25maWcgZW50cnkgdGhpcyBzb3VyY2Ugd2FzIGJ1aWx0IGZyb20gKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpLiBJdHMgYHR5cGVgIGRlY2lkZXMgZmFzdC13cml0ZSBmbHVzaCB0aW1pbmc6IHR5cGUtXCJyZW1vdGVcIiBkb3duc3RyZWFtIHNvdXJjZXMgKG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzKSBmbHVzaCBxdWlja2x5IChjaGVhcCwgYW5kIHdlIHdhbnQgY3Jvc3Mtbm9kZSByZWR1bmRhbmN5IGZhc3QpLCB3aGlsZSBvdGhlcnMgKGUuZy4gYmFja2JsYXplKSBrZWVwIHRoZSBmdWxsIHdyaXRlRGVsYXkgc28gZXhwZW5zaXZlIGV4dGVybmFsIHdyaXRlcyBzdGF5IGNvYWxlc2NlZC4gVGhlIHdpbmRvdy9yb3V0ZSBPTiB0aGlzIGNvbmZpZyBhcmUgdGhlIFNPVVJDRSdzIG93bjsgQXJjaGl2ZXNTb3VyY2UudmFsaWRXaW5kb3cvcm91dGUgYXJlIHdoYXQgdGhlIG93bmluZyBzdG9yZSBhY3R1YWxseSB1c2VzIChyb3V0ZSBpcyBpbnRlcnNlY3RlZCB3aXRoIHRoZSBzdG9yZSdzIHJvdXRlKS5cbiAgICBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7XG4gICAgLy8gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSB1bmRlcmx5aW5nIGVuZHBvaW50IChpdHMgY29uZmlnIHdpdGggd2luZG93cy9yb3V0ZXMgc3RyaXBwZWQpIC0gaG93IEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzIHJlY29nbml6ZXMgYSBzb3VyY2UgYWNyb3NzIGNvbmZpZyBjaGFuZ2VzIHNvIGl0IGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiByZW1vdmluZyBhbmQgcmUtYWRkaW5nIGl0XG4gICAgaWRlbnRpdHk/OiBzdHJpbmc7XG59O1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSByZWFjaGVzIGl0IG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvd3MgKHRoZSBjbGllbnQgcmVzb2x2ZWQgaXRzIHRhcmdldCwgdGhlbiB0aW1lIGNyb3NzZWQgYSB3aW5kb3cgYm91bmRhcnkgYmVmb3JlIHRoZSB3cml0ZSBsYW5kZWQpLiBDbGllbnRzIGRldGVjdCB0aGlzIG1hcmtlciBhbmQgcmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5LXZhbGlkIHNvdXJjZSwgcmV0cnlpbmcgT05DRSAtIGJvdW5kYXJpZXMgYXJlIGZhciBhcGFydCwgc28gaGl0dGluZyBpdCB0d2ljZSBpbiBvbmUgYXR0ZW1wdCBtZWFucyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgd3JvbmcuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cgPSBcIlJFTU9URV9TVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV19hN2MxZjA0ZVwiO1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSdzIGtleSByb3V0ZXMgb3V0c2lkZSB0aGUgc2hhcmRzIHRoaXMgc2VydmVyIGhhbmRsZXMgKHRoZSBjbGllbnQncyBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIC0gY2xpZW50cyByZS1yZXNvbHZlIG9uY2UpXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19ST1VURSA9IFwiUkVNT1RFX1NUT1JBR0VfV1JPTkdfUk9VVEVfYzk0ZDJlMTdcIjtcblxuLy8gRXJyb3IgbWFya2VyIGEgc2VydmVyIGluY2x1ZGVzIHdoZW4gYSB3cml0ZSByZWFjaGVzIGEgc3RvcmUgd2hvc2Ugb3duIHJvdXRpbmcgY29uZmlnIGhhcyBOTyBlbnRyeSBmb3IgaXQgb24gdGhhdCBzZXJ2ZXIgKG9yIHRoYXQgaGFzIG5vIHJvdXRpbmcgY29uZmlnIGF0IGFsbCkgLSBhY2NlcHRpbmcgdGhlIHdyaXRlIHdvdWxkIHN0b3JlIGRhdGEgbm90aGluZyBzY2FucyBvciByZWNvbmNpbGVzLiBDbGllbnRzIHJlLXJlc29sdmUgb25jZSwgZXhhY3RseSBsaWtlIHRoZSBtYXJrZXJzIGFib3ZlOiB0aGUgdXN1YWwgY2F1c2UgaXMgdGhlIGNsaWVudCBydW5uaW5nIGEgZGlmZmVyZW50IGNvbmZpZyB0aGFuIHRoZSBzdG9yZS5cbmV4cG9ydCBjb25zdCBTVE9SQUdFX05PVF9DT05GSUdVUkVEID0gXCJSRU1PVEVfU1RPUkFHRV9OT1RfQ09ORklHVVJFRF9lNTFiN2Q5MlwiO1xuXG5leHBvcnQgY29uc3QgRlVMTF9ST1VURTogW251bWJlciwgbnVtYmVyXSA9IFswLCAxXTtcblxuLy8gQSBrZXkgY29udGFpbmluZyB0aGlzIHNlbnRpbmVsIGRvZXNuJ3QgaGF2ZSBhIGZpeGVkIHNoYXJkOiBzZXRWYXJpYWJsZVNoYXJkIHBpY2tzIHRoZSAobG93ZXN0IGxhdGVuY3ksIHVwKSB3cml0ZSBzaGFyZCwgYXBwZW5kcyBcIl88dmFsdWUgaW4gdGhlIHNoYXJkJ3Mgcm91dGU+XCIgZGlyZWN0bHkgYWZ0ZXIgdGhlIHNlbnRpbmVsLCBhbmQgcmV0dXJucyB0aGUgbWF0ZXJpYWxpemVkIGtleS4gZ2V0Um91dGUgdHJlYXRzIHRoYXQgc3VmZml4IGFzIGEgY29tcGxldGUgcm91dGUgb3ZlcnJpZGUuXG5leHBvcnQgY29uc3QgVkFSSUFCTEVfU0hBUkQgPSBcIlZBUklBQkxFX1NIQVJEX2YwMjM0amZhaDA4Zmd5aGZneXNzZGRzODNubXBcIjtcbi8vIE5vIGdyYWNlIHBhc3QgdGhlIGVuZDogYSB3aW5kb3cgYm91bmRhcnkgaXMgYSBoYXJkIGhhbmRvZmYgKGNsaWVudHMgcmV0cnkgYSByZWplY3RlZCB3cml0ZSBhZ2FpbnN0IHRoZSBuZXdseS12YWxpZCBzb3VyY2UsIHNvIGxlbmllbmN5IGhlcmUgd291bGQgb25seSBkZXN5bmNocm9uaXplIHRoZSBoYW5kb2ZmKVxuLy8gIC0gV3JpdGluZyB0byBvbGRlciB2YWxpZCBzdGF0ZSB3aW5kb3dzIGlzIGZpbmUsIHRob3VnaC4gV2UgbmVlZCB0aGlzIHRvIGluZ2VzdCB0aGUgb2xkIGRhdGEgd2hlbiB3ZSdyZSBzeW5jaHJvbml6aW5nIG5vZGVzIHRvIGdldCB0aGVtIHVwIHRvIGRhdGUgYW55d2F5LiBcbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dBY2NlcHRzV3JpdGVzKHZhbGlkV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWxpZFdpbmRvdykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHZhbGlkV2luZG93WzFdID4gRGF0ZS5ub3coKTtcbn1cbi8vIEEgc291cmNlICh3aGljaCBjYW4gaG9sZCBzZXZlcmFsIHdpbmRvd3MpIGFjY2VwdHMgd3JpdGVzIHdoaWxlIEFOWSBvZiBpdHMgd2luZG93cyBpcyBzdGlsbCBvcGVuLiBObyB3aW5kb3dzID0gdGhlIGJhc2UgZGlzayBvZiBhbiBpbmVydCBzdG9yZSAobm90IGluIHRoZSBjb25maWcpLCB3aGljaCBuZXZlciByZWNlaXZlcyBmYW4tb3V0IHdyaXRlcyBhbnl3YXkuXG5leHBvcnQgZnVuY3Rpb24gd2luZG93c0FjY2VwdFdyaXRlcyh2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWxpZFdpbmRvd3Muc29tZSh3aW5kb3dBY2NlcHRzV3JpdGVzKTtcbn1cblxuLy8gQWJvdmUgdGhpcywgc2V0IHRyYW5zcGFyZW50bHkgc3RyZWFtcyB0aHJvdWdoIHNldExhcmdlRmlsZTogb25lIGdpYW50IHdpcmUgbWVzc2FnZSB3b3VsZCBleGNlZWQgdGhlIHRyYW5zcG9ydCBsaW1pdCBhbmQgbGFnIGV2ZXJ5IG90aGVyIGNsaWVudCBzaGFyaW5nIHRoZSBjb25uZWN0aW9uXG5leHBvcnQgY29uc3QgTEFSR0VfU0VUX1RIUkVTSE9MRCA9IDggKiAxMDI0ICogMTAyNDtcblxuLyoqIFRoZSBzZXRMYXJnZUZpbGUgc3RyZWFtIG92ZXIgYW4gaW4tbWVtb3J5IGJ1ZmZlciwgaW4gTEFSR0VfU0VUX1RIUkVTSE9MRCBzbGljZXMgLSBob3cgc2V0IHRyYW5zcGFyZW50bHkgYmVjb21lcyBzZXRMYXJnZUZpbGUgZm9yIGxhcmdlIGJ1ZmZlcnMuIFNwcmVhZCBpbnRvIHRoZSBjb25maWc6IGl0IHByb3ZpZGVzIGJvdGggZ2V0TmV4dERhdGEgYW5kIHJlc3RhcnRTdHJlYW0gKHRoZSBidWZmZXIgaXMgc3RpbGwgaGVsZCwgc28gYSByZXRyeSBjb3N0cyBub3RoaW5nKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJDaHVua1N0cmVhbShkYXRhOiBCdWZmZXIpOiB7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgcmVzdGFydFN0cmVhbSgpOiB2b2lkIH0ge1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldE5leHREYXRhOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGNodW5rID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX1NFVF9USFJFU0hPTEQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBjaHVuaztcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdGFydFN0cmVhbTogKCkgPT4ge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyBSZS1leHBvcnRlZCBmb3IgdGhlIGV4aXN0aW5nIGltcG9ydGVycyAtIHRoZSBpbXBsZW1lbnRhdGlvbnMgKGFuZCBtb3ZlQXJjaGl2ZUZpbGUpIGxpdmUgaW4gYXJjaGl2ZUhlbHBlcnMudHMsIGJlc2lkZSB0aGlzIGludGVyZmFjZSByYXRoZXIgdGhhbiBpbiBpdFxuZXhwb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4vYXJjaGl2ZUhlbHBlcnNcIjtcblxuLyoqIG1vdmUncyBjb25maWcuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBsYXN0TW9kaWZpZWQ6IHRoZSBkZXN0aW5hdGlvbiBpcyBBTFdBWVMgc3RhbXBlZCBmcmVzaCAoc2VlIElBcmNoaXZlcy5tb3ZlKSAtIGEgbW92ZSBpcyBhIG5ldyB3cml0ZSBhdCB0aGUgbmV3IHBhdGgsIGFuZCBhIHByZXNlcnZlZCBvbGQgc3RhbXAgaXMgaG93IGEgbW92ZWQgZmlsZSBsb3NlcyB0byBhIHN0YWxlIHRvbWJzdG9uZSB0aGVyZSBhbmQgdmFuaXNoZXMuICovXG5leHBvcnQgdHlwZSBNb3ZlRmlsZUNvbmZpZyA9IHtcbiAgICBmcm9tUGF0aDogc3RyaW5nO1xuICAgIHRvUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTeW5jU291cmNlU3RhdHVzID0ge1xuICAgIGRlYnVnTmFtZTogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBcmNoaXZlc1N5bmNTdGF0dXMgPSB7XG4gICAgYWxsU2NhbnNDb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBOdW1iZXIgb2YgZmlsZXMgaW4gdGhlIGluZGV4XG4gICAgaW5kZXhTaXplOiBudW1iZXI7XG4gICAgc291cmNlczogQXJjaGl2ZXNTeW5jU291cmNlU3RhdHVzW107XG59O1xuXG4vLyBOT1RFOiBXZSBkb24ndCBwcmVzZW50bHkgaGF2ZSBhbiBhcHBlbmQgZnVuY3Rpb24gaGVyZSBiZWNhdXNlIGEgc3VycHJpc2luZyBudW1iZXIgb2Ygc3RvcmFnZSBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgaXQgKGJhY2tibGF6ZSwgZmlsZSBzeXN0ZW0gYXBpKS4gSXQgd291bGQgYWxzbyBjb21wbGljYXRlIHRoaW5ncyBhcyBub3cgdGhlcmUgbmVlZHMgdG8gYmUgcmVhbGx5IGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBvZiBhIGZpbGUsIGFuZCBpZiB5b3UgYXBwZW5kIHRvIHRoZSB3cm9uZyBzaW5nbGUgc291cmNlIG9mIHRydXRoLCB0aGluZ3MganVzdCBiZWNvbWUgdmVyeSBjb21wbGljYXRlZC4gXG5leHBvcnQgaW50ZXJmYWNlIElBcmNoaXZlcyB7XG4gICAgZ2V0RGVidWdOYW1lKCk6IHN0cmluZztcbiAgICAvKiogV2hldGhlciB3cml0ZXMgd291bGQgYmUgYWNjZXB0ZWQgKGNyZWRlbnRpYWxzIGV4aXN0LCB0aGUgYWNjb3VudCB0cnVzdHMgdGhpcyBtYWNoaW5lLCBldGMpLiBDaGVja2VkIHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gKi9cbiAgICBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMgdW5sZXNzIGNvbmZpZy5ub0ZhbGxiYWNrcyBpcyBzZXQuXG4gICAgICogQSBmYWxsYmFjayBjb3B5IGNhbiBsYWcgdGhlIHdyaXRlIHRhcmdldCwgc28gYSBjYWxsZXIgcmVhZGluZyBzdGF0ZSBpbiBvcmRlciB0byBtdXRhdGUgaXRcbiAgICAgKiAoZS5nLiB4KyspLCB3aGVyZSBhY3Rpbmcgb24gcHJldmlvdXMgc3RhdGUgd291bGQgY2F1c2UgYmlnIGlzc3Vlcywgc2hvdWxkIHBhc3Mgbm9GYWxsYmFja3MgLVxuICAgICAqIGFuZCB0cnkvY2F0Y2ggdGhlIHJlYWQsIGhhbmRsaW5nIHRoZSBjYXRjaCBjYXNlIChhIGRvd24gcHJpbWFyeSBpcyByZXRyaWVkIGZvciBhIHdoaWxlLCB0aGVuXG4gICAgICogdGhyb3dzIGluc3RlYWQgb2YgZGVncmFkaW5nIHRvIGEgc3RhbGUgY29weSkuXG4gICAgICovXG4gICAgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjtcbiAgICAvKiogU2VlIGdldCBmb3IgdGhlIGZhbGxiYWNrIHNlbWFudGljcyAoYW5kIHdoZW4gdG8gcGFzcyBub0ZhbGxiYWNrcykuIHVybCBpcyB0aGUgY29uZmlnIFVSTCBvZiB0aGUgc291cmNlIHRoYXQgYW5zd2VyZWQgLSB0aGUgYXV0aG9yaXR5IHRoZSBkYXRhIChvciB0aGUgXCJkb2VzIG5vdCBleGlzdFwiKSBjYW1lIGZyb20uIE11bHRpLXNvdXJjZSBpbXBsZW1lbnRhdGlvbnMgKEFyY2hpdmVzQ2hhaW4pIEFMV0FZUyByZXR1cm4gYW4gb2JqZWN0OiB3aGVuIHRoZSB2YWx1ZSBkb2Vzbid0IGV4aXN0IHRoZXJlIGlzIHN0aWxsIGEgc2VydmVyIHNheWluZyBpdCBkb2Vzbid0IGV4aXN0LCBzbyB0aGV5IHJldHVybiB7IHVybCB9IGFsb25lIHJhdGhlciB0aGFuIHVuZGVmaW5lZC4gU2luZ2xlLXNvdXJjZSBiYWNrZW5kcyByZXR1cm4gdW5kZWZpbmVkIGZvciBhYnNlbnQgKHRoZXkgQVJFIHRoZSBhdXRob3JpdHkpLiAqL1xuICAgIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsPzogc3RyaW5nIH0gfCB7IGRhdGE/OiB1bmRlZmluZWQ7IHdyaXRlVGltZT86IHVuZGVmaW5lZDsgc2l6ZT86IHVuZGVmaW5lZDsgdXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD47XG4gICAgLyoqXG4gICAgICogbGFzdE1vZGlmaWVkIHN0YW1wcyB0aGUgd3JpdGUgd2l0aCB0aGF0IGxhc3Qtd3JpdGUgdGltZSBpbnN0ZWFkIG9mIG5vdy4gSWYgaXQgaXMgT0xERVIgdGhhblxuICAgICAqIHRoZSBmaWxlJ3MgY3VycmVudCBsYXN0LXdyaXRlIHRpbWUgdGhlIHdyaXRlIG5vLW9wcyAoc28gZGVsYXllZCAvIHN5bmNocm9uaXplZCB3cml0ZXMgY2FuXG4gICAgICogbmV2ZXIgY2xvYmJlciBuZXdlciBkYXRhKS4gVGltZXMgbW9yZSB0aGFuIDE1IG1pbnV0ZXMgaW4gdGhlIGZ1dHVyZSBhcmUgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIGtleSBhY3R1YWxseSB3cml0dGVuIC0gaWRlbnRpY2FsIHRvIGZpbGVOYW1lLCBFWENFUFQgZm9yIGtleXMgY29udGFpbmluZ1xuICAgICAqIFZBUklBQkxFX1NIQVJELCB3aGVyZSB0aGUgc2hhcmQgdmFsdWUgaXMgbWF0ZXJpYWxpemVkIGludG8gdGhlIGtleSAocGlja2VkIGJ5IHNoYXJkIGxhdGVuY3ksXG4gICAgICogc2VlIEFyY2hpdmVzQ2hhaW4pIGFuZCB0aGUgY2FsbGVyIG5lZWRzIHRoZSByZXR1cm5lZCBrZXkgdG8gZXZlciByZWFkIHRoZSB2YWx1ZSBiYWNrLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFRIUk9XUyBvbiBhbiBlbXB0eSBidWZmZXI6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSAodGhlIHRvbWJzdG9uZSksIHNvIGFcbiAgICAgKiBzZXQtZW1wdHkgd291bGQgcmVhZCBiYWNrIGFzIFwidGhlIGZpbGUgaXMgZ29uZVwiIC0gd2hpY2ggaXMganVzdCBhc2tpbmcgZm9yIHByb2JsZW1zLiBJZiB5b3VcbiAgICAgKiB3YW50IHRoZSBmaWxlIGRlbGV0ZWQsIGNhbGwgZGVsOyBkZWxldGlvbnMgdGFrZSB0aGVpciBvd24gcGF0aC5cbiAgICAgKi9cbiAgICBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IERlbENvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIE1vdmVzIGEgZmlsZSB0byBhIG5ldyBwYXRoIHdpdGhpbiBUSElTIGFyY2hpdmVzLCBiYWNrZW5kLXNpZGUgd2hlcmUgdGhlIGJhY2tlbmQgY2FuIChiYWNrYmxhemUgY29waWVzIHNlcnZlci1zaWRlLCBkaXNrIHJlbmFtZXMsIHRoZSBzdG9yYWdlIHNlcnZlciByZWxvY2F0ZXMgbm9kZS1zaWRlKSAtIHRoZSBieXRlcyBuZXZlciB0cmF2ZWwgdGhyb3VnaCB0aGUgY2FsbGVyLiBUaGUgZGVzdGluYXRpb24gaXMgc3RhbXBlZCB3aXRoIGEgRlJFU0ggd3JpdGUgdGltZSwgZXZlbiB3aGVuIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbiAoYSByZW5hbWUpIHdvdWxkIHByZXNlcnZlIHRoZSBvbGQgb25lLCBzbyB0aGUgbW92ZWQgZmlsZSBjYW5ub3QgaW1tZWRpYXRlbHkgbG9zZSB0byBzb21ldGhpbmcgbmV3ZXIgc2l0dGluZyBhdCBpdHMgbmV3IHBhdGggKGUuZy4gdGhlIHRvbWJzdG9uZSBvZiBhbiBlYXJsaWVyIGRlbGV0aW9uIHRoZXJlKTsgdGhlIHNvdXJjZSBpcyB0aGVuIGRlbGV0ZWQsIGV4YWN0bHkgbGlrZSBkZWwuIFRIUk9XUyB3aGVuIHRoZSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3B0aW9uYWwgLSBjYWxsZXJzIGdvIHRocm91Z2ggbW92ZUFyY2hpdmVGaWxlIChhcmNoaXZlSGVscGVycy50cyksIHdoaWNoIGZhbGxzIGJhY2sgdG8gY29weSArIGNvbmZpcm0gKyBkZWxldGUuICovXG4gICAgbW92ZT8oY29uZmlnOiBNb3ZlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIFJlc3RvcmVzIGEgZGVsZXRlZCBmaWxlIHdob3NlIGJ5dGVzIGFyZSBzdGlsbCBpbiB0aGUgZGVsZXRpb24gaGlzdG9yeSAoc2VlIFNldENvbmZpZy51bmRlbGV0ZSwgd2hpY2ggdGhpcyByaWRlcyBvbikuIE9ubHkgaW5kZXgtYmFja2VkIHN0b3JlcyBrZWVwIGEgZGVsZXRpb24gaGlzdG9yeSwgc28gb25seSB0aGV5IHN1cHBvcnQgdGhpcy4gVEhST1dTIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byByZXN0b3JlLiAqL1xuICAgIHVuZGVsZXRlPyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICAvKiogU3RyZWFtcyBhIGZpbGUgdG9vIGxhcmdlIHRvIGhvbGQgaW4gbWVtb3J5LiBnZXROZXh0RGF0YSByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIGRvbmUuIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgd2hlbiB5b3UgQ0FOTk9UIG1hdGVyaWFsaXplIHRoZSBlbnRpcmUgZmlsZSBpbiBtZW1vcnkgLSBpZiB5b3UgY2FuLCBqdXN0IGNhbGwgc2V0OiBhYm92ZSBMQVJHRV9TRVRfVEhSRVNIT0xEIGl0IHN0cmVhbXMgdGhyb3VnaCBzZXRMYXJnZUZpbGUgaW50ZXJuYWxseSwga2VlcGluZyB0aGUgY2xpZW50IHJlc3BvbnNpdmUgYW5kIG5vdCBvdmVyd2hlbG1pbmcgdGhlIHNlcnZlci4gVGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyBpcyBhIHBsYWluIFNldENvbmZpZyBhbmQgbWVhbnMgZXhhY3RseSB3aGF0IGl0IG1lYW5zIG9uIHNldCAodGhhdCBpcyB3aGF0IG1ha2VzIGEgbGFyZ2Ugc2V0IGJlaGF2ZSBsaWtlIGEgc21hbGwgb25lIGluc3RlYWQgb2YgcXVpZXRseSBsb3NpbmcgaW1tdXRhYmlsaXR5LCBvcmRlcmluZywgaW50ZXJuYWwsIG9yIGZhbGxiYWNrcyBzZW1hbnRpY3MgYXMgdGhlIGZpbGUgY3Jvc3NlcyB0aGUgdGhyZXNob2xkKTsgYmFja2VuZHMgdGhhdCBzdGFtcCB0aGVpciBvd24gdGltZXMgKGJhY2tibGF6ZSkgYWNjZXB0IGFuZCBpZ25vcmUgbGFzdE1vZGlmaWVkLiBUSFJPV1Mgd2hlbiB0aGUgc3RyZWFtIHByb2R1Y2VzIG5vIGRhdGEgYXQgYWxsIC0gc2FtZSBydWxlIGFzIHNldDogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZy4gKi9cbiAgICBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiB3cml0ZVRpbWUgaXMgdGhlIGxhc3Qtd3JpdGUgdGltZSDigJQgc2VlIEFyY2hpdmVGaWxlSW5mby5jcmVhdGVUaW1lLCB3aGljaCBpcyB0aGUgc2FtZSB2YWx1ZS4gdXJsIGFzIGluIGdldDIuIFNpemUtMCBlbnRyaWVzICh0b21ic3RvbmVzKSByZXBvcnQgdW5kZWZpbmVkIHVubGVzcyBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMuICovXG4gICAgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybD86IHN0cmluZyB9IHwgdW5kZWZpbmVkPjtcbiAgICAvKipcbiAgICAgKiBFbXB0eSAoc2l6ZS0wKSBmaWxlcyBhcmUgTkVWRVIgcmV0dXJuZWQgYnkgaW5kZXgtYmFja2VkIHN0b3JlcyAoQmxvYlN0b3JlLCBhbmQgdGhlcmVmb3JlIHRoZVxuICAgICAqIGNoYWluKTogYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSAtIHRoZSB0b21ic3RvbmUgb2YgYSBkZWxldGlvbi4gSWYgeW91IHdhbnQgYSBtYXJrZXJcbiAgICAgKiBmaWxlIHRoYXQgc2hvd3MgdXAgaW4gbGlzdGluZ3MsIGFkZCBzb21lIGNvbnRlbnQgdG8gaXQuIFJhdyBzb3VyY2VzIChkaXNrLCBiYWNrYmxhemUpIERPIGxpc3RcbiAgICAgKiB0aGVpciBlbXB0eSBmaWxlcyAtIHRoYXQgaXMgaG93IHNjYW5zIGxlYXJuIG9mIGRlbGV0aW9ucyAtIGJ1dCBub3RoaW5nIGJ1aWx0IG9uIHRoZSBpbmRleFxuICAgICAqIGV2ZXIgc3VyZmFjZXMgdGhlbS5cbiAgICAgKi9cbiAgICBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgLyoqIFNlZSBmaW5kIGZvciB0aGUgZW1wdHktZmlsZSAodG9tYnN0b25lKSBydWxlLiAqL1xuICAgIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgLyoqIE9ubHkgd29ya3MgZm9yIHB1YmxpYyBidWNrZXRzIChwcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seSkuICovXG4gICAgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAvKiogVGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24sIHdoaWNoIHRlbGxzIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLiAqL1xuICAgIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPjtcbiAgICAvKipcbiAgICAgKiBBbGwgZmlsZXMgY2hhbmdlZCBhZnRlciBjb25maWcudGltZSwgb3B0aW9uYWxseSByZXN0cmljdGVkIHRvIGtleXMgcm91dGluZyBpbnRvIG9uZSBvZlxuICAgICAqIGNvbmZpZy5yb3V0ZXMgKHVzZWQgYnkgc2Nhbm5pbmcsIHNvIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZHMgb25seSByZWNlaXZlIHRoZWlyIHNsaWNlKS5cbiAgICAgKiBXaGVuIGdldENvbmZpZygpLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCB0aGlzIGlzIGJhY2tlZCBieSBhbiBpbmRleCAoZmFzdCwgYW5kIGRlbGV0aW9ucyBBUkVcbiAgICAgKiByZXBvcnRlZCwgYXMgc2l6ZS0wIHRvbWJzdG9uZSBlbnRyaWVzKS4gRXZlcnkgb3RoZXIgYmFja2VuZCBlbXVsYXRlcyBpdDogYSBmdWxsIGZpbmRJbmZvXG4gICAgICogbGlzdGluZyBmaWx0ZXJlZCBpbiBtZW1vcnkgLSBjb3JyZWN0LCBidXQgbm8gY2hlYXBlciB0aGFuIHRoZSBsaXN0aW5nIGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgLyoqIFN5bmNocm9uaXphdGlvbiBpbnRyb3NwZWN0aW9uLCBmb3IgYmFja2VuZHMgdGhhdCBzeW5jaHJvbml6ZSBmcm9tIHNvdXJjZXMgKHNlZSBCbG9iU3RvcmUpLiAqL1xuICAgIGdldFN5bmNTdGF0dXM/KCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPjtcbn1cbiJdfQ==
|
|
62
|
-
/* _JS_SOURCE_HASH = "
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUFyY2hpdmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSUFyY2hpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3S0FBd0s7OztBQUV4SyxzSkFBc0o7QUFDekksUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2RCx5TEFBeUw7QUFDNUssUUFBQSxvQkFBb0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pELFNBQWdCLHVCQUF1QixDQUFDLFlBQW9CO0lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQ0FBd0IsQ0FBQztJQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxZQUFZLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7QUFDTCxDQUFDO0FBTEQsMERBS0M7QUFFRDs7d0RBRXdEO0FBQ3hELFNBQWdCLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsU0FBaUI7SUFDaEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMscUNBQXFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0FBQ0wsQ0FBQztBQUpELDRDQUlDO0FBdUZZLFFBQUEsaUJBQWlCLEdBQXFCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBNEloRix3WEFBd1g7QUFDM1csUUFBQSwwQkFBMEIsR0FBRyw0Q0FBNEMsQ0FBQztBQUV2Riw4TEFBOEw7QUFDakwsUUFBQSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUV6RSx1V0FBdVc7QUFDMVYsUUFBQSxzQkFBc0IsR0FBRyx3Q0FBd0MsQ0FBQztBQUVsRSxRQUFBLFVBQVUsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFbkQsMlJBQTJSO0FBQzlRLFFBQUEsY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBQzVFLG9MQUFvTDtBQUNwTCw4SkFBOEo7QUFDOUosU0FBZ0IsbUJBQW1CLENBQUMsV0FBeUM7SUFDekUsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM5QixPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUhELGtEQUdDO0FBQ0QsaU5BQWlOO0FBQ2pOLFNBQWdCLG1CQUFtQixDQUFDLFlBQWdDO0lBQ2hFLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFGRCxrREFFQztBQUVELHdLQUF3SztBQUMzSixRQUFBLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRW5ELG1SQUFtUjtBQUNuUixTQUFnQixpQkFBaUIsQ0FBQyxJQUFZO0lBQzFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLE9BQU87UUFDSCxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDNUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLDJCQUFtQixDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDaEIsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQztBQWJELDhDQWFDO0FBRUQsd0pBQXdKO0FBQ3hKLG1EQUFtRDtBQUExQyxpSEFBQSxlQUFlLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgaW1wb3J0YW50IG9wZXJhdGlvbnMgb2YgYW4gYXJjaGl2ZSBidWNrZXQgKGV4dHJhY3RlZCBmcm9tIEFyY2hpdmVzQmFja2JsYXplKSwgc28gb3RoZXIgYmFja2VuZHMgKGUuZy4gb3VyIG93biByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIpIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseS5cblxuLy8gQSB3cml0ZSBtYXkgbm90IGJlIHN0YW1wZWQgbW9yZSB0aGFuIHRoaXMgZmFyIGluIHRoZSBmdXR1cmUsIG9yIGNsb2NrIHNrZXcgYmV0d2VlbiBtYWNoaW5lcyB3b3VsZCBsZXQgYSBiYWQgdGltZXN0YW1wIGJsb2NrIHdyaXRlcyBmb3IgYSBsb25nIHRpbWUuXG5leHBvcnQgY29uc3QgTUFYX0xBU1RfTU9ESUZJRURfRlVUVVJFID0gMTUgKiA2MCAqIDEwMDA7XG5cbi8vIEhvdyBsb25nIGJyb3dzZXJzIG1heSBjYWNoZSBmaWxlcyBmcm9tIGltbXV0YWJsZSBidWNrZXRzICh0aGUgQ2FjaGUtQ29udHJvbCBtYXgtYWdlKSwgc2hhcmVkIGJ5IGV2ZXJ5IGhvc3RpbmcgcGF0aCAoYmFja2JsYXplIGJ1Y2tldCBzZXR0aW5ncyBhbmQgb3VyIG93biBzdG9yYWdlIHNlcnZlcidzIEhUVFAgcm91dGUpXG5leHBvcnQgY29uc3QgSU1NVVRBQkxFX0NBQ0hFX1RJTUUgPSA4NjQwMCAqIDEwMDA7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgbWF4ID0gRGF0ZS5ub3coKSArIE1BWF9MQVNUX01PRElGSUVEX0ZVVFVSRTtcbiAgICBpZiAobGFzdE1vZGlmaWVkID4gbWF4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbGFzdE1vZGlmaWVkIGlzIHRvbyBmYXIgaW4gdGhlIGZ1dHVyZTogJHtsYXN0TW9kaWZpZWR9ID4gJHttYXh9IChub3cgKyAxNSBtaW51dGVzKWApO1xuICAgIH1cbn1cblxuLyoqIEV2ZXJ5IGZpbGUtYWRkcmVzc2VkIG9wZXJhdGlvbiBjaGVja3MgdGhpcyBhdCBpdHMgZW50cnkgcG9pbnQsIHNvIGFuIGVtcHR5IG5hbWUgZmFpbHMgcmlnaHRcbiAgICB3aGVyZSBpdCB3YXMgcGFzc2VkIC0gd2l0aCB0aGUgY2FsbGVyIGluIHRoZSBzdGFjayAtIGluc3RlYWQgb2Ygc3VyZmFjaW5nIGFzIGEgYmFmZmxpbmcgYmFja2VuZFxuICAgIHJlamVjdGlvbiBhZnRlciB0aGUgcmV0cnkgbG9vcHMgYXJlIGRvbmUgd2l0aCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFmaWxlTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgZmlsZSBuYW1lYCk7XG4gICAgfVxufVxuXG5cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBOT1RFOiBWZXJzaW9uIGlzIHVzZWQgd2hlbiB1cGRhdGluZyB0aGUgY29uZmlndXJhdGlvbi4gVGhlIG5ld2VyIHZlcnNpb24gaXMgYWx3YXlzIHRha2VuLiBBIG1pc3NpbmcgdmVyc2lvbiBjb3VudHMgYXMgdmVyc2lvbiAtMS5cbiAgICB2ZXJzaW9uPzogbnVtYmVyO1xuICAgIHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXTtcbn07XG5cbi8qKlxuICAgIHN0cmluZyBhcmd1bWVudHMgd2lsbCBiZSBhIHVybCwgbG9va2luZyBsaWtlOlxuICAgICAgICBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvcXVlcnlzdWJ0ZXN0LWNvbS1wdWJsaWMtaW1tdXRhYmxlL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgICAgICAtIFRoZXNlIG1hcCB0byB7IHVybCB9LCB3aXRoIHRoZSB0eXBlIGluZmVycmVkIGZyb20gdGhlIHVybFxuICAgICAgICAtIEhvc3RlZCB1cmxzIGFyZSAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiwgYmFja2JsYXplIHVybHMgYXJlIC9maWxlLzxidWNrZXROYW1lPi8uLi5cblxuICAgIE5PVEU6IElmIHdlIGRvIG5vdCBoYXZlIHJpZ2h0IGFjY2VzcyB0byB0aGVzZSwgdGhlbiBpdCBiZWNvbWVzIGEgcmVhZC1vbmx5IElBcmNoaXZlcywgd2hlcmUgd2Ugc29sZWx5IHJlYWQgdXNpbmcgdGhlIHVybCBmb3JtICh3aGljaCBtaWdodCB0aHJvdyBkdWUgdG8gbm90IGhhdmluZyBhY2Nlc3MgYXMgd2VsbCkuIFVOTEVTUyBPdXIgY29uZmlndXJhdGlvbiBleHBsaWNpdGx5IGhhcyBwdWJsaWM6IGZhbHNlLCBpbiB3aGljaCBjYXNlLCB3ZSBkb24ndCBldmVuIGhpdCB0aGUgVVJMIGFuZCB3ZSB0aHJvdyBvbiBhY2Nlc3MuXG5cbiAgICBOT1RFOiBJZiB3ZSdyZSBpbiB0aGUgYnJvd3Nlciwgd2Ugc2hvdWxkIGFsbG93IGRvd25sb2FkaW5nIHRoZSBmaWxlcyB2aWEgdGhlIFVSTCBmb3JtIChpZiBpdCdzIGEgcHVibGljIGJ1Y2tldCksIGhvd2V2ZXIsIHdlIHdvbid0IGFsbG93IHdyaXRpbmcsIGJlY2F1c2UgdGhlaXIgc2VydmVycyBkbyBub3QgYWxsb3cgc2VjdXJlIGJyb3dzZXIgd3JpdGVzLlxuKi9cbmV4cG9ydCB0eXBlIFJlbW90ZUNvbmZpZ0Jhc2UgPSBzdHJpbmcgfCBTb3VyY2VDb25maWc7XG5cbi8qKiBPbmUgY29uZmlndXJlZCBzb3VyY2UgaW4gYSByb3V0aW5nIGNvbmZpZzogYSBob3N0ZWQgKG91ciBzdG9yYWdlIHNlcnZlcikgb3IgYmFja2JsYXplIGVudHJ5LiBSZXF1ZXN0cyBjYXJyeSB0aGUgZXhhY3QgU291cmNlQ29uZmlnIHRoZXkgc2VsZWN0ZWQsIGFuZCB0aGUgc2VydmVyIG1hdGNoZXMgaXQgYWdhaW5zdCBpdHMgb3duIGVudHJpZXMgdG8gcGljayB0aGUgYmFja2luZyBzdG9yZS4gKi9cbmV4cG9ydCB0eXBlIFNvdXJjZUNvbmZpZyA9IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZztcblxuZXhwb3J0IHR5cGUgQ29tbW9uQ29uZmlnID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdG9yYWdlIHRoaXMgZW50cnkgbmFtZXMsIGFzIG9wcG9zZWQgdG8gdGhlIHJ1bGVzIGZvciB1c2luZyBpdC4gRXZlcnkgZW50cnkgd2l0aCB0aGUgc2FtZVxuICAgICAqIG5hbWUgKGZvciB0aGUgc2FtZSBhY2NvdW50IGFuZCBidWNrZXQpIElTIHRoZSBzYW1lIHN0b3JhZ2U6IG9uZSBmb2xkZXIgb24gdGhlIHNlcnZlciwgb25lXG4gICAgICogc3RvcmUsIG9uZSBpbmRleCAtIGhvd2V2ZXIgbWFueSBlbnRyaWVzIHRoZXJlIGFyZSBhbmQgd2hhdGV2ZXIgdGhlaXIgd2luZG93cyBhbmQgcm91dGVzIHNheS5cbiAgICAgKiBFdmVyeXRoaW5nIGFib3V0IFdIRU4gYW5kIFdISUNIIEtFWVMgKHZhbGlkV2luZG93LCByb3V0ZSkgaXMgcG9saWN5IGxheWVyZWQgb24gdG9wIG9mIGl0LCBhbmRcbiAgICAgKiBjaGFuZ2luZyB0aGF0IHBvbGljeSBuZXZlciBtb3ZlcyBkYXRhLlxuICAgICAqXG4gICAgICogTGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZSwgZGFzaCBhbmQgcGVyaW9kcywgdXAgdG8gNjQgY2hhcmFjdGVycyAtIHNvIGEgaG9zdCBvciBhIHZlcnNpb25cbiAgICAgKiBjYW4gYmUgdXNlZCBhcy1pcy4gSXQgaXMgdGhlIGZvbGRlciBuYW1lLCBzbyBpdCBtdXN0IHN0YXkgdW5pcXVlIGFuZCBtdXN0IG5ldmVyIGJlIHJldXNlZCBmb3JcbiAgICAgKiBkaWZmZXJlbnQgc3RvcmFnZTpcbiAgICAgKiBwb2ludGluZyB0d28gdW5yZWxhdGVkIGVudHJpZXMgYXQgb25lIG5hbWUgbWVyZ2VzIHRoZWlyIGRhdGEsIGFuZCByZS11c2luZyBhIHJldGlyZWQgbmFtZVxuICAgICAqIGhhbmRzIHRoZSBuZXcgZW50cnkgdGhlIHJldGlyZWQgb25lJ3MgZmlsZXMuIERlY2lkaW5nIHRoYXQgaXMgdGhlIGRldmVsb3BlcidzIGpvYiAtIHRoZSBzZXJ2ZXJcbiAgICAgKiBvbmx5IGV2ZXIgZG9lcyB3aGF0IHRoZSBuYW1lIHNheXMuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBCeSBkZWZhdWx0IGEgc2VydmVyIGhvc3RpbmcgdGhpcyBidWNrZXQgZWFnZXJseSBjb3BpZXMgdGhpcyBzb3VyY2UncyBmdWxsIGNvbnRlbnRzIG9udG8gaXRzIG93biBkaXNrIChvbiB0b3Agb2YgdGhlIGxhenkgcmVhZC10aHJvdWdoIGNhY2hpbmcpLiBTZXQgdGhpcyB0byBiZSBhIGZyb250IGVuZCBmb3IgYSB2ZXJ5IGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyB0aGUgZnVsbCBkYXRhYmFzZSAtIHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgaW5kaXZpZHVhbCBmaWxlcyBvbiBkZW1hbmQuICovXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQtY2FjaGUgdGhpcyBzZXJ2ZXIncyBkaXNrIG1heSBob2xkOyBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gZGlzayB0byBzdGF5IHVuZGVyIGl0IChvbmx5IGV2ZXIgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIHRoZSBmaWxlIC0gdGhlIG9ubHkgY29weSBpcyBuZXZlciBkZWxldGVkKS4gUmVxdWlyZXMgbm9GdWxsU3luYyAoYSBmdWxsIGNvcHkgY2FuJ3QgYmUgYm91bmRlZCkuICovXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgd3JpdGUgdGltZXMgKFtzdGFydE1zLCBlbmRNc10pIHRoaXMgc291cmNlIGlzIHZhbGlkIGZvciAoc2VlIEFyY2hpdmVzU291cmNlLnZhbGlkV2luZG93IGZvciB0aGUgc3luY2hyb25pemF0aW9uIHNlbWFudGljcykuIFJlcXVpcmVkIG9uIG9iamVjdCBjb25maWdzOiBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBTQ0hFRFVMRUQgKGEgbmV3IHNvdXJjZSBiZWNvbWVzIHZhbGlkIGF0IGEgZnV0dXJlIHRpbWUgd2hpbGUgdGhlIG9sZCBvbmUncyB3aW5kb3cgZW5kcyksIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gUGxhaW4gVVJMLXN0cmluZyBzb3VyY2VzIGRlZmF1bHQgdG8gRlVMTF9WQUxJRF9XSU5ET1cgLSBvbmNlIHlvdSdyZSB3cml0aW5nIG9iamVjdCBjb25maWdzLCB5b3UncmUgZG9pbmcgc29tZXRoaW5nIGNvbXBsaWNhdGVkIGVub3VnaCB0byB0aGluayBhYm91dCB3aGVuIHRoaW5ncyBjaGFuZ2UuICovXG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLyoqIFNoYXJkaW5nOiB0aGUgZnJhY3Rpb24gb2YgdGhlIGtleSBzcGFjZSB0aGlzIHNvdXJjZSBoYW5kbGVzLCBhcyBbc3RhcnQsIGVuZCkgb3ZlciBbMCwgMSkgKGtleXMgYXJlIHJvdXRlZCBieSBnZXRSb3V0ZSBpbiByZW1vdGVDb25maWcudHMpLiBEZWZhdWx0cyB0byBGVUxMX1JPVVRFICh1bnNoYXJkZWQpLiBBdCBldmVyeSBwb2ludCBpbiB0aW1lIHRoZSBzb3VyY2VzJyByb3V0ZXMgbXVzdCBmdWxseSBjb3ZlciBbMCwgMSksIG9yIHNvbWUga2V5cyBjb3VsZCBuZXZlciBiZSByZWFkLiAqL1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICAvKiogU2V0IG9uIGVudHJpZXMgaW5qZWN0ZWQgaW50byB0aGUgaW4tbWVtb3J5IGNvbmZpZyBieSBhbiBvdmVybGF5IChhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgd2luZG93KS4gTmV2ZXIgd3JpdHRlbiB0byBkaXNrOiByZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyBzdHJpcHMgdGhlc2UgYW5kIHJlam9pbnMgdGhlIHdpbmRvd3MgYXJvdW5kIHRoZW0sIHdoaWNoIGlzIGFsc28gaG93IGEgY2xpZW50IHRlbGxzIHdoZXRoZXIgYW4gdXBkYXRlIGlzIGEgcmVhbCBjb25maWd1cmF0aW9uIGNoYW5nZSBvciBqdXN0IGFuIG92ZXJsYXkuIFRoZSBWQUxVRSBpcyB0aGUgdXJsIG9mIHRoZSBzb3VyY2UgdGhpcyBpbnRlcm1lZGlhdGUgd2FzIHNwbGl0IG91dCBvZiAoaXRzIGFsdGVybmF0ZS1wb3J0IHZpZXcpIC0gc28gYSByZXF1ZXN0IG5hbWluZyB0aGUgaW50ZXJtZWRpYXRlIHN0aWxsIHJlc29sdmVzIHRvIHRoZSBPUklHSU5BTCBzb3VyY2UsIGV2ZW4gYWZ0ZXIgdGhlIGludGVybWVkaWF0ZSByZWpvaW5zIGFuZCB0aGUgZW50cnkgaXMgZ29uZS4gKi9cbiAgICBpbnRlcm1lZGlhdGU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBIb3N0ZWRDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJyZW1vdGVcIjtcblxuICAgIC8vIEV4OiBodHRwczovLzk5LTI1MC0xMjQtOTEucXVlcnlzdWJ0ZXN0LmNvbTo1MjMzL2ZpbGUvcm9vdC91bmlxdWVidWNrZXRuYW1lL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIC8vIE5PVEU6IFRoZSBhY2NvdW50IGFuZCBidWNrZXQgbmFtZSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuXG4gICAgLy8gTk9URTogQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCBieSBjZXJ0LnRzLCB2aWEgaGF2aW5nIHlvdXIgbWFjaGluZSB0cnVzdGVkIHRvIGFjY2VzcyB0aGlzIGFjY291bnQuIFxuXG4gICAgcHVibGljPzogYm9vbGVhbjtcbiAgICAvLyBGYXN0IG1vZGU6IHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHdyaXRlcyBvbmNlIHRoZXkgYXJlIGluIG1lbW9yeSwgZmx1c2hpbmcgdG8gZGlzayBhZnRlciB3cml0ZURlbGF5IChkZWZhdWx0IDUgbWludXRlcykgYW5kIGNvYWxlc2Npbmcgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUuIEEgc2VydmVyIGNyYXNoIGxvc2VzIHdyaXRlcyB0aGF0IGhhdmVuJ3QgZmx1c2hlZCB5ZXQuXG4gICAgZmFzdD86IGJvb2xlYW47XG4gICAgd3JpdGVEZWxheT86IG51bWJlcjtcbiAgICAvLyBXcml0ZXMgdG8gcGF0aHMgdGhhdCBhbHJlYWR5IGV4aXN0IGFyZSBkaXNhbGxvd2VkIChkZWxldGVzIHN0aWxsIHdvcmspLlxuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrYmxhemVDb25maWcgPSBDb21tb25Db25maWcgJiB7XG4gICAgdHlwZTogXCJiYWNrYmxhemVcIjtcbiAgICAvLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbiAgICAvLyBOT1RFOiBUaGUgYnVja2V0IG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUgVVJMLlxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIFB1YmxpYyBidWNrZXRzIGFyZSBzZXJ2ZWQgb3ZlciBwbGFpbiBIVFRQUyBHRVRzIChnZXRVUkwpLiBQcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seS5cbiAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgIC8vIE5PVEU6IFRoaXMgaXNuJ3QgZW5mb3JjZWQgb24gdGhlIGJhY2tibGF6ZSBsZXZlbCwgc28gdGhpcyBpcyBqdXN0IGEgY2xpZW50LXNpZGUgZ3VhcmFudGVlLiBUaGlzIGNhbiBjaGFuZ2UgaG93IHdlIGNhY2hlIGZpbGVzLlxuICAgIC8vICAtIEJhY2tibGF6ZSBkb2VzIHN1cHBvcnQgaW1tdXRhYmlsaXR5LiBIb3dldmVyLCBhcHBhcmVudGx5LCBvbmNlIHdlIGVuYWJsZSBpdCBvbiBhIGJ1Y2tldCwgd2UgY2FuJ3QgZGlzYWJsZSBpdCwgd2hpY2ggaXMgcmVhbGx5IGJhZCwgYXMgaXQgbWVhbnMgaWYgb3VyIGNvZGUgY291bGQgZXZlciBlbmFibGUgaXQgYW5kIHdlIGFjY2lkZW50YWxseSBlbmFibGUgaXQgb24gYW4gaW1wb3J0YW50IGJ1Y2tldCwgd2UgZXNzZW50aWFsbHkganVzdCBicmlja2VkIHRoYXQgYnVja2V0LiBTbyB3ZSBzaG91bGQgbmV2ZXIgd3JpdGUgYW55IGNvZGUgdGhhdCBldmVyIHRyaWVzIHRvIHVzZSBiYWNrYmxhemUgdG8gbWFrZSB0aGluZ3MgaW1tdXRhYmxlLiBcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIC8vIENPUlMgb3JpZ2lucyBhbGxvd2VkIHRvIGNvbnN1bWUgdGhlIGJ1Y2tldCdzIGZpbGVzIGluIGEgYnJvd3Nlci4gTm90IGEgc2VjdXJpdHkgYm91bmRhcnkgKGFjY2VzcyBpcyBnYXRlZCBieSB0aGUgQVBJIGtleSAvIHNpZ25lZCBVUkxzLCBuZWl0aGVyIG9mIHdoaWNoIHJpZGVzIGluIGNvb2tpZXMpIC0gaXQgb25seSBjb250cm9scyB3aGljaCBzaXRlcycgaW4tcGFnZSBKYXZhU2NyaXB0IGNhbiByZWFkIHJlc3BvbnNlcy4gRGVmYXVsdHMgdG8gYW55IEhUVFBTIG9yaWdpbi5cbiAgICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuXG4gICAgLy8gTk9URTogV2Ugd2lsbCBhY2Nlc3MgdGhlIGFwaSBrZXkgZnJvbSBnZXRTZWNyZXQsIHNlZSBiYWNrYmxhemUudHMgZm9yIHRoZSBzcGVjaWZpYyBrZXlzLlxufTtcblxuXG5leHBvcnQgY29uc3QgRlVMTF9WQUxJRF9XSU5ET1c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJdO1xuXG5cblxuXG5leHBvcnQgdHlwZSBHZXRDb25maWcgPSB7XG4gICAgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gICAgLyoqIFJlYWQgT05MWSBmcm9tIHRoZSBwcmltYXJ5IHNvdXJjZSAtIHRoZSBvbmUgd3JpdGVzIHdvdWxkIHRhcmdldCAtIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMuIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgeW91ciByZWFkcyBhbmQgd3JpdGVzIHRvIGJlIHNvbWV3aGF0IGF0b21pYzogdGhlcmUgd2lsbCBzdGlsbCBiZSBpc3N1ZXMgd2l0aCB0aGUgcm91bmQgdHJpcCwgYnV0IHdpdGhvdXQgaXQgeW91IGNvdWxkIHRhbGsgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBub2RlIGFuZCBnZXQgYSBtdWNoIG9sZGVyIHZhbHVlLiBNb3N0IHJlYWRzIGFyZW4ndCBmb2xsb3dlZCBieSBhIHdyaXRlIHRob3VnaCwgc28gZm9yIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIgdG8gZ2V0IGEgdmFsdWUgdGhhbiB0byBoYXZlIHRvIHdhaXQgKG9yIGV2ZW4gdGhyb3cpIHdoZW4gdGhlIHByaW1hcnkgbm9kZSBpcyBub3QgYXZhaWxhYmxlLiAqL1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU3RvcmUtdG8tc3RvcmUgY2FsbDogdGhlIHNlcnZpbmcgbm9kZSBuZXZlciBjb25zdWx0cyBpdHMgT1RIRVIgc291cmNlcyAtIGNoYXNpbmcgaXRzIG93biByZW1vdGUgaG9sZGVycyB3aGlsZSBhbnN3ZXJpbmcgYW5vdGhlciBzdG9yZSBpcyBob3cgaW5maW5pdGUgZ2V0IGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0gKEEgYXNrcyBCLCBCJ3MgaW5kZXggcG9pbnRzIGJhY2sgYXQgQSwgLi4uKS4gVGhhdCBpcyB0aGUgZmxhZydzIEVOVElSRSBtZWFuaW5nOiBubyBmYWxsYmFja3MsIG5vdGhpbmcgZWxzZS4gVGhlIHJlYWQgaXMgb3RoZXJ3aXNlIGZ1bGx5IGNvcnJlY3QgLSB0aGUgbm9kZSdzIGluZGV4IHN0aWxsIGdhdGVzIGl0IChhIGtleSBpdHMgaW5kZXggc2F5cyBpcyBkZWxldGVkIGFuc3dlcnMgYXMgZGVsZXRlZCwgbmV2ZXIgYXMgdGhlIGhpc3RvcnkgYnl0ZXMgc3RpbGwgc2l0dGluZyBvbiBpdHMgZGlzaykuIE5vIHdpbmRvdyBvciByb3V0ZSBjaGVja3Mgb24gcmVhZHMuICovXG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIC8qKiBBbHNvIHJldHVybiBzaXplLTAgcmVzdWx0cyAodG9tYnN0b25lcyAtIGFuIGVtcHR5IGZpbGUgSVMgYSBtaXNzaW5nIGZpbGUpIGluc3RlYWQgb2YgdHJlYXRpbmcgdGhlbSBhcyBhYnNlbnQuIE9mZiBieSBkZWZhdWx0LCBtYXRjaGluZyBnZXRJbmZvJ3MgZmxhZyBvZiB0aGUgc2FtZSBuYW1lLiBTeW5jaHJvbml6YXRpb24gcGFzc2VzIHRoaXMgc28gYSBERUxFVEVEIGZpbGUgKHdpdGggaXRzIHdyaXRlIHRpbWUpIGlzIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZmlsZSB0aGF0IG5ldmVyIGV4aXN0ZWQuICovXG4gICAgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuO1xuICAgIC8qKiBSZWFkcyBmaWxlcyB0aGF0IGFyZSBNQVJLRUQgZm9yIGRlbGV0aW9uIChkZWxldGVkLCBidXQgd2l0aCB0aGVpciBieXRlcyBzdGlsbCBpbiB0aGUgZGVsZXRpb24gaGlzdG9yeSAtIHNlZSBTZXRDb25maWcudW5kZWxldGUgZm9yIHJlc3RvcmluZyB0aGVtKS4gVGhlIGFjdHVhbCBjb250ZW50IGNvbWVzIGJhY2ssIHVubGlrZSBpbmNsdWRlVG9tYnN0b25lcywgd2hpY2ggb25seSByZXBvcnRzIHRoYXQgYSBkZWxldGlvbiBoYXBwZW5lZC4gKi9cbiAgICBpbmNsdWRlTWFya2VkPzogYm9vbGVhbjtcbiAgICAvKiogUmVhZCBmcm9tIEVYQUNUTFkgdGhpcyBzb3VyY2UgLSBpdHMgY29uZmlnIHVybCwgYXMgQXJjaGl2ZXNDaGFpbi5nZXRGaWxlU291cmNlcyBsaXN0cyB0aGVtIC0gd2l0aCBubyBmYWxsYmFjayB0byBhbnkgb3RoZXIuIEZvciBjb21wYXJpbmcgdGhlIGNvcGllcyBkaWZmZXJlbnQgc291cmNlcyBob2xkIChjb21iaW5lIHdpdGggaW50ZXJuYWwgdG8gcmVhZCBvbmx5IHRoYXQgc2VydmVyJ3Mgb3duIGRpc2ssIHNraXBwaW5nIGl0cyBob2xkZXIgcmVzb2x1dGlvbikuIE11bHRpLXNvdXJjZSBhcmNoaXZlcyBvbmx5OyB0aHJvd3Mgd2hlbiBubyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhlIHVybC4gKi9cbiAgICBzb3VyY2VVcmw/OiBzdHJpbmc7XG4gICAgLyoqIEhvdyBtYW55IGV4dHJhIHRpbWVzIHRoZSBXSE9MRSBvcGVyYXRpb24gaXMgcmV0cmllZCBhZnRlciBldmVyeSBzb3VyY2UgaW4gYSBwYXNzIGZhaWxlZCAtIGFueSBlcnJvciBjb3VudHMgKHRoZSB3cm9uZy13aW5kb3cvcm91dGUgbWFya2VycyBzdGlsbCBnZXQgdGhlaXIgY29uZmlnIHJlLXJlc29sdmUgZmlyc3QpLiBPbmx5IGFwcGxpZXMgdG8gZmFsbGJhY2sgZGlzcGF0Y2ggKG11bHRpLXNvdXJjZSwgbm90IG5vRmFsbGJhY2tzKSwgd2hlcmUgaXQgZGVmYXVsdHMgdG8gMzsgdGhlIG5vRmFsbGJhY2tzL3dyaXRlLW5vZGUgcGF0aCBhbHJlYWR5IHJldHJpZXMgb24gaXRzIG93biBkZWFkbGluZS4gTXVsdGktcGFydCB1cGxvYWRzIGFkZGl0aW9uYWxseSByZXRyeSBwZXIgcGFydCByZWdhcmRsZXNzIG9mIHRoaXMuICovXG4gICAgcmV0cmllcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbmRDb25maWcgPSB7XG4gICAgc2hhbGxvdz86IGJvb2xlYW47XG4gICAgdHlwZT86IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiO1xuICAgIC8qKiBBbHNvIGxpc3QgZmlsZXMgTUFSS0VEIGZvciBkZWxldGlvbiAoc2VlIEdldENvbmZpZy5pbmNsdWRlTWFya2VkKS4gKi9cbiAgICBpbmNsdWRlTWFya2VkPzogYm9vbGVhbjtcbiAgICAvKiogTGlzdGluZ3Mgbm9ybWFsbHkgY29tZSBPTkxZIGZyb20gdGhlIGF1dGhvcml0YXRpdmUgc291cmNlcyAodGhlIHNhbWUgbm9kZXMgd3JpdGVzIGdvIHRvIC0gcmVhZC15b3VyLXdyaXRlcykuIFdpdGggZmFsbGJhY2tzLCBhIGZhaWxpbmcgc2hhcmQncyByb3V0ZXMgYXJlIGNvdmVyZWQgYnkgdGhlIG5leHQgc291cmNlIGhvbGRpbmcgdGhlbSAoZS5nLiBhIHdpZGUgcmVhZCByZXBsaWNhKSBpbnN0ZWFkIG9mIHRoZSBjYWxsIGZhaWxpbmcgLSBoaWdoIGF2YWlsYWJpbGl0eSBhdCB0aGUgY29zdCBvZiBwb3NzaWJseSBtaXNzaW5nIGp1c3Qtd3JpdHRlbiBkYXRhLiBTaW5nbGUtc291cmNlIGFyY2hpdmVzIGlnbm9yZSB0aGUgZmxhZy4gKi9cbiAgICBmYWxsYmFja3M/OiBib29sZWFuO1xuICAgIC8qKiBTdG9yZS10by1zdG9yZSBsaXN0aW5nOiBvbmx5IGVudHJpZXMgd2hvc2UgYnl0ZXMgdGhlIG5vZGUgSVRTRUxGIGhvbGRzIC0gbmV2ZXIgZW50cmllcyBpdHMgaW5kZXggcmVkaXJlY3RzIHRvIGl0cyBvd24gb3RoZXIgc291cmNlcy4gQSBwZWVyIHJlYWRzIHdpdGggR2V0Q29uZmlnLmludGVybmFsICh3aGljaCBuZXZlciBjaGFzZXMgdGhvc2UgcmVkaXJlY3RzKSwgc28gbGlzdGluZyBhIHJlZGlyZWN0IHdvdWxkIGp1c3QgbWFrZSB0aGUgcGVlciBmbGFnIHRoZSBmaWxlIG1pc3NpbmcsIHB1cmdlIGl0LCByZS1saXN0IGl0LCBhbmQgbG9vcCBmb3JldmVyOyB0aGUgcGVlciBoZWFycyBhYm91dCBzdWNoIGZpbGVzIGZyb20gdGhlIHNvdXJjZSBhY3R1YWxseSBob2xkaW5nIHRoZW0gaW5zdGVhZC4gKi9cbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBEZWxDb25maWcgPSB7XG4gICAgLyoqIFN0YW1wcyB0aGUgZGVsZXRpb24gKGl0cyB0b21ic3RvbmUpIHdpdGggdGhpcyB3cml0ZSB0aW1lIGluc3RlYWQgb2Ygbm93LiBTeW5jaHJvbml6YXRpb24gcGFzc2VzIHRoZSBPUklHSU5BTCBkZWxldGlvbiB0aW1lLCBzbyBkZWxldGlvbiBvcmRlcmluZyBzdXJ2aXZlcyBwcm9wYWdhdGlvbiBleGFjdGx5IGxpa2UgYW55IG90aGVyIHdyaXRlJ3Mgb3JkZXJpbmcuICovXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyO1xuICAgIC8qKiBTZWUgU2V0Q29uZmlnLmludGVybmFsLiAqL1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIFNldENvbmZpZy5ub0NoZWNrcy4gKi9cbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBTZXRDb25maWcuZmFsbGJhY2tzLiAqL1xuICAgIGZhbGxiYWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBHZXRDb25maWcucmV0cmllcy4gKi9cbiAgICByZXRyaWVzPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgR2V0SW5mb0NvbmZpZyA9IHtcbiAgICAvKiogQWxzbyByZXBvcnQgc2l6ZS0wIGVudHJpZXMgKHRvbWJzdG9uZXMgLSBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gT2ZmIGJ5IGRlZmF1bHQsIHNvIGEgZGVsZXRlZCBrZXkgcmVwb3J0cyB1bmRlZmluZWQsIG1hdGNoaW5nIGdldC4gU3luY2hyb25pemF0aW9uLXN0eWxlIGNhbGxlcnMgcGFzcyB0aGlzIHdoZW4gdGhleSBuZWVkIGEgZGVsZXRpb24ncyB3cml0ZSB0aW1lIChlLmcuIHRvIGNvbXBhcmUgaXQgYWdhaW5zdCBhIHdyaXRlIHRoZXkgYXJlIGFib3V0IHRvIG1ha2UpLiAqL1xuICAgIGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIEdldENvbmZpZy5ub0ZhbGxiYWNrczogYW5zd2VyIE9OTFkgZnJvbSB0aGUgcHJpbWFyeSBzb3VyY2UgKHRoZSBvbmUgd3JpdGVzIHdvdWxkIHRhcmdldCkgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgYWNyb3NzIHRoZSByZWR1bmRhbnQgc291cmNlcy4gKi9cbiAgICBub0ZhbGxiYWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFNlZSBHZXRDb25maWcucmV0cmllcy4gKi9cbiAgICByZXRyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBTZWUgR2V0Q29uZmlnLnNvdXJjZVVybDogYW5zd2VyIGZyb20gRVhBQ1RMWSB0aGlzIHNvdXJjZS4gKi9cbiAgICBzb3VyY2VVcmw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzQWZ0ZXJDb25maWcgPSB7XG4gICAgdGltZTogbnVtYmVyO1xuICAgIC8qKiBPbmx5IGtleXMgcm91dGluZyBpbnRvIG9uZSBvZiB0aGVzZSBbc3RhcnQsIGVuZCkgcmFuZ2VzLiBPbmx5IHNjYW5uaW5nIHBhc3NlcyB0aGlzIC0gaXQgbGV0cyBhIHN0b3JlIHN5bmNpbmcgYSBwYXJ0aWFsIHNoYXJkIGFzayBmb3IganVzdCBpdHMgc2xpY2UuICovXG4gICAgcm91dGVzPzogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIC8qKiBTZWUgRmluZENvbmZpZy5pbnRlcm5hbCAtIHRoZSBjaGFuZ2UgZmVlZCBpcyBhIGxpc3RpbmcgdG9vLCBhbmQgcmVkaXJlY3QgZW50cmllcyBmYWlsIGEgcGVlcidzIGludGVybmFsIHJlYWRzIHRoZSBzYW1lIHdheS4gRGVsZXRpb25zIGFyZSBhbHdheXMgcmVwb3J0ZWQgKHRoZXkgYXJlIGluZGV4LW9ubHksIHRoZXJlIGFyZSBubyBieXRlcyB0byBob2xkKS4gKi9cbiAgICBpbnRlcm5hbD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTZXRDb25maWcgPSB7XG4gICAgLyoqIFRoZSB3cml0ZSB0aW1lIHRvIHN0YW1wIChzZWUgSUFyY2hpdmVzLnNldCkuIFJPVU5ERUQgdG8gd2hvbGUgbWlsbGlzZWNvbmRzIGJ5IGV2ZXJ5IGltcGxlbWVudGF0aW9uIC0gdGhlIGRpc2sgY2FuJ3Qgc3RvcmUgZnJhY3Rpb25hbCBtaWxsaXNlY29uZHMgYW55d2F5ICh1dGltZXMgcm91bmQtdHJpcHMgd2hvbGUgbXMpLCBzbyBhIGZyYWN0aW9uYWwgc3RhbXAgY291bGQgbmV2ZXIgYmUgcmVwcm9kdWNlZCBieSBwcm9wYWdhdGlvbiBhbmQgd291bGQgY29tcGFyZSBcIm5ld2VyXCIgdGhhbiBpdHMgb3duIGNvcGllcyBmb3JldmVyLiBSb3VuZGVkIHJhdGhlciB0aGFuIGZsb29yZWQgYmVjYXVzZSB1dGltZXMgZ29lcyB0aHJvdWdoIGEgc2Vjb25kcyBkb3VibGUgYW5kIGNhbiByZWFkIGJhY2sgYSBoYWlyIGJlbG93IHRoZSBzdGFtcGVkIG1pbGxpc2Vjb25kIChzZWUgQXJjaGl2ZXNEaXNrLmdldDIpLiAqL1xuICAgIGxhc3RNb2RpZmllZD86IG51bWJlcjtcbiAgICAvKiogTWFrZXMgdGhlIHdyaXRlIGFjY2VwdGFibGUgb24gaW1tdXRhYmxlIHRhcmdldHM6IGFuIGV4aXN0aW5nIHBhdGggaXMgc2ltcGx5IGtlcHQgKGltbXV0YWJpbGl0eSB3aW5zIC0gbm90aGluZyBpcyBvdmVyd3JpdHRlbikgaW5zdGVhZCBvZiB0aGUgd3JpdGUgdGhyb3dpbmcuIFJlcXVpcmVzIGxhc3RNb2RpZmllZC4gU3luY2hyb25pemF0aW9uIE1VU1QgcGFzcyB0aGlzIG9uIGV2ZXJ5IHB1c2ggLSBhIHBsYWluIHNldCB0aHJvd3Mgb24gaW1tdXRhYmxlIHRhcmdldHMsIHdoaWNoIHdvdWxkIGFib3J0IHJlY29uY2lsaWF0aW9uIHdoZW5ldmVyIG9uZSBzb3VyY2UgaW4gYSBjaGFpbiBpcyBpbW11dGFibGUuICovXG4gICAgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuO1xuICAgIC8qKiBTa2lwcyBSRURVTkRBTlQgdGFyZ2V0LXNpZGUgc2FmZXR5IHJlYWRzIGFyb3VuZCB0aGUgd3JpdGUgKGJhY2tibGF6ZTogdGhlIHBvc3QtdXBsb2FkIGV4aXN0ZW5jZSBwb2xsKS4gSXQgZG9lcyBOT1Qgc2tpcCBjaGVja3MgdGhhdCBhcmUgdGhlIHRhcmdldCdzIG9ubHkgb3JkZXJpbmcgZ3VhcmQ6IGJhY2tibGF6ZSdzIHByZS13cml0ZSBjb21wYXJpc29uIHN0YXlzLCBiZWNhdXNlIGIyIGhhcyBubyBzZXJ2ZXIgb2Ygb3VycyBlbmZvcmNpbmcgb25seS10YWtlLXRoZS1sYXRlc3QgLSB3aXRob3V0IGl0IGEgc3RhbGUgcHVzaCBsYW5kcyBvdmVyIGEgbmV3ZXIgdmFsdWUgb3IgdG9tYnN0b25lIGFuZCBiMidzIHNlbGYtc3RhbXBlZCB1cGxvYWQgdGltZSBsYXVuZGVycyBpdCBpbnRvIHRoZSBuZXdlc3QgY29weSBpbiB0aGUgc3lzdGVtIChnbG9iYWwgcmVzdXJyZWN0aW9uKS4gSG9zdGVkIHRhcmdldHMgcmUtY2hlY2sgc2VydmVyLXNpZGUsIHNvIHRoZWlyIGNsaWVudC1zaWRlIHNob3J0Y3V0cyBhcmUgc2FmZS4gKi9cbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgLyoqIFN0b3JlLXRvLXN0b3JlIHB1c2g6IHRoZSByZWNlaXZpbmcgbm9kZSB3cml0ZXMgcHVyZWx5IHRvIGl0cyBvd24gZGlzayBhbmQgaW5kZXgsIHdpdGggTk8gZG93bnN0cmVhbSBmYW4tb3V0ICh0aGUgcHVzaGluZyBzdG9yZSBvd25zIHByb3BhZ2F0aW9uIC0gZmFubmluZyBpdHMgcHVzaGVzIGJhY2sgb3V0IGlzIGhvdyB3cml0ZSBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtKS4gV2luZG93IGFuZCByb3V0ZSBBUkUgc3RpbGwgY2hlY2tlZDogdGhlIHN0YW1wIG11c3QgZmFsbCBpbnNpZGUgb25lIG9mIHRoZSByZWNlaXZlcidzIGNvbmZpZ3VyZWQgd2luZG93cyBhbmQgcm91dGVzLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2Fubm90IHN0dWZmIGRhdGEgb250byBhIG5vZGUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdC4gUmVxdWlyZXMgbGFzdE1vZGlmaWVkLiAqL1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICAvKiogV3JpdGVzIG5vcm1hbGx5IGdvIE9OTFkgdG8gdGhlIHdyaXRlIG5vZGUgKHRoZSBmaXJzdCBjdXJyZW50LXdpbmRvdyBzb3VyY2UgY292ZXJpbmcgdGhlIGtleSksIHJldHJ5aW5nIGl0IGV2ZW4gd2hpbGUgaXQgaXMgZG93biAtIGNvbnNpc3RlbnQsIGJ1dCB1bmF2YWlsYWJsZSB3aGVuIHRoYXQgbm9kZSBpcy4gV2l0aCBmYWxsYmFja3MsIHRoZSB3cml0ZSBub2RlIGlzIHN0aWxsIHRyaWVkIGZpcnN0LCBidXQgb24gZmFpbHVyZSB0aGUgd3JpdGUgbGFuZHMgb24gdGhlIG5leHQgY3VycmVudC13aW5kb3cgc291cmNlIGNvdmVyaW5nIHRoZSBrZXkgKHN5bmNocm9uaXphdGlvbiBtb3ZlcyBpdCB0byB0aGUgd3JpdGUgbm9kZSBsYXRlcikgLSBhdmFpbGFiaWxpdHkgYXQgdGhlIGNvc3Qgb2YgcmVhZHMgcG9zc2libHkgbWlzc2luZyB0aGUgd3JpdGUgdW50aWwgaXQgcHJvcGFnYXRlcy4gU2luZ2xlLXNvdXJjZSBhcmNoaXZlcyBpZ25vcmUgdGhlIGZsYWcuICovXG4gICAgZmFsbGJhY2tzPzogYm9vbGVhbjtcbiAgICAvKiogU2VlIEdldENvbmZpZy5yZXRyaWVzLiAqL1xuICAgIHJldHJpZXM/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBzZXQgaXMgbm90IGEgd3JpdGUgYXQgYWxsOiBpdCBSRVNUT1JFUyBhIGZpbGUgbWFya2VkIGZvciBkZWxldGlvbiwgZmxpcHBpbmcgaXRzIGluZGV4IGVudHJ5IGJhY2sgdG8gbGl2ZSAod2l0aCBhIGZyZXNoIHdyaXRlIHRpbWUsIHNvIHRoZSByZXN0b3JlIG91dHJhbmtzIHRoZSBkZWxldGlvbiBldmVyeXdoZXJlIGl0IHByb3BhZ2F0ZWQpIC0gdGhlIGJ5dGVzIG5ldmVyIGxlZnQgdGhlIGRpc2ssIHNvIHJlYWRzIGp1c3Qgd29yayBhZ2Fpbi4gVGhlIGRhdGEgYnVmZmVyIGlzIGlnbm9yZWQgKGEgMS1ieXRlIHBsYWNlaG9sZGVyIHNhdGlzZmllcyB0aGUgZW1wdHktYnVmZmVyIHJ1bGUpOyB1c2UgSUFyY2hpdmVzLnVuZGVsZXRlIHJhdGhlciB0aGFuIHBhc3NpbmcgdGhpcyB5b3Vyc2VsZi4gVGhyb3dzIHdoZW4gdGhlIGtleSBoYXMgbm8gbWFya2VkIGRlbGV0aW9uIHRvIHJlc3RvcmUgKGl0cyBoaXN0b3J5IHdhcyBkcm9wcGVkLCBvciBpdCB3YXMgbmV2ZXIgZGVsZXRlZCkuICovXG4gICAgdW5kZWxldGU/OiBib29sZWFuO1xufTtcblxuLyoqIHNldExhcmdlRmlsZSdzIGNvbmZpZzogYSBTZXRDb25maWcgKGl0IElTIGEgc2V0IC0gdGhlIHNhbWUgaW1tdXRhYmlsaXR5LCBvcmRlcmluZywgaW50ZXJuYWwsIGFuZCBmYWxsYmFja3MgcnVsZXMgYXBwbHkpIHBsdXMgdGhlIHN0cmVhbSBjYXJyeWluZyB0aGUgYnl0ZXMuICovXG5leHBvcnQgdHlwZSBTZXRMYXJnZUZpbGVDb25maWcgPSBTZXRDb25maWcgJiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjtcbiAgICAvKiogUmV3aW5kcyB0aGUgc3RyZWFtIHRvIGl0cyBmaXJzdCBieXRlLiBXaXRob3V0IGl0IHRoZSB3cml0ZSBnZXRzIGV4YWN0bHkgT05FIGF0dGVtcHQ6IGEgcmV0cnkgKGEgZmFsbGJhY2sgc291cmNlLCBvciB0aGUgd3JpdGUgbm9kZSBjb21pbmcgYmFjaykgd291bGQgdXBsb2FkIHdoYXRldmVyIGlzIGxlZnQgb2YgYW4gYWxyZWFkeS1jb25zdW1lZCBzdHJlYW0gYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgZmlsZS4gQ2FsbGVycyBob2xkaW5nIHRoZSBkYXRhIChhIGJ1ZmZlciwgb3IgYSBzb3VyY2UgdGhleSBjYW4gcmUtcmVhZCkgYWx3YXlzIHBhc3MgaXQgLSBhIGxhcmdlIHNldCB3aXRoIGZhbGxiYWNrcyBpcyBvbmx5IGFzIGF2YWlsYWJsZSBhcyB0aGlzLiAqL1xuICAgIHJlc3RhcnRTdHJlYW0/KCk6IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufTtcblxuLy8gY3JlYXRlVGltZSBpcyBhIG1pc25vbWVyIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkg4oCUIGl0IGlzIHJlYWxseSB0aGUgTEFTVC1XUklURSB0aW1lLCBzYW1lIGFzIGdldEluZm8ncyB3cml0ZVRpbWUuIE5laXRoZXIgQmFja2JsYXplIG5vciBvdXIgcmVtb3RlIHN0b3JhZ2UgdHJhY2tzIGEgZGlzdGluY3QgY3JlYXRpb24gZGF0ZTogZWFjaCB3cml0ZSBzdGFtcHMgYSBmcmVzaCB0aW1lc3RhbXAgb24gdGhlIGN1cnJlbnQgdmVyc2lvbiwgc28gYm90aCBmaWVsZHMgYXJlIGp1c3QgXCJ3aGVuIHRoZSBieXRlcyBzZXJ2ZWQgYnkgZ2V0KCkgd2VyZSBtb3N0IHJlY2VudGx5IHdyaXR0ZW5cIi4gQWx3YXlzIFdIT0xFIG1pbGxpc2Vjb25kczogd3JpdGUgdGltZXMgYXJlIHJvdW5kZWQgYXQgZXZlcnkgcHJvZHVjZXIgKHNlZSBTZXRDb25maWcubGFzdE1vZGlmaWVkKS5cbmV4cG9ydCB0eXBlIEFyY2hpdmVGaWxlSW5mbyA9IHsgcGF0aDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9O1xuXG4vLyBBbiBpbi1wcm9ncmVzcyBiYWNrZ3JvdW5kIHN5bmNocm9uaXphdGlvbiB0YXNrIChzZWUgQXJjaGl2ZXNDb25maWcuc3luY2luZylcbmV4cG9ydCB0eXBlIFN5bmNBY3Rpdml0eSA9IHtcbiAgICAvLyBBIG1ldGFkYXRhIHNjYW4gaXMgYSBzaW5nbGUgbGlzdGluZyBjYWxsLCBzbyBpdCBoYXMgbm8gaW5jcmVtZW50YWwgcHJvZ3Jlc3MgLSBqdXN0IHRoYXQgaXQncyBydW5uaW5nIGFuZCBzaW5jZSB3aGVuLiBBIGZ1bGwgc3luYyBrbm93cyBpdHMgZXhhY3QgZmlsZS9ieXRlIHByb2dyZXNzLlxuICAgIHR5cGU6IFwibWV0YWRhdGFTY2FuXCIgfCBcImZ1bGxTeW5jXCI7XG4gICAgc291cmNlRGVidWdOYW1lOiBzdHJpbmc7XG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XG4gICAgZG9uZUZpbGVzPzogbnVtYmVyO1xuICAgIHRvdGFsRmlsZXM/OiBudW1iZXI7XG4gICAgZG9uZUJ5dGVzPzogbnVtYmVyO1xuICAgIHRvdGFsQnl0ZXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc0NvbmZpZyA9IHtcbiAgICAvLyBXaGV0aGVyIGdldENoYW5nZXNBZnRlcjIgaXMgbmF0aXZlbHkgaW5kZXgtYmFja2VkIChmYXN0IGNoYW5nZSBwb2xsaW5nOyBldmVyeSBiYWNrZW5kIHN0aWxsIHNlcnZlcyBpdCwgYnV0IHRoZSBvdGhlcnMgZW11bGF0ZSBpdCB3aXRoIGEgZnVsbCBsaXN0aW5nKVxuICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyPzogYm9vbGVhbjtcbiAgICAvLyBUaGUgYnVja2V0J3MgZnVsbCByb3V0aW5nIGNvbmZpZyAoUk9VVElOR19GSUxFKS4gQWJzZW50IGZvciBzb3VyY2VzIHRoYXQgZG9uJ3QgaGF2ZSBvbmUgKGEgYmFyZSBkaXNrIHNvdXJjZSwgb3IgYSBidWNrZXQgdGhhdCBkb2Vzbid0IGV4aXN0IHlldCkuXG4gICAgcmVtb3RlQ29uZmlnPzogUmVtb3RlQ29uZmlnO1xuICAgIC8vIExpdmUgaW5kZXggdG90YWxzICh0b21ic3RvbmVzIGV4Y2x1ZGVkKSwga2VwdCB1cCB0byBkYXRlIGluIG1lbW9yeSBvbiBldmVyeSBtdXRhdGlvbiBhbmQgcmVjb21wdXRlZCBvbiBsb2FkIC0gc28gYW55IGRyaWZ0IGhlYWxzIG9uIHJlc3RhcnRcbiAgICBpbmRleD86IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH07XG4gICAgLyoqIEZpbGVzIE1BUktFRCBmb3IgZGVsZXRpb24gKGRlbGV0ZWQsIGJ5dGVzIHN0aWxsIGtlcHQgYXMgaGlzdG9yeSAtIHNlZSBTZXRDb25maWcudW5kZWxldGUpOiBob3cgbWFueSwgaG93IGJpZywgYW5kIHRoZSBkZWxldGUgdGltZSBvZiB0aGUgb2xkZXN0IG9uZSAtIHdoaWNoIGlzIGhvdyBmYXIgYmFjayB0aGUgZGVsZXRpb24gaGlzdG9yeSByZWFjaGVzLiAqL1xuICAgIG1hcmtlZEluZGV4PzogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IG9sZGVzdERlbGV0ZVRpbWU/OiBudW1iZXIgfTtcbiAgICAvLyBUaGUgc2FtZSB0b3RhbHMgYnJva2VuIGRvd24gYnkgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyBlYWNoIGZpbGUncyBieXRlcyAodGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBzZXJ2ZXIncyBvd24gZGlzaylcbiAgICBpbmRleFNvdXJjZXM/OiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyBjb25maWd1cmVkIHJlYWRlckRpc2tMaW1pdCwgd2hlbiBpdCBydW5zIGFzIGEgYm91bmRlZCByZWFkIGNhY2hlXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8vIEJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAoZW1wdHkgd2hlbiBpZGxlKVxuICAgIHN5bmNpbmc/OiBTeW5jQWN0aXZpdHlbXTtcbn07XG5cbi8vIEEgc3luY2hyb25pemF0aW9uIHNvdXJjZSBvZiBhIEJsb2JTdG9yZSAod2hpY2ggc3luY2hyb25pemVzIGFuIGluZGV4ICsgbG9jYWwgY2FjaGUgZnJvbSB0aGVtKVxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTb3VyY2UgPSB7XG4gICAgc291cmNlOiBJQXJjaGl2ZXM7XG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IGlkZW50aXR5IG9mIHRoZSBlbmRwb2ludDogaXRzIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSwgb3IgdGhlIGRpc2sgZm9sZGVyIHBhdGggZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlLiBUaGUgc3RvcmUgcGVyc2lzdHMgdGhpcyAodmlhIGl0cyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QpIGFzIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCwgc28gaXQgbXVzdCBtZWFuIHRoZSBzYW1lIGVuZHBvaW50IGZvcmV2ZXIuICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnLCBidXQgQUxMIG9mIHRoZW06IHRoZSBzYW1lIGVuZHBvaW50IChzYW1lIHVybCtyb3V0ZSwgaWdub3JpbmcgdGhlIHdpbmRvdykgY2FuIGFwcGVhciBpbiB0aGUgcm91dGluZyBjb25maWcgdW5kZXIgc2V2ZXJhbCB3aW5kb3dzIGF0IG9uY2UgLSBtb3N0IGNvbW1vbmx5IHdoZW4gYSBkZXBsb3kgc3dpdGNob3ZlciBoYXMgc3BsaXQgb25lIHdpbmRvdyBpbiB0d28gYXJvdW5kIGFuIGludGVybWVkaWF0ZS4gSXQgaXMgT05FIHNvdXJjZSB0aGF0IGtub3dzIGFsbCBpdHMgd2luZG93cywgbmV2ZXIgc2V2ZXJhbCBzb3VyY2VzLiBUaGUgd2luZG93IHJvdXRlcyBXUklURVM6IHRoZSBzb3VyY2UgcmVjZWl2ZXMgd3JpdGVzIHdoaWxlIEFOWSBvZiBpdHMgd2luZG93cyBpcyBzdGlsbCBvcGVuIChzZWUgd2luZG93c0FjY2VwdFdyaXRlcykuIFdpbmRvd3MgZG8gTk9UIGZpbHRlciBzY2FubmluZzogYSBzY2FuIGlzIHVzIGFza2luZyB0aGUgc291cmNlIHdoYXQgaXQgYWxyZWFkeSBob2xkcywgYW5kIGV4aXN0aW5nIHZhbHVlcyBzeW5jaHJvbml6ZSByZWdhcmRsZXNzIG9mIHRoZWlyIHdyaXRlIHRpbWVzICh0aGUgc2FtZSByZWFzb25pbmcgdGhhdCBsZXRzIHN5bmNocm9uaXphdGlvbiBpZ25vcmUgdGhlIGltbXV0YWJsZSBmbGFnKS5cbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICAvLyBGcm9tIHRoZSBzb3VyY2UncyBDb21tb25Db25maWcgKGludGVyc2VjdGVkIHdpdGggdGhlIG93bmluZyBzdG9yZSdzIG93biByb3V0ZSk6IG9ubHkga2V5cyByb3V0aW5nIGludG8gW3N0YXJ0LCBlbmQpIGFyZSBhY2NlcHRlZCBmcm9tIHRoaXMgc291cmNlJ3Mgc2NhbnMgYW5kIHNlbnQgdG8gaXQgaW4gd3JpdGVzL3JlY29uY2lsaWF0aW9uLiBUaGUgcm91dGluZyBmaWxlIGlzIGV4ZW1wdCAtIGNvbmZpZyBmbG93cyBldmVyeXdoZXJlLiBBYnNlbnQgPSBhbGwga2V5cy5cbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOyBzZWUgdGhlcmUuXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnOiBhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZS1wb3J0IGVudHJ5ICh0aGUgdmFsdWUgaXMgdGhlIHVybCBvZiB0aGUgc291cmNlIGl0IHdhcyBzcGxpdCBvdXQgb2YpLiBPbmNlIGl0cyB3aW5kb3cgaXMgcGFzdCwgdGhlIHBvcnQgaXQgcG9pbnRzIGF0IGlzIGdvbmUgZm9yIGdvb2QgLSBzbyBpdCBpcyBuZXZlciBzY2FubmVkIHRoZW4sIGFuZCBzY2FuIGZhaWx1cmVzIGFyZSBuZXZlciByZXRyaWVkLlxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBUaGUgcm91dGluZy1jb25maWcgZW50cnkgdGhpcyBzb3VyY2Ugd2FzIGJ1aWx0IGZyb20gKGFic2VudCBmb3IgdGhlIGJhc2UgZGlzayBzb3VyY2UpLiBJdHMgYHR5cGVgIGRlY2lkZXMgZmFzdC13cml0ZSBmbHVzaCB0aW1pbmc6IHR5cGUtXCJyZW1vdGVcIiBkb3duc3RyZWFtIHNvdXJjZXMgKG91ciBvd24gc3RvcmFnZSBzZXJ2ZXJzKSBmbHVzaCBxdWlja2x5IChjaGVhcCwgYW5kIHdlIHdhbnQgY3Jvc3Mtbm9kZSByZWR1bmRhbmN5IGZhc3QpLCB3aGlsZSBvdGhlcnMgKGUuZy4gYmFja2JsYXplKSBrZWVwIHRoZSBmdWxsIHdyaXRlRGVsYXkgc28gZXhwZW5zaXZlIGV4dGVybmFsIHdyaXRlcyBzdGF5IGNvYWxlc2NlZC4gVGhlIHdpbmRvdy9yb3V0ZSBPTiB0aGlzIGNvbmZpZyBhcmUgdGhlIFNPVVJDRSdzIG93bjsgQXJjaGl2ZXNTb3VyY2UudmFsaWRXaW5kb3cvcm91dGUgYXJlIHdoYXQgdGhlIG93bmluZyBzdG9yZSBhY3R1YWxseSB1c2VzIChyb3V0ZSBpcyBpbnRlcnNlY3RlZCB3aXRoIHRoZSBzdG9yZSdzIHJvdXRlKS5cbiAgICBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7XG4gICAgLy8gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSB1bmRlcmx5aW5nIGVuZHBvaW50IChpdHMgY29uZmlnIHdpdGggd2luZG93cy9yb3V0ZXMgc3RyaXBwZWQpIC0gaG93IEJsb2JTdG9yZS51cGRhdGVTb3VyY2VzIHJlY29nbml6ZXMgYSBzb3VyY2UgYWNyb3NzIGNvbmZpZyBjaGFuZ2VzIHNvIGl0IGNhbiB1cGRhdGUgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiByZW1vdmluZyBhbmQgcmUtYWRkaW5nIGl0XG4gICAgaWRlbnRpdHk/OiBzdHJpbmc7XG59O1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSByZWFjaGVzIGl0IG91dHNpZGUgaXRzIHZhbGlkIHdpbmRvd3MgKHRoZSBjbGllbnQgcmVzb2x2ZWQgaXRzIHRhcmdldCwgdGhlbiB0aW1lIGNyb3NzZWQgYSB3aW5kb3cgYm91bmRhcnkgYmVmb3JlIHRoZSB3cml0ZSBsYW5kZWQpLiBDbGllbnRzIGRldGVjdCB0aGlzIG1hcmtlciBhbmQgcmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5LXZhbGlkIHNvdXJjZSwgcmV0cnlpbmcgT05DRSAtIGJvdW5kYXJpZXMgYXJlIGZhciBhcGFydCwgc28gaGl0dGluZyBpdCB0d2ljZSBpbiBvbmUgYXR0ZW1wdCBtZWFucyBzb21ldGhpbmcgaXMgYWN0dWFsbHkgd3JvbmcuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1cgPSBcIlJFTU9URV9TVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV19hN2MxZjA0ZVwiO1xuXG4vLyBFcnJvciBtYXJrZXIgYSBzZXJ2ZXIgaW5jbHVkZXMgd2hlbiBhIGZyZXNobHktc3RhbXBlZCB3cml0ZSdzIGtleSByb3V0ZXMgb3V0c2lkZSB0aGUgc2hhcmRzIHRoaXMgc2VydmVyIGhhbmRsZXMgKHRoZSBjbGllbnQncyBjb25maWcgZGlzYWdyZWVzIHdpdGggdGhlIHNlcnZlcidzIC0gY2xpZW50cyByZS1yZXNvbHZlIG9uY2UpXG5leHBvcnQgY29uc3QgU1RPUkFHRV9XUk9OR19ST1VURSA9IFwiUkVNT1RFX1NUT1JBR0VfV1JPTkdfUk9VVEVfYzk0ZDJlMTdcIjtcblxuLy8gRXJyb3IgbWFya2VyIGEgc2VydmVyIGluY2x1ZGVzIHdoZW4gYSB3cml0ZSByZWFjaGVzIGEgc3RvcmUgd2hvc2Ugb3duIHJvdXRpbmcgY29uZmlnIGhhcyBOTyBlbnRyeSBmb3IgaXQgb24gdGhhdCBzZXJ2ZXIgKG9yIHRoYXQgaGFzIG5vIHJvdXRpbmcgY29uZmlnIGF0IGFsbCkgLSBhY2NlcHRpbmcgdGhlIHdyaXRlIHdvdWxkIHN0b3JlIGRhdGEgbm90aGluZyBzY2FucyBvciByZWNvbmNpbGVzLiBDbGllbnRzIHJlLXJlc29sdmUgb25jZSwgZXhhY3RseSBsaWtlIHRoZSBtYXJrZXJzIGFib3ZlOiB0aGUgdXN1YWwgY2F1c2UgaXMgdGhlIGNsaWVudCBydW5uaW5nIGEgZGlmZmVyZW50IGNvbmZpZyB0aGFuIHRoZSBzdG9yZS5cbmV4cG9ydCBjb25zdCBTVE9SQUdFX05PVF9DT05GSUdVUkVEID0gXCJSRU1PVEVfU1RPUkFHRV9OT1RfQ09ORklHVVJFRF9lNTFiN2Q5MlwiO1xuXG5leHBvcnQgY29uc3QgRlVMTF9ST1VURTogW251bWJlciwgbnVtYmVyXSA9IFswLCAxXTtcblxuLy8gQSBrZXkgY29udGFpbmluZyB0aGlzIHNlbnRpbmVsIGRvZXNuJ3QgaGF2ZSBhIGZpeGVkIHNoYXJkOiBzZXRWYXJpYWJsZVNoYXJkIHBpY2tzIHRoZSAobG93ZXN0IGxhdGVuY3ksIHVwKSB3cml0ZSBzaGFyZCwgYXBwZW5kcyBcIl88dmFsdWUgaW4gdGhlIHNoYXJkJ3Mgcm91dGU+XCIgZGlyZWN0bHkgYWZ0ZXIgdGhlIHNlbnRpbmVsLCBhbmQgcmV0dXJucyB0aGUgbWF0ZXJpYWxpemVkIGtleS4gZ2V0Um91dGUgdHJlYXRzIHRoYXQgc3VmZml4IGFzIGEgY29tcGxldGUgcm91dGUgb3ZlcnJpZGUuXG5leHBvcnQgY29uc3QgVkFSSUFCTEVfU0hBUkQgPSBcIlZBUklBQkxFX1NIQVJEX2YwMjM0amZhaDA4Zmd5aGZneXNzZGRzODNubXBcIjtcbi8vIE5vIGdyYWNlIHBhc3QgdGhlIGVuZDogYSB3aW5kb3cgYm91bmRhcnkgaXMgYSBoYXJkIGhhbmRvZmYgKGNsaWVudHMgcmV0cnkgYSByZWplY3RlZCB3cml0ZSBhZ2FpbnN0IHRoZSBuZXdseS12YWxpZCBzb3VyY2UsIHNvIGxlbmllbmN5IGhlcmUgd291bGQgb25seSBkZXN5bmNocm9uaXplIHRoZSBoYW5kb2ZmKVxuLy8gIC0gV3JpdGluZyB0byBvbGRlciB2YWxpZCBzdGF0ZSB3aW5kb3dzIGlzIGZpbmUsIHRob3VnaC4gV2UgbmVlZCB0aGlzIHRvIGluZ2VzdCB0aGUgb2xkIGRhdGEgd2hlbiB3ZSdyZSBzeW5jaHJvbml6aW5nIG5vZGVzIHRvIGdldCB0aGVtIHVwIHRvIGRhdGUgYW55d2F5LiBcbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dBY2NlcHRzV3JpdGVzKHZhbGlkV2luZG93OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWxpZFdpbmRvdykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHZhbGlkV2luZG93WzFdID4gRGF0ZS5ub3coKTtcbn1cbi8vIEEgc291cmNlICh3aGljaCBjYW4gaG9sZCBzZXZlcmFsIHdpbmRvd3MpIGFjY2VwdHMgd3JpdGVzIHdoaWxlIEFOWSBvZiBpdHMgd2luZG93cyBpcyBzdGlsbCBvcGVuLiBObyB3aW5kb3dzID0gdGhlIGJhc2UgZGlzayBvZiBhbiBpbmVydCBzdG9yZSAobm90IGluIHRoZSBjb25maWcpLCB3aGljaCBuZXZlciByZWNlaXZlcyBmYW4tb3V0IHdyaXRlcyBhbnl3YXkuXG5leHBvcnQgZnVuY3Rpb24gd2luZG93c0FjY2VwdFdyaXRlcyh2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWxpZFdpbmRvd3Muc29tZSh3aW5kb3dBY2NlcHRzV3JpdGVzKTtcbn1cblxuLy8gQWJvdmUgdGhpcywgc2V0IHRyYW5zcGFyZW50bHkgc3RyZWFtcyB0aHJvdWdoIHNldExhcmdlRmlsZTogb25lIGdpYW50IHdpcmUgbWVzc2FnZSB3b3VsZCBleGNlZWQgdGhlIHRyYW5zcG9ydCBsaW1pdCBhbmQgbGFnIGV2ZXJ5IG90aGVyIGNsaWVudCBzaGFyaW5nIHRoZSBjb25uZWN0aW9uXG5leHBvcnQgY29uc3QgTEFSR0VfU0VUX1RIUkVTSE9MRCA9IDggKiAxMDI0ICogMTAyNDtcblxuLyoqIFRoZSBzZXRMYXJnZUZpbGUgc3RyZWFtIG92ZXIgYW4gaW4tbWVtb3J5IGJ1ZmZlciwgaW4gTEFSR0VfU0VUX1RIUkVTSE9MRCBzbGljZXMgLSBob3cgc2V0IHRyYW5zcGFyZW50bHkgYmVjb21lcyBzZXRMYXJnZUZpbGUgZm9yIGxhcmdlIGJ1ZmZlcnMuIFNwcmVhZCBpbnRvIHRoZSBjb25maWc6IGl0IHByb3ZpZGVzIGJvdGggZ2V0TmV4dERhdGEgYW5kIHJlc3RhcnRTdHJlYW0gKHRoZSBidWZmZXIgaXMgc3RpbGwgaGVsZCwgc28gYSByZXRyeSBjb3N0cyBub3RoaW5nKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJDaHVua1N0cmVhbShkYXRhOiBCdWZmZXIpOiB7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjsgcmVzdGFydFN0cmVhbSgpOiB2b2lkIH0ge1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldE5leHREYXRhOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGNodW5rID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX1NFVF9USFJFU0hPTEQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBjaHVuaztcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdGFydFN0cmVhbTogKCkgPT4ge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyBSZS1leHBvcnRlZCBmb3IgdGhlIGV4aXN0aW5nIGltcG9ydGVycyAtIHRoZSBpbXBsZW1lbnRhdGlvbnMgKGFuZCBtb3ZlQXJjaGl2ZUZpbGUpIGxpdmUgaW4gYXJjaGl2ZUhlbHBlcnMudHMsIGJlc2lkZSB0aGlzIGludGVyZmFjZSByYXRoZXIgdGhhbiBpbiBpdFxuZXhwb3J0IHsgY29weUFyY2hpdmVGaWxlIH0gZnJvbSBcIi4vYXJjaGl2ZUhlbHBlcnNcIjtcblxuLyoqIG1vdmUncyBjb25maWcuIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBsYXN0TW9kaWZpZWQ6IHRoZSBkZXN0aW5hdGlvbiBpcyBBTFdBWVMgc3RhbXBlZCBmcmVzaCAoc2VlIElBcmNoaXZlcy5tb3ZlKSAtIGEgbW92ZSBpcyBhIG5ldyB3cml0ZSBhdCB0aGUgbmV3IHBhdGgsIGFuZCBhIHByZXNlcnZlZCBvbGQgc3RhbXAgaXMgaG93IGEgbW92ZWQgZmlsZSBsb3NlcyB0byBhIHN0YWxlIHRvbWJzdG9uZSB0aGVyZSBhbmQgdmFuaXNoZXMuICovXG5leHBvcnQgdHlwZSBNb3ZlRmlsZUNvbmZpZyA9IHtcbiAgICBmcm9tUGF0aDogc3RyaW5nO1xuICAgIHRvUGF0aDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTeW5jU291cmNlU3RhdHVzID0ge1xuICAgIGRlYnVnTmFtZTogc3RyaW5nO1xuICAgIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYm9vbGVhbjtcbiAgICBpbml0aWFsU2NhbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIC8vIEZpbGVzIHNlZW4gaW4gdGhpcyBzb3VyY2UncyBzY2FucyAvIGNoYW5nZSBwb2xscyBzbyBmYXJcbiAgICBzY2FubmVkQ291bnQ6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBcmNoaXZlc1N5bmNTdGF0dXMgPSB7XG4gICAgYWxsU2NhbnNDb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBOdW1iZXIgb2YgZmlsZXMgaW4gdGhlIGluZGV4XG4gICAgaW5kZXhTaXplOiBudW1iZXI7XG4gICAgc291cmNlczogQXJjaGl2ZXNTeW5jU291cmNlU3RhdHVzW107XG59O1xuXG4vLyBOT1RFOiBXZSBkb24ndCBwcmVzZW50bHkgaGF2ZSBhbiBhcHBlbmQgZnVuY3Rpb24gaGVyZSBiZWNhdXNlIGEgc3VycHJpc2luZyBudW1iZXIgb2Ygc3RvcmFnZSBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgaXQgKGJhY2tibGF6ZSwgZmlsZSBzeXN0ZW0gYXBpKS4gSXQgd291bGQgYWxzbyBjb21wbGljYXRlIHRoaW5ncyBhcyBub3cgdGhlcmUgbmVlZHMgdG8gYmUgcmVhbGx5IGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBvZiBhIGZpbGUsIGFuZCBpZiB5b3UgYXBwZW5kIHRvIHRoZSB3cm9uZyBzaW5nbGUgc291cmNlIG9mIHRydXRoLCB0aGluZ3MganVzdCBiZWNvbWUgdmVyeSBjb21wbGljYXRlZC4gXG5leHBvcnQgaW50ZXJmYWNlIElBcmNoaXZlcyB7XG4gICAgZ2V0RGVidWdOYW1lKCk6IHN0cmluZztcbiAgICAvKiogV2hldGhlciB3cml0ZXMgd291bGQgYmUgYWNjZXB0ZWQgKGNyZWRlbnRpYWxzIGV4aXN0LCB0aGUgYWNjb3VudCB0cnVzdHMgdGhpcyBtYWNoaW5lLCBldGMpLiBDaGVja2VkIHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gKi9cbiAgICBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIGFjcm9zcyB0aGUgcmVkdW5kYW50IHNvdXJjZXMgdW5sZXNzIGNvbmZpZy5ub0ZhbGxiYWNrcyBpcyBzZXQuXG4gICAgICogQSBmYWxsYmFjayBjb3B5IGNhbiBsYWcgdGhlIHdyaXRlIHRhcmdldCwgc28gYSBjYWxsZXIgcmVhZGluZyBzdGF0ZSBpbiBvcmRlciB0byBtdXRhdGUgaXRcbiAgICAgKiAoZS5nLiB4KyspLCB3aGVyZSBhY3Rpbmcgb24gcHJldmlvdXMgc3RhdGUgd291bGQgY2F1c2UgYmlnIGlzc3Vlcywgc2hvdWxkIHBhc3Mgbm9GYWxsYmFja3MgLVxuICAgICAqIGFuZCB0cnkvY2F0Y2ggdGhlIHJlYWQsIGhhbmRsaW5nIHRoZSBjYXRjaCBjYXNlIChhIGRvd24gcHJpbWFyeSBpcyByZXRyaWVkIGZvciBhIHdoaWxlLCB0aGVuXG4gICAgICogdGhyb3dzIGluc3RlYWQgb2YgZGVncmFkaW5nIHRvIGEgc3RhbGUgY29weSkuXG4gICAgICovXG4gICAgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPjtcbiAgICAvKiogU2VlIGdldCBmb3IgdGhlIGZhbGxiYWNrIHNlbWFudGljcyAoYW5kIHdoZW4gdG8gcGFzcyBub0ZhbGxiYWNrcykuIHVybCBpcyB0aGUgY29uZmlnIFVSTCBvZiB0aGUgc291cmNlIHRoYXQgYW5zd2VyZWQgLSB0aGUgYXV0aG9yaXR5IHRoZSBkYXRhIChvciB0aGUgXCJkb2VzIG5vdCBleGlzdFwiKSBjYW1lIGZyb20uIE11bHRpLXNvdXJjZSBpbXBsZW1lbnRhdGlvbnMgKEFyY2hpdmVzQ2hhaW4pIEFMV0FZUyByZXR1cm4gYW4gb2JqZWN0OiB3aGVuIHRoZSB2YWx1ZSBkb2Vzbid0IGV4aXN0IHRoZXJlIGlzIHN0aWxsIGEgc2VydmVyIHNheWluZyBpdCBkb2Vzbid0IGV4aXN0LCBzbyB0aGV5IHJldHVybiB7IHVybCB9IGFsb25lIHJhdGhlciB0aGFuIHVuZGVmaW5lZC4gU2luZ2xlLXNvdXJjZSBiYWNrZW5kcyByZXR1cm4gdW5kZWZpbmVkIGZvciBhYnNlbnQgKHRoZXkgQVJFIHRoZSBhdXRob3JpdHkpLiAqL1xuICAgIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlcjsgdXJsPzogc3RyaW5nIH0gfCB7IGRhdGE/OiB1bmRlZmluZWQ7IHdyaXRlVGltZT86IHVuZGVmaW5lZDsgc2l6ZT86IHVuZGVmaW5lZDsgdXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD47XG4gICAgLyoqXG4gICAgICogbGFzdE1vZGlmaWVkIHN0YW1wcyB0aGUgd3JpdGUgd2l0aCB0aGF0IGxhc3Qtd3JpdGUgdGltZSBpbnN0ZWFkIG9mIG5vdy4gSWYgaXQgaXMgT0xERVIgdGhhblxuICAgICAqIHRoZSBmaWxlJ3MgY3VycmVudCBsYXN0LXdyaXRlIHRpbWUgdGhlIHdyaXRlIG5vLW9wcyAoc28gZGVsYXllZCAvIHN5bmNocm9uaXplZCB3cml0ZXMgY2FuXG4gICAgICogbmV2ZXIgY2xvYmJlciBuZXdlciBkYXRhKS4gVGltZXMgbW9yZSB0aGFuIDE1IG1pbnV0ZXMgaW4gdGhlIGZ1dHVyZSBhcmUgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIGtleSBhY3R1YWxseSB3cml0dGVuIC0gaWRlbnRpY2FsIHRvIGZpbGVOYW1lLCBFWENFUFQgZm9yIGtleXMgY29udGFpbmluZ1xuICAgICAqIFZBUklBQkxFX1NIQVJELCB3aGVyZSB0aGUgc2hhcmQgdmFsdWUgaXMgbWF0ZXJpYWxpemVkIGludG8gdGhlIGtleSAocGlja2VkIGJ5IHNoYXJkIGxhdGVuY3ksXG4gICAgICogc2VlIEFyY2hpdmVzQ2hhaW4pIGFuZCB0aGUgY2FsbGVyIG5lZWRzIHRoZSByZXR1cm5lZCBrZXkgdG8gZXZlciByZWFkIHRoZSB2YWx1ZSBiYWNrLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFRIUk9XUyBvbiBhbiBlbXB0eSBidWZmZXI6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiBpbiB0aGlzIHN5c3RlbSAodGhlIHRvbWJzdG9uZSksIHNvIGFcbiAgICAgKiBzZXQtZW1wdHkgd291bGQgcmVhZCBiYWNrIGFzIFwidGhlIGZpbGUgaXMgZ29uZVwiIC0gd2hpY2ggaXMganVzdCBhc2tpbmcgZm9yIHByb2JsZW1zLiBJZiB5b3VcbiAgICAgKiB3YW50IHRoZSBmaWxlIGRlbGV0ZWQsIGNhbGwgZGVsOyBkZWxldGlvbnMgdGFrZSB0aGVpciBvd24gcGF0aC5cbiAgICAgKi9cbiAgICBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz47XG4gICAgZGVsKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IERlbENvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIE1vdmVzIGEgZmlsZSB0byBhIG5ldyBwYXRoIHdpdGhpbiBUSElTIGFyY2hpdmVzLCBiYWNrZW5kLXNpZGUgd2hlcmUgdGhlIGJhY2tlbmQgY2FuIChiYWNrYmxhemUgY29waWVzIHNlcnZlci1zaWRlLCBkaXNrIHJlbmFtZXMsIHRoZSBzdG9yYWdlIHNlcnZlciByZWxvY2F0ZXMgbm9kZS1zaWRlKSAtIHRoZSBieXRlcyBuZXZlciB0cmF2ZWwgdGhyb3VnaCB0aGUgY2FsbGVyLiBUaGUgZGVzdGluYXRpb24gaXMgc3RhbXBlZCB3aXRoIGEgRlJFU0ggd3JpdGUgdGltZSwgZXZlbiB3aGVuIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbiAoYSByZW5hbWUpIHdvdWxkIHByZXNlcnZlIHRoZSBvbGQgb25lLCBzbyB0aGUgbW92ZWQgZmlsZSBjYW5ub3QgaW1tZWRpYXRlbHkgbG9zZSB0byBzb21ldGhpbmcgbmV3ZXIgc2l0dGluZyBhdCBpdHMgbmV3IHBhdGggKGUuZy4gdGhlIHRvbWJzdG9uZSBvZiBhbiBlYXJsaWVyIGRlbGV0aW9uIHRoZXJlKTsgdGhlIHNvdXJjZSBpcyB0aGVuIGRlbGV0ZWQsIGV4YWN0bHkgbGlrZSBkZWwuIFRIUk9XUyB3aGVuIHRoZSBzb3VyY2UgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3B0aW9uYWwgLSBjYWxsZXJzIGdvIHRocm91Z2ggbW92ZUFyY2hpdmVGaWxlIChhcmNoaXZlSGVscGVycy50cyksIHdoaWNoIGZhbGxzIGJhY2sgdG8gY29weSArIGNvbmZpcm0gKyBkZWxldGUuICovXG4gICAgbW92ZT8oY29uZmlnOiBNb3ZlRmlsZUNvbmZpZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIFJlc3RvcmVzIGEgZGVsZXRlZCBmaWxlIHdob3NlIGJ5dGVzIGFyZSBzdGlsbCBpbiB0aGUgZGVsZXRpb24gaGlzdG9yeSAoc2VlIFNldENvbmZpZy51bmRlbGV0ZSwgd2hpY2ggdGhpcyByaWRlcyBvbikuIE9ubHkgaW5kZXgtYmFja2VkIHN0b3JlcyBrZWVwIGEgZGVsZXRpb24gaGlzdG9yeSwgc28gb25seSB0aGV5IHN1cHBvcnQgdGhpcy4gVEhST1dTIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byByZXN0b3JlLiAqL1xuICAgIHVuZGVsZXRlPyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICAvKiogU3RyZWFtcyBhIGZpbGUgdG9vIGxhcmdlIHRvIGhvbGQgaW4gbWVtb3J5LiBnZXROZXh0RGF0YSByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIGRvbmUuIFRoaXMgb25seSBuZWVkcyB0byBiZSBjYWxsZWQgd2hlbiB5b3UgQ0FOTk9UIG1hdGVyaWFsaXplIHRoZSBlbnRpcmUgZmlsZSBpbiBtZW1vcnkgLSBpZiB5b3UgY2FuLCBqdXN0IGNhbGwgc2V0OiBhYm92ZSBMQVJHRV9TRVRfVEhSRVNIT0xEIGl0IHN0cmVhbXMgdGhyb3VnaCBzZXRMYXJnZUZpbGUgaW50ZXJuYWxseSwga2VlcGluZyB0aGUgY2xpZW50IHJlc3BvbnNpdmUgYW5kIG5vdCBvdmVyd2hlbG1pbmcgdGhlIHNlcnZlci4gVGhlIHJlc3Qgb2YgdGhlIGNvbmZpZyBpcyBhIHBsYWluIFNldENvbmZpZyBhbmQgbWVhbnMgZXhhY3RseSB3aGF0IGl0IG1lYW5zIG9uIHNldCAodGhhdCBpcyB3aGF0IG1ha2VzIGEgbGFyZ2Ugc2V0IGJlaGF2ZSBsaWtlIGEgc21hbGwgb25lIGluc3RlYWQgb2YgcXVpZXRseSBsb3NpbmcgaW1tdXRhYmlsaXR5LCBvcmRlcmluZywgaW50ZXJuYWwsIG9yIGZhbGxiYWNrcyBzZW1hbnRpY3MgYXMgdGhlIGZpbGUgY3Jvc3NlcyB0aGUgdGhyZXNob2xkKTsgYmFja2VuZHMgdGhhdCBzdGFtcCB0aGVpciBvd24gdGltZXMgKGJhY2tibGF6ZSkgYWNjZXB0IGFuZCBpZ25vcmUgbGFzdE1vZGlmaWVkLiBUSFJPV1Mgd2hlbiB0aGUgc3RyZWFtIHByb2R1Y2VzIG5vIGRhdGEgYXQgYWxsIC0gc2FtZSBydWxlIGFzIHNldDogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZy4gKi9cbiAgICBzZXRMYXJnZUZpbGUoY29uZmlnOiBTZXRMYXJnZUZpbGVDb25maWcpOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiB3cml0ZVRpbWUgaXMgdGhlIGxhc3Qtd3JpdGUgdGltZSDigJQgc2VlIEFyY2hpdmVGaWxlSW5mby5jcmVhdGVUaW1lLCB3aGljaCBpcyB0aGUgc2FtZSB2YWx1ZS4gdXJsIGFzIGluIGdldDIuIFNpemUtMCBlbnRyaWVzICh0b21ic3RvbmVzKSByZXBvcnQgdW5kZWZpbmVkIHVubGVzcyBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMuICovXG4gICAgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybD86IHN0cmluZyB9IHwgdW5kZWZpbmVkPjtcbiAgICAvKipcbiAgICAgKiBFbXB0eSAoc2l6ZS0wKSBmaWxlcyBhcmUgTkVWRVIgcmV0dXJuZWQgYnkgaW5kZXgtYmFja2VkIHN0b3JlcyAoQmxvYlN0b3JlLCBhbmQgdGhlcmVmb3JlIHRoZVxuICAgICAqIGNoYWluKTogYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSAtIHRoZSB0b21ic3RvbmUgb2YgYSBkZWxldGlvbi4gSWYgeW91IHdhbnQgYSBtYXJrZXJcbiAgICAgKiBmaWxlIHRoYXQgc2hvd3MgdXAgaW4gbGlzdGluZ3MsIGFkZCBzb21lIGNvbnRlbnQgdG8gaXQuIFJhdyBzb3VyY2VzIChkaXNrLCBiYWNrYmxhemUpIERPIGxpc3RcbiAgICAgKiB0aGVpciBlbXB0eSBmaWxlcyAtIHRoYXQgaXMgaG93IHNjYW5zIGxlYXJuIG9mIGRlbGV0aW9ucyAtIGJ1dCBub3RoaW5nIGJ1aWx0IG9uIHRoZSBpbmRleFxuICAgICAqIGV2ZXIgc3VyZmFjZXMgdGhlbS5cbiAgICAgKi9cbiAgICBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgLyoqIFNlZSBmaW5kIGZvciB0aGUgZW1wdHktZmlsZSAodG9tYnN0b25lKSBydWxlLiAqL1xuICAgIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiBGaW5kQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgLyoqIE9ubHkgd29ya3MgZm9yIHB1YmxpYyBidWNrZXRzIChwcml2YXRlIGJ1Y2tldHMgYXJlIEFQSS1hY2Nlc3Mgb25seSkuICovXG4gICAgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICAvKiogVGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24sIHdoaWNoIHRlbGxzIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLiAqL1xuICAgIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPjtcbiAgICAvKipcbiAgICAgKiBBbGwgZmlsZXMgY2hhbmdlZCBhZnRlciBjb25maWcudGltZSwgb3B0aW9uYWxseSByZXN0cmljdGVkIHRvIGtleXMgcm91dGluZyBpbnRvIG9uZSBvZlxuICAgICAqIGNvbmZpZy5yb3V0ZXMgKHVzZWQgYnkgc2Nhbm5pbmcsIHNvIHBhcnRpYWxseS1vdmVybGFwcGluZyBzaGFyZHMgb25seSByZWNlaXZlIHRoZWlyIHNsaWNlKS5cbiAgICAgKiBXaGVuIGdldENvbmZpZygpLnN1cHBvcnRzQ2hhbmdlc0FmdGVyLCB0aGlzIGlzIGJhY2tlZCBieSBhbiBpbmRleCAoZmFzdCwgYW5kIGRlbGV0aW9ucyBBUkVcbiAgICAgKiByZXBvcnRlZCwgYXMgc2l6ZS0wIHRvbWJzdG9uZSBlbnRyaWVzKS4gRXZlcnkgb3RoZXIgYmFja2VuZCBlbXVsYXRlcyBpdDogYSBmdWxsIGZpbmRJbmZvXG4gICAgICogbGlzdGluZyBmaWx0ZXJlZCBpbiBtZW1vcnkgLSBjb3JyZWN0LCBidXQgbm8gY2hlYXBlciB0aGFuIHRoZSBsaXN0aW5nIGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT47XG4gICAgLyoqIFN5bmNocm9uaXphdGlvbiBpbnRyb3NwZWN0aW9uLCBmb3IgYmFja2VuZHMgdGhhdCBzeW5jaHJvbml6ZSBmcm9tIHNvdXJjZXMgKHNlZSBCbG9iU3RvcmUpLiAqL1xuICAgIGdldFN5bmNTdGF0dXM/KCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPjtcbn1cbiJdfQ==
|
|
71
|
+
/* _JS_SOURCE_HASH = "d7f707641617b1f2f49be3b35a2dc0624466b9dfc9df74bedb57325aaaf4bac0"; */
|