cdk-nextjs 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +38 -38
- package/README.md +1 -0
- package/docs/breaking-changes.md +4 -2
- package/docs/native-dependencies-guide.md +223 -0
- package/lib/adapter/adapter.mjs +4 -1
- package/lib/adapter/build-outputs.js +8 -3
- package/lib/adapter/build-outputs.test.js +3 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +25 -0
- package/lib/nextjs-build/nextjs-build.js +103 -2
- package/lib/nextjs-build/nextjs-build.test.js +50 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +4 -1
- package/lib/runtime/core.test.js +9 -1
- package/lib/runtime/lambda.mjs +5 -0
- package/lib/runtime/next-modules.d.ts +16 -0
- package/lib/runtime/next-modules.js +21 -1
- package/lib/runtime/server.mjs +5 -0
- package/package.json +1 -1
|
@@ -25,9 +25,14 @@ const ENV_FILES = [".env", ".env.production"];
|
|
|
25
25
|
*
|
|
26
26
|
* `serve-static` is in every group: `serveStaticFile`
|
|
27
27
|
* (`src/runtime/static-files.ts`) serves prerendered and static results with it
|
|
28
|
-
* wherever they land.
|
|
28
|
+
* wherever they land. `instrumentation-globals` is required by `loadRuntime`
|
|
29
|
+
* on every cold start (`registerInstrumentation`), so it is staged here rather
|
|
30
|
+
* than trusted to each group's entrypoint trace.
|
|
29
31
|
*/
|
|
30
|
-
const RUNTIME_NEXT_MODULES = [
|
|
32
|
+
const RUNTIME_NEXT_MODULES = [
|
|
33
|
+
"next/dist/server/serve-static.js",
|
|
34
|
+
"next/dist/server/lib/router-utils/instrumentation-globals.external.js",
|
|
35
|
+
];
|
|
31
36
|
/**
|
|
32
37
|
* next's image optimizer and the config helpers around it
|
|
33
38
|
* (`src/runtime/image.ts`), whose closure is what brings `sharp` in. Only the
|
|
@@ -849,4 +854,4 @@ function toPosix(path) {
|
|
|
849
854
|
function sortedUnique(values) {
|
|
850
855
|
return [...new Set(values)].sort();
|
|
851
856
|
}
|
|
852
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtb3V0cHV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2J1aWxkLW91dHB1dHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzS0EsOENBNENDO0FBd0JELG9EQWtJQztBQTVXRCxzREFBc0Q7QUFDdEQscUNBQThEO0FBQzlELCtDQVEwQjtBQUMxQiw2Q0FBNEM7QUFDNUMseUNBQWtFO0FBRWxFLHVEQU8yQjtBQUMzQiw0Q0FBMEM7QUFDMUMsa0RBVzZCO0FBbUI3Qjs7Ozs7R0FLRztBQUNILE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFOUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFFbEU7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsbUNBQW1DO0lBQ25DLHNDQUFzQztJQUN0QyxxQ0FBcUM7Q0FDdEMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQXVFMUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsR0FBeUIsRUFDekIsVUFBK0IsRUFBRTtJQUVqQyxNQUFNLFVBQVUsR0FBRyxJQUFBLGdCQUFJLEVBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSwyQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUEsZ0JBQUksRUFBQyxVQUFVLEVBQUUsNkJBQWtCLENBQUMsQ0FBQztJQUUxRCxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVoRSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNqRCxNQUFNLFlB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QUFZO0lBQzNCLE9BQU8sZUFBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsTUFBZ0I7SUFDcEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIHJlYWxwYXRoU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQge1xuICBjb3B5RmlsZSxcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkbGluayxcbiAgcm0sXG4gIHN5bWxpbmssXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBOZXh0QWRhcHRlciB9IGZyb20gXCJuZXh0XCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0ZVTkNUSU9OX0dST1VQLFxuICBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUixcbiAgRnVuY3Rpb25Hcm91cFNwZWMsXG4gIGFzc2VydE5vSTE4blNwbGl0dGluZyxcbiAgYXNzaWduUm91dGVzVG9Hcm91cHMsXG4gIHBhcnNlRnVuY3Rpb25Hcm91cHNFbnYsXG59IGZyb20gXCIuL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEFEQVBURVJfRElSX05BTUUsXG4gIEFEQVBURVJfTUFOSUZFU1RfVkVSU0lPTixcbiAgQWRhcHRlckVudHJ5cG9pbnQsXG4gIEFkYXB0ZXJFbnRyeXBvaW50VHlwZSxcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBBZGFwdGVyTWlkZGxld2FyZSxcbiAgRVJST1JfUEFHRV9TVUZGSVhFUyxcbiAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICBSVU5USU1FX0RJUl9OQU1FLFxuICBncm91cFN0YWdpbmdEaXJOYW1lLFxufSBmcm9tIFwiLi4vcnVudGltZS9tYW5pZmVzdFwiO1xuXG4vKipcbiAqIFRoZSBgb25CdWlsZENvbXBsZXRlYCBhcmd1bWVudC4gRGVyaXZlZCBmcm9tIHRoZSBgbmV4dGAgdHlwaW5ncyByYXRoZXIgdGhhblxuICogcmVzdGF0ZWQgc28gYSBgbmV4dGAgYnVtcCBzdXJmYWNlcyBhcyBhIGNvbXBpbGUgZXJyb3IgaGVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgQnVpbGRDb21wbGV0ZUNvbnRleHQgPSBQYXJhbWV0ZXJzPFxuICBOb25OdWxsYWJsZTxOZXh0QWRhcHRlcltcIm9uQnVpbGRDb21wbGV0ZVwiXT5cbj5bMF07XG5cbnR5cGUgQWRhcHRlck91dHB1dHMgPSBCdWlsZENvbXBsZXRlQ29udGV4dFtcIm91dHB1dHNcIl07XG4vKiogQW55IG91dHB1dCB0aGF0IHdlIGludm9rZSBhdCByZXF1ZXN0IHRpbWUsIGkuZS4gbm90IGEgcHJlcmVuZGVyL3N0YXRpYyBmaWxlLiAqL1xudHlwZSBJbnZvY2FibGVPdXRwdXQgPVxuICB8IEFkYXB0ZXJPdXRwdXRzW1wicGFnZXNcIl1bbnVtYmVyXVxuICB8IEFkYXB0ZXJPdXRwdXRzW1wicGFnZXNBcGlcIl1bbnVtYmVyXVxuICB8IEFkYXB0ZXJPdXRwdXRzW1wiYXBwUGFnZXNcIl1bbnVtYmVyXVxuICB8IEFkYXB0ZXJPdXRwdXRzW1wiYXBwUm91dGVzXCJdW251bWJlcl1cbiAgfCBOb25OdWxsYWJsZTxBZGFwdGVyT3V0cHV0c1tcIm1pZGRsZXdhcmVcIl0+O1xuXG4vKipcbiAqIEVudiBmaWxlcyBgd3JpdGVTdGFuZGFsb25lRGlyZWN0b3J5YCBjb3BpZXMgaW50byB0aGUgc3RhbmRhbG9uZSB0cmVlIGFuZCB0aGF0XG4gKiBgb25CdWlsZENvbXBsZXRlYCBoYXMgbm8gZXF1aXZhbGVudCBmb3IuIERyb3BwaW5nIGBvdXRwdXQ6IFwic3RhbmRhbG9uZVwiYFxuICogc2lsZW50bHkgZHJvcHMgdGhlc2UgdW5sZXNzIHdlIHN0YWdlIHRoZW0gb3Vyc2VsdmVzLlxuICogQHNlZSBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYXBpLXJlZmVyZW5jZS9jb25maWcvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmNvbnN0IEVOVl9GSUxFUyA9IFtcIi5lbnZcIiwgXCIuZW52LnByb2R1Y3Rpb25cIl07XG5cbi8qKlxuICogYG5leHRgIHN1Ym1vZHVsZXMgdGhlICpydW50aW1lKiByZXF1aXJlcyB0aGF0IG5vIGFwcCBldmVyIHJlYWNoZXMsIHNvXG4gKiBgbmV4dCBidWlsZGAncyBvd24gdHJhY2UgbmV2ZXIgY292ZXJzIHRoZW0uIFRoZXkgYXJlIHJlcXVpcmVkIGZyb20gdGhlIGFwcCdzXG4gKiBgbmV4dGAgcmF0aGVyIHRoYW4gYnVuZGxlZCwgZGVsaWJlcmF0ZWx5IOKAlCBzZWUgYHNyYy9ydW50aW1lL25leHQtbW9kdWxlcy50c2BcbiAqIOKAlCB3aGljaCBtYWtlcyBzdGFnaW5nIHRoZWlyIGNsb3N1cmUgdGhpcyBtb2R1bGUncyBqb2IuXG4gKlxuICogYHNlcnZlLXN0YXRpY2AgaXMgaW4gZXZlcnkgZ3JvdXA6IGBzZXJ2ZVN0YXRpY0ZpbGVgXG4gKiAoYHNyYy9ydW50aW1lL3N0YXRpYy1maWxlcy50c2ApIHNlcnZlcyBwcmVyZW5kZXJlZCBhbmQgc3RhdGljIHJlc3VsdHMgd2l0aCBpdFxuICogd2hlcmV2ZXIgdGhleSBsYW5kLlxuICovXG5jb25zdCBSVU5USU1FX05FWFRfTU9EVUxFUyA9IFtcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCJdO1xuXG4vKipcbiAqIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIgYW5kIHRoZSBjb25maWcgaGVscGVycyBhcm91bmQgaXRcbiAqIChgc3JjL3J1bnRpbWUvaW1hZ2UudHNgKSwgd2hvc2UgY2xvc3VyZSBpcyB3aGF0IGJyaW5ncyBgc2hhcnBgIGluLiBPbmx5IHRoZVxuICogYGRlZmF1bHRgIGdyb3VwIGdldHMgdGhlbTogdGhlIGVkZ2Ugc2VuZHMgZXZlcnkgYC9fbmV4dC9pbWFnZWAgcmVxdWVzdCB0aGVyZS5cbiAqL1xuY29uc3QgSU1BR0VfTkVYVF9NT0RVTEVTID0gW1xuICBcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiLFxuICBcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy5qc1wiLFxuICBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIsXG5dO1xuXG4vKipcbiAqIFRoZSBmaWxlIHRyYWNlciBgbmV4dCBidWlsZGAgaXRzZWxmIHVzZXMsIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXBwJ3Mgb3duIGBuZXh0YFxuICogc28gdGhhdCBpdCBpcyB0aGUgdmVyc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGZpbGVzIGJlaW5nIHRyYWNlZC4gTm90IGFcbiAqIGRlcGVuZGVuY3kgb2YgY2RrLW5leHRqczogYnVuZGxpbmcgYSBzZWNvbmQgY29weSBvZiBgQHZlcmNlbC9uZnRgIGludG8gdGhlXG4gKiBwdWJsaXNoZWQgYWRhcHRlciB3b3VsZCBhZGQgbWVnYWJ5dGVzIHRvIGV2ZXJ5IGluc3RhbGwgdG8gZG8gdGhlIHNhbWUgam9iLlxuICovXG5jb25zdCBORVhUX0ZJTEVfVFJBQ0VSID0gXCJuZXh0L2Rpc3QvY29tcGlsZWQvQHZlcmNlbC9uZnRcIjtcblxuLyoqIFRoZSBzdWJzZXQgb2YgYG5vZGVGaWxlVHJhY2VgIHRoaXMgbW9kdWxlIHVzZXMuICovXG50eXBlIE5vZGVGaWxlVHJhY2UgPSAoXG4gIGZpbGVzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogeyBiYXNlOiBzdHJpbmcgfSxcbikgPT4gUHJvbWlzZTx7IGZpbGVMaXN0OiBTZXQ8c3RyaW5nPiB9PjtcblxuLyoqXG4gKiBTdGFnaW5nIGtleSAocmVwby1yb290LXJlbGF0aXZlIFBPU0lYKSDihpIgYWJzb2x1dGUgc291cmNlIHBhdGggb24gdGhlIGJ1aWxkXG4gKiBtYWNoaW5lLiBUaGUgZGVkdXBlZCB1bmlvbiB0aGF0IHJlcGxhY2VzIHRoZSBzdGFuZGFsb25lIHRyZWUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0YWdpbmdQbGFuID0gUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3V0cHV0c09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBgbmV4dCBidWlsZGAgd2FzIGludm9rZWQgZnJvbS4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgLFxuICAgKiB3aGljaCBpcyB0aGUgcmVhbCBhbnN3ZXIgaW5zaWRlIGBvbkJ1aWxkQ29tcGxldGVgOyBhIHBhcmFtZXRlciBvbmx5IHNvIHRoZVxuICAgKiB1bml0IHRlc3RzIGNhbiBkcml2ZSB0aGUgZml4dHVyZXMnIHN5bnRoZXRpYyBwcm9qZWN0IGRpcnMuXG4gICAqL1xuICByZWFkb25seSBidWlsZEN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVkIGBmdW5jdGlvbkdyb3Vwc2AuIERlZmF1bHRzIHRvIHtAbGluayBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0sXG4gICAqIHdoaWNoIGlzIGhvdyB0aGUgY29uc3RydWN0cyBnZXQgdGhlbSBoZXJlOiBgb25CdWlsZENvbXBsZXRlYCBydW5zIGluc2lkZVxuICAgKiBgbmV4dCBidWlsZGAgYW5kIGNhbm5vdCByZWFkIENESyBwcm9wcy5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgbWVhbnMgb25lIGRlcGxveW1lbnQgcm9vdCBob2xkaW5nIGV2ZXJ5IHJvdXRlLCB3aGljaCBpcyB0aGVcbiAgICogZGVmYXVsdCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhlIENvbnRhaW5lcnMgdHlwZXMgZXZlciBkby5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogRnVuY3Rpb25Hcm91cFNwZWNbXTtcbn1cblxuLyoqIE9uZSBkZXBsb3ltZW50IHJvb3Q6IHRoZSBzdGFnaW5nIHBsYW4gZm9yIGl0LCBhbmQgd2hlcmUgaXQgZ29lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VkR3JvdXAge1xuICAvKipcbiAgICogR3JvdXAgbmFtZSwgYGRlZmF1bHRgIGZvciB0aGUgaW1wbGljaXQgZ3JvdXAuIEFsd2F5cyBwcmVzZW50IOKAlCBhIGJ1aWxkIHdpdGhcbiAgICogbm8gYGZ1bmN0aW9uR3JvdXBzYCBwcm9kdWNlcyBleGFjdGx5IG9uZSB7QGxpbmsgU3RhZ2VkR3JvdXB9IG5hbWVkIGBkZWZhdWx0YCxcbiAgICogc28gY2FsbGVycyBuZXZlciBicmFuY2ggb24gXCJpcyB0aGlzIHNwbGl0XCIuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgaW5zaWRlIGBjZGstbmV4dGpzLWFkYXB0ZXJgLCBQT1NJWDogYGFwcGAgd2hlbiBub3Qgc3BsaXR0aW5nLFxuICAgKiBgZ3JvdXBzLzxuYW1lPmAgd2hlbiBzcGxpdHRpbmcuXG4gICAqL1xuICByZWFkb25seSBkaXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YWdpbmc6IFN0YWdpbmdQbGFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQWRhcHRlck1hbmlmZXN0UmVzdWx0IHtcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqIE9uZSBlbnRyeSBwZXIgZGVwbG95bWVudCByb290IHRvIHN0YWdlLiBMZW5ndGggMSB1bmxlc3Mgc3BsaXR0aW5nLiAqL1xuICByZWFkb25seSBncm91cHM6IFN0YWdlZEdyb3VwW107XG59XG5cbi8qKiBBIHN0YWdlZCBkZXBsb3ltZW50IHJvb3Qgb24gZGlzay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VkR3JvdXBSZXN1bHQge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IHJvb3QuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZmlsZUNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVCdWlsZE91dHB1dHNSZXN1bHQgZXh0ZW5kcyBCdWlsZEFkYXB0ZXJNYW5pZmVzdFJlc3VsdCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIGA8ZGlzdERpcj4vY2RrLW5leHRqcy1hZGFwdGVyYC4gKi9cbiAgcmVhZG9ubHkgYWRhcHRlckRpcjogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgd3JpdHRlbiBtYW5pZmVzdC4gKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RQYXRoOiBzdHJpbmc7XG4gIC8qKiBPbmUgcGVyIGRlcGxveW1lbnQgcm9vdCwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzdGFnZWQuICovXG4gIHJlYWRvbmx5IHN0YWdlZEdyb3VwczogU3RhZ2VkR3JvdXBSZXN1bHRbXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbWFuaWZlc3QgYW5kIHN0YWdpbmcgcGxhbiwgc3RhZ2UgdGhlIGZpbGVzLCBhbmQgd3JpdGUgdGhlIG1hbmlmZXN0LlxuICogQ2FsbGVkIGZyb20gYG9uQnVpbGRDb21wbGV0ZWAsIHdoaWNoIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgaG9sZHMgdGhlIGJ1aWxkXG4gKiBvdXRwdXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWlsZE91dHB1dHMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIG9wdGlvbnM6IEJ1aWxkT3V0cHV0c09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8V3JpdGVCdWlsZE91dHB1dHNSZXN1bHQ+IHtcbiAgY29uc3QgYWRhcHRlckRpciA9IGpvaW4oY3R4LmRpc3REaXIsIEFEQVBURVJfRElSX05BTUUpO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGFkYXB0ZXJEaXIsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG5cbiAgY29uc3QgeyBtYW5pZmVzdCwgZ3JvdXBzIH0gPSBidWlsZEFkYXB0ZXJNYW5pZmVzdChjdHgsIG9wdGlvbnMpO1xuXG4gIC8vIFRyYWNlZCBvbmNlLCBoZXJlOiB0aGUgdHJhY2UgaXMgYXN5bmMsIHdoaWNoIGlzIHdoeSBpdCBjYW5ub3QgaGFwcGVuIGluc2lkZVxuICAvLyBgYnVpbGRBZGFwdGVyTWFuaWZlc3RgLiBgcnVudGltZUNsb3N1cmVgIGlzIG1lcmdlZCBpbnRvIGV2ZXJ5IGdyb3VwLCBhbmRcbiAgLy8gYGltYWdlQ2xvc3VyZWAgaW50byBgZGVmYXVsdGAgb25seSwgdGhlIG9uZSBncm91cCBgL19uZXh0L2ltYWdlYCByZWFjaGVzLlxuICBjb25zdCBydW50aW1lQ2xvc3VyZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGltYWdlQ2xvc3VyZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGF3YWl0IGFkZFJ1bnRpbWVOZXh0Q2xvc3VyZShjdHgsIHJ1bnRpbWVDbG9zdXJlLCBpbWFnZUNsb3N1cmUpO1xuICBhZGRSZXF1aXJlZFNlcnZlckZpbGVzKGN0eCwgcnVudGltZUNsb3N1cmUpO1xuXG4gIC8vIEEgcHJldmlvdXMgYnVpbGQncyB0cmVlIGlzIG5ldmVyIGFkZGl0aXZlIHdpdGggdGhpcyBvbmUnczogYSByZW1vdmVkIHJvdXRlXG4gIC8vIGxlYXZlcyBiZWhpbmQgYW4gZW50cnlwb2ludCB0aGUgbWFuaWZlc3Qgbm8gbG9uZ2VyIG1lbnRpb25zLCBhIHJlbmFtZWQgY2h1bmtcbiAgLy8gbGVhdmVzIGRlYWQgYnl0ZXMgaW5zaWRlIHRoZSAyNTAgTUIgYnVkZ2V0LCBhbmQgYSByZWdyb3VwZWQgYnVpbGQgbGVhdmVzIGFcbiAgLy8gd2hvbGUgZGVwbG95bWVudCByb290IG5vdGhpbmcgZGVwbG95cy5cbiAgYXdhaXQgcm0oYWRhcHRlckRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHN0YWdlZEdyb3VwczogU3RhZ2VkR3JvdXBSZXN1bHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgIGNvbnN0IGdyb3VwU3RhZ2luZyA9IG1lcmdlZChcbiAgICAgIG1lcmdlZChncm91cC5zdGFnaW5nLCBydW50aW1lQ2xvc3VyZSksXG4gICAgICBncm91cC5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQID8gaW1hZ2VDbG9zdXJlIDogbmV3IE1hcCgpLFxuICAgICk7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4oYWRhcHRlckRpciwgLi4uZ3JvdXAuZGlyTmFtZS5zcGxpdChcIi9cIikpO1xuICAgIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHN0YWdlRmlsZXMoZ3JvdXBTdGFnaW5nLCBwYXRoKTtcbiAgICBzdGFnZWRHcm91cHMucHVzaCh7IG5hbWU6IGdyb3VwLm5hbWUsIHBhdGgsIGZpbGVDb3VudDogZ3JvdXBTdGFnaW5nLnNpemUgfSk7XG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3QsXG4gICAgZ3JvdXBzLFxuICAgIGFkYXB0ZXJEaXIsXG4gICAgbWFuaWZlc3RQYXRoLFxuICAgIHN0YWdlZEdyb3VwcyxcbiAgfTtcbn1cblxuLyoqIExlZnQgd2lucywgYXMgZXZlcnl3aGVyZSBlbHNlIGluIHRoaXMgbW9kdWxlOiBmaXJzdCB3cml0ZXIgb2YgYSBrZXkga2VlcHMgaXQuICovXG5mdW5jdGlvbiBtZXJnZWQoXG4gIGJhc2U6IFN0YWdpbmdQbGFuLFxuICBhZGRpdGlvbnM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKGJhc2UpO1xuICBmb3IgKGNvbnN0IFtrZXksIHNvdXJjZV0gb2YgYWRkaXRpb25zKSB7XG4gICAgaWYgKCFyZXN1bHQuaGFzKGtleSkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBwdXJlIGhhbGYgb2Yge0BsaW5rIHdyaXRlQnVpbGRPdXRwdXRzfTogZXZlcnl0aGluZyBkZXJpdmVkIGZyb20gdGhlIGJ1aWxkXG4gKiBvdXRwdXRzLCB3aXRoIG5vIHdyaXRlcy4gU3BsaXQgb3V0IHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhZ2FpbnN0IGNvbW1pdHRlZFxuICogYG9uQnVpbGRDb21wbGV0ZWAgZml4dHVyZXMuXG4gKlxuICogVGhyb3dzIG9uIGFueSBub24tTm9kZSBvdXRwdXQgYW5kIG9uIGFueSBzdGFnaW5nIGtleSB0d28gb3V0cHV0cyBtYXAgdG9cbiAqIGRpZmZlcmVudCBjb250ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBZGFwdGVyTWFuaWZlc3QoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIG9wdGlvbnM6IEJ1aWxkT3V0cHV0c09wdGlvbnMgPSB7fSxcbik6IEJ1aWxkQWRhcHRlck1hbmlmZXN0UmVzdWx0IHtcbiAgY29uc3QgeyBvdXRwdXRzLCByZXBvUm9vdCB9ID0gY3R4O1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgYXNzZXJ0QnVpbGRDd2QoY3R4LCBvcHRpb25zLmJ1aWxkQ3dkID8/IHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBpbnZvY2FibGU6IEludm9jYWJsZU91dHB1dFtdID0gW1xuICAgIC4uLm91dHB1dHMucGFnZXMsXG4gICAgLi4ub3V0cHV0cy5wYWdlc0FwaSxcbiAgICAuLi5vdXRwdXRzLmFwcFBhZ2VzLFxuICAgIC4uLm91dHB1dHMuYXBwUm91dGVzLFxuICAgIC4uLihvdXRwdXRzLm1pZGRsZXdhcmUgPyBbb3V0cHV0cy5taWRkbGV3YXJlXSA6IFtdKSxcbiAgXTtcblxuICBhc3NlcnROb2RlUnVudGltZXMoaW52b2NhYmxlLCBvdXRwdXRzLm1pZGRsZXdhcmUpO1xuICB3YXJuT25Ecm9wcGVkUm91dGVDb25maWcoaW52b2NhYmxlKTtcblxuICBjb25zdCBzdGF0aWNGaWxlcyA9IGNvbGxlY3RTdGF0aWNGaWxlcyhjdHgpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyRW50cnlwb2ludD4gPSB7fTtcbiAgZm9yIChjb25zdCB7IG91dHB1dHM6IGdyb3VwLCB0eXBlIH0gb2YgW1xuICAgIHsgb3V0cHV0czogb3V0cHV0cy5wYWdlcywgdHlwZTogXCJwYWdlXCIgYXMgY29uc3QgfSxcbiAgICB7IG91dHB1dHM6IG91dHB1dHMucGFnZXNBcGksIHR5cGU6IFwicGFnZS1hcGlcIiBhcyBjb25zdCB9LFxuICAgIHsgb3V0cHV0czogb3V0cHV0cy5hcHBQYWdlcywgdHlwZTogXCJhcHAtcGFnZVwiIGFzIGNvbnN0IH0sXG4gICAgeyBvdXRwdXRzOiBvdXRwdXRzLmFwcFJvdXRlcywgdHlwZTogXCJhcHAtcm91dGVcIiBhcyBjb25zdCB9LFxuICBdKSB7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgZ3JvdXApIHtcbiAgICAgIGFkZEVudHJ5cG9pbnQoZW50cnlwb2ludHMsIHJlcG9Sb290LCBvdXRwdXQsIHR5cGUsIGJhc2VQYXRoKTtcbiAgICB9XG4gIH1cblxuICBhZGRQcmVyZW5kZXJQYXRobmFtZXMoXG4gICAgZW50cnlwb2ludHMsXG4gICAgb3V0cHV0cy5wcmVyZW5kZXJzLFxuICAgIGN0eC5yb3V0aW5nLmR5bmFtaWNSb3V0ZXMsXG4gICAgYmFzZVBhdGgsXG4gICAgYCR7YmFzZVBhdGh9L19uZXh0L2RhdGEvJHtjdHguYnVpbGRJZH0vYCxcbiAgKTtcblxuICBjb25zdCBwYXRobmFtZXMgPSBzb3J0ZWRVbmlxdWUoW1xuICAgIC4uLk9iamVjdC5rZXlzKGVudHJ5cG9pbnRzKSxcbiAgICAuLi5PYmplY3Qua2V5cyhzdGF0aWNGaWxlcyksXG4gIF0pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uR3JvdXBzID1cbiAgICBvcHRpb25zLmZ1bmN0aW9uR3JvdXBzID8/XG4gICAgcGFyc2VGdW5jdGlvbkdyb3Vwc0Vudihwcm9jZXNzLmVudltGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUl0pO1xuICAvLyBpMThuIGlzIGNoZWNrZWQgZmlyc3Q6IGl0IHJlamVjdHMgdGhlIGNvbWJpbmF0aW9uIG91dHJpZ2h0LCBhbmQgcnVubmluZyBpdFxuICAvLyBhZnRlciB0aGUgYXNzaWdubWVudCBtZWFudCBhbiBpMThuIGFwcCBnb3QgdGhlIGFzc2lnbm1lbnQncyBcInBhdHRlcm4gbWF0Y2hlc1xuICAvLyBubyByb3V0ZVwiIGVycm9yIGluc3RlYWQg4oCUIHRydWUsIGJ1dCBhYm91dCB0aGUgd3JvbmcgdGhpbmcsIHNpbmNlIGEgbG9jYWxpemVkXG4gIC8vIHRlbXBsYXRlIG5ldmVyIG1hdGNoZXMgYW4gdW5sb2NhbGl6ZWQgcGF0dGVybi5cbiAgaWYgKGZ1bmN0aW9uR3JvdXBzKSB7XG4gICAgYXNzZXJ0Tm9JMThuU3BsaXR0aW5nKGN0eC5jb25maWcuaTE4biA/PyBudWxsKTtcbiAgfVxuICBjb25zdCBhc3NpZ25tZW50ID0gZnVuY3Rpb25Hcm91cHNcbiAgICA/IGFzc2lnblJvdXRlc1RvR3JvdXBzKFxuICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgLy8gS2V5ZWQgb24gdGhlIGZpbGUsIG5vdCB0aGUgb3V0cHV0IGBpZGA6IGEgUGFnZXMgUm91dGVyIHBhZ2UgYW5kIGl0c1xuICAgICAgICAvLyBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCByb3V0ZSBhcmUgc2VwYXJhdGUgb3V0cHV0cyB3aXRoXG4gICAgICAgIC8vIHNlcGFyYXRlIGlkcyBiYWNrZWQgYnkgb25lIGZpbGUsIGFuZCBvbmx5IHRoZSBwYWdlJ3MgdGVtcGxhdGUgbWF0Y2hlc1xuICAgICAgICAvLyBhIGdyb3VwIHBhdHRlcm4uXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJ5cG9pbnRzKS5tYXAoKFt0ZW1wbGF0ZSwgZW50cnlwb2ludF0pID0+ICh7XG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgZW50cnlwb2ludElkOiBlbnRyeXBvaW50LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGU6IGVudHJ5cG9pbnQudHlwZSxcbiAgICAgICAgfSkpLFxuICAgICAgICB7XG4gICAgICAgICAgYmFzZVBhdGg6IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIixcbiAgICAgICAgICBidWlsZElkOiBjdHguYnVpbGRJZCxcbiAgICAgICAgICB0cmFpbGluZ1NsYXNoOiBjdHguY29uZmlnLnRyYWlsaW5nU2xhc2ggPT09IHRydWUsXG4gICAgICAgICAgcm91dGluZzogY3R4LnJvdXRpbmcsXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCA9IHtcbiAgICB2ZXJzaW9uOiBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04gYXMgMSxcbiAgICBidWlsZElkOiBjdHguYnVpbGRJZCxcbiAgICByZWxhdGl2ZVByb2plY3REaXI6IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIGN0eC5wcm9qZWN0RGlyKSksXG4gICAgY29uZmlnOiB7XG4gICAgICBiYXNlUGF0aDogY3R4LmNvbmZpZy5iYXNlUGF0aCB8fCBcIlwiLFxuICAgICAgdHJhaWxpbmdTbGFzaDogY3R4LmNvbmZpZy50cmFpbGluZ1NsYXNoID09PSB0cnVlLFxuICAgICAgYXNzZXRQcmVmaXg6IGN0eC5jb25maWcuYXNzZXRQcmVmaXggfHwgXCJcIixcbiAgICAgIGRpc3REaXI6IHRvUG9zaXgocmVsYXRpdmUoY3R4LnByb2plY3REaXIsIGN0eC5kaXN0RGlyKSksXG4gICAgICBjb21wcmVzczogY3R4LmNvbmZpZy5jb21wcmVzcyAhPT0gZmFsc2UsXG4gICAgICBnZW5lcmF0ZUV0YWdzOiBjdHguY29uZmlnLmdlbmVyYXRlRXRhZ3MgIT09IGZhbHNlLFxuICAgICAgaTE4bjogY3R4LmNvbmZpZy5pMThuID8/IG51bGwsXG4gICAgICBkZXBsb3ltZW50SWQ6IChjdHguY29uZmlnLmRlcGxveW1lbnRJZCA/PyBcIlwiKS5yZXBsYWNlKFxuICAgICAgICAvW15BLVphLXowLTlfLV0vZyxcbiAgICAgICAgXCItXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgcm91dGluZzogY3R4LnJvdXRpbmcsXG4gICAgcGF0aG5hbWVzLFxuICAgIGVudHJ5cG9pbnRzLFxuICAgIG1pZGRsZXdhcmU6IGJ1aWxkTWlkZGxld2FyZShyZXBvUm9vdCwgb3V0cHV0cy5taWRkbGV3YXJlKSxcbiAgICBzdGF0aWNGaWxlcyxcbiAgICAuLi4oYXNzaWdubWVudFxuICAgICAgPyB7XG4gICAgICAgICAgZ3JvdXBzOiBhc3NpZ25tZW50LnRlbXBsYXRlcyxcbiAgICAgICAgICBiZWhhdmlvcnM6IGFzc2lnbm1lbnQuYmVoYXZpb3JzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzOiBmdW5jdGlvbkdyb3VwcyEubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJvdXRlcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xuXG4gIGNvbnN0IGdyb3VwczogU3RhZ2VkR3JvdXBbXSA9IGFzc2lnbm1lbnRcbiAgICA/IE9iamVjdC5lbnRyaWVzKGFzc2lnbm1lbnQudGVtcGxhdGVzKS5tYXAoKFtuYW1lLCB0ZW1wbGF0ZXNdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkaXJOYW1lOiBncm91cFN0YWdpbmdEaXJOYW1lKG5hbWUpLFxuICAgICAgICBzdGFnaW5nOiBjb2xsZWN0R3JvdXBTdGFnaW5nUGxhbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgaW52b2NhYmxlLFxuICAgICAgICAgIGVudHJ5cG9pbnRzLFxuICAgICAgICAgIHRlbXBsYXRlcyxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgIDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgICAgICAgICBkaXJOYW1lOiBncm91cFN0YWdpbmdEaXJOYW1lKCksXG4gICAgICAgICAgc3RhZ2luZzogc2VydmVkU3RhZ2luZ1BsYW4oY3R4LCBpbnZvY2FibGUpLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICByZXR1cm4geyBtYW5pZmVzdCwgZ3JvdXBzIH07XG59XG5cbi8qKlxuICogT25lIGdyb3VwJ3Mgc2xpY2Ugb2YgdGhlIHN0YWdpbmcgcGxhbjogdGhlIGFzc2V0cyBvZiB0aGUgb3V0cHV0cyBpdCBvd25zLCBhbmRcbiAqIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBNaWRkbGV3YXJlIGlzIGluIGV2ZXJ5IGdyb3VwLCBub3QganVzdCB0aGUgZGVmYXVsdCBvbmUg4oCUIGl0IHJ1bnMgb24gZXZlcnlcbiAqIHJlcXVlc3Qgd2hlcmV2ZXIgdGhhdCByZXF1ZXN0IGxhbmRzLCBzbyBpdCBpcyBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYXMgaXMgdGhlXG4gKiBgbmV4dGAgY2xvc3VyZSB0aGUgZW50cnlwb2ludHMgc2hhcmUuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBzdGF0aWMgZmlsZXMgdGhlXG4gKiBydW50aW1lIHNlcnZlcyBpdHNlbGYgKGA0MDQuaHRtbGAsIGBmYXZpY29uLmljby5ib2R5YCk6IGFueSBncm91cCBjYW4gYmUgYXNrZWRcbiAqIGZvciB0aGVtLiBBbmQgc28gYXJlIHRoZSBub3QtZm91bmQgYW5kIGVycm9yIHBhZ2VzOiB0aGUgcnVudGltZSByZW5kZXJzIGFcbiAqIDQwNCBvciBhIDUwMCB3aXRoIHdoaWNoZXZlciBvZiB0aGVtIHRoZSBzaGFyZWQgbWFuaWZlc3QgbmFtZXNcbiAqIChgc3RhdHVzVGFyZ2V0c2AgaW4gYHJ1bnRpbWUvZGlzcGF0Y2gudHNgKSwgaW4gd2hpY2hldmVyIGdyb3VwIHRoZVxuICogcmVxdWVzdCByZWFjaGVkLCBzbyBhIGdyb3VwIHdpdGhvdXQgdGhlbSBhbnN3ZXJlZCBhIFVSTCB1bmRlciBpdHMgb3duXG4gKiBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBubyByb3V0ZSB3aXRoIFwidGhlIGRlcGxveW1lbnQgcGFja2FnZSBpcyBpbmNvbXBsZXRlXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIG1hdGNoZWQgb24gdGhlIGVudHJ5cG9pbnQncyBgZmlsZVBhdGhgLCBub3QgaXRzIGBpZGAgb3JcbiAqIHBhdGhuYW1lOiB0aGUgbWFuaWZlc3QncyBlbnRyeXBvaW50cyBhcmUga2V5ZWQgYnkgKnRlbXBsYXRlKiwgYW4gb3V0cHV0IG1heVxuICogYmFjayBzZXZlcmFsIHRlbXBsYXRlcywgYW5kIHtAbGluayBhZGRQcmVyZW5kZXJQYXRobmFtZXN9IHN5bnRoZXNpemVzXG4gKiBlbnRyeXBvaW50cyB0aGF0IGNhcnJ5IHRoZSAqcHJlcmVuZGVyJ3MqIGlkLCB3aGljaCBubyBpbnZvY2FibGUgb3V0cHV0IGhhcyAodGhlXG4gKiByb290LXBhcmFtcyBhcHA6IGVudHJ5cG9pbnQgYC9lbmAgd2l0aCBgaWQ6IFwiL2VuXCJgIGJhY2tlZCBieSB0aGUgb3V0cHV0XG4gKiBgL1tsb2NhbGVdYCkuIFRoZSBzeW50aGVzaXplZCBlbnRyeXBvaW50J3MgYGZpbGVQYXRoYCBpcyB0aGUgb3duaW5nIG91dHB1dCdzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0R3JvdXBTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbiAgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PixcbiAgdGVtcGxhdGVzOiBzdHJpbmdbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgY29uc3Qgb3duZWRFbnRyeXBvaW50cyA9IFtcbiAgICAuLi50ZW1wbGF0ZXMsXG4gICAgLi4uRVJST1JfUEFHRV9TVUZGSVhFUy5tYXAoKHN1ZmZpeCkgPT4gYCR7YmFzZVBhdGh9JHtzdWZmaXh9YCksXG4gIF1cbiAgICAubWFwKCh0ZW1wbGF0ZSkgPT4gZW50cnlwb2ludHNbdGVtcGxhdGVdKVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgQWRhcHRlckVudHJ5cG9pbnQgPT4gZW50cnkgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IG93bmVkRmlsZXMgPSBuZXcgU2V0KG93bmVkRW50cnlwb2ludHMubWFwKChlbnRyeSkgPT4gZW50cnkuZmlsZVBhdGgpKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IGN0eC5vdXRwdXRzLm1pZGRsZXdhcmU7XG4gIGNvbnN0IG93bmVkID0gaW52b2NhYmxlLmZpbHRlcihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgb3duZWRGaWxlcy5oYXModG9Qb3NpeChyZWxhdGl2ZShjdHgucmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpKSB8fFxuICAgICAgb3V0cHV0ID09PSBtaWRkbGV3YXJlLFxuICApO1xuICByZXR1cm4gc2VydmVkU3RhZ2luZ1BsYW4oY3R4LCBvd25lZCk7XG59XG5cbi8qKiB7QGxpbmsgY29sbGVjdFN0YWdpbmdQbGFufSBmb3IgYG91dHB1dHNgLCBwbHVzIHRoZSBmaWxlcyB0aGUgcnVudGltZSBzZXJ2ZXMuICovXG5mdW5jdGlvbiBzZXJ2ZWRTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgb3V0cHV0czogSW52b2NhYmxlT3V0cHV0W10sXG4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qgc3RhZ2luZyA9IGNvbGxlY3RTdGFnaW5nUGxhbihjdHgsIG91dHB1dHMpO1xuICBzdGFnZVNlcnZlZFN0YXRpY0ZpbGVzKGN0eCwgc3RhZ2luZyk7XG4gIHJldHVybiBzdGFnaW5nO1xufVxuXG4vKipcbiAqIEpvYiAxOiByZWplY3Qgbm9uLU5vZGUgb3V0cHV0cywgZXZlcnl3aGVyZS5cbiAqXG4gKiBgZXhwb3J0IGNvbnN0IHJ1bnRpbWUgPSAnZWRnZSdgIG9uIGEgcGFnZSBvciByb3V0ZSBoYW5kbGVyIGxhbmRzIGluXG4gKiBgYXBwUGFnZXNgL2BhcHBSb3V0ZXNgL2BwYWdlc2AvYHBhZ2VzQXBpYCB3aXRoIGBydW50aW1lOiAnZWRnZSdgLFxuICogYGFzc2V0czoge31gLCBhbmQgYW4gYGVkZ2VSdW50aW1lYCBkZXNjcmlwdG9yIG5lZWRpbmcgYGdsb2JhbFRoaXMuX0VOVFJJRVNgXG4gKiBhbmQgYSBzYW5kYm94LiBHdWFyZGluZyBtaWRkbGV3YXJlIGFsb25lIHdvdWxkIGxlYXZlIGEgc2lsZW50IGZhaWx1cmUgbW9kZVxuICogZm9yIGVkZ2UgcGFnZXM6IGFuIGVudHJ5cG9pbnQgd2UgY2FuJ3QgaW52b2tlIGFuZCBubyBhc3NldHMgdG8gaW52b2tlIGl0XG4gKiB3aXRoLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlUnVudGltZXMoXG4gIGludm9jYWJsZTogSW52b2NhYmxlT3V0cHV0W10sXG4gIG1pZGRsZXdhcmU6IEFkYXB0ZXJPdXRwdXRzW1wibWlkZGxld2FyZVwiXSxcbik6IHZvaWQge1xuICBjb25zdCBvZmZlbmRpbmcgPSBpbnZvY2FibGUuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5ydW50aW1lICE9PSBcIm5vZGVqc1wiKTtcbiAgaWYgKG9mZmVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBNaWRkbGV3YXJlIGlzIHJlcG9ydGVkIHNlcGFyYXRlbHkgZnJvbSByb3V0ZXMuIEl0cyBgc291cmNlUGFnZWAgaXMgYC9gLCBzb1xuICAvLyBmb2xkaW5nIGl0IGluIHdpdGggdGhlIHJvdXRlcyBwcm9kdWNlcyB0aGUgYWN0aXZlbHkgbWlzbGVhZGluZyBhZHZpY2UgdG9cbiAgLy8gcmVtb3ZlIGBleHBvcnQgY29uc3QgcnVudGltZSA9IFwiZWRnZVwiYCBmcm9tIHRoZSBob21lIHBhZ2UgLSB3aGljaCBpcyB3aGVyZVxuICAvLyB0aGUgZWRnZSBydW50aW1lIGlzIG5vdCwgYW5kIG1heSBub3QgZXZlbiBleGlzdC5cbiAgY29uc3Qgb2ZmZW5kaW5nTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUgJiYgb2ZmZW5kaW5nLmluY2x1ZGVzKG1pZGRsZXdhcmUpO1xuICAvLyBgLnJzY2AgdmFyaWFudHMgc2hhcmUgYSBgc291cmNlUGFnZWAgd2l0aCB0aGVpciBIVE1MIHNpYmxpbmcsIHNvIGRlZHVwZS5cbiAgY29uc3Qgcm91dGVzID0gc29ydGVkVW5pcXVlKFxuICAgIG9mZmVuZGluZ1xuICAgICAgLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQgIT09IG1pZGRsZXdhcmUpXG4gICAgICAubWFwKChvdXRwdXQpID0+IGAke291dHB1dC5zb3VyY2VQYWdlfSAocnVudGltZTogXCIke291dHB1dC5ydW50aW1lfVwiKWApLFxuICApO1xuXG4gIGNvbnN0IHJlYXNvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmIChyb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgIHJlYXNvbnMucHVzaChcbiAgICAgIGBjZGstbmV4dGpzIGNhbm5vdCBkZXBsb3kgcm91dGVzIGJ1aWx0IGZvciB0aGUgZWRnZSBydW50aW1lLiBgICtcbiAgICAgICAgYFJlbW92ZSBcXGBleHBvcnQgY29uc3QgcnVudGltZSA9IFwiZWRnZVwiXFxgIGZyb206XFxuYCArXG4gICAgICAgIHJvdXRlcy5tYXAoKHJvdXRlKSA9PiBgICAtICR7cm91dGV9YCkuam9pbihcIlxcblwiKSxcbiAgICApO1xuICB9XG4gIGlmIChvZmZlbmRpbmdNaWRkbGV3YXJlKSB7XG4gICAgcmVhc29ucy5wdXNoKFxuICAgICAgYGNkay1uZXh0anMgY2Fubm90IGRlcGxveSBtaWRkbGV3YXJlIGJ1aWx0IGZvciB0aGUgZWRnZSBydW50aW1lIGAgK1xuICAgICAgICBgKCR7bWlkZGxld2FyZS5maWxlUGF0aH0sIHJ1bnRpbWU6IFwiJHttaWRkbGV3YXJlLnJ1bnRpbWV9XCIpLiBgICtcbiAgICAgICAgYFJlbmFtZSBpdCB0byBcXGBwcm94eS50c1xcYCAoTmV4dC5qcyAxNiBydW5zIHByb3h5IG9uIHRoZSBOb2RlIGAgK1xuICAgICAgICBgcnVudGltZSksIG9yIGtlZXAgXFxgbWlkZGxld2FyZS50c1xcYCBhbmQgYWRkIGAgK1xuICAgICAgICBgXFxgZXhwb3J0IGNvbnN0IGNvbmZpZyA9IHsgcnVudGltZTogXCJub2RlanNcIiB9XFxgIHRvIGl0IOKAlCBgICtcbiAgICAgICAgYFxcYG1pZGRsZXdhcmUudHNcXGAgZGVmYXVsdHMgdG8gdGhlIGVkZ2UgcnVudGltZSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgaXQuYCxcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGAke0xPR19QUkVGSVh9ICR7cmVhc29ucy5qb2luKFwiXFxuXCIpfVxcbmAgK1xuICAgICAgYFRoZSBlZGdlIHJ1bnRpbWUgaXMgZGVwcmVjYXRlZCBpbiBOZXh0LmpzOiBgICtcbiAgICAgIGBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9lZGdlLXJ1bnRpbWUtZGVwcmVjYXRlZGAsXG4gICk7XG59XG5cbi8qKlxuICogV2FybiBvbiByb3V0ZSBjb25maWcgY2RrLW5leHRqcyBkb2VzIG5vdCBob25vci4gQW4gYXV0aG9yIHdobyBzZXQgdGhlc2UgYXNrZWRcbiAqIGZvciBzb21ldGhpbmcgZXhwbGljaXRseSwgc28gc2F5IHNvIHJhdGhlciB0aGFuIGlnbm9yaW5nIGl0IHNpbGVudGx5OyBuZXZlclxuICogdGhyb3csIGJlY2F1c2Ugcm91dGUtbGV2ZWwgYG1heER1cmF0aW9uYCBpcyB2YWxpZCBOZXh0LmpzLlxuICpcbiAqIGBOZXh0anNCdWlsZGAgcnVucyBgbmV4dCBidWlsZGAgd2l0aCBgc3RkaW86IFwiaW5oZXJpdFwiYCwgc28gdGhpcyByZWFjaGVzIHRoZVxuICogdXNlcidzIHRlcm1pbmFsLiBTZWUgdGhlIHBsYW4ncyBcIkRlY2lzaW9uc1wiIGZvciB3aHkgbmVpdGhlciBpcyBob25vcmVkLlxuICovXG5mdW5jdGlvbiB3YXJuT25Ecm9wcGVkUm91dGVDb25maWcoaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSk6IHZvaWQge1xuICBjb25zdCBkcm9wcGVkOiBSZWNvcmQ8XCJtYXhEdXJhdGlvblwiIHwgXCJwcmVmZXJyZWRSZWdpb25cIiwgc3RyaW5nW10+ID0ge1xuICAgIG1heER1cmF0aW9uOiBbXSxcbiAgICBwcmVmZXJyZWRSZWdpb246IFtdLFxuICB9O1xuICBmb3IgKGNvbnN0IG91dHB1dCBvZiBpbnZvY2FibGUpIHtcbiAgICBpZiAob3V0cHV0LmNvbmZpZz8ubWF4RHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5tYXhEdXJhdGlvbi5wdXNoKG91dHB1dC5zb3VyY2VQYWdlKTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5jb25maWc/LnByZWZlcnJlZFJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcm9wcGVkLnByZWZlcnJlZFJlZ2lvbi5wdXNoKG91dHB1dC5zb3VyY2VQYWdlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZW1lZHk6IFJlY29yZDxcIm1heER1cmF0aW9uXCIgfCBcInByZWZlcnJlZFJlZ2lvblwiLCBzdHJpbmc+ID0ge1xuICAgIG1heER1cmF0aW9uOlxuICAgICAgXCJTZXQgdGhlIGZ1bmN0aW9uIHRpbWVvdXQgd2l0aCB0aGUgY29uc3RydWN0J3MgYG92ZXJyaWRlc2AgcHJvcCBpbnN0ZWFkIChlLmcuIGBvdmVycmlkZXM6IHsgbmV4dGpzRnVuY3Rpb25zOiB7IGZ1bmN0aW9uUHJvcHM6IHsgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMCkgfSB9IH1gKTsgYSBMYW1iZGEgdGltZW91dCBpcyBwZXItZnVuY3Rpb24gd2hpbGUgYG1heER1cmF0aW9uYCBpcyBwZXItcm91dGUuXCIsXG4gICAgcHJlZmVycmVkUmVnaW9uOlxuICAgICAgXCJIb25vcmluZyBpdCB3b3VsZCByZXF1aXJlIGEgbXVsdGktcmVnaW9uIGRlcGxveW1lbnQsIHdoaWNoIHRoaXMgY29uc3RydWN0IGRvZXMgbm90IG1vZGVsLlwiLFxuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFtcIm1heER1cmF0aW9uXCIsIFwicHJlZmVycmVkUmVnaW9uXCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3Qgcm91dGVzID0gc29ydGVkVW5pcXVlKGRyb3BwZWRba2V5XSk7XG4gICAgaWYgKHJvdXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSBcXGAke2tleX1cXGAgaXMgbm90IGhvbm9yZWQgYnkgY2RrLW5leHRqcy4gYCArXG4gICAgICAgIGAke3JvdXRlcy5sZW5ndGh9IHJvdXRlKHMpIHNldCBpdCwgaW5jbHVkaW5nOiAke3JvdXRlcy5zbGljZSgwLCA1KS5qb2luKFwiLCBcIil9YCArXG4gICAgICAgIGAke3JvdXRlcy5sZW5ndGggPiA1ID8gYCwgYW5kICR7cm91dGVzLmxlbmd0aCAtIDV9IG1vcmVgIDogXCJcIn0uIGAgK1xuICAgICAgICByZW1lZHlba2V5XSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSm9icyAyLCAzIGFuZCA2OiB0aGUgZGVkdXBlZCB1bmlvbiBvZiBldmVyeSBzaGlwcGVkIG91dHB1dCdzIHRyYWNlZCBgYXNzZXRzYCxcbiAqIHBsdXMgZWFjaCBlbnRyeXBvaW50IGZpbGUgaXRzZWxmLCBwbHVzIHRoZSBlbnYgZmlsZXMsIHdpdGggYGFzc2V0c0hhc2hlc2AgdXNlZFxuICogYXMgYSBjb25mbGljdCBjaGVjay5cbiAqXG4gKiBEZWR1cCBpcyBieSBrZXk6IHRoZSB0cmFjZWQgYG5leHRgIGNsb3N1cmUgaXMgbWVyZ2VkIGludG8gZXZlcnkgb3V0cHV0J3NcbiAqIGBhc3NldHNgIChgZ2V0U2hhcmVkTm9kZUFzc2V0c2Ag4oaSIGBzaGFyZWROb2RlQXNzZXRzYCksIHNvIE4gb3V0cHV0c1xuICogb3ZlcndoZWxtaW5nbHkgcmVwZWF0IGtleXMuIFdoYXQgdGhlIGhhc2hlcyBidXkgaXMgZGV0ZWN0aW5nIHR3byBvdXRwdXRzXG4gKiBtYXBwaW5nIHRoZSAqKnNhbWUga2V5IHRvIGRpZmZlcmVudCBjb250ZW50KiosIHdoaWNoIGlzIHVucGFja2FnZWFibGUgaW50b1xuICogb25lIExhbWJkYSDigJQgZmFpbCB0aGUgYnVpbGQgbG91ZGx5IHJhdGhlciB0aGFuIGxldHRpbmcgbGFzdC13cml0ZS13aW5zIHBpY2suXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IHJlcG9Sb290IH0gPSBjdHg7XG4gIGNvbnN0IHN0YWdpbmcgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBoYXNoZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0IGFkZCA9IChrZXk6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGhhc2g/OiBzdHJpbmcpID0+IHtcbiAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgICBjb25zdCBleGlzdGluZ0hhc2ggPSBoYXNoZXMuZ2V0KGtleSk7XG4gICAgaWYgKFxuICAgICAgaGFzaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBleGlzdGluZ0hhc2ggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgZXhpc3RpbmdIYXNoICE9PSBoYXNoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFR3byBidWlsZCBvdXRwdXRzIG1hcCBcIiR7a2V5fVwiIHRvIGRpZmZlcmVudCBjb250ZW50IGAgK1xuICAgICAgICAgIGAoaGFzaGVzICR7ZXhpc3RpbmdIYXNofSBhbmQgJHtoYXNofSkuIE9uZSBkZXBsb3ltZW50IHBhY2thZ2UgY2Fubm90IGAgK1xuICAgICAgICAgIGBob2xkIGJvdGguIFRoaXMgdXN1YWxseSBtZWFucyB0d28gTmV4dC5qcyBwcm9qZWN0cyBpbiB0aGUgc2FtZSByZXBvIGAgK1xuICAgICAgICAgIGB3cml0ZSB0aGUgc2FtZSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzaGVzLnNldChrZXksIGhhc2gpO1xuICAgIH1cbiAgICBpZiAoIXN0YWdpbmcuaGFzKGtleSkpIHtcbiAgICAgIHN0YWdpbmcuc2V0KGtleSwgc291cmNlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChjb25zdCBvdXRwdXQgb2YgaW52b2NhYmxlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dC5hc3NldHMpKSB7XG4gICAgICBhZGQoa2V5LCBzb3VyY2UsIG91dHB1dC5hc3NldHNIYXNoZXNba2V5XSk7XG4gICAgfVxuICAgIC8vIFRoZSBlbnRyeXBvaW50J3Mgb3duIGZpbGUgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tIGl0cyBgYXNzZXRzYCDigJQgdGhlXG4gICAgLy8gTkZUIHRyYWNlIGNvdmVycyB0aGUgY2xvc3VyZSBpdCByZXF1aXJlcywgbm90IGl0c2VsZi4gYGFzc2V0c0hhc2hlc2AgZG9lc1xuICAgIC8vIGNhcnJ5IGl0IChrZXllZCB0aGUgc2FtZSB3YXkpLCB3aGljaCBpcyBhbHNvIHdoYXQgcGlucyB0aGUga2V5IGZvcm1hdC5cbiAgICBjb25zdCBlbnRyeUtleSA9IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpO1xuICAgIGFkZChlbnRyeUtleSwgb3V0cHV0LmZpbGVQYXRoLCBvdXRwdXQuYXNzZXRzSGFzaGVzW2VudHJ5S2V5XSk7XG4gIH1cblxuICAvLyBKb2IgMiwgc2Vjb25kIGhhbGY6IGB3cml0ZVN0YW5kYWxvbmVEaXJlY3RvcnlgIGZpbHRlcnMgYGxvYWRlZEVudkZpbGVzYCB0b1xuICAvLyBleGFjdGx5IHRoZXNlIHR3byBhbmQgY29waWVzIHRoZW07IGBidWlsZC1jb21wbGV0ZS5qc2AgaGFzIG5vIGVudi1maWxlXG4gIC8vIGhhbmRsaW5nIGF0IGFsbCwgc28gdGhleSBhcmUgbm90IGluIGFueSBgYXNzZXRzYCBtYXAuXG4gIGZvciAoY29uc3QgZW52RmlsZSBvZiBFTlZfRklMRVMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBqb2luKGN0eC5wcm9qZWN0RGlyLCBlbnZGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSB7XG4gICAgICBhZGQodG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgc291cmNlKSksIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YWdpbmc7XG59XG5cbi8qKlxuICogSm9iIDIsIHRoaXJkIHBhcnQ6IHRoZSBzdGF0aWMgZmlsZXMgdGhlICpydW50aW1lKiBoYXMgdG8gc2VydmUsIGFuZCB0aGVpclxuICogc291cmNlcy5cbiAqXG4gKiBgb3V0cHV0cy5zdGF0aWNGaWxlc2AgbWl4ZXMgdHdvIHBvcHVsYXRpb25zIHdpdGggdGhlIHNhbWUgYFNUQVRJQ19GSUxFYCB0eXBlOlxuICpcbiAqIC0gKipgPGRpc3REaXI+L3N0YXRpYy8qKmAgYW5kIGBwdWJsaWMvKipgKiog4oCUIHVwbG9hZGVkIHRvIFMzIGJ5XG4gKiAgIGBOZXh0anNTdGF0aWNBc3NldHNgLCBhbmQgQ2xvdWRGcm9udCAvIEFQSSBHYXRld2F5IGFuc3dlciB0aGVtIGJlZm9yZSB0aGVcbiAqICAgcmVxdWVzdCBldmVyIHJlYWNoZXMgdGhlIGNvbXB1dGUuIE5vdCBzdGFnZWQ6IGBwdWJsaWMvYCBhbG9uZSBjYW4gYmVcbiAqICAgaHVuZHJlZHMgb2YgbWVnYWJ5dGVzIGFnYWluc3QgYSAyNTAgTUIgdW56aXBwZWQgTGFtYmRhIGNhcCwgYW5kIGl0IHdvdWxkIGJlXG4gKiAgIGEgc2Vjb25kIGNvcHkgb2YgYnl0ZXMgYWxyZWFkeSBpbiBTMy4gYHB1YmxpYy9gIGlzIG5vdCBpblxuICogICBgb3V0cHV0cy5zdGF0aWNGaWxlc2AgYXQgYWxsIOKAlCBOZXh0LmpzIGxpc3RzIGl0IG9ubHkgZm9yIGBvdXRwdXQ6IFwiZXhwb3J0XCJgXG4gKiAgIOKAlCBhbmQgaXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhZGRlZCBoZXJlOiB0aGUgY29udGFpbmVyIHJ1bnRpbWUgbGlzdHMgaXQgb2ZmXG4gKiAgIGRpc2sgYXQgY29sZCBzdGFydCBpbnN0ZWFkLCBhcyBgbmV4dCBzdGFydGAgZG9lcyAoYHJlYWRQdWJsaWNGaWxlc2AgaW5cbiAqICAgYHNyYy9ydW50aW1lL3B1YmxpYy1maWxlcy50c2ApLCBiZWNhdXNlIG9ubHkgdGhlIGRpc2sga25vd3Mgd2hhdCBhbiBhcHAnc1xuICogICBgcG9zdGJ1aWxkYCB3cm90ZSBpbnRvIGl0IGFmdGVyIHRoaXMgaG9vayByYW4uXG4gKiAtICoqZXZlcnl0aGluZyBlbHNlKiosIGFsbCBvZiBpdCB1bmRlciBgPGRpc3REaXI+L3NlcnZlci9gIOKAlCBgNDA0Lmh0bWxgLFxuICogICBgNTAwLmh0bWxgLCBgZmF2aWNvbi5pY28uYm9keWAsIGFuZCBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIEhUTUwuIE5vdGhpbmdcbiAqICAgaW4gZnJvbnQgb2YgdGhlIGNvbXB1dGUgc2VydmVzIHRoZXNlLCBzbyB0aGV5IGFyZSBzdGFnZWQuIEJvdW5kZWQgYnkgcm91dGVcbiAqICAgY291bnQgYW5kIHNtYWxsLlxuICpcbiAqIFRoZSBwYXRobmFtZSDihpIga2V5IG1hcCBpcyByZXR1cm5lZCBmb3IgKmFsbCogb2YgdGhlbSwgYmVjYXVzZSBkaXNwYXRjaCBoYXMgdG9cbiAqIHJlc29sdmUgYSBwYXRobmFtZSB0byBcInN0YXRpYyBmaWxlLCBub3QgYSA0MDRcIiBlaXRoZXIgd2F5OyB0aGUgcnVudGltZSA0MDRzIGlmXG4gKiB0aGUgZmlsZSB0dXJucyBvdXQgbm90IHRvIGJlIGluIHRoZSBwYWNrYWdlLCB3aGljaCBpcyBvbmx5IHJlYWNoYWJsZSB3aGVuIHRoZVxuICogZGlzdHJpYnV0aW9uIGlzIG1pc3JvdXRlZC5cbiAqXG4gKiBTdGFnaW5nIGlzIHtAbGluayBzdGFnZVNlcnZlZFN0YXRpY0ZpbGVzfSwgYXBwbGllZCBvbmNlIHBlciBkZXBsb3ltZW50IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGF0aWNGaWxlcyhjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgcmVwb1Jvb3QgfSA9IGN0eDtcbiAgY29uc3QgYmFzZVBhdGggPSBjdHguY29uZmlnLmJhc2VQYXRoIHx8IFwiXCI7XG4gIGNvbnN0IHN0YXRpY0ZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgcGFnZXNEaXIgPSBqb2luKGN0eC5kaXN0RGlyLCBcInNlcnZlclwiLCBcInBhZ2VzXCIpICsgc2VwO1xuXG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGN0eC5vdXRwdXRzLnN0YXRpY0ZpbGVzKSB7XG4gICAgY29uc3Qga2V5ID0gdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgb3V0cHV0LmZpbGVQYXRoKSk7XG4gICAgY29uc3QgcGF0aG5hbWVzID0gcm91dGFibGVQYXRobmFtZXMoXG4gICAgICBvdXRwdXQucGF0aG5hbWUsXG4gICAgICBiYXNlUGF0aCxcbiAgICAgIG91dHB1dC5maWxlUGF0aC5zdGFydHNXaXRoKHBhZ2VzRGlyKSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgcGF0aG5hbWVzKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0YXRpY0ZpbGVzLmdldChwYXRobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0ga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBUd28gc3RhdGljIGZpbGVzIGNsYWltIHRoZSBwYXRobmFtZSBgICtcbiAgICAgICAgICAgIGBcIiR7cGF0aG5hbWV9XCIgKFwiJHtleGlzdGluZ31cIiBhbmQgXCIke2tleX1cIikuIERpc3BhdGNoIGNhbm5vdCBgICtcbiAgICAgICAgICAgIGBjaG9vc2UgYmV0d2VlbiB0aGVtLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGF0aWNGaWxlcy5zZXQocGF0aG5hbWUsIGtleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU29ydGVkIGJlY2F1c2Ugb2JqZWN0IGtleXMga2VlcCBpbnNlcnRpb24gb3JkZXIsIGFuZCBhIGJ5dGUtc3RhYmxlXG4gIC8vIGBtYW5pZmVzdC5qc29uYCBpcyB3aGF0IGtlZXBzIGl0IGRpZmZhYmxlIGFuZCB0aGUgQ0RLIGFzc2V0IGhhc2ggZnJvbVxuICAvLyBjaHVybmluZy5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4uc3RhdGljRmlsZXNdLnNvcnQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IDEpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcGF0aG5hbWVzIGFuIG91dHB1dCBhbnN3ZXJzLCB3aGljaCBmb3Igb25lIHNoYXBlIGlzIG5vdCB0aGUgcGF0aG5hbWVcbiAqIGBuZXh0IGJ1aWxkYCByZXBvcnRlZC5cbiAqXG4gKiAqKkEgUGFnZXMgUm91dGVyIGhvbWUgcGFnZSBhcnJpdmVzIGFzIGAvaW5kZXhgLioqIFRoZSBhZGFwdGVyIGhvb2sgZGVyaXZlcyBldmVyeVxuICogUGFnZXMgcGF0aG5hbWUgd2l0aCBgbm9ybWFsaXplUGFnZVBhdGgocGFnZSlgLCBhbmQgYG5vcm1hbGl6ZVBhZ2VQYXRoKFwiL1wiKWAgaXNcbiAqIGBcIi9pbmRleFwiYCAoYG5leHQvZGlzdC9zaGFyZWQvbGliL3BhZ2UtcGF0aC9ub3JtYWxpemUtcGFnZS1wYXRoLmpzYCkg4oCUIGZvciB0aGVcbiAqIGBQQUdFU2Agb3V0cHV0IG9mIGFuIFNTRyBvciBTU1IgaG9tZSBwYWdlIGFuZCBmb3IgdGhlIGBTVEFUSUNfRklMRWAgb2YgYVxuICogZnVsbHktc3RhdGljIG9uZSBhbGlrZS4gYC9pbmRleGAgaXMgbm90IGEgVVJMIGFueW9uZSByZXF1ZXN0cywgYW5kIG5vdGhpbmcgZWxzZVxuICogaW4gdGhlIG91dHB1dHMgY2FycmllcyBgL2AgZm9yIHRoYXQgcGFnZSwgc28gd2l0aG91dCB0aGlzIHRoZSBob21lIHBhZ2UgaXMgaW5cbiAqIG5laXRoZXIgYG1hbmlmZXN0LnBhdGhuYW1lc2Agbm9yIGBtYW5pZmVzdC5lbnRyeXBvaW50c2AvYHN0YXRpY0ZpbGVzYCwgYW5kIGV2ZXJ5XG4gKiByZXF1ZXN0IHRvIGAvYCA0MDRzIHdoaWxlIGV2ZXJ5IG90aGVyIHBhZ2Ugb2YgdGhlIHNhbWUgYXBwIHNlcnZlcy4gTWVhc3VyZWRcbiAqIGFnYWluc3QgbmV4dC5qcydzIGB0ZXN0L2UyZS9uZXctbGluay1iZWhhdmlvcmAgKGAvYCByZXR1cm5lZCB0aGUgYnVpbHQtaW4gNDA0LFxuICogdGhlIHNpeCBvdGhlciBwYWdlcyB3ZXJlIGZpbmUpIGFuZCBgdGVzdC9lMmUvcHJlcmVuZGVyLXByZXZpZXdgICh0aGUgb25lIGNhc2VcbiAqIHRoYXQgZmV0Y2hlcyBgL2AgZ290IHRoZSA0MDQgcGFnZSdzIEhUTUwsIHRoZSBlaWdodCB0aGF0IGhpdCBBUEkgcm91dGVzIHBhc3NlZCkuXG4gKlxuICogUGFnZXMgUm91dGVyIG91dHB1dHMgb25seSwgd2hpY2ggaXMgd2hhdCBgZnJvbVBhZ2VzUm91dGVyYCBzYXlzLiBBcHAgUm91dGVyXG4gKiByZXBvcnRzIGl0cyBob21lIHBhZ2UgYXMgYC9gIGFuZCBvbmx5IHRoZSBSU0Mgc2libGluZyBhcyBgL2luZGV4LnJzY2AsIHNvIGFuXG4gKiBBcHAgUm91dGVyIGAvaW5kZXhgIGlzIGBhcHAvaW5kZXgvcGFnZS50c3hgIOKAlCBhIHJlYWwgcm91dGUgYXQgYC9pbmRleGAsIGFuZFxuICogbWFwcGluZyBpdCB0byBgL2AgbWFkZSBhbiBhcHAgd2l0aCBib3RoIHBhZ2VzIGZhaWwgdGhlIGJ1aWxkIG9uIGEgcGF0aG5hbWVcbiAqIGNvbGxpc2lvbiwgYW5kIGFuIGFwcCB3aXRoIG9ubHkgdGhlIHNlY29uZCBzZXJ2ZSBpdCBhdCBgL2AuIFRoZSBzYW1lIGdvZXMgZm9yXG4gKiBhIGBwdWJsaWMvaW5kZXhgIGZpbGUuXG4gKlxuICogQm90aCBwYXRobmFtZXMgYXJlIHJlZ2lzdGVyZWQuIGAvYCBiZWNhdXNlIGl0IGlzIHRoZSByZWFsIG9uZTsgYC9pbmRleGAgYmVjYXVzZVxuICogbmV4dCdzIG93biBtaW5pbWFsIG1vZGUg4oCUIHRoZSBtb2RlIG91ciBydW50aW1lIHJ1bnMgaW4g4oCUIGFjY2VwdHMgaXQsIHJld3JpdGluZ1xuICogYHJlcS51cmxgIGFuZCBgeC1tYXRjaGVkLXBhdGhgIGZyb20gYC9pbmRleGAgdG8gYC9gIGJlZm9yZSBtYXRjaGluZ1xuICogKGBiYXNlLXNlcnZlci50c2AsIFwiaW4gbWluaW1hbCBtb2RlXCIpLCBzbyBkcm9wcGluZyBpdCB3b3VsZCBiZSBhIGRpdmVyZ2VuY2UgaW5cbiAqIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gKlxuICogVW5hbWJpZ3VvdXMgd2l0aGluIHRoZSBQYWdlcyBSb3V0ZXIgZGVzcGl0ZSB0aGUgY29sbGlzaW9uIGl0IGxvb2tzIGxpa2U6XG4gKiBgbm9ybWFsaXplUGFnZVBhdGgoXCIvaW5kZXhcIilgIGlzIGBcIi9pbmRleC9pbmRleFwiYCwgc28gYSByZXBvcnRlZCBgL2luZGV4YCBjYW5cbiAqIG9ubHkgaGF2ZSBjb21lIGZyb20gdGhlIHBhZ2UgYC9gLlxuICogVGhlIGRhdGEgcm91dGUgb2YgdGhlIHNhbWUgcGFnZSwgYC9fbmV4dC9kYXRhLzxidWlsZElkPi9pbmRleC5qc29uYCwgYW5kIGFuIEFwcFxuICogUm91dGVyIGAvaW5kZXgucnNjYCBhcmUgYm90aCByZWFsIFVSTHMgYW5kIGFyZSBsZWZ0IGFsb25lIGJ5IHRoZSBleGFjdCBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gcm91dGFibGVQYXRobmFtZXMoXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4gIGZyb21QYWdlc1JvdXRlcjogYm9vbGVhbixcbik6IHN0cmluZ1tdIHtcbiAgaWYgKCFmcm9tUGFnZXNSb3V0ZXIgfHwgcGF0aG5hbWUgIT09IGAke2Jhc2VQYXRofS9pbmRleGApIHtcbiAgICByZXR1cm4gW3BhdGhuYW1lXTtcbiAgfVxuICAvLyBgYmFzZVBhdGggfHwgXCIvXCJgLCBub3QgYCR7YmFzZVBhdGh9L2A6IHdpdGggYGJhc2VQYXRoOiBcIi9wcm9kXCJgIHRoZSBob21lIHBhZ2VcbiAgLy8gaXMgYC9wcm9kYCwgd2hpY2ggaXMgaG93IHRoZSBBcHAgUm91dGVyIGZpeHR1cmVzIHJlcG9ydCB0aGVpcnMuXG4gIHJldHVybiBbYmFzZVBhdGggfHwgXCIvXCIsIHBhdGhuYW1lXTtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIHN0YXRpYyBmaWxlcyB0aGUgKnJ1bnRpbWUqIHNlcnZlcyB0byBhIHN0YWdpbmcgcGxhbiDigJQgdGhlIFwiZXZlcnl0aGluZ1xuICogZWxzZVwiIHBvcHVsYXRpb24gZGVzY3JpYmVkIG9uIHtAbGluayBjb2xsZWN0U3RhdGljRmlsZXN9LCBhbGwgb2YgaXQgdW5kZXJcbiAqIGA8ZGlzdERpcj4vc2VydmVyL2AuXG4gKlxuICogU2VwYXJhdGUgZnJvbSBidWlsZGluZyB0aGUgbWFuaWZlc3QncyBgc3RhdGljRmlsZXNgIG1hcCBiZWNhdXNlIHRoZSBtYXAgaXMgdGhlXG4gKiBzYW1lIGZvciBldmVyeSBncm91cCB3aGlsZSB0aGUgc3RhZ2luZyBpcyBhcHBsaWVkIG9uY2UgcGVyIGRlcGxveW1lbnQgcm9vdDpcbiAqIGFueSBncm91cCBjYW4gYmUgYXNrZWQgZm9yIGAvNDA0YCwgc28gZXZlcnkgZ3JvdXAgc2hpcHMgdGhlc2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWdlU2VydmVkU3RhdGljRmlsZXMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIHN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgY29uc3QgeyByZXBvUm9vdCwgZGlzdERpciB9ID0gY3R4O1xuICBjb25zdCBjbGllbnRTdGF0aWNEaXIgPSBqb2luKGRpc3REaXIsIFwic3RhdGljXCIpICsgc2VwO1xuXG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGN0eC5vdXRwdXRzLnN0YXRpY0ZpbGVzKSB7XG4gICAgY29uc3Qgc2VydmVkQnlTMyA9XG4gICAgICBvdXRwdXQuZmlsZVBhdGguc3RhcnRzV2l0aChjbGllbnRTdGF0aWNEaXIpIHx8XG4gICAgICAhb3V0cHV0LmZpbGVQYXRoLnN0YXJ0c1dpdGgoZGlzdERpciArIHNlcCk7XG4gICAgaWYgKHNlcnZlZEJ5UzMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgb3V0cHV0LmZpbGVQYXRoKTtcbiAgICBzdGFnaW5nLnNldChrZXksIG91dHB1dC5maWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgaW52YXJpYW50IGJlaGluZCBgbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyYDogYG5leHQgYnVpbGRgIG11c3QgcnVuIGZyb21cbiAqIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAqXG4gKiBOZXh0IGlubGluZXMgYHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHByb2plY3REaXIpYCBpbnRvIGV2ZXJ5IGVudHJ5cG9pbnRcbiAqIChgZGVmaW5lLWVudi5qc2ApIGFuZCB0aGUgYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhZ2FpbnN0IHRoZSAqcnVudGltZSpcbiAqIGBwcm9jZXNzLmN3ZCgpYC4gS2VlcGluZyBidWlsZCBjd2QgYW5kIHByb2plY3QgZGlyIGVxdWFsIG1ha2VzIHRoYXQgaW5saW5lZFxuICogdmFsdWUgYFwiXCJgLCBzbyB0aGUgcnVudGltZSBvbmx5IGhhcyB0byBgY2hkaXJgIHRvIHRoZSBzdGFnZWQgcHJvamVjdCBkaXIuIEFcbiAqIGJ1aWxkIHJ1biBmcm9tIGVsc2V3aGVyZSB3b3VsZCBpbmxpbmUgYSBub24tZW1wdHkgcmVsYXRpdmUgcGF0aCDigJQgb2Z0ZW4gb25lXG4gKiBwb2ludGluZyBvdXRzaWRlIHRoZSBzdGFnaW5nIHRyZWUg4oCUIGFuZCBldmVyeSBlbnRyeXBvaW50IHdvdWxkIGZhaWwgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBhdCBydW50aW1lIHdpdGggbm8gaGludCBhcyB0byB3aHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ1aWxkQ3dkKGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsIGJ1aWxkQ3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgY3dkID0gcmVzb2x2ZShidWlsZEN3ZCk7XG4gIGlmIChjd2QgPT09IHJlc29sdmUoY3R4LnByb2plY3REaXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgJHtMT0dfUFJFRklYfSBcXGBuZXh0IGJ1aWxkXFxgIG11c3QgcnVuIGZyb20gdGhlIE5leHQuanMgcHJvamVjdCBgICtcbiAgICAgIGBkaXJlY3RvcnkuIEl0IHJhbiBmcm9tIFwiJHtjd2R9XCIgd2l0aCB0aGUgcHJvamVjdCBhdCBgICtcbiAgICAgIGBcIiR7Y3R4LnByb2plY3REaXJ9XCIuIE5leHQuanMgYmFrZXMgdGhlIHJlbGF0aXZlIHBhdGggYmV0d2VlbiB0aG9zZSB0d28gYCArXG4gICAgICBgaW50byBldmVyeSBidWlsdCBlbnRyeXBvaW50LCBhbmQgY2RrLW5leHRqcyBjYW5ub3QgcmVwcm9kdWNlIHRoYXQgbGF5b3V0IGAgK1xuICAgICAgYGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UuIENoYW5nZSBkaXJlY3RvcnkgZmlyc3QgKFxcYGNkIGAgK1xuICAgICAgYCR7cmVsYXRpdmUoY3dkLCBjdHgucHJvamVjdERpcikgfHwgXCIuXCJ9ICYmIG5leHQgYnVpbGRcXGApIGluc3RlYWQgb2YgYCArXG4gICAgICBgcGFzc2luZyB0aGUgZGlyZWN0b3J5IGFzIGFuIGFyZ3VtZW50OyBpbiBhIG1vbm9yZXBvLCBydW4gdGhlIGFwcCdzIG93biBgICtcbiAgICAgIGBidWlsZCBzY3JpcHQgZnJvbSBpdHMgZGlyZWN0b3J5IChlLmcuIFxcYHBucG0gLS1maWx0ZXIgPGFwcD4gYnVpbGRcXGAsIGAgK1xuICAgICAgYHdoaWNoIHJ1bnMgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5KS5gLFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGRFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50czogUmVjb3JkPHN0cmluZywgQWRhcHRlckVudHJ5cG9pbnQ+LFxuICByZXBvUm9vdDogc3RyaW5nLFxuICBvdXRwdXQ6IHsgaWQ6IHN0cmluZzsgcGF0aG5hbWU6IHN0cmluZzsgZmlsZVBhdGg6IHN0cmluZyB9LFxuICB0eXBlOiBBZGFwdGVyRW50cnlwb2ludFR5cGUsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgZmlsZVBhdGggPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgY29uc3QgcGF0aG5hbWVzID0gcm91dGFibGVQYXRobmFtZXMoXG4gICAgb3V0cHV0LnBhdGhuYW1lLFxuICAgIGJhc2VQYXRoLFxuICAgIHR5cGUgPT09IFwicGFnZVwiLFxuICApO1xuICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIHBhdGhuYW1lcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZW50cnlwb2ludHNbcGF0aG5hbWVdO1xuICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5maWxlUGF0aCAhPT0gZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVHdvIGJ1aWxkIG91dHB1dHMgY2xhaW0gdGhlIHBhdGhuYW1lIFwiJHtwYXRobmFtZX1cIiBgICtcbiAgICAgICAgICBgKFwiJHtleGlzdGluZy5maWxlUGF0aH1cIiBhbmQgXCIke2ZpbGVQYXRofVwiKS4gRGlzcGF0Y2ggY2Fubm90IGNob29zZSBgICtcbiAgICAgICAgICBgYmV0d2VlbiB0aGVtLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBlbnRyeXBvaW50c1twYXRobmFtZV0gPSB7IGlkOiBvdXRwdXQuaWQsIGZpbGVQYXRoLCB0eXBlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgdGhlICpwcmVyZW5kZXIqIHBhdGhuYW1lcyB0aGF0IG5vIGludm9jYWJsZSBvdXRwdXQgY2xhaW1zIGFuZCB0aGF0IHJvdXRpbmdcbiAqIGNhbm5vdCBvdGhlcndpc2UgcmVhY2guXG4gKlxuICogYHJlc29sdmVSb3V0ZXNgIGNhbiBvbmx5IG1hdGNoIGEgcGF0aG5hbWUgcHJlc2VudCBpbiBgbWFuaWZlc3QucGF0aG5hbWVzYCwgYW5kXG4gKiBmb3IgYSBkeW5hbWljIG1hdGNoIGl0IHJldHVybnMgdGhlICoqdGVtcGxhdGUqKiBpdCBtYXRjaGVkLiBSb3V0ZXMgYW5kIHN0YXRpY1xuICogZmlsZXMgY292ZXIgbW9zdCBvZiB0aGF0OyB0d28gc2hhcGVzIHRoZXkgbWlzczpcbiAqXG4gKiAxLiAqKlRlbXBsYXRlcy4qKiBBIHJlcXVlc3QgZm9yIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZnIvYmxvZy9oZWxsby5qc29uYCBvbmx5XG4gKiAgICByZXNvbHZlcyBpZiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+L2ZyL2Jsb2cvW3NsdWddLmpzb25gIGlzIGxpc3RlZCwgYW5kIHRoYXRcbiAqICAgIHBhdGhuYW1lIGV4aXN0cyBzb2xlbHkgYXMgYSBgcHJlcmVuZGVyc2AgZW50cnkuXG4gKiAxYi4gKipBIHN0YXRpYyBgZ2V0U3RhdGljUHJvcHNgIHBhZ2UncyBkYXRhIHJvdXRlLioqIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZ3NwLmpzb25gXG4gKiAgICBoYXMgbm8gdGVtcGxhdGUgdG8gbWF0Y2ggYW5kIG5vIHJ1bGUgb2YgaXRzIG93bjogYG5leHQgYnVpbGRgIG9ubHkgZW1pdHMgYVxuICogICAgYGR5bmFtaWNSb3V0ZXNgIHJ1bGUgZm9yIGEgZGF0YSByb3V0ZSB3aGVuIHRoZSBwYWdlIGlzIGR5bmFtaWMgKm9yKiB0aGUgYXBwIGhhc1xuICogICAgbWlkZGxld2FyZSAoYGJ1aWxkLWNvbXBsZXRlLnRzYCwgYG5lZWRzTWlkZGxld2FyZVJlc29sdmVSb3V0ZXNgLCB3aGljaCBpcyBhbHNvXG4gKiAgICB3aGF0IGByb3V0aW5nLnNob3VsZE5vcm1hbGl6ZU5leHREYXRhYCByZXBvcnRzKS4gV2l0aG91dCBtaWRkbGV3YXJlIE5leHQuanNcbiAqICAgIGV4cGVjdHMgdGhlIHBsYXRmb3JtIHRvIHNlcnZlIHRoZSBkYXRhIHJvdXRlIGFzIGFuIG91dHB1dCwgYnkgcGF0aG5hbWUg4oCUIHNvIGFcbiAqICAgIGNvbmNyZXRlIGRhdGEtcm91dGUgcHJlcmVuZGVyIGlzIHJlZ2lzdGVyZWQgd2hhdGV2ZXIgdGhlIHJ1bGVzIHNheS4gTWlzc2luZyBpdFxuICogICAgdHVybmVkIGV2ZXJ5IGNsaWVudC1zaWRlIG5hdmlnYXRpb24gaW50byBzdWNoIGEgcGFnZSBpbnRvIGEgZnVsbCBwYWdlIGxvYWQsXG4gKiAgICBiZWNhdXNlIHRoZSByb3V0ZXIncyBgLmpzb25gIGZldGNoIDQwNCdkOiBtZWFzdXJlZCBhZ2FpbnN0XG4gKiAgICBgdGVzdC9lMmUvbm8tcGFnZS1wcm9wc2AuIE9ubHkgd2hlbiBubyAqdW5nYXRlZCogcnVsZSBtYXRjaGVzLCBmb3IgdGhlIHJlYXNvblxuICogICAgYmVsb3cg4oCUIGEgZHluYW1pYyBwYWdlJ3MgYC/igKYvYmxvZy9oZWxsby5qc29uYCBtdXN0IGtlZXAgcmVzb2x2aW5nIHRvIGl0c1xuICogICAgYFtzbHVnXS5qc29uYCB0ZW1wbGF0ZSwgd2hpY2ggaXMgd2hlcmUgYG54dFBzbHVnYCBjb21lcyBmcm9tLlxuICogMi4gKipDb25jcmV0ZSBwYXRobmFtZXMgd2hvc2UgZHluYW1pYyByb3V0ZSBydWxlIGlzIGdhdGVkLioqIEEgcm91dGUgd2hvc2UgcGFyYW1zXG4gKiAgICBjYW4gbmV2ZXIgYmUgZmlsbGVkIGF0IHJlcXVlc3QgdGltZSDigJQgcm9vdCBwYXJhbXMgYXJlIHRoZSBjYXNlIHRoYXQgcHJvZHVjZWRcbiAqICAgIHRoaXMsIGBhcHAvW2xvY2FsZV0vcGFnZS50c3hgIHdpdGggYGdlbmVyYXRlU3RhdGljUGFyYW1zKClgIGFuZCBub1xuICogICAgYGFwcC9sYXlvdXQudHN4YCDigJQgZ2V0cyBpdHMgYGR5bmFtaWNSb3V0ZXNgIHJ1bGUgZW1pdHRlZCB3aXRoIGEgZHJhZnQtbW9kZVxuICogICAgYGhhc2Agb24gYF9fcHJlcmVuZGVyX2J5cGFzc2AuIE5leHQuanMgaXMgc2F5aW5nOiBpbnZva2UgdGhlIGZ1bmN0aW9uIG9ubHkgaW5cbiAqICAgIGRyYWZ0IG1vZGUsIGFuZCBvdGhlcndpc2Ugc2VydmUgdGhlIHByZXJlbmRlciB5b3Ugd2VyZSBoYW5kZWQuIFZlcmNlbCdzIENETlxuICogICAgZG9lcyB0aGF0IGZyb20gdGhlIG91dHB1dCBpdHNlbGY7IHdlIHJvdXRlIHRoZSByZXF1ZXN0IHRvIHRoZSBvd25pbmdcbiAqICAgIGVudHJ5cG9pbnQsIHdoaWNoIGFuc3dlcnMgaXQgb3V0IG9mIHRoZSBzZWVkZWQgY2FjaGUuIFdpdGhvdXQgdGhpcywgYC9lbmAgaXMgYVxuICogICAgNDA0IHdoaWxlIGBuZXh0IHN0YXJ0YCByZW5kZXJzIGl0IOKAlCBhbmQgc28gaXMgZXZlcnkgYC5yc2NgL2Auc2VnbWVudHNgXG4gKiAgICB2YXJpYW50LCB3aGljaCBpcyB3aHkgYSBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uIGludG8gc3VjaCBhbiBhcHAgbmV2ZXJcbiAqICAgIGNvbXBsZXRlcy5cbiAqXG4gKiBBIGNvbmNyZXRlIHBhdGhuYW1lIGlzIGFkZGVkIG9ubHkgd2hlbiBhIGdhdGVkIHJ1bGUgbWF0Y2hlcyBpdCBhbmQgbm8gdW5nYXRlZFxuICogb25lIGRvZXMg4oCUIHRoZSBzZXQgdGhhdCB3b3VsZCA0MDQgdG9kYXkgKmFuZCogdGhhdCByb3V0aW5nIGNhbiBzdGlsbCBwcm9kdWNlLlxuICogQWRkaW5nIHRoZW0gdW5jb25kaXRpb25hbGx5IHdhcyBtZWFzdXJlZCB0byBiZSBhY3RpdmVseSB3cm9uZyB0d2ljZSBvdmVyOlxuICogYC9pc3IvMWAgcmVzb2x2ZXMgdG8gaXRzZWxmIHJhdGhlciB0aGFuIHRvIGAvaXNyL1tpZF1gLCBsb3NpbmcgdGhlIGBueHRQaWRgXG4gKiBxdWVyeSBwYXJhbSB0aGUgcm91dGUgbmVlZHMsIGFuZCBwYXRobmFtZXMgbm8gcnVsZSBtYXRjaGVzIGF0IGFsbCAoYSBzdGF0aWNcbiAqIHJvdXRlJ3MgYC5zZWdtZW50cy/igKZgIG91dHB1dHMsIHdoaWNoIGByZXNvbHZlUm91dGVzYCBuZXZlciBhc2tzIGZvcikgYXJlIGRlYWRcbiAqIG1hbmlmZXN0IHdlaWdodC4gTWF0Y2hpbmcgbWlycm9ycyBgcmVzb2x2ZVJvdXRlc2AsIHdoaWNoIGlzIGNhc2UtaW5zZW5zaXRpdmUgYnlcbiAqIGRlZmF1bHQuXG4gKlxuICogVGhlIG93bmluZyBlbnRyeXBvaW50IGNvbWVzIGZyb20gYHByZXJlbmRlci5yb3V0ZWAsIHdoaWNoIGlzIHRoZSB1bnByZWZpeGVkIGFuZFxuICogdW5sb2NhbGl6ZWQgc291cmNlIHJvdXRlIChgL2Jsb2cvW3NsdWddYCksIGhlbmNlIHRoZSBiYXNlUGF0aC10aGVuLWJhcmUgbGFkZGVyLlxuICogTG9jYWxlIHZhcmlhbnRzIG9mIG9uZSBwYWdlIHNoYXJlIGEgYGZpbGVQYXRoYCwgc28gYW55IGxvY2FsZSdzIGVudHJ5cG9pbnQgaXNcbiAqIHRoZSByaWdodCB0YXJnZXQuIEFuIFJTQyBvciBzZWdtZW50LXByZWZldGNoIHBhdGhuYW1lIHByZWZlcnMgdGhlIHJvdXRlJ3MgYC5yc2NgXG4gKiBlbnRyeXBvaW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlIGtleSBgcmVzb2x2ZVJvdXRlc2AgcmVzb2x2ZXMgc3VjaCBhIHJlcXVlc3QgdG8uXG4gKi9cbmZ1bmN0aW9uIGFkZFByZXJlbmRlclBhdGhuYW1lcyhcbiAgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PixcbiAgcHJlcmVuZGVyczogQWRhcHRlck91dHB1dHNbXCJwcmVyZW5kZXJzXCJdLFxuICBkeW5hbWljUm91dGVzOiB7XG4gICAgc291cmNlUmVnZXg6IHN0cmluZztcbiAgICBoYXM/OiB1bmtub3duW107XG4gICAgbWlzc2luZz86IHVua25vd25bXTtcbiAgfVtdLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBkYXRhUm91dGVQcmVmaXg6IHN0cmluZyxcbik6IHZvaWQge1xuICBjb25zdCBtYXRjaGVycyA9IGR5bmFtaWNSb3V0ZXMubWFwKChyb3V0ZSkgPT4gKHtcbiAgICByZWdleDogbmV3IFJlZ0V4cChyb3V0ZS5zb3VyY2VSZWdleCwgXCJpXCIpLFxuICAgIGdhdGVkOiBCb29sZWFuKHJvdXRlLmhhcz8ubGVuZ3RoIHx8IHJvdXRlLm1pc3Npbmc/Lmxlbmd0aCksXG4gIH0pKTtcbiAgY29uc3QgbWF0Y2hpbmdSdWxlcyA9IChwYXRobmFtZTogc3RyaW5nKSA9PlxuICAgIG1hdGNoZXJzLmZpbHRlcigoeyByZWdleCB9KSA9PiByZWdleC50ZXN0KHBhdGhuYW1lKSk7XG4gIGNvbnN0IG9ubHlHYXRlZFJ1bGVzTWF0Y2ggPSAocGF0aG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGluZ1J1bGVzKHBhdGhuYW1lKTtcbiAgICByZXR1cm4gbWF0Y2hlZC5sZW5ndGggPiAwICYmIG1hdGNoZWQuZXZlcnkoKHsgZ2F0ZWQgfSkgPT4gZ2F0ZWQpO1xuICB9O1xuICAvKipcbiAgICogTm90aGluZyByZWFjaGVzIHRoaXMgcGF0aG5hbWUgYXQgcmVxdWVzdCB0aW1lOiBlaXRoZXIgbm8gcnVsZSBtYXRjaGVzIGl0IG9yXG4gICAqIGV2ZXJ5IHJ1bGUgdGhhdCBkb2VzIGlzIGdhdGVkLiBUaGUgZ2F0ZWQgaGFsZiBpcyB7QGxpbmsgb25seUdhdGVkUnVsZXNNYXRjaH07XG4gICAqIHRoZSBcIm5vIHJ1bGUgYXQgYWxsXCIgaGFsZiBvbmx5IGV2ZXIgaG9sZHMgZm9yIGEgZGF0YSByb3V0ZSwgYmVjYXVzZSBhIHBhZ2Unc1xuICAgKiBvd24gcGF0aG5hbWUgaXMgYW4gb3V0cHV0LlxuICAgKi9cbiAgY29uc3Qgbm90aGluZ1VuZ2F0ZWRNYXRjaGVzID0gKHBhdGhuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hpbmdSdWxlcyhwYXRobmFtZSkuZXZlcnkoKHsgZ2F0ZWQgfSkgPT4gZ2F0ZWQpO1xuXG4gIGNvbnN0IG9ycGhhbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJlcmVuZGVyIG9mIHByZXJlbmRlcnMpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwcmVyZW5kZXI7XG4gICAgaWYgKGVudHJ5cG9pbnRzW3BhdGhuYW1lXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzVGVtcGxhdGUgPSBwYXRobmFtZS5pbmNsdWRlcyhcIltcIik7XG4gICAgY29uc3QgaXNEYXRhUm91dGUgPVxuICAgICAgcGF0aG5hbWUuc3RhcnRzV2l0aChkYXRhUm91dGVQcmVmaXgpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIik7XG4gICAgY29uc3QgcmVhY2hhYmxlID0gaXNEYXRhUm91dGVcbiAgICAgID8gbm90aGluZ1VuZ2F0ZWRNYXRjaGVzKHBhdGhuYW1lKVxuICAgICAgOiBvbmx5R2F0ZWRSdWxlc01hdGNoKHBhdGhuYW1lKTtcbiAgICBpZiAoIWlzVGVtcGxhdGUgJiYgIXJlYWNoYWJsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeGVzID0gcGF0aG5hbWUuZW5kc1dpdGgoXCIucnNjXCIpID8gW1wiLnJzY1wiLCBcIlwiXSA6IFtcIlwiXTtcbiAgICBjb25zdCBvd25lciA9IHN1ZmZpeGVzXG4gICAgICAuZmxhdE1hcCgoc3VmZml4KSA9PiBbXG4gICAgICAgIGAke2Jhc2VQYXRofSR7cHJlcmVuZGVyLnJvdXRlfSR7c3VmZml4fWAsXG4gICAgICAgIGAke3ByZXJlbmRlci5yb3V0ZX0ke3N1ZmZpeH1gLFxuICAgICAgXSlcbiAgICAgIC5tYXAoKGtleSkgPT4gZW50cnlwb2ludHNba2V5XSlcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGlmICghb3duZXIpIHtcbiAgICAgIG9ycGhhbnMucHVzaChgJHtwYXRobmFtZX0gKHJvdXRlOiBcIiR7cHJlcmVuZGVyLnJvdXRlfVwiKWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudHJ5cG9pbnRzW3BhdGhuYW1lXSA9IHtcbiAgICAgIGlkOiBwcmVyZW5kZXIuaWQsXG4gICAgICBmaWxlUGF0aDogb3duZXIuZmlsZVBhdGgsXG4gICAgICB0eXBlOiBvd25lci50eXBlLFxuICAgIH07XG4gIH1cblxuICBpZiAob3JwaGFucy5sZW5ndGggPiAwKSB7XG4gICAgLy8gV2FybiByYXRoZXIgdGhhbiB0aHJvdzogYW4gdW5tYXBwZWQgcGF0aG5hbWUgZGVncmFkZXMgb25lIFVSTCBzaGFwZSB0byBhXG4gICAgLy8gNDA0LCB3aGljaCBpcyB3aGF0IHdvdWxkIGhhcHBlbiB3aXRob3V0IHRoaXMgZnVuY3Rpb24gYXQgYWxsLiBBIHRocm93XG4gICAgLy8gd291bGQgYnJlYWsgdGhlIGJ1aWxkIG91dHJpZ2h0IG9uIGFuIG91dHB1dCBzaGFwZSBhIGZ1dHVyZSBgbmV4dGAgbWlub3JcbiAgICAvLyBtaWdodCBpbnRyb2R1Y2UuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gJHtvcnBoYW5zLmxlbmd0aH0gcHJlcmVuZGVyIHBhdGhuYW1lKHMpIGhhdmUgbm8gYCArXG4gICAgICAgIGBtYXRjaGluZyByb3V0ZSBlbnRyeXBvaW50IGFuZCB3aWxsIDQwNDogYCArXG4gICAgICAgIGAke29ycGhhbnMuc2xpY2UoMCwgNSkuam9pbihcIiwgXCIpfWAgK1xuICAgICAgICBgJHtvcnBoYW5zLmxlbmd0aCA+IDUgPyBgLCBhbmQgJHtvcnBoYW5zLmxlbmd0aCAtIDV9IG1vcmVgIDogXCJcIn0uYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWlkZGxld2FyZShcbiAgcmVwb1Jvb3Q6IHN0cmluZyxcbiAgbWlkZGxld2FyZTogQWRhcHRlck91dHB1dHNbXCJtaWRkbGV3YXJlXCJdLFxuKTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsIHtcbiAgaWYgKCFtaWRkbGV3YXJlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gYGNvbmZpZy5tYXRjaGVyc2AgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjb3BpZWQgaGVyZTogaXQgYXJyaXZlcyBpbnNpZGVcbiAgLy8gYGN0eC5yb3V0aW5nLm1pZGRsZXdhcmVNYXRjaGVyc2AsIHdoaWNoIGBAbmV4dC9yb3V0aW5nYCBjb25zdW1lcyBkaXJlY3RseS5cbiAgcmV0dXJuIHtcbiAgICBpZDogbWlkZGxld2FyZS5pZCxcbiAgICBmaWxlUGF0aDogdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgbWlkZGxld2FyZS5maWxlUGF0aCkpLFxuICB9O1xufVxuXG4vKipcbiAqIENvcHkgdGhlIHN0YWdpbmcgcGxhbiBpbnRvIGBzdGFnaW5nRGlyYC5cbiAqXG4gKiAqKlN5bWxpbmtzIGFyZSByZWNyZWF0ZWQgYXMgc3ltbGlua3MsIG5vdCBkZXJlZmVyZW5jZWQqKiwgd2hpY2ggaXMgd2hhdFxuICogTmV4dC5qcydzIG93biBgY29weVRyYWNlZEZpbGVzYCBkb2VzIChgbmV4dC9kaXN0L2J1aWxkL3V0aWxzLmpzYDogYHJlYWRsaW5rYFxuICogdGhlbiBgc3ltbGlua2AsIHdpdGggYSBXaW5kb3dzIGp1bmN0aW9uIGZhbGxiYWNrKS4gVW5kZXIgcG5wbSBhIHRyYWNlZCBhc3NldFxuICoga2V5IGlzIGZyZXF1ZW50bHkgYSAqZGlyZWN0b3J5KiBzeW1saW5rIGludG8gdGhlIHN0b3JlXG4gKiAoYG5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi9ub2RlX21vZHVsZXMvcmVhY3RgIOKGkiBgLi4vLi4vcmVhY3RAMTkuMi4zL+KApmApLCBzb1xuICogYGNvcHlGaWxlYCBmYWlscyBvdXRyaWdodCB3aXRoIGBFTk9UU1VQYC4gRGVyZWZlcmVuY2luZyBpbnN0ZWFkIHdvdWxkIHRyaXBsZVxuICogdGhlIHRyZWUg4oCUIGBleGFtcGxlcy9hcHAtcGxheWdyb3VuZGAgbWVhc3VyZXMgMzIgTUIgc3RhZ2VkIHZlcnN1cyA5NiBNQiB3aXRoXG4gKiBgZHUgLXNoTGAsIGFnYWluc3QgYSAyNTAgTUIgdW56aXBwZWQgTGFtYmRhIGNhcCDigJQgYmVjYXVzZSB3aG9sZSBwYWNrYWdlcyBhcmVcbiAqIHJlYWNoYWJsZSB0aHJvdWdoIHNldmVyYWwgc3VjaCBsaW5rcy4gVGhlIGxpbmsgdGFyZ2V0cyBhcmUgdGhlbXNlbHZlcyBzdGFnZWRcbiAqIGtleXMsIHNvIHJlbGF0aXZlIGxpbmtzIHJlc29sdmUgaW5zaWRlIHRoZSBkZXBsb3ltZW50IHJvb3QuXG4gKlxuICogUmVndWxhciBmaWxlcyBhcmUgc3RhZ2VkIGZpcnN0IHNvIHRoYXQgYSBzeW1saW5rIHdob3NlIHBhdGggd2FzIGFscmVhZHlcbiAqIG1hdGVyaWFsaXplZCBhcyBhIHJlYWwgZGlyZWN0b3J5IGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gY2xvYmJlcmluZyBpdC5cbiAqXG4gKiBOb3RoaW5nIG1heSBkZXJlZmVyZW5jZSB0aGVtIGFmdGVyd2FyZHM6IHRoZSBGdW5jdGlvbnMgemlwIGtlZXBzIHRoZW0gYXNcbiAqIGxpbmtzIChgemlwRGlyZWN0b3J5YCksIGFuZCB0aGUgQ29udGFpbmVycyBgQ09QWWAgZG9lcyB0b28uXG4gKi9cbi8qKiBCb3VuZGVkIHNvIGEgbGFyZ2UgYXBwIGRvZXNuJ3QgZXhoYXVzdCBmaWxlIGRlc2NyaXB0b3JzLiAqL1xuY29uc3QgU1RBR0lOR19DT05DVVJSRU5DWSA9IDMyO1xuXG5hc3luYyBmdW5jdGlvbiBzdGFnZUZpbGVzKFxuICBzdGFnaW5nOiBTdGFnaW5nUGxhbixcbiAgc3RhZ2luZ0Rpcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBsYW5uZWQgPSBbLi4uc3RhZ2luZ107XG4gIC8vIExpbmtzIGxhbmQgYnkgcGxhbiBpbmRleCwgc28gdGhlIHBhc3MgYmVsb3cgY3JlYXRlcyB0aGVtIGluIHRoZSBwbGFuJ3NcbiAgLy8gb3JkZXIgd2hhdGV2ZXIgb3JkZXIgdGhlIHdvcmtlcnMgZmluaXNoZWQgaW4uXG4gIGNvbnN0IGxpbmtzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQ+ID0gbmV3IEFycmF5KFxuICAgIHBsYW5uZWQubGVuZ3RoLFxuICApO1xuICBsZXQgbmV4dEVudHJ5ID0gMDtcbiAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChuZXh0RW50cnkgPCBwbGFubmVkLmxlbmd0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSBuZXh0RW50cnkrKztcbiAgICAgIGNvbnN0IFtrZXksIHNvdXJjZV0gPSBwbGFubmVkW2luZGV4XTtcbiAgICAgIGNvbnN0IGxpbmtUYXJnZXQgPSBhd2FpdCByZWFkbGluayhzb3VyY2UpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgaWYgKGxpbmtUYXJnZXQgIT09IG51bGwpIHtcbiAgICAgICAgbGlua3NbaW5kZXhdID0gW2tleSwgc291cmNlLCBsaW5rVGFyZ2V0XTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXN0ID0gam9pbihzdGFnaW5nRGlyLCBrZXkpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShkZXN0KSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBjb3B5RmlsZShzb3VyY2UsIGRlc3QpO1xuICAgIH1cbiAgfTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBNYXRoLm1pbihTVEFHSU5HX0NPTkNVUlJFTkNZLCBwbGFubmVkLmxlbmd0aCkgfSxcbiAgICAgIHdvcmtlcixcbiAgICApLFxuICApO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGlmIChsaW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBba2V5LCBzb3VyY2UsIGxpbmtUYXJnZXRdID0gbGluaztcbiAgICBjb25zdCBkZXN0ID0gam9pbihzdGFnaW5nRGlyLCBrZXkpO1xuICAgIGlmIChleGlzdHNTeW5jKGRlc3QpKSB7XG4gICAgICAvLyBBbHJlYWR5IHN0YWdlZCBhcyByZWFsIGNvbnRlbnQgYnkgdGhlIHBvb2wgYWJvdmU7IHRoZSBsaW5rIHdvdWxkIGFkZFxuICAgICAgLy8gbm90aGluZyBhbmQgd291bGQgcmVwbGFjZSBhIGRpcmVjdG9yeSB3ZSBuZWVkLlxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGVzdCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShkaXJuYW1lKGRlc3QpLCBsaW5rVGFyZ2V0KTtcbiAgICBpZiAocmVzb2x2ZWQgPT09IHN0YWdpbmdEaXIgfHwgcmVzb2x2ZWQuc3RhcnRzV2l0aChzdGFnaW5nRGlyICsgc2VwKSkge1xuICAgICAgYXdhaXQgc3ltbGluayhsaW5rVGFyZ2V0LCBkZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9pbnRzIG91dHNpZGUgdGhlIGRlcGxveW1lbnQgcm9vdCwgc28gdGhlIGxpbmsgd291bGQgZGFuZ2xlIGluIExhbWJkYS5cbiAgICAgIC8vIEFic29sdXRlIHN0b3JlIHBhdGhzIGFyZSB0aGUgcmVhbGlzdGljIGNhc2UgaGVyZS5cbiAgICAgIGF3YWl0IGNwKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGRlcmVmZXJlbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFkZHMge0BsaW5rIFJVTlRJTUVfTkVYVF9NT0RVTEVTfSwgYEBuZXh0L2VudmAsIGFuZCBldmVyeXRoaW5nIHRoZXkgcmVxdWlyZSB0b1xuICogYHN0YWdpbmdgLCBhbmQge0BsaW5rIElNQUdFX05FWFRfTU9EVUxFU30gYW5kIHRoZWlycyB0byBgaW1hZ2VTdGFnaW5nYC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgdGhlIGRlcGxveW1lbnQgaXMgY29tcGxldGUgZm9yIGV2ZXJ5IHJvdXRlIHRoZSBhcHAgaGFzIGFuZCBicm9rZW5cbiAqIGZvciBgL19uZXh0L2ltYWdlYDogdGhlIHRyYWNlZCBgYXNzZXRzYCBvZiBhIGJ1aWxkIG91dHB1dCBjb3ZlciB3aGF0IHRoZSAqYXBwKlxuICogcmVhY2hlcywgYW5kIGFuIGFwcCBuZXZlciByZWFjaGVzIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIsIHNvXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNgIGFuZCBpdHMgY2xvc3VyZSBhcmUgc2ltcGx5IGFic2VudCBhbmRcbiAqIGV2ZXJ5IGltYWdlIHJlcXVlc3QgNTAwcyB3aXRoIGEgYE1PRFVMRV9OT1RfRk9VTkRgIGZyb20gYG5leHRNb2R1bGVgLlxuICpcbiAqIFJlc29sdXRpb24gaXMgYW5jaG9yZWQgaW5zaWRlIGBjdHgucHJvamVjdERpcmAgZm9yIHRoZSBzYW1lIHJlYXNvblxuICogYHVzZU5leHRGcm9tYCBhbmNob3JzIHRoZXJlIGF0IHJ1bnRpbWU6IGl0IGlzIHRoZSBkaXJlY3Rvcnkgd2hvc2VcbiAqIGBub2RlX21vZHVsZXNgIHdhbGsgZmluZHMgdGhlIGFwcCdzIGBuZXh0YC4gQSByZXBvIHdoZXJlIHRoYXQgcmVzb2x1dGlvbiBmYWlsc1xuICogaXMgbm90IGEgcmVhbCBgbmV4dCBidWlsZGAg4oCUIG5vdGhpbmcgZWxzZSB3b3VsZCBoYXZlIHJ1biDigJQgc28gaXQgd2FybnMgYW5kXG4gKiBjb250aW51ZXMgcmF0aGVyIHRoYW4gZmFpbGluZyBhIGJ1aWxkIGZvciBhIHBhY2thZ2UgaXQgY291bGQgbm90IGhhdmUgbmVlZGVkLlxuICogQSBtaXNzaW5nICp0cmFjZXIqIGlzIGRpZmZlcmVudDogYG5leHRgIGlzIHJpZ2h0IHRoZXJlIGFuZCBpbWFnZSBvcHRpbWl6YXRpb25cbiAqIHdvdWxkIHNpbGVudGx5IDUwMCBpbiBwcm9kdWN0aW9uLCBzbyB0aGF0IHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkUnVudGltZU5leHRDbG9zdXJlKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBzdGFnaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBpbWFnZVN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gVGhlIGFuY2hvciBmaWxlIG5lZWRuJ3QgZXhpc3Q7IGBjcmVhdGVSZXF1aXJlYCBvbmx5IHJlYWRzIGl0cyBkaXJlY3RvcnkuXG4gIGNvbnN0IG5leHRSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShcbiAgICBqb2luKGN0eC5wcm9qZWN0RGlyLCBcImNkay1uZXh0anMtbmV4dC1yZXNvbHZlci5janNcIiksXG4gICk7XG5cbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICBsZXQgaW1hZ2VFbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gUlVOVElNRV9ORVhUX01PRFVMRVMubWFwKChzcGVjaWZpZXIpID0+XG4gICAgICBuZXh0UmVxdWlyZS5yZXNvbHZlKHNwZWNpZmllciksXG4gICAgKTtcbiAgICBpbWFnZUVudHJpZXMgPSBJTUFHRV9ORVhUX01PRFVMRVMubWFwKChzcGVjaWZpZXIpID0+XG4gICAgICBuZXh0UmVxdWlyZS5yZXNvbHZlKHNwZWNpZmllciksXG4gICAgKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBuZXh0J3MgaW1hZ2Ugb3B0aW1pemVyIGZyb20gYCArXG4gICAgICAgIGBcIiR7Y3R4LnByb2plY3REaXJ9XCIgKCR7KGNhdXNlIGFzIEVycm9yKS5tZXNzYWdlfSkuIFJlcXVlc3RzIHRvIGAgK1xuICAgICAgICBgL19uZXh0L2ltYWdlIHdpbGwgZmFpbCBhdCBydW50aW1lLmAsXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYGxvYWRFbnZGaWxlc2AgKHJ1bnRpbWUgYG5leHQtbW9kdWxlcy50c2ApIGxvYWRzIHRoZSBzdGFnZWQgZW52IGZpbGVzIHdpdGhcbiAgLy8gYEBuZXh0L2VudmAsIHdoaWNoIGlzIGBuZXh0YCdzIGRlcGVuZGVuY3ksIHNvIHJlc29sdmVkIGZyb20gYG5leHRgJ3MgZGlyLlxuICAvLyBBbiBhcHAgbmV2ZXIgcmVxdWlyZXMgaXQsIHNvIG5vIG91dHB1dCdzIHRyYWNlIGhhcyBpdCBlaXRoZXIuXG4gIGNvbnN0IG5leHRQYWNrYWdlID0gbmV4dFJlcXVpcmUucmVzb2x2ZShcIm5leHQvcGFja2FnZS5qc29uXCIpO1xuICB0cnkge1xuICAgIGVudHJpZXMucHVzaChjcmVhdGVSZXF1aXJlKG5leHRQYWNrYWdlKS5yZXNvbHZlKFwiQG5leHQvZW52XCIpKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBcIkBuZXh0L2VudlwiIGZyb20gdGhlIGFwcCdzIFxcYG5leHRcXGAsIGAgK1xuICAgICAgICBgd2hpY2ggdGhlIGNkay1uZXh0anMgcnVudGltZSB1c2VzIHRvIGxvYWQgLmVudiBmaWxlcy5gLFxuICAgICAgeyBjYXVzZSB9LFxuICAgICk7XG4gIH1cblxuICBsZXQgbm9kZUZpbGVUcmFjZTogTm9kZUZpbGVUcmFjZTtcbiAgdHJ5IHtcbiAgICAoeyBub2RlRmlsZVRyYWNlIH0gPSBuZXh0UmVxdWlyZShORVhUX0ZJTEVfVFJBQ0VSKSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQ291bGQgbm90IGxvYWQgXCIke05FWFRfRklMRV9UUkFDRVJ9XCIsIHdoaWNoIGNkay1uZXh0anMgdXNlcyBgICtcbiAgICAgICAgYHRvIHN0YWdlIHRoZSBcXGBuZXh0XFxgIGZpbGVzIGl0cyBpbWFnZSBvcHRpbWl6ZXIgcmVxdWlyZXMuIFRoaXMgTmV4dC5qcyBgICtcbiAgICAgICAgYHZlcnNpb24gbWF5IGhhdmUgbW92ZWQgaXQ7IHBsZWFzZSBvcGVuIGFuIGlzc3VlLmAsXG4gICAgICB7IGNhdXNlIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFkZCA9IChmaWxlTGlzdDogU2V0PHN0cmluZz4sIHRhcmdldDogTWFwPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIGZvciAoY29uc3QgdHJhY2VkIG9mIGZpbGVMaXN0KSB7XG4gICAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHRyYWNlZCk7XG4gICAgICBpZiAodGFyZ2V0LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc291cmNlID0gam9pbihjdHgucmVwb1Jvb3QsIHRyYWNlZCk7XG4gICAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgICAgIHRhcmdldC5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfTtcbiAgYWRkKFxuICAgIChhd2FpdCBub2RlRmlsZVRyYWNlKGltYWdlRW50cmllcywgeyBiYXNlOiBjdHgucmVwb1Jvb3QgfSkpLmZpbGVMaXN0LFxuICAgIGltYWdlU3RhZ2luZyxcbiAgKTtcbiAgY29uc3QgeyBmaWxlTGlzdCB9ID0gYXdhaXQgbm9kZUZpbGVUcmFjZShlbnRyaWVzLCB7IGJhc2U6IGN0eC5yZXBvUm9vdCB9KTtcbiAgLy8gVGhlIHRyYWNlIHN0YXJ0cyBmcm9tIGBAbmV4dC9lbnZgJ3MgcmVhbCBwYXRoLCBzbyB1bmRlciBwbnBtIGl0IG5ldmVyXG4gIC8vIHBhc3NlcyB0aHJvdWdoIHRoZSBgLnBucG0vbmV4dEDigKYvbm9kZV9tb2R1bGVzL0BuZXh0L2VudmAgbGluayB0aGF0IGBuZXh0YFxuICAvLyByZXNvbHZlcyBpdCBieS4gV2l0aG91dCB0aGUgbGluaywgZXZlcnkgcmVxdWVzdCBmYWlscyBhdCBjb2xkIHN0YXJ0IHdpdGhcbiAgLy8gXCJDYW5ub3QgZmluZCBtb2R1bGUgJ0BuZXh0L2VudidcIi5cbiAgY29uc3QgbmV4dEVudkxpbmsgPSBqb2luKGRpcm5hbWUobmV4dFBhY2thZ2UpLCBcIi4uXCIsIFwiQG5leHRcIiwgXCJlbnZcIik7XG4gIGlmIChsc3RhdFN5bmMobmV4dEVudkxpbmssIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgLy8gYHJlc29sdmVgIHJldHVybnMgcmVhbCBwYXRocywgc28gcmVsYXRpdmUgdG8gdGhlIHJlYWwgcmVwbyByb290LlxuICAgIGZpbGVMaXN0LmFkZChyZWxhdGl2ZShyZWFscGF0aFN5bmMoY3R4LnJlcG9Sb290KSwgbmV4dEVudkxpbmspKTtcbiAgfVxuICBhZGQoZmlsZUxpc3QsIHN0YWdpbmcpO1xufVxuXG4vKipcbiAqIEFkZCBgPGRpc3REaXI+L3JlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCB0byBhIHBsYW4gZXZlcnkgZ3JvdXAgaXMgbWVyZ2VkIHdpdGguXG4gKlxuICogSXQgcmVhY2hlcyBhIGdyb3VwIG90aGVyd2lzZSBvbmx5IGFzIGEgdHJhY2VkIGBhc3NldGAgb2Ygc29tZSBpbnZvY2FibGUgb3V0cHV0LFxuICogd2hpY2ggaXMgbm90IGEgZ3VhcmFudGVlOiBhIGdyb3VwIHdob3NlIHRlbXBsYXRlcyBhcmUgYWxsIGFzc2lnbmVkIGVsc2V3aGVyZVxuICogb3ducyBubyBvdXRwdXRzIGF0IGFsbC4gVGhhdCBpcyByZWFjaGFibGUg4oCUIGEgUGFnZXMtUm91dGVyLW9ubHkgYXBwIHdob3NlIGV2ZXJ5XG4gKiBwYWdlIGZhbGxzIHVuZGVyIHRoZSBjb25maWd1cmVkIGBmdW5jdGlvbkdyb3Vwc2AgbGVhdmVzIHRoZSAqZGVmYXVsdCogZ3JvdXBcbiAqIHRlbXBsYXRlLWVtcHR5LCBhbmQgdGhlIGRlZmF1bHQgZ3JvdXAgaXMgc3RpbGwgd2hhdCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHRoZVxuICogc3RhdGljIGZpbGVzLCBhbmQgdGhlIGRpc3RyaWJ1dGlvbidzIGNhdGNoLWFsbC5cbiAqXG4gKiBJdHMgYWJzZW5jZSBpcyBub3QgYSBwYXJ0aWFsIGZhaWx1cmU6IGBsb2FkUnVudGltZWAgcHJvYmVzIGZvciBleGFjdGx5IHRoaXMgZmlsZVxuICogYmVmb3JlIGl0IHdpbGwgc2VydmUgYW55dGhpbmcsIGFuZCBgaW1hZ2UudHNgIHJlYWRzIHRoZSBpbWFnZSBjb25maWcgb3V0IG9mIGl0LFxuICogc28gdGhlIHdob2xlIHJvb3QgYW5zd2VycyBcInRoZSBkZXBsb3ltZW50IHBhY2thZ2UgaXMgaW5jb21wbGV0ZVwiLiBDaGVhcCB0byBtYWtlXG4gKiB1bmNvbmRpdGlvbmFsLCBzbyBtYWtlIGl0IHVuY29uZGl0aW9uYWwuXG4gKlxuICogTm90IHRyYWNlZCBsaWtlIHtAbGluayBSVU5USU1FX05FWFRfTU9EVUxFU30sIGJlY2F1c2UgaXQgaXMgZGF0YSByYXRoZXIgdGhhbiBhXG4gKiBtb2R1bGU6IG5vdGhpbmcgYHJlcXVpcmVgcyBpdCwgc28gbm8gZmlsZSB0cmFjZXIgY2FuIGZpbmQgaXQuXG4gKlxuICogQWJzZW5jZSBpcyBsZWZ0IHRvIGBsb2FkUnVudGltZWAsIHdoaWNoIG5hbWVzIHRoZSBmaWxlIGFuZCB0aGUgbGF5b3V0IGNvbnRyYWN0XG4gKiBpdCBiZWxvbmdzIHRvLiBgbmV4dCBidWlsZGAgYWx3YXlzIHdyaXRlcyBpdCwgc28gdGhlcmUgaXMgbm8gYnVpbGQtdGltZSBlcnJvclxuICogd29ydGggaW52ZW50aW5nIGhlcmUgZm9yIGEgZmlsZSB0aGlzIHN0ZXAgZG9lcyBub3Qgb3duLlxuICovXG5mdW5jdGlvbiBhZGRSZXF1aXJlZFNlcnZlckZpbGVzKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBzdGFnaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oY3R4LmRpc3REaXIsIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIik7XG4gIGNvbnN0IGtleSA9IHRvUG9zaXgocmVsYXRpdmUoY3R4LnJlcG9Sb290LCBzb3VyY2UpKTtcbiAgaWYgKHN0YWdpbmcuaGFzKGtleSkgfHwgIWV4aXN0c1N5bmMoc291cmNlKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgc3RhZ2luZy5zZXQoa2V5LCBzb3VyY2UpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN0YWdlZCBwYXRoIG11c3QgbGFuZCBpbnNpZGUgdGhlIHN0YWdpbmcgdHJlZSBhbmQgbXVzdCBub3Qgc2hhZG93IHRoZVxuICogcmVzZXJ2ZWQgZGlyZWN0b3J5IGNkay1uZXh0anMgY29waWVzIGl0cyBvd24gcnVudGltZSBpbnRvIGF0IHN5bnRoLlxuICovXG5mdW5jdGlvbiBhc3NlcnRTdGFnaW5nS2V5KGtleTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoa2V5ID09PSBcIlwiIHx8IGtleS5zdGFydHNXaXRoKFwiL1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIi4uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQnVpbGQgb3V0cHV0IGFzc2V0IFwiJHtzb3VyY2V9XCIgcmVzb2x2ZXMgdG8gdGhlIHN0YWdpbmcga2V5IGAgK1xuICAgICAgICBgXCIke2tleX1cIiwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgZGVwbG95bWVudCByb290LiBTZXQgYCArXG4gICAgICAgIGBcXGBvdXRwdXRGaWxlVHJhY2luZ1Jvb3RcXGAgc28gYWxsIHRyYWNlZCBmaWxlcyBsaXZlIHVuZGVyIG9uZSByb290LmAsXG4gICAgKTtcbiAgfVxuICBpZiAoa2V5ID09PSBSVU5USU1FX0RJUl9OQU1FIHx8IGtleS5zdGFydHNXaXRoKGAke1JVTlRJTUVfRElSX05BTUV9L2ApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQnVpbGQgb3V0cHV0IGFzc2V0IFwiJHtzb3VyY2V9XCIgcmVzb2x2ZXMgdG8gdGhlIHN0YWdpbmcga2V5IGAgK1xuICAgICAgICBgXCIke2tleX1cIiwgYnV0IFwiJHtSVU5USU1FX0RJUl9OQU1FfS9cIiBpcyByZXNlcnZlZCBmb3IgY2RrLW5leHRqcydzIG93biBgICtcbiAgICAgICAgYHJ1bnRpbWUgZmlsZXMuYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUG9zaXgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlcCA9PT0gXCIvXCIgPyBwYXRoIDogcGF0aC5zcGxpdChzZXApLmpvaW4oXCIvXCIpO1xufVxuXG5mdW5jdGlvbiBzb3J0ZWRVbmlxdWUodmFsdWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KHZhbHVlcyldLnNvcnQoKTtcbn1cbiJdfQ==
|
|
857
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtb3V0cHV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2J1aWxkLW91dHB1dHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyS0EsOENBNENDO0FBd0JELG9EQWtJQztBQWpYRCxzREFBc0Q7QUFDdEQscUNBQThEO0FBQzlELCtDQVEwQjtBQUMxQiw2Q0FBNEM7QUFDNUMseUNBQWtFO0FBRWxFLHVEQU8yQjtBQUMzQiw0Q0FBMEM7QUFDMUMsa0RBVzZCO0FBbUI3Qjs7Ozs7R0FLRztBQUNILE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLGtDQUFrQztJQUNsQyx1RUFBdUU7Q0FDeEUsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLG1DQUFtQztJQUNuQyxzQ0FBc0M7SUFDdEMscUNBQXFDO0NBQ3RDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsZ0NBQWdDLENBQUM7QUF1RTFEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEdBQXlCLEVBQ3pCLFVBQStCLEVBQUU7SUFFakMsTUFBTSxVQUFVLEdBQUcsSUFBQSxnQkFBSSxFQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsMkJBQWdCLENBQUMsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFBLGdCQUFJLEVBQUMsVUFBVSxFQUFFLDZCQUFrQixDQUFDLENBQUM7SUFFMUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFaEUsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENB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U0FBUyxPQUFPLENBQUMsSUFBWTtJQUMzQixPQUFPLGVBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQWdCO0lBQ3BDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbHN0YXRTeW5jLCByZWFscGF0aFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHtcbiAgY29weUZpbGUsXG4gIGNwLFxuICBta2RpcixcbiAgcmVhZGxpbmssXG4gIHJtLFxuICBzeW1saW5rLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgTmV4dEFkYXB0ZXIgfSBmcm9tIFwibmV4dFwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVIsXG4gIEZ1bmN0aW9uR3JvdXBTcGVjLFxuICBhc3NlcnROb0kxOG5TcGxpdHRpbmcsXG4gIGFzc2lnblJvdXRlc1RvR3JvdXBzLFxuICBwYXJzZUZ1bmN0aW9uR3JvdXBzRW52LFxufSBmcm9tIFwiLi9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IExPR19QUkVGSVggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBBREFQVEVSX0RJUl9OQU1FLFxuICBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04sXG4gIEFkYXB0ZXJFbnRyeXBvaW50LFxuICBBZGFwdGVyRW50cnlwb2ludFR5cGUsXG4gIEFkYXB0ZXJNYW5pZmVzdCxcbiAgQWRhcHRlck1pZGRsZXdhcmUsXG4gIEVSUk9SX1BBR0VfU1VGRklYRVMsXG4gIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgUlVOVElNRV9ESVJfTkFNRSxcbiAgZ3JvdXBTdGFnaW5nRGlyTmFtZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcblxuLyoqXG4gKiBUaGUgYG9uQnVpbGRDb21wbGV0ZWAgYXJndW1lbnQuIERlcml2ZWQgZnJvbSB0aGUgYG5leHRgIHR5cGluZ3MgcmF0aGVyIHRoYW5cbiAqIHJlc3RhdGVkIHNvIGEgYG5leHRgIGJ1bXAgc3VyZmFjZXMgYXMgYSBjb21waWxlIGVycm9yIGhlcmUuXG4gKi9cbmV4cG9ydCB0eXBlIEJ1aWxkQ29tcGxldGVDb250ZXh0ID0gUGFyYW1ldGVyczxcbiAgTm9uTnVsbGFibGU8TmV4dEFkYXB0ZXJbXCJvbkJ1aWxkQ29tcGxldGVcIl0+XG4+WzBdO1xuXG50eXBlIEFkYXB0ZXJPdXRwdXRzID0gQnVpbGRDb21wbGV0ZUNvbnRleHRbXCJvdXRwdXRzXCJdO1xuLyoqIEFueSBvdXRwdXQgdGhhdCB3ZSBpbnZva2UgYXQgcmVxdWVzdCB0aW1lLCBpLmUuIG5vdCBhIHByZXJlbmRlci9zdGF0aWMgZmlsZS4gKi9cbnR5cGUgSW52b2NhYmxlT3V0cHV0ID1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcInBhZ2VzXCJdW251bWJlcl1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcInBhZ2VzQXBpXCJdW251bWJlcl1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcImFwcFBhZ2VzXCJdW251bWJlcl1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcImFwcFJvdXRlc1wiXVtudW1iZXJdXG4gIHwgTm9uTnVsbGFibGU8QWRhcHRlck91dHB1dHNbXCJtaWRkbGV3YXJlXCJdPjtcblxuLyoqXG4gKiBFbnYgZmlsZXMgYHdyaXRlU3RhbmRhbG9uZURpcmVjdG9yeWAgY29waWVzIGludG8gdGhlIHN0YW5kYWxvbmUgdHJlZSBhbmQgdGhhdFxuICogYG9uQnVpbGRDb21wbGV0ZWAgaGFzIG5vIGVxdWl2YWxlbnQgZm9yLiBEcm9wcGluZyBgb3V0cHV0OiBcInN0YW5kYWxvbmVcImBcbiAqIHNpbGVudGx5IGRyb3BzIHRoZXNlIHVubGVzcyB3ZSBzdGFnZSB0aGVtIG91cnNlbHZlcy5cbiAqIEBzZWUgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2FwaS1yZWZlcmVuY2UvY29uZmlnL25leHQtY29uZmlnLWpzL291dHB1dFxuICovXG5jb25zdCBFTlZfRklMRVMgPSBbXCIuZW52XCIsIFwiLmVudi5wcm9kdWN0aW9uXCJdO1xuXG4vKipcbiAqIGBuZXh0YCBzdWJtb2R1bGVzIHRoZSAqcnVudGltZSogcmVxdWlyZXMgdGhhdCBubyBhcHAgZXZlciByZWFjaGVzLCBzb1xuICogYG5leHQgYnVpbGRgJ3Mgb3duIHRyYWNlIG5ldmVyIGNvdmVycyB0aGVtLiBUaGV5IGFyZSByZXF1aXJlZCBmcm9tIHRoZSBhcHAnc1xuICogYG5leHRgIHJhdGhlciB0aGFuIGJ1bmRsZWQsIGRlbGliZXJhdGVseSDigJQgc2VlIGBzcmMvcnVudGltZS9uZXh0LW1vZHVsZXMudHNgXG4gKiDigJQgd2hpY2ggbWFrZXMgc3RhZ2luZyB0aGVpciBjbG9zdXJlIHRoaXMgbW9kdWxlJ3Mgam9iLlxuICpcbiAqIGBzZXJ2ZS1zdGF0aWNgIGlzIGluIGV2ZXJ5IGdyb3VwOiBgc2VydmVTdGF0aWNGaWxlYFxuICogKGBzcmMvcnVudGltZS9zdGF0aWMtZmlsZXMudHNgKSBzZXJ2ZXMgcHJlcmVuZGVyZWQgYW5kIHN0YXRpYyByZXN1bHRzIHdpdGggaXRcbiAqIHdoZXJldmVyIHRoZXkgbGFuZC4gYGluc3RydW1lbnRhdGlvbi1nbG9iYWxzYCBpcyByZXF1aXJlZCBieSBgbG9hZFJ1bnRpbWVgXG4gKiBvbiBldmVyeSBjb2xkIHN0YXJ0IChgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25gKSwgc28gaXQgaXMgc3RhZ2VkIGhlcmUgcmF0aGVyXG4gKiB0aGFuIHRydXN0ZWQgdG8gZWFjaCBncm91cCdzIGVudHJ5cG9pbnQgdHJhY2UuXG4gKi9cbmNvbnN0IFJVTlRJTUVfTkVYVF9NT0RVTEVTID0gW1xuICBcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIsXG4gIFwibmV4dC9kaXN0L3NlcnZlci9saWIvcm91dGVyLXV0aWxzL2luc3RydW1lbnRhdGlvbi1nbG9iYWxzLmV4dGVybmFsLmpzXCIsXG5dO1xuXG4vKipcbiAqIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIgYW5kIHRoZSBjb25maWcgaGVscGVycyBhcm91bmQgaXRcbiAqIChgc3JjL3J1bnRpbWUvaW1hZ2UudHNgKSwgd2hvc2UgY2xvc3VyZSBpcyB3aGF0IGJyaW5ncyBgc2hhcnBgIGluLiBPbmx5IHRoZVxuICogYGRlZmF1bHRgIGdyb3VwIGdldHMgdGhlbTogdGhlIGVkZ2Ugc2VuZHMgZXZlcnkgYC9fbmV4dC9pbWFnZWAgcmVxdWVzdCB0aGVyZS5cbiAqL1xuY29uc3QgSU1BR0VfTkVYVF9NT0RVTEVTID0gW1xuICBcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiLFxuICBcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy5qc1wiLFxuICBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIsXG5dO1xuXG4vKipcbiAqIFRoZSBmaWxlIHRyYWNlciBgbmV4dCBidWlsZGAgaXRzZWxmIHVzZXMsIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXBwJ3Mgb3duIGBuZXh0YFxuICogc28gdGhhdCBpdCBpcyB0aGUgdmVyc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGZpbGVzIGJlaW5nIHRyYWNlZC4gTm90IGFcbiAqIGRlcGVuZGVuY3kgb2YgY2RrLW5leHRqczogYnVuZGxpbmcgYSBzZWNvbmQgY29weSBvZiBgQHZlcmNlbC9uZnRgIGludG8gdGhlXG4gKiBwdWJsaXNoZWQgYWRhcHRlciB3b3VsZCBhZGQgbWVnYWJ5dGVzIHRvIGV2ZXJ5IGluc3RhbGwgdG8gZG8gdGhlIHNhbWUgam9iLlxuICovXG5jb25zdCBORVhUX0ZJTEVfVFJBQ0VSID0gXCJuZXh0L2Rpc3QvY29tcGlsZWQvQHZlcmNlbC9uZnRcIjtcblxuLyoqIFRoZSBzdWJzZXQgb2YgYG5vZGVGaWxlVHJhY2VgIHRoaXMgbW9kdWxlIHVzZXMuICovXG50eXBlIE5vZGVGaWxlVHJhY2UgPSAoXG4gIGZpbGVzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogeyBiYXNlOiBzdHJpbmcgfSxcbikgPT4gUHJvbWlzZTx7IGZpbGVMaXN0OiBTZXQ8c3RyaW5nPiB9PjtcblxuLyoqXG4gKiBTdGFnaW5nIGtleSAocmVwby1yb290LXJlbGF0aXZlIFBPU0lYKSDihpIgYWJzb2x1dGUgc291cmNlIHBhdGggb24gdGhlIGJ1aWxkXG4gKiBtYWNoaW5lLiBUaGUgZGVkdXBlZCB1bmlvbiB0aGF0IHJlcGxhY2VzIHRoZSBzdGFuZGFsb25lIHRyZWUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0YWdpbmdQbGFuID0gUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3V0cHV0c09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBgbmV4dCBidWlsZGAgd2FzIGludm9rZWQgZnJvbS4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgLFxuICAgKiB3aGljaCBpcyB0aGUgcmVhbCBhbnN3ZXIgaW5zaWRlIGBvbkJ1aWxkQ29tcGxldGVgOyBhIHBhcmFtZXRlciBvbmx5IHNvIHRoZVxuICAgKiB1bml0IHRlc3RzIGNhbiBkcml2ZSB0aGUgZml4dHVyZXMnIHN5bnRoZXRpYyBwcm9qZWN0IGRpcnMuXG4gICAqL1xuICByZWFkb25seSBidWlsZEN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVkIGBmdW5jdGlvbkdyb3Vwc2AuIERlZmF1bHRzIHRvIHtAbGluayBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0sXG4gICAqIHdoaWNoIGlzIGhvdyB0aGUgY29uc3RydWN0cyBnZXQgdGhlbSBoZXJlOiBgb25CdWlsZENvbXBsZXRlYCBydW5zIGluc2lkZVxuICAgKiBgbmV4dCBidWlsZGAgYW5kIGNhbm5vdCByZWFkIENESyBwcm9wcy5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgbWVhbnMgb25lIGRlcGxveW1lbnQgcm9vdCBob2xkaW5nIGV2ZXJ5IHJvdXRlLCB3aGljaCBpcyB0aGVcbiAgICogZGVmYXVsdCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhlIENvbnRhaW5lcnMgdHlwZXMgZXZlciBkby5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogRnVuY3Rpb25Hcm91cFNwZWNbXTtcbn1cblxuLyoqIE9uZSBkZXBsb3ltZW50IHJvb3Q6IHRoZSBzdGFnaW5nIHBsYW4gZm9yIGl0LCBhbmQgd2hlcmUgaXQgZ29lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VkR3JvdXAge1xuICAvKipcbiAgICogR3JvdXAgbmFtZSwgYGRlZmF1bHRgIGZvciB0aGUgaW1wbGljaXQgZ3JvdXAuIEFsd2F5cyBwcmVzZW50IOKAlCBhIGJ1aWxkIHdpdGhcbiAgICogbm8gYGZ1bmN0aW9uR3JvdXBzYCBwcm9kdWNlcyBleGFjdGx5IG9uZSB7QGxpbmsgU3RhZ2VkR3JvdXB9IG5hbWVkIGBkZWZhdWx0YCxcbiAgICogc28gY2FsbGVycyBuZXZlciBicmFuY2ggb24gXCJpcyB0aGlzIHNwbGl0XCIuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgaW5zaWRlIGBjZGstbmV4dGpzLWFkYXB0ZXJgLCBQT1NJWDogYGFwcGAgd2hlbiBub3Qgc3BsaXR0aW5nLFxuICAgKiBgZ3JvdXBzLzxuYW1lPmAgd2hlbiBzcGxpdHRpbmcuXG4gICAqL1xuICByZWFkb25seSBkaXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YWdpbmc6IFN0YWdpbmdQbGFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQWRhcHRlck1hbmlmZXN0UmVzdWx0IHtcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqIE9uZSBlbnRyeSBwZXIgZGVwbG95bWVudCByb290IHRvIHN0YWdlLiBMZW5ndGggMSB1bmxlc3Mgc3BsaXR0aW5nLiAqL1xuICByZWFkb25seSBncm91cHM6IFN0YWdlZEdyb3VwW107XG59XG5cbi8qKiBBIHN0YWdlZCBkZXBsb3ltZW50IHJvb3Qgb24gZGlzay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VkR3JvdXBSZXN1bHQge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IHJvb3QuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZmlsZUNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVCdWlsZE91dHB1dHNSZXN1bHQgZXh0ZW5kcyBCdWlsZEFkYXB0ZXJNYW5pZmVzdFJlc3VsdCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIGA8ZGlzdERpcj4vY2RrLW5leHRqcy1hZGFwdGVyYC4gKi9cbiAgcmVhZG9ubHkgYWRhcHRlckRpcjogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgd3JpdHRlbiBtYW5pZmVzdC4gKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RQYXRoOiBzdHJpbmc7XG4gIC8qKiBPbmUgcGVyIGRlcGxveW1lbnQgcm9vdCwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzdGFnZWQuICovXG4gIHJlYWRvbmx5IHN0YWdlZEdyb3VwczogU3RhZ2VkR3JvdXBSZXN1bHRbXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbWFuaWZlc3QgYW5kIHN0YWdpbmcgcGxhbiwgc3RhZ2UgdGhlIGZpbGVzLCBhbmQgd3JpdGUgdGhlIG1hbmlmZXN0LlxuICogQ2FsbGVkIGZyb20gYG9uQnVpbGRDb21wbGV0ZWAsIHdoaWNoIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgaG9sZHMgdGhlIGJ1aWxkXG4gKiBvdXRwdXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWlsZE91dHB1dHMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIG9wdGlvbnM6IEJ1aWxkT3V0cHV0c09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8V3JpdGVCdWlsZE91dHB1dHNSZXN1bHQ+IHtcbiAgY29uc3QgYWRhcHRlckRpciA9IGpvaW4oY3R4LmRpc3REaXIsIEFEQVBURVJfRElSX05BTUUpO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGFkYXB0ZXJEaXIsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG5cbiAgY29uc3QgeyBtYW5pZmVzdCwgZ3JvdXBzIH0gPSBidWlsZEFkYXB0ZXJNYW5pZmVzdChjdHgsIG9wdGlvbnMpO1xuXG4gIC8vIFRyYWNlZCBvbmNlLCBoZXJlOiB0aGUgdHJhY2UgaXMgYXN5bmMsIHdoaWNoIGlzIHdoeSBpdCBjYW5ub3QgaGFwcGVuIGluc2lkZVxuICAvLyBgYnVpbGRBZGFwdGVyTWFuaWZlc3RgLiBgcnVudGltZUNsb3N1cmVgIGlzIG1lcmdlZCBpbnRvIGV2ZXJ5IGdyb3VwLCBhbmRcbiAgLy8gYGltYWdlQ2xvc3VyZWAgaW50byBgZGVmYXVsdGAgb25seSwgdGhlIG9uZSBncm91cCBgL19uZXh0L2ltYWdlYCByZWFjaGVzLlxuICBjb25zdCBydW50aW1lQ2xvc3VyZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGltYWdlQ2xvc3VyZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGF3YWl0IGFkZFJ1bnRpbWVOZXh0Q2xvc3VyZShjdHgsIHJ1bnRpbWVDbG9zdXJlLCBpbWFnZUNsb3N1cmUpO1xuICBhZGRSZXF1aXJlZFNlcnZlckZpbGVzKGN0eCwgcnVudGltZUNsb3N1cmUpO1xuXG4gIC8vIEEgcHJldmlvdXMgYnVpbGQncyB0cmVlIGlzIG5ldmVyIGFkZGl0aXZlIHdpdGggdGhpcyBvbmUnczogYSByZW1vdmVkIHJvdXRlXG4gIC8vIGxlYXZlcyBiZWhpbmQgYW4gZW50cnlwb2ludCB0aGUgbWFuaWZlc3Qgbm8gbG9uZ2VyIG1lbnRpb25zLCBhIHJlbmFtZWQgY2h1bmtcbiAgLy8gbGVhdmVzIGRlYWQgYnl0ZXMgaW5zaWRlIHRoZSAyNTAgTUIgYnVkZ2V0LCBhbmQgYSByZWdyb3VwZWQgYnVpbGQgbGVhdmVzIGFcbiAgLy8gd2hvbGUgZGVwbG95bWVudCByb290IG5vdGhpbmcgZGVwbG95cy5cbiAgYXdhaXQgcm0oYWRhcHRlckRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHN0YWdlZEdyb3VwczogU3RhZ2VkR3JvdXBSZXN1bHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgIGNvbnN0IGdyb3VwU3RhZ2luZyA9IG1lcmdlZChcbiAgICAgIG1lcmdlZChncm91cC5zdGFnaW5nLCBydW50aW1lQ2xvc3VyZSksXG4gICAgICBncm91cC5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQID8gaW1hZ2VDbG9zdXJlIDogbmV3IE1hcCgpLFxuICAgICk7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4oYWRhcHRlckRpciwgLi4uZ3JvdXAuZGlyTmFtZS5zcGxpdChcIi9cIikpO1xuICAgIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHN0YWdlRmlsZXMoZ3JvdXBTdGFnaW5nLCBwYXRoKTtcbiAgICBzdGFnZWRHcm91cHMucHVzaCh7IG5hbWU6IGdyb3VwLm5hbWUsIHBhdGgsIGZpbGVDb3VudDogZ3JvdXBTdGFnaW5nLnNpemUgfSk7XG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3QsXG4gICAgZ3JvdXBzLFxuICAgIGFkYXB0ZXJEaXIsXG4gICAgbWFuaWZlc3RQYXRoLFxuICAgIHN0YWdlZEdyb3VwcyxcbiAgfTtcbn1cblxuLyoqIExlZnQgd2lucywgYXMgZXZlcnl3aGVyZSBlbHNlIGluIHRoaXMgbW9kdWxlOiBmaXJzdCB3cml0ZXIgb2YgYSBrZXkga2VlcHMgaXQuICovXG5mdW5jdGlvbiBtZXJnZWQoXG4gIGJhc2U6IFN0YWdpbmdQbGFuLFxuICBhZGRpdGlvbnM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKGJhc2UpO1xuICBmb3IgKGNvbnN0IFtrZXksIHNvdXJjZV0gb2YgYWRkaXRpb25zKSB7XG4gICAgaWYgKCFyZXN1bHQuaGFzKGtleSkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBwdXJlIGhhbGYgb2Yge0BsaW5rIHdyaXRlQnVpbGRPdXRwdXRzfTogZXZlcnl0aGluZyBkZXJpdmVkIGZyb20gdGhlIGJ1aWxkXG4gKiBvdXRwdXRzLCB3aXRoIG5vIHdyaXRlcy4gU3BsaXQgb3V0IHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhZ2FpbnN0IGNvbW1pdHRlZFxuICogYG9uQnVpbGRDb21wbGV0ZWAgZml4dHVyZXMuXG4gKlxuICogVGhyb3dzIG9uIGFueSBub24tTm9kZSBvdXRwdXQgYW5kIG9uIGFueSBzdGFnaW5nIGtleSB0d28gb3V0cHV0cyBtYXAgdG9cbiAqIGRpZmZlcmVudCBjb250ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBZGFwdGVyTWFuaWZlc3QoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIG9wdGlvbnM6IEJ1aWxkT3V0cHV0c09wdGlvbnMgPSB7fSxcbik6IEJ1aWxkQWRhcHRlck1hbmlmZXN0UmVzdWx0IHtcbiAgY29uc3QgeyBvdXRwdXRzLCByZXBvUm9vdCB9ID0gY3R4O1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgYXNzZXJ0QnVpbGRDd2QoY3R4LCBvcHRpb25zLmJ1aWxkQ3dkID8/IHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBpbnZvY2FibGU6IEludm9jYWJsZU91dHB1dFtdID0gW1xuICAgIC4uLm91dHB1dHMucGFnZXMsXG4gICAgLi4ub3V0cHV0cy5wYWdlc0FwaSxcbiAgICAuLi5vdXRwdXRzLmFwcFBhZ2VzLFxuICAgIC4uLm91dHB1dHMuYXBwUm91dGVzLFxuICAgIC4uLihvdXRwdXRzLm1pZGRsZXdhcmUgPyBbb3V0cHV0cy5taWRkbGV3YXJlXSA6IFtdKSxcbiAgXTtcblxuICBhc3NlcnROb2RlUnVudGltZXMoaW52b2NhYmxlLCBvdXRwdXRzLm1pZGRsZXdhcmUpO1xuICB3YXJuT25Ecm9wcGVkUm91dGVDb25maWcoaW52b2NhYmxlKTtcblxuICBjb25zdCBzdGF0aWNGaWxlcyA9IGNvbGxlY3RTdGF0aWNGaWxlcyhjdHgpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyRW50cnlwb2ludD4gPSB7fTtcbiAgZm9yIChjb25zdCB7IG91dHB1dHM6IGdyb3VwLCB0eXBlIH0gb2YgW1xuICAgIHsgb3V0cHV0czogb3V0cHV0cy5wYWdlcywgdHlwZTogXCJwYWdlXCIgYXMgY29uc3QgfSxcbiAgICB7IG91dHB1dHM6IG91dHB1dHMucGFnZXNBcGksIHR5cGU6IFwicGFnZS1hcGlcIiBhcyBjb25zdCB9LFxuICAgIHsgb3V0cHV0czogb3V0cHV0cy5hcHBQYWdlcywgdHlwZTogXCJhcHAtcGFnZVwiIGFzIGNvbnN0IH0sXG4gICAgeyBvdXRwdXRzOiBvdXRwdXRzLmFwcFJvdXRlcywgdHlwZTogXCJhcHAtcm91dGVcIiBhcyBjb25zdCB9LFxuICBdKSB7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgZ3JvdXApIHtcbiAgICAgIGFkZEVudHJ5cG9pbnQoZW50cnlwb2ludHMsIHJlcG9Sb290LCBvdXRwdXQsIHR5cGUsIGJhc2VQYXRoKTtcbiAgICB9XG4gIH1cblxuICBhZGRQcmVyZW5kZXJQYXRobmFtZXMoXG4gICAgZW50cnlwb2ludHMsXG4gICAgb3V0cHV0cy5wcmVyZW5kZXJzLFxuICAgIGN0eC5yb3V0aW5nLmR5bmFtaWNSb3V0ZXMsXG4gICAgYmFzZVBhdGgsXG4gICAgYCR7YmFzZVBhdGh9L19uZXh0L2RhdGEvJHtjdHguYnVpbGRJZH0vYCxcbiAgKTtcblxuICBjb25zdCBwYXRobmFtZXMgPSBzb3J0ZWRVbmlxdWUoW1xuICAgIC4uLk9iamVjdC5rZXlzKGVudHJ5cG9pbnRzKSxcbiAgICAuLi5PYmplY3Qua2V5cyhzdGF0aWNGaWxlcyksXG4gIF0pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uR3JvdXBzID1cbiAgICBvcHRpb25zLmZ1bmN0aW9uR3JvdXBzID8/XG4gICAgcGFyc2VGdW5jdGlvbkdyb3Vwc0Vudihwcm9jZXNzLmVudltGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUl0pO1xuICAvLyBpMThuIGlzIGNoZWNrZWQgZmlyc3Q6IGl0IHJlamVjdHMgdGhlIGNvbWJpbmF0aW9uIG91dHJpZ2h0LCBhbmQgcnVubmluZyBpdFxuICAvLyBhZnRlciB0aGUgYXNzaWdubWVudCBtZWFudCBhbiBpMThuIGFwcCBnb3QgdGhlIGFzc2lnbm1lbnQncyBcInBhdHRlcm4gbWF0Y2hlc1xuICAvLyBubyByb3V0ZVwiIGVycm9yIGluc3RlYWQg4oCUIHRydWUsIGJ1dCBhYm91dCB0aGUgd3JvbmcgdGhpbmcsIHNpbmNlIGEgbG9jYWxpemVkXG4gIC8vIHRlbXBsYXRlIG5ldmVyIG1hdGNoZXMgYW4gdW5sb2NhbGl6ZWQgcGF0dGVybi5cbiAgaWYgKGZ1bmN0aW9uR3JvdXBzKSB7XG4gICAgYXNzZXJ0Tm9JMThuU3BsaXR0aW5nKGN0eC5jb25maWcuaTE4biA/PyBudWxsKTtcbiAgfVxuICBjb25zdCBhc3NpZ25tZW50ID0gZnVuY3Rpb25Hcm91cHNcbiAgICA/IGFzc2lnblJvdXRlc1RvR3JvdXBzKFxuICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgLy8gS2V5ZWQgb24gdGhlIGZpbGUsIG5vdCB0aGUgb3V0cHV0IGBpZGA6IGEgUGFnZXMgUm91dGVyIHBhZ2UgYW5kIGl0c1xuICAgICAgICAvLyBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCByb3V0ZSBhcmUgc2VwYXJhdGUgb3V0cHV0cyB3aXRoXG4gICAgICAgIC8vIHNlcGFyYXRlIGlkcyBiYWNrZWQgYnkgb25lIGZpbGUsIGFuZCBvbmx5IHRoZSBwYWdlJ3MgdGVtcGxhdGUgbWF0Y2hlc1xuICAgICAgICAvLyBhIGdyb3VwIHBhdHRlcm4uXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJ5cG9pbnRzKS5tYXAoKFt0ZW1wbGF0ZSwgZW50cnlwb2ludF0pID0+ICh7XG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgZW50cnlwb2ludElkOiBlbnRyeXBvaW50LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGU6IGVudHJ5cG9pbnQudHlwZSxcbiAgICAgICAgfSkpLFxuICAgICAgICB7XG4gICAgICAgICAgYmFzZVBhdGg6IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIixcbiAgICAgICAgICBidWlsZElkOiBjdHguYnVpbGRJZCxcbiAgICAgICAgICB0cmFpbGluZ1NsYXNoOiBjdHguY29uZmlnLnRyYWlsaW5nU2xhc2ggPT09IHRydWUsXG4gICAgICAgICAgcm91dGluZzogY3R4LnJvdXRpbmcsXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCA9IHtcbiAgICB2ZXJzaW9uOiBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04gYXMgMSxcbiAgICBidWlsZElkOiBjdHguYnVpbGRJZCxcbiAgICByZWxhdGl2ZVByb2plY3REaXI6IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIGN0eC5wcm9qZWN0RGlyKSksXG4gICAgY29uZmlnOiB7XG4gICAgICBiYXNlUGF0aDogY3R4LmNvbmZpZy5iYXNlUGF0aCB8fCBcIlwiLFxuICAgICAgdHJhaWxpbmdTbGFzaDogY3R4LmNvbmZpZy50cmFpbGluZ1NsYXNoID09PSB0cnVlLFxuICAgICAgYXNzZXRQcmVmaXg6IGN0eC5jb25maWcuYXNzZXRQcmVmaXggfHwgXCJcIixcbiAgICAgIGRpc3REaXI6IHRvUG9zaXgocmVsYXRpdmUoY3R4LnByb2plY3REaXIsIGN0eC5kaXN0RGlyKSksXG4gICAgICBjb21wcmVzczogY3R4LmNvbmZpZy5jb21wcmVzcyAhPT0gZmFsc2UsXG4gICAgICBnZW5lcmF0ZUV0YWdzOiBjdHguY29uZmlnLmdlbmVyYXRlRXRhZ3MgIT09IGZhbHNlLFxuICAgICAgaTE4bjogY3R4LmNvbmZpZy5pMThuID8/IG51bGwsXG4gICAgICBkZXBsb3ltZW50SWQ6IChjdHguY29uZmlnLmRlcGxveW1lbnRJZCA/PyBcIlwiKS5yZXBsYWNlKFxuICAgICAgICAvW15BLVphLXowLTlfLV0vZyxcbiAgICAgICAgXCItXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgcm91dGluZzogY3R4LnJvdXRpbmcsXG4gICAgcGF0aG5hbWVzLFxuICAgIGVudHJ5cG9pbnRzLFxuICAgIG1pZGRsZXdhcmU6IGJ1aWxkTWlkZGxld2FyZShyZXBvUm9vdCwgb3V0cHV0cy5taWRkbGV3YXJlKSxcbiAgICBzdGF0aWNGaWxlcyxcbiAgICAuLi4oYXNzaWdubWVudFxuICAgICAgPyB7XG4gICAgICAgICAgZ3JvdXBzOiBhc3NpZ25tZW50LnRlbXBsYXRlcyxcbiAgICAgICAgICBiZWhhdmlvcnM6IGFzc2lnbm1lbnQuYmVoYXZpb3JzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzOiBmdW5jdGlvbkdyb3VwcyEubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJvdXRlcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xuXG4gIGNvbnN0IGdyb3VwczogU3RhZ2VkR3JvdXBbXSA9IGFzc2lnbm1lbnRcbiAgICA/IE9iamVjdC5lbnRyaWVzKGFzc2lnbm1lbnQudGVtcGxhdGVzKS5tYXAoKFtuYW1lLCB0ZW1wbGF0ZXNdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkaXJOYW1lOiBncm91cFN0YWdpbmdEaXJOYW1lKG5hbWUpLFxuICAgICAgICBzdGFnaW5nOiBjb2xsZWN0R3JvdXBTdGFnaW5nUGxhbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgaW52b2NhYmxlLFxuICAgICAgICAgIGVudHJ5cG9pbnRzLFxuICAgICAgICAgIHRlbXBsYXRlcyxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgIDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgICAgICAgICBkaXJOYW1lOiBncm91cFN0YWdpbmdEaXJOYW1lKCksXG4gICAgICAgICAgc3RhZ2luZzogc2VydmVkU3RhZ2luZ1BsYW4oY3R4LCBpbnZvY2FibGUpLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICByZXR1cm4geyBtYW5pZmVzdCwgZ3JvdXBzIH07XG59XG5cbi8qKlxuICogT25lIGdyb3VwJ3Mgc2xpY2Ugb2YgdGhlIHN0YWdpbmcgcGxhbjogdGhlIGFzc2V0cyBvZiB0aGUgb3V0cHV0cyBpdCBvd25zLCBhbmRcbiAqIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBNaWRkbGV3YXJlIGlzIGluIGV2ZXJ5IGdyb3VwLCBub3QganVzdCB0aGUgZGVmYXVsdCBvbmUg4oCUIGl0IHJ1bnMgb24gZXZlcnlcbiAqIHJlcXVlc3Qgd2hlcmV2ZXIgdGhhdCByZXF1ZXN0IGxhbmRzLCBzbyBpdCBpcyBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYXMgaXMgdGhlXG4gKiBgbmV4dGAgY2xvc3VyZSB0aGUgZW50cnlwb2ludHMgc2hhcmUuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBzdGF0aWMgZmlsZXMgdGhlXG4gKiBydW50aW1lIHNlcnZlcyBpdHNlbGYgKGA0MDQuaHRtbGAsIGBmYXZpY29uLmljby5ib2R5YCk6IGFueSBncm91cCBjYW4gYmUgYXNrZWRcbiAqIGZvciB0aGVtLiBBbmQgc28gYXJlIHRoZSBub3QtZm91bmQgYW5kIGVycm9yIHBhZ2VzOiB0aGUgcnVudGltZSByZW5kZXJzIGFcbiAqIDQwNCBvciBhIDUwMCB3aXRoIHdoaWNoZXZlciBvZiB0aGVtIHRoZSBzaGFyZWQgbWFuaWZlc3QgbmFtZXNcbiAqIChgc3RhdHVzVGFyZ2V0c2AgaW4gYHJ1bnRpbWUvZGlzcGF0Y2gudHNgKSwgaW4gd2hpY2hldmVyIGdyb3VwIHRoZVxuICogcmVxdWVzdCByZWFjaGVkLCBzbyBhIGdyb3VwIHdpdGhvdXQgdGhlbSBhbnN3ZXJlZCBhIFVSTCB1bmRlciBpdHMgb3duXG4gKiBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBubyByb3V0ZSB3aXRoIFwidGhlIGRlcGxveW1lbnQgcGFja2FnZSBpcyBpbmNvbXBsZXRlXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIG1hdGNoZWQgb24gdGhlIGVudHJ5cG9pbnQncyBgZmlsZVBhdGhgLCBub3QgaXRzIGBpZGAgb3JcbiAqIHBhdGhuYW1lOiB0aGUgbWFuaWZlc3QncyBlbnRyeXBvaW50cyBhcmUga2V5ZWQgYnkgKnRlbXBsYXRlKiwgYW4gb3V0cHV0IG1heVxuICogYmFjayBzZXZlcmFsIHRlbXBsYXRlcywgYW5kIHtAbGluayBhZGRQcmVyZW5kZXJQYXRobmFtZXN9IHN5bnRoZXNpemVzXG4gKiBlbnRyeXBvaW50cyB0aGF0IGNhcnJ5IHRoZSAqcHJlcmVuZGVyJ3MqIGlkLCB3aGljaCBubyBpbnZvY2FibGUgb3V0cHV0IGhhcyAodGhlXG4gKiByb290LXBhcmFtcyBhcHA6IGVudHJ5cG9pbnQgYC9lbmAgd2l0aCBgaWQ6IFwiL2VuXCJgIGJhY2tlZCBieSB0aGUgb3V0cHV0XG4gKiBgL1tsb2NhbGVdYCkuIFRoZSBzeW50aGVzaXplZCBlbnRyeXBvaW50J3MgYGZpbGVQYXRoYCBpcyB0aGUgb3duaW5nIG91dHB1dCdzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0R3JvdXBTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbiAgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PixcbiAgdGVtcGxhdGVzOiBzdHJpbmdbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgY29uc3Qgb3duZWRFbnRyeXBvaW50cyA9IFtcbiAgICAuLi50ZW1wbGF0ZXMsXG4gICAgLi4uRVJST1JfUEFHRV9TVUZGSVhFUy5tYXAoKHN1ZmZpeCkgPT4gYCR7YmFzZVBhdGh9JHtzdWZmaXh9YCksXG4gIF1cbiAgICAubWFwKCh0ZW1wbGF0ZSkgPT4gZW50cnlwb2ludHNbdGVtcGxhdGVdKVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgQWRhcHRlckVudHJ5cG9pbnQgPT4gZW50cnkgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IG93bmVkRmlsZXMgPSBuZXcgU2V0KG93bmVkRW50cnlwb2ludHMubWFwKChlbnRyeSkgPT4gZW50cnkuZmlsZVBhdGgpKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IGN0eC5vdXRwdXRzLm1pZGRsZXdhcmU7XG4gIGNvbnN0IG93bmVkID0gaW52b2NhYmxlLmZpbHRlcihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgb3duZWRGaWxlcy5oYXModG9Qb3NpeChyZWxhdGl2ZShjdHgucmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpKSB8fFxuICAgICAgb3V0cHV0ID09PSBtaWRkbGV3YXJlLFxuICApO1xuICByZXR1cm4gc2VydmVkU3RhZ2luZ1BsYW4oY3R4LCBvd25lZCk7XG59XG5cbi8qKiB7QGxpbmsgY29sbGVjdFN0YWdpbmdQbGFufSBmb3IgYG91dHB1dHNgLCBwbHVzIHRoZSBmaWxlcyB0aGUgcnVudGltZSBzZXJ2ZXMuICovXG5mdW5jdGlvbiBzZXJ2ZWRTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgb3V0cHV0czogSW52b2NhYmxlT3V0cHV0W10sXG4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qgc3RhZ2luZyA9IGNvbGxlY3RTdGFnaW5nUGxhbihjdHgsIG91dHB1dHMpO1xuICBzdGFnZVNlcnZlZFN0YXRpY0ZpbGVzKGN0eCwgc3RhZ2luZyk7XG4gIHJldHVybiBzdGFnaW5nO1xufVxuXG4vKipcbiAqIEpvYiAxOiByZWplY3Qgbm9uLU5vZGUgb3V0cHV0cywgZXZlcnl3aGVyZS5cbiAqXG4gKiBgZXhwb3J0IGNvbnN0IHJ1bnRpbWUgPSAnZWRnZSdgIG9uIGEgcGFnZSBvciByb3V0ZSBoYW5kbGVyIGxhbmRzIGluXG4gKiBgYXBwUGFnZXNgL2BhcHBSb3V0ZXNgL2BwYWdlc2AvYHBhZ2VzQXBpYCB3aXRoIGBydW50aW1lOiAnZWRnZSdgLFxuICogYGFzc2V0czoge31gLCBhbmQgYW4gYGVkZ2VSdW50aW1lYCBkZXNjcmlwdG9yIG5lZWRpbmcgYGdsb2JhbFRoaXMuX0VOVFJJRVNgXG4gKiBhbmQgYSBzYW5kYm94LiBHdWFyZGluZyBtaWRkbGV3YXJlIGFsb25lIHdvdWxkIGxlYXZlIGEgc2lsZW50IGZhaWx1cmUgbW9kZVxuICogZm9yIGVkZ2UgcGFnZXM6IGFuIGVudHJ5cG9pbnQgd2UgY2FuJ3QgaW52b2tlIGFuZCBubyBhc3NldHMgdG8gaW52b2tlIGl0XG4gKiB3aXRoLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlUnVudGltZXMoXG4gIGludm9jYWJsZTogSW52b2NhYmxlT3V0cHV0W10sXG4gIG1pZGRsZXdhcmU6IEFkYXB0ZXJPdXRwdXRzW1wibWlkZGxld2FyZVwiXSxcbik6IHZvaWQge1xuICBjb25zdCBvZmZlbmRpbmcgPSBpbnZvY2FibGUuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5ydW50aW1lICE9PSBcIm5vZGVqc1wiKTtcbiAgaWYgKG9mZmVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBNaWRkbGV3YXJlIGlzIHJlcG9ydGVkIHNlcGFyYXRlbHkgZnJvbSByb3V0ZXMuIEl0cyBgc291cmNlUGFnZWAgaXMgYC9gLCBzb1xuICAvLyBmb2xkaW5nIGl0IGluIHdpdGggdGhlIHJvdXRlcyBwcm9kdWNlcyB0aGUgYWN0aXZlbHkgbWlzbGVhZGluZyBhZHZpY2UgdG9cbiAgLy8gcmVtb3ZlIGBleHBvcnQgY29uc3QgcnVudGltZSA9IFwiZWRnZVwiYCBmcm9tIHRoZSBob21lIHBhZ2UgLSB3aGljaCBpcyB3aGVyZVxuICAvLyB0aGUgZWRnZSBydW50aW1lIGlzIG5vdCwgYW5kIG1heSBub3QgZXZlbiBleGlzdC5cbiAgY29uc3Qgb2ZmZW5kaW5nTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUgJiYgb2ZmZW5kaW5nLmluY2x1ZGVzKG1pZGRsZXdhcmUpO1xuICAvLyBgLnJzY2AgdmFyaWFudHMgc2hhcmUgYSBgc291cmNlUGFnZWAgd2l0aCB0aGVpciBIVE1MIHNpYmxpbmcsIHNvIGRlZHVwZS5cbiAgY29uc3Qgcm91dGVzID0gc29ydGVkVW5pcXVlKFxuICAgIG9mZmVuZGluZ1xuICAgICAgLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQgIT09IG1pZGRsZXdhcmUpXG4gICAgICAubWFwKChvdXRwdXQpID0+IGAke291dHB1dC5zb3VyY2VQYWdlfSAocnVudGltZTogXCIke291dHB1dC5ydW50aW1lfVwiKWApLFxuICApO1xuXG4gIGNvbnN0IHJlYXNvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmIChyb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgIHJlYXNvbnMucHVzaChcbiAgICAgIGBjZGstbmV4dGpzIGNhbm5vdCBkZXBsb3kgcm91dGVzIGJ1aWx0IGZvciB0aGUgZWRnZSBydW50aW1lLiBgICtcbiAgICAgICAgYFJlbW92ZSBcXGBleHBvcnQgY29uc3QgcnVudGltZSA9IFwiZWRnZVwiXFxgIGZyb206XFxuYCArXG4gICAgICAgIHJvdXRlcy5tYXAoKHJvdXRlKSA9PiBgICAtICR7cm91dGV9YCkuam9pbihcIlxcblwiKSxcbiAgICApO1xuICB9XG4gIGlmIChvZmZlbmRpbmdNaWRkbGV3YXJlKSB7XG4gICAgcmVhc29ucy5wdXNoKFxuICAgICAgYGNkay1uZXh0anMgY2Fubm90IGRlcGxveSBtaWRkbGV3YXJlIGJ1aWx0IGZvciB0aGUgZWRnZSBydW50aW1lIGAgK1xuICAgICAgICBgKCR7bWlkZGxld2FyZS5maWxlUGF0aH0sIHJ1bnRpbWU6IFwiJHttaWRkbGV3YXJlLnJ1bnRpbWV9XCIpLiBgICtcbiAgICAgICAgYFJlbmFtZSBpdCB0byBcXGBwcm94eS50c1xcYCAoTmV4dC5qcyAxNiBydW5zIHByb3h5IG9uIHRoZSBOb2RlIGAgK1xuICAgICAgICBgcnVudGltZSksIG9yIGtlZXAgXFxgbWlkZGxld2FyZS50c1xcYCBhbmQgYWRkIGAgK1xuICAgICAgICBgXFxgZXhwb3J0IGNvbnN0IGNvbmZpZyA9IHsgcnVudGltZTogXCJub2RlanNcIiB9XFxgIHRvIGl0IOKAlCBgICtcbiAgICAgICAgYFxcYG1pZGRsZXdhcmUudHNcXGAgZGVmYXVsdHMgdG8gdGhlIGVkZ2UgcnVudGltZSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgaXQuYCxcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGAke0xPR19QUkVGSVh9ICR7cmVhc29ucy5qb2luKFwiXFxuXCIpfVxcbmAgK1xuICAgICAgYFRoZSBlZGdlIHJ1bnRpbWUgaXMgZGVwcmVjYXRlZCBpbiBOZXh0LmpzOiBgICtcbiAgICAgIGBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9lZGdlLXJ1bnRpbWUtZGVwcmVjYXRlZGAsXG4gICk7XG59XG5cbi8qKlxuICogV2FybiBvbiByb3V0ZSBjb25maWcgY2RrLW5leHRqcyBkb2VzIG5vdCBob25vci4gQW4gYXV0aG9yIHdobyBzZXQgdGhlc2UgYXNrZWRcbiAqIGZvciBzb21ldGhpbmcgZXhwbGljaXRseSwgc28gc2F5IHNvIHJhdGhlciB0aGFuIGlnbm9yaW5nIGl0IHNpbGVudGx5OyBuZXZlclxuICogdGhyb3csIGJlY2F1c2Ugcm91dGUtbGV2ZWwgYG1heER1cmF0aW9uYCBpcyB2YWxpZCBOZXh0LmpzLlxuICpcbiAqIGBOZXh0anNCdWlsZGAgcnVucyBgbmV4dCBidWlsZGAgd2l0aCBgc3RkaW86IFwiaW5oZXJpdFwiYCwgc28gdGhpcyByZWFjaGVzIHRoZVxuICogdXNlcidzIHRlcm1pbmFsLiBTZWUgdGhlIHBsYW4ncyBcIkRlY2lzaW9uc1wiIGZvciB3aHkgbmVpdGhlciBpcyBob25vcmVkLlxuICovXG5mdW5jdGlvbiB3YXJuT25Ecm9wcGVkUm91dGVDb25maWcoaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSk6IHZvaWQge1xuICBjb25zdCBkcm9wcGVkOiBSZWNvcmQ8XCJtYXhEdXJhdGlvblwiIHwgXCJwcmVmZXJyZWRSZWdpb25cIiwgc3RyaW5nW10+ID0ge1xuICAgIG1heER1cmF0aW9uOiBbXSxcbiAgICBwcmVmZXJyZWRSZWdpb246IFtdLFxuICB9O1xuICBmb3IgKGNvbnN0IG91dHB1dCBvZiBpbnZvY2FibGUpIHtcbiAgICBpZiAob3V0cHV0LmNvbmZpZz8ubWF4RHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5tYXhEdXJhdGlvbi5wdXNoKG91dHB1dC5zb3VyY2VQYWdlKTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5jb25maWc/LnByZWZlcnJlZFJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcm9wcGVkLnByZWZlcnJlZFJlZ2lvbi5wdXNoKG91dHB1dC5zb3VyY2VQYWdlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZW1lZHk6IFJlY29yZDxcIm1heER1cmF0aW9uXCIgfCBcInByZWZlcnJlZFJlZ2lvblwiLCBzdHJpbmc+ID0ge1xuICAgIG1heER1cmF0aW9uOlxuICAgICAgXCJTZXQgdGhlIGZ1bmN0aW9uIHRpbWVvdXQgd2l0aCB0aGUgY29uc3RydWN0J3MgYG92ZXJyaWRlc2AgcHJvcCBpbnN0ZWFkIChlLmcuIGBvdmVycmlkZXM6IHsgbmV4dGpzRnVuY3Rpb25zOiB7IGZ1bmN0aW9uUHJvcHM6IHsgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMCkgfSB9IH1gKTsgYSBMYW1iZGEgdGltZW91dCBpcyBwZXItZnVuY3Rpb24gd2hpbGUgYG1heER1cmF0aW9uYCBpcyBwZXItcm91dGUuXCIsXG4gICAgcHJlZmVycmVkUmVnaW9uOlxuICAgICAgXCJIb25vcmluZyBpdCB3b3VsZCByZXF1aXJlIGEgbXVsdGktcmVnaW9uIGRlcGxveW1lbnQsIHdoaWNoIHRoaXMgY29uc3RydWN0IGRvZXMgbm90IG1vZGVsLlwiLFxuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFtcIm1heER1cmF0aW9uXCIsIFwicHJlZmVycmVkUmVnaW9uXCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3Qgcm91dGVzID0gc29ydGVkVW5pcXVlKGRyb3BwZWRba2V5XSk7XG4gICAgaWYgKHJvdXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSBcXGAke2tleX1cXGAgaXMgbm90IGhvbm9yZWQgYnkgY2RrLW5leHRqcy4gYCArXG4gICAgICAgIGAke3JvdXRlcy5sZW5ndGh9IHJvdXRlKHMpIHNldCBpdCwgaW5jbHVkaW5nOiAke3JvdXRlcy5zbGljZSgwLCA1KS5qb2luKFwiLCBcIil9YCArXG4gICAgICAgIGAke3JvdXRlcy5sZW5ndGggPiA1ID8gYCwgYW5kICR7cm91dGVzLmxlbmd0aCAtIDV9IG1vcmVgIDogXCJcIn0uIGAgK1xuICAgICAgICByZW1lZHlba2V5XSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSm9icyAyLCAzIGFuZCA2OiB0aGUgZGVkdXBlZCB1bmlvbiBvZiBldmVyeSBzaGlwcGVkIG91dHB1dCdzIHRyYWNlZCBgYXNzZXRzYCxcbiAqIHBsdXMgZWFjaCBlbnRyeXBvaW50IGZpbGUgaXRzZWxmLCBwbHVzIHRoZSBlbnYgZmlsZXMsIHdpdGggYGFzc2V0c0hhc2hlc2AgdXNlZFxuICogYXMgYSBjb25mbGljdCBjaGVjay5cbiAqXG4gKiBEZWR1cCBpcyBieSBrZXk6IHRoZSB0cmFjZWQgYG5leHRgIGNsb3N1cmUgaXMgbWVyZ2VkIGludG8gZXZlcnkgb3V0cHV0J3NcbiAqIGBhc3NldHNgIChgZ2V0U2hhcmVkTm9kZUFzc2V0c2Ag4oaSIGBzaGFyZWROb2RlQXNzZXRzYCksIHNvIE4gb3V0cHV0c1xuICogb3ZlcndoZWxtaW5nbHkgcmVwZWF0IGtleXMuIFdoYXQgdGhlIGhhc2hlcyBidXkgaXMgZGV0ZWN0aW5nIHR3byBvdXRwdXRzXG4gKiBtYXBwaW5nIHRoZSAqKnNhbWUga2V5IHRvIGRpZmZlcmVudCBjb250ZW50KiosIHdoaWNoIGlzIHVucGFja2FnZWFibGUgaW50b1xuICogb25lIExhbWJkYSDigJQgZmFpbCB0aGUgYnVpbGQgbG91ZGx5IHJhdGhlciB0aGFuIGxldHRpbmcgbGFzdC13cml0ZS13aW5zIHBpY2suXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IHJlcG9Sb290IH0gPSBjdHg7XG4gIGNvbnN0IHN0YWdpbmcgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBoYXNoZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0IGFkZCA9IChrZXk6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGhhc2g/OiBzdHJpbmcpID0+IHtcbiAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgICBjb25zdCBleGlzdGluZ0hhc2ggPSBoYXNoZXMuZ2V0KGtleSk7XG4gICAgaWYgKFxuICAgICAgaGFzaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBleGlzdGluZ0hhc2ggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgZXhpc3RpbmdIYXNoICE9PSBoYXNoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFR3byBidWlsZCBvdXRwdXRzIG1hcCBcIiR7a2V5fVwiIHRvIGRpZmZlcmVudCBjb250ZW50IGAgK1xuICAgICAgICAgIGAoaGFzaGVzICR7ZXhpc3RpbmdIYXNofSBhbmQgJHtoYXNofSkuIE9uZSBkZXBsb3ltZW50IHBhY2thZ2UgY2Fubm90IGAgK1xuICAgICAgICAgIGBob2xkIGJvdGguIFRoaXMgdXN1YWxseSBtZWFucyB0d28gTmV4dC5qcyBwcm9qZWN0cyBpbiB0aGUgc2FtZSByZXBvIGAgK1xuICAgICAgICAgIGB3cml0ZSB0aGUgc2FtZSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzaGVzLnNldChrZXksIGhhc2gpO1xuICAgIH1cbiAgICBpZiAoIXN0YWdpbmcuaGFzKGtleSkpIHtcbiAgICAgIHN0YWdpbmcuc2V0KGtleSwgc291cmNlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChjb25zdCBvdXRwdXQgb2YgaW52b2NhYmxlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dC5hc3NldHMpKSB7XG4gICAgICBhZGQoa2V5LCBzb3VyY2UsIG91dHB1dC5hc3NldHNIYXNoZXNba2V5XSk7XG4gICAgfVxuICAgIC8vIFRoZSBlbnRyeXBvaW50J3Mgb3duIGZpbGUgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tIGl0cyBgYXNzZXRzYCDigJQgdGhlXG4gICAgLy8gTkZUIHRyYWNlIGNvdmVycyB0aGUgY2xvc3VyZSBpdCByZXF1aXJlcywgbm90IGl0c2VsZi4gYGFzc2V0c0hhc2hlc2AgZG9lc1xuICAgIC8vIGNhcnJ5IGl0IChrZXllZCB0aGUgc2FtZSB3YXkpLCB3aGljaCBpcyBhbHNvIHdoYXQgcGlucyB0aGUga2V5IGZvcm1hdC5cbiAgICBjb25zdCBlbnRyeUtleSA9IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpO1xuICAgIGFkZChlbnRyeUtleSwgb3V0cHV0LmZpbGVQYXRoLCBvdXRwdXQuYXNzZXRzSGFzaGVzW2VudHJ5S2V5XSk7XG4gIH1cblxuICAvLyBKb2IgMiwgc2Vjb25kIGhhbGY6IGB3cml0ZVN0YW5kYWxvbmVEaXJlY3RvcnlgIGZpbHRlcnMgYGxvYWRlZEVudkZpbGVzYCB0b1xuICAvLyBleGFjdGx5IHRoZXNlIHR3byBhbmQgY29waWVzIHRoZW07IGBidWlsZC1jb21wbGV0ZS5qc2AgaGFzIG5vIGVudi1maWxlXG4gIC8vIGhhbmRsaW5nIGF0IGFsbCwgc28gdGhleSBhcmUgbm90IGluIGFueSBgYXNzZXRzYCBtYXAuXG4gIGZvciAoY29uc3QgZW52RmlsZSBvZiBFTlZfRklMRVMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBqb2luKGN0eC5wcm9qZWN0RGlyLCBlbnZGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSB7XG4gICAgICBhZGQodG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgc291cmNlKSksIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YWdpbmc7XG59XG5cbi8qKlxuICogSm9iIDIsIHRoaXJkIHBhcnQ6IHRoZSBzdGF0aWMgZmlsZXMgdGhlICpydW50aW1lKiBoYXMgdG8gc2VydmUsIGFuZCB0aGVpclxuICogc291cmNlcy5cbiAqXG4gKiBgb3V0cHV0cy5zdGF0aWNGaWxlc2AgbWl4ZXMgdHdvIHBvcHVsYXRpb25zIHdpdGggdGhlIHNhbWUgYFNUQVRJQ19GSUxFYCB0eXBlOlxuICpcbiAqIC0gKipgPGRpc3REaXI+L3N0YXRpYy8qKmAgYW5kIGBwdWJsaWMvKipgKiog4oCUIHVwbG9hZGVkIHRvIFMzIGJ5XG4gKiAgIGBOZXh0anNTdGF0aWNBc3NldHNgLCBhbmQgQ2xvdWRGcm9udCAvIEFQSSBHYXRld2F5IGFuc3dlciB0aGVtIGJlZm9yZSB0aGVcbiAqICAgcmVxdWVzdCBldmVyIHJlYWNoZXMgdGhlIGNvbXB1dGUuIE5vdCBzdGFnZWQ6IGBwdWJsaWMvYCBhbG9uZSBjYW4gYmVcbiAqICAgaHVuZHJlZHMgb2YgbWVnYWJ5dGVzIGFnYWluc3QgYSAyNTAgTUIgdW56aXBwZWQgTGFtYmRhIGNhcCwgYW5kIGl0IHdvdWxkIGJlXG4gKiAgIGEgc2Vjb25kIGNvcHkgb2YgYnl0ZXMgYWxyZWFkeSBpbiBTMy4gYHB1YmxpYy9gIGlzIG5vdCBpblxuICogICBgb3V0cHV0cy5zdGF0aWNGaWxlc2AgYXQgYWxsIOKAlCBOZXh0LmpzIGxpc3RzIGl0IG9ubHkgZm9yIGBvdXRwdXQ6IFwiZXhwb3J0XCJgXG4gKiAgIOKAlCBhbmQgaXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhZGRlZCBoZXJlOiB0aGUgY29udGFpbmVyIHJ1bnRpbWUgbGlzdHMgaXQgb2ZmXG4gKiAgIGRpc2sgYXQgY29sZCBzdGFydCBpbnN0ZWFkLCBhcyBgbmV4dCBzdGFydGAgZG9lcyAoYHJlYWRQdWJsaWNGaWxlc2AgaW5cbiAqICAgYHNyYy9ydW50aW1lL3B1YmxpYy1maWxlcy50c2ApLCBiZWNhdXNlIG9ubHkgdGhlIGRpc2sga25vd3Mgd2hhdCBhbiBhcHAnc1xuICogICBgcG9zdGJ1aWxkYCB3cm90ZSBpbnRvIGl0IGFmdGVyIHRoaXMgaG9vayByYW4uXG4gKiAtICoqZXZlcnl0aGluZyBlbHNlKiosIGFsbCBvZiBpdCB1bmRlciBgPGRpc3REaXI+L3NlcnZlci9gIOKAlCBgNDA0Lmh0bWxgLFxuICogICBgNTAwLmh0bWxgLCBgZmF2aWNvbi5pY28uYm9keWAsIGFuZCBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIEhUTUwuIE5vdGhpbmdcbiAqICAgaW4gZnJvbnQgb2YgdGhlIGNvbXB1dGUgc2VydmVzIHRoZXNlLCBzbyB0aGV5IGFyZSBzdGFnZWQuIEJvdW5kZWQgYnkgcm91dGVcbiAqICAgY291bnQgYW5kIHNtYWxsLlxuICpcbiAqIFRoZSBwYXRobmFtZSDihpIga2V5IG1hcCBpcyByZXR1cm5lZCBmb3IgKmFsbCogb2YgdGhlbSwgYmVjYXVzZSBkaXNwYXRjaCBoYXMgdG9cbiAqIHJlc29sdmUgYSBwYXRobmFtZSB0byBcInN0YXRpYyBmaWxlLCBub3QgYSA0MDRcIiBlaXRoZXIgd2F5OyB0aGUgcnVudGltZSA0MDRzIGlmXG4gKiB0aGUgZmlsZSB0dXJucyBvdXQgbm90IHRvIGJlIGluIHRoZSBwYWNrYWdlLCB3aGljaCBpcyBvbmx5IHJlYWNoYWJsZSB3aGVuIHRoZVxuICogZGlzdHJpYnV0aW9uIGlzIG1pc3JvdXRlZC5cbiAqXG4gKiBTdGFnaW5nIGlzIHtAbGluayBzdGFnZVNlcnZlZFN0YXRpY0ZpbGVzfSwgYXBwbGllZCBvbmNlIHBlciBkZXBsb3ltZW50IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGF0aWNGaWxlcyhjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgcmVwb1Jvb3QgfSA9IGN0eDtcbiAgY29uc3QgYmFzZVBhdGggPSBjdHguY29uZmlnLmJhc2VQYXRoIHx8IFwiXCI7XG4gIGNvbnN0IHN0YXRpY0ZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgcGFnZXNEaXIgPSBqb2luKGN0eC5kaXN0RGlyLCBcInNlcnZlclwiLCBcInBhZ2VzXCIpICsgc2VwO1xuXG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGN0eC5vdXRwdXRzLnN0YXRpY0ZpbGVzKSB7XG4gICAgY29uc3Qga2V5ID0gdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgb3V0cHV0LmZpbGVQYXRoKSk7XG4gICAgY29uc3QgcGF0aG5hbWVzID0gcm91dGFibGVQYXRobmFtZXMoXG4gICAgICBvdXRwdXQucGF0aG5hbWUsXG4gICAgICBiYXNlUGF0aCxcbiAgICAgIG91dHB1dC5maWxlUGF0aC5zdGFydHNXaXRoKHBhZ2VzRGlyKSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgcGF0aG5hbWVzKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0YXRpY0ZpbGVzLmdldChwYXRobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0ga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBUd28gc3RhdGljIGZpbGVzIGNsYWltIHRoZSBwYXRobmFtZSBgICtcbiAgICAgICAgICAgIGBcIiR7cGF0aG5hbWV9XCIgKFwiJHtleGlzdGluZ31cIiBhbmQgXCIke2tleX1cIikuIERpc3BhdGNoIGNhbm5vdCBgICtcbiAgICAgICAgICAgIGBjaG9vc2UgYmV0d2VlbiB0aGVtLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGF0aWNGaWxlcy5zZXQocGF0aG5hbWUsIGtleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU29ydGVkIGJlY2F1c2Ugb2JqZWN0IGtleXMga2VlcCBpbnNlcnRpb24gb3JkZXIsIGFuZCBhIGJ5dGUtc3RhYmxlXG4gIC8vIGBtYW5pZmVzdC5qc29uYCBpcyB3aGF0IGtlZXBzIGl0IGRpZmZhYmxlIGFuZCB0aGUgQ0RLIGFzc2V0IGhhc2ggZnJvbVxuICAvLyBjaHVybmluZy5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4uc3RhdGljRmlsZXNdLnNvcnQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IDEpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcGF0aG5hbWVzIGFuIG91dHB1dCBhbnN3ZXJzLCB3aGljaCBmb3Igb25lIHNoYXBlIGlzIG5vdCB0aGUgcGF0aG5hbWVcbiAqIGBuZXh0IGJ1aWxkYCByZXBvcnRlZC5cbiAqXG4gKiAqKkEgUGFnZXMgUm91dGVyIGhvbWUgcGFnZSBhcnJpdmVzIGFzIGAvaW5kZXhgLioqIFRoZSBhZGFwdGVyIGhvb2sgZGVyaXZlcyBldmVyeVxuICogUGFnZXMgcGF0aG5hbWUgd2l0aCBgbm9ybWFsaXplUGFnZVBhdGgocGFnZSlgLCBhbmQgYG5vcm1hbGl6ZVBhZ2VQYXRoKFwiL1wiKWAgaXNcbiAqIGBcIi9pbmRleFwiYCAoYG5leHQvZGlzdC9zaGFyZWQvbGliL3BhZ2UtcGF0aC9ub3JtYWxpemUtcGFnZS1wYXRoLmpzYCkg4oCUIGZvciB0aGVcbiAqIGBQQUdFU2Agb3V0cHV0IG9mIGFuIFNTRyBvciBTU1IgaG9tZSBwYWdlIGFuZCBmb3IgdGhlIGBTVEFUSUNfRklMRWAgb2YgYVxuICogZnVsbHktc3RhdGljIG9uZSBhbGlrZS4gYC9pbmRleGAgaXMgbm90IGEgVVJMIGFueW9uZSByZXF1ZXN0cywgYW5kIG5vdGhpbmcgZWxzZVxuICogaW4gdGhlIG91dHB1dHMgY2FycmllcyBgL2AgZm9yIHRoYXQgcGFnZSwgc28gd2l0aG91dCB0aGlzIHRoZSBob21lIHBhZ2UgaXMgaW5cbiAqIG5laXRoZXIgYG1hbmlmZXN0LnBhdGhuYW1lc2Agbm9yIGBtYW5pZmVzdC5lbnRyeXBvaW50c2AvYHN0YXRpY0ZpbGVzYCwgYW5kIGV2ZXJ5XG4gKiByZXF1ZXN0IHRvIGAvYCA0MDRzIHdoaWxlIGV2ZXJ5IG90aGVyIHBhZ2Ugb2YgdGhlIHNhbWUgYXBwIHNlcnZlcy4gTWVhc3VyZWRcbiAqIGFnYWluc3QgbmV4dC5qcydzIGB0ZXN0L2UyZS9uZXctbGluay1iZWhhdmlvcmAgKGAvYCByZXR1cm5lZCB0aGUgYnVpbHQtaW4gNDA0LFxuICogdGhlIHNpeCBvdGhlciBwYWdlcyB3ZXJlIGZpbmUpIGFuZCBgdGVzdC9lMmUvcHJlcmVuZGVyLXByZXZpZXdgICh0aGUgb25lIGNhc2VcbiAqIHRoYXQgZmV0Y2hlcyBgL2AgZ290IHRoZSA0MDQgcGFnZSdzIEhUTUwsIHRoZSBlaWdodCB0aGF0IGhpdCBBUEkgcm91dGVzIHBhc3NlZCkuXG4gKlxuICogUGFnZXMgUm91dGVyIG91dHB1dHMgb25seSwgd2hpY2ggaXMgd2hhdCBgZnJvbVBhZ2VzUm91dGVyYCBzYXlzLiBBcHAgUm91dGVyXG4gKiByZXBvcnRzIGl0cyBob21lIHBhZ2UgYXMgYC9gIGFuZCBvbmx5IHRoZSBSU0Mgc2libGluZyBhcyBgL2luZGV4LnJzY2AsIHNvIGFuXG4gKiBBcHAgUm91dGVyIGAvaW5kZXhgIGlzIGBhcHAvaW5kZXgvcGFnZS50c3hgIOKAlCBhIHJlYWwgcm91dGUgYXQgYC9pbmRleGAsIGFuZFxuICogbWFwcGluZyBpdCB0byBgL2AgbWFkZSBhbiBhcHAgd2l0aCBib3RoIHBhZ2VzIGZhaWwgdGhlIGJ1aWxkIG9uIGEgcGF0aG5hbWVcbiAqIGNvbGxpc2lvbiwgYW5kIGFuIGFwcCB3aXRoIG9ubHkgdGhlIHNlY29uZCBzZXJ2ZSBpdCBhdCBgL2AuIFRoZSBzYW1lIGdvZXMgZm9yXG4gKiBhIGBwdWJsaWMvaW5kZXhgIGZpbGUuXG4gKlxuICogQm90aCBwYXRobmFtZXMgYXJlIHJlZ2lzdGVyZWQuIGAvYCBiZWNhdXNlIGl0IGlzIHRoZSByZWFsIG9uZTsgYC9pbmRleGAgYmVjYXVzZVxuICogbmV4dCdzIG93biBtaW5pbWFsIG1vZGUg4oCUIHRoZSBtb2RlIG91ciBydW50aW1lIHJ1bnMgaW4g4oCUIGFjY2VwdHMgaXQsIHJld3JpdGluZ1xuICogYHJlcS51cmxgIGFuZCBgeC1tYXRjaGVkLXBhdGhgIGZyb20gYC9pbmRleGAgdG8gYC9gIGJlZm9yZSBtYXRjaGluZ1xuICogKGBiYXNlLXNlcnZlci50c2AsIFwiaW4gbWluaW1hbCBtb2RlXCIpLCBzbyBkcm9wcGluZyBpdCB3b3VsZCBiZSBhIGRpdmVyZ2VuY2UgaW5cbiAqIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gKlxuICogVW5hbWJpZ3VvdXMgd2l0aGluIHRoZSBQYWdlcyBSb3V0ZXIgZGVzcGl0ZSB0aGUgY29sbGlzaW9uIGl0IGxvb2tzIGxpa2U6XG4gKiBgbm9ybWFsaXplUGFnZVBhdGgoXCIvaW5kZXhcIilgIGlzIGBcIi9pbmRleC9pbmRleFwiYCwgc28gYSByZXBvcnRlZCBgL2luZGV4YCBjYW5cbiAqIG9ubHkgaGF2ZSBjb21lIGZyb20gdGhlIHBhZ2UgYC9gLlxuICogVGhlIGRhdGEgcm91dGUgb2YgdGhlIHNhbWUgcGFnZSwgYC9fbmV4dC9kYXRhLzxidWlsZElkPi9pbmRleC5qc29uYCwgYW5kIGFuIEFwcFxuICogUm91dGVyIGAvaW5kZXgucnNjYCBhcmUgYm90aCByZWFsIFVSTHMgYW5kIGFyZSBsZWZ0IGFsb25lIGJ5IHRoZSBleGFjdCBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gcm91dGFibGVQYXRobmFtZXMoXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4gIGZyb21QYWdlc1JvdXRlcjogYm9vbGVhbixcbik6IHN0cmluZ1tdIHtcbiAgaWYgKCFmcm9tUGFnZXNSb3V0ZXIgfHwgcGF0aG5hbWUgIT09IGAke2Jhc2VQYXRofS9pbmRleGApIHtcbiAgICByZXR1cm4gW3BhdGhuYW1lXTtcbiAgfVxuICAvLyBgYmFzZVBhdGggfHwgXCIvXCJgLCBub3QgYCR7YmFzZVBhdGh9L2A6IHdpdGggYGJhc2VQYXRoOiBcIi9wcm9kXCJgIHRoZSBob21lIHBhZ2VcbiAgLy8gaXMgYC9wcm9kYCwgd2hpY2ggaXMgaG93IHRoZSBBcHAgUm91dGVyIGZpeHR1cmVzIHJlcG9ydCB0aGVpcnMuXG4gIHJldHVybiBbYmFzZVBhdGggfHwgXCIvXCIsIHBhdGhuYW1lXTtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIHN0YXRpYyBmaWxlcyB0aGUgKnJ1bnRpbWUqIHNlcnZlcyB0byBhIHN0YWdpbmcgcGxhbiDigJQgdGhlIFwiZXZlcnl0aGluZ1xuICogZWxzZVwiIHBvcHVsYXRpb24gZGVzY3JpYmVkIG9uIHtAbGluayBjb2xsZWN0U3RhdGljRmlsZXN9LCBhbGwgb2YgaXQgdW5kZXJcbiAqIGA8ZGlzdERpcj4vc2VydmVyL2AuXG4gKlxuICogU2VwYXJhdGUgZnJvbSBidWlsZGluZyB0aGUgbWFuaWZlc3QncyBgc3RhdGljRmlsZXNgIG1hcCBiZWNhdXNlIHRoZSBtYXAgaXMgdGhlXG4gKiBzYW1lIGZvciBldmVyeSBncm91cCB3aGlsZSB0aGUgc3RhZ2luZyBpcyBhcHBsaWVkIG9uY2UgcGVyIGRlcGxveW1lbnQgcm9vdDpcbiAqIGFueSBncm91cCBjYW4gYmUgYXNrZWQgZm9yIGAvNDA0YCwgc28gZXZlcnkgZ3JvdXAgc2hpcHMgdGhlc2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWdlU2VydmVkU3RhdGljRmlsZXMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIHN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgY29uc3QgeyByZXBvUm9vdCwgZGlzdERpciB9ID0gY3R4O1xuICBjb25zdCBjbGllbnRTdGF0aWNEaXIgPSBqb2luKGRpc3REaXIsIFwic3RhdGljXCIpICsgc2VwO1xuXG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGN0eC5vdXRwdXRzLnN0YXRpY0ZpbGVzKSB7XG4gICAgY29uc3Qgc2VydmVkQnlTMyA9XG4gICAgICBvdXRwdXQuZmlsZVBhdGguc3RhcnRzV2l0aChjbGllbnRTdGF0aWNEaXIpIHx8XG4gICAgICAhb3V0cHV0LmZpbGVQYXRoLnN0YXJ0c1dpdGgoZGlzdERpciArIHNlcCk7XG4gICAgaWYgKHNlcnZlZEJ5UzMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgb3V0cHV0LmZpbGVQYXRoKTtcbiAgICBzdGFnaW5nLnNldChrZXksIG91dHB1dC5maWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgaW52YXJpYW50IGJlaGluZCBgbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyYDogYG5leHQgYnVpbGRgIG11c3QgcnVuIGZyb21cbiAqIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAqXG4gKiBOZXh0IGlubGluZXMgYHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHByb2plY3REaXIpYCBpbnRvIGV2ZXJ5IGVudHJ5cG9pbnRcbiAqIChgZGVmaW5lLWVudi5qc2ApIGFuZCB0aGUgYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhZ2FpbnN0IHRoZSAqcnVudGltZSpcbiAqIGBwcm9jZXNzLmN3ZCgpYC4gS2VlcGluZyBidWlsZCBjd2QgYW5kIHByb2plY3QgZGlyIGVxdWFsIG1ha2VzIHRoYXQgaW5saW5lZFxuICogdmFsdWUgYFwiXCJgLCBzbyB0aGUgcnVudGltZSBvbmx5IGhhcyB0byBgY2hkaXJgIHRvIHRoZSBzdGFnZWQgcHJvamVjdCBkaXIuIEFcbiAqIGJ1aWxkIHJ1biBmcm9tIGVsc2V3aGVyZSB3b3VsZCBpbmxpbmUgYSBub24tZW1wdHkgcmVsYXRpdmUgcGF0aCDigJQgb2Z0ZW4gb25lXG4gKiBwb2ludGluZyBvdXRzaWRlIHRoZSBzdGFnaW5nIHRyZWUg4oCUIGFuZCBldmVyeSBlbnRyeXBvaW50IHdvdWxkIGZhaWwgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBhdCBydW50aW1lIHdpdGggbm8gaGludCBhcyB0byB3aHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ1aWxkQ3dkKGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsIGJ1aWxkQ3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgY3dkID0gcmVzb2x2ZShidWlsZEN3ZCk7XG4gIGlmIChjd2QgPT09IHJlc29sdmUoY3R4LnByb2plY3REaXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgJHtMT0dfUFJFRklYfSBcXGBuZXh0IGJ1aWxkXFxgIG11c3QgcnVuIGZyb20gdGhlIE5leHQuanMgcHJvamVjdCBgICtcbiAgICAgIGBkaXJlY3RvcnkuIEl0IHJhbiBmcm9tIFwiJHtjd2R9XCIgd2l0aCB0aGUgcHJvamVjdCBhdCBgICtcbiAgICAgIGBcIiR7Y3R4LnByb2plY3REaXJ9XCIuIE5leHQuanMgYmFrZXMgdGhlIHJlbGF0aXZlIHBhdGggYmV0d2VlbiB0aG9zZSB0d28gYCArXG4gICAgICBgaW50byBldmVyeSBidWlsdCBlbnRyeXBvaW50LCBhbmQgY2RrLW5leHRqcyBjYW5ub3QgcmVwcm9kdWNlIHRoYXQgbGF5b3V0IGAgK1xuICAgICAgYGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UuIENoYW5nZSBkaXJlY3RvcnkgZmlyc3QgKFxcYGNkIGAgK1xuICAgICAgYCR7cmVsYXRpdmUoY3dkLCBjdHgucHJvamVjdERpcikgfHwgXCIuXCJ9ICYmIG5leHQgYnVpbGRcXGApIGluc3RlYWQgb2YgYCArXG4gICAgICBgcGFzc2luZyB0aGUgZGlyZWN0b3J5IGFzIGFuIGFyZ3VtZW50OyBpbiBhIG1vbm9yZXBvLCBydW4gdGhlIGFwcCdzIG93biBgICtcbiAgICAgIGBidWlsZCBzY3JpcHQgZnJvbSBpdHMgZGlyZWN0b3J5IChlLmcuIFxcYHBucG0gLS1maWx0ZXIgPGFwcD4gYnVpbGRcXGAsIGAgK1xuICAgICAgYHdoaWNoIHJ1bnMgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5KS5gLFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGRFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50czogUmVjb3JkPHN0cmluZywgQWRhcHRlckVudHJ5cG9pbnQ+LFxuICByZXBvUm9vdDogc3RyaW5nLFxuICBvdXRwdXQ6IHsgaWQ6IHN0cmluZzsgcGF0aG5hbWU6IHN0cmluZzsgZmlsZVBhdGg6IHN0cmluZyB9LFxuICB0eXBlOiBBZGFwdGVyRW50cnlwb2ludFR5cGUsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgZmlsZVBhdGggPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgY29uc3QgcGF0aG5hbWVzID0gcm91dGFibGVQYXRobmFtZXMoXG4gICAgb3V0cHV0LnBhdGhuYW1lLFxuICAgIGJhc2VQYXRoLFxuICAgIHR5cGUgPT09IFwicGFnZVwiLFxuICApO1xuICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIHBhdGhuYW1lcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZW50cnlwb2ludHNbcGF0aG5hbWVdO1xuICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5maWxlUGF0aCAhPT0gZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVHdvIGJ1aWxkIG91dHB1dHMgY2xhaW0gdGhlIHBhdGhuYW1lIFwiJHtwYXRobmFtZX1cIiBgICtcbiAgICAgICAgICBgKFwiJHtleGlzdGluZy5maWxlUGF0aH1cIiBhbmQgXCIke2ZpbGVQYXRofVwiKS4gRGlzcGF0Y2ggY2Fubm90IGNob29zZSBgICtcbiAgICAgICAgICBgYmV0d2VlbiB0aGVtLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBlbnRyeXBvaW50c1twYXRobmFtZV0gPSB7IGlkOiBvdXRwdXQuaWQsIGZpbGVQYXRoLCB0eXBlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgdGhlICpwcmVyZW5kZXIqIHBhdGhuYW1lcyB0aGF0IG5vIGludm9jYWJsZSBvdXRwdXQgY2xhaW1zIGFuZCB0aGF0IHJvdXRpbmdcbiAqIGNhbm5vdCBvdGhlcndpc2UgcmVhY2guXG4gKlxuICogYHJlc29sdmVSb3V0ZXNgIGNhbiBvbmx5IG1hdGNoIGEgcGF0aG5hbWUgcHJlc2VudCBpbiBgbWFuaWZlc3QucGF0aG5hbWVzYCwgYW5kXG4gKiBmb3IgYSBkeW5hbWljIG1hdGNoIGl0IHJldHVybnMgdGhlICoqdGVtcGxhdGUqKiBpdCBtYXRjaGVkLiBSb3V0ZXMgYW5kIHN0YXRpY1xuICogZmlsZXMgY292ZXIgbW9zdCBvZiB0aGF0OyB0d28gc2hhcGVzIHRoZXkgbWlzczpcbiAqXG4gKiAxLiAqKlRlbXBsYXRlcy4qKiBBIHJlcXVlc3QgZm9yIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZnIvYmxvZy9oZWxsby5qc29uYCBvbmx5XG4gKiAgICByZXNvbHZlcyBpZiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+L2ZyL2Jsb2cvW3NsdWddLmpzb25gIGlzIGxpc3RlZCwgYW5kIHRoYXRcbiAqICAgIHBhdGhuYW1lIGV4aXN0cyBzb2xlbHkgYXMgYSBgcHJlcmVuZGVyc2AgZW50cnkuXG4gKiAxYi4gKipBIHN0YXRpYyBgZ2V0U3RhdGljUHJvcHNgIHBhZ2UncyBkYXRhIHJvdXRlLioqIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZ3NwLmpzb25gXG4gKiAgICBoYXMgbm8gdGVtcGxhdGUgdG8gbWF0Y2ggYW5kIG5vIHJ1bGUgb2YgaXRzIG93bjogYG5leHQgYnVpbGRgIG9ubHkgZW1pdHMgYVxuICogICAgYGR5bmFtaWNSb3V0ZXNgIHJ1bGUgZm9yIGEgZGF0YSByb3V0ZSB3aGVuIHRoZSBwYWdlIGlzIGR5bmFtaWMgKm9yKiB0aGUgYXBwIGhhc1xuICogICAgbWlkZGxld2FyZSAoYGJ1aWxkLWNvbXBsZXRlLnRzYCwgYG5lZWRzTWlkZGxld2FyZVJlc29sdmVSb3V0ZXNgLCB3aGljaCBpcyBhbHNvXG4gKiAgICB3aGF0IGByb3V0aW5nLnNob3VsZE5vcm1hbGl6ZU5leHREYXRhYCByZXBvcnRzKS4gV2l0aG91dCBtaWRkbGV3YXJlIE5leHQuanNcbiAqICAgIGV4cGVjdHMgdGhlIHBsYXRmb3JtIHRvIHNlcnZlIHRoZSBkYXRhIHJvdXRlIGFzIGFuIG91dHB1dCwgYnkgcGF0aG5hbWUg4oCUIHNvIGFcbiAqICAgIGNvbmNyZXRlIGRhdGEtcm91dGUgcHJlcmVuZGVyIGlzIHJlZ2lzdGVyZWQgd2hhdGV2ZXIgdGhlIHJ1bGVzIHNheS4gTWlzc2luZyBpdFxuICogICAgdHVybmVkIGV2ZXJ5IGNsaWVudC1zaWRlIG5hdmlnYXRpb24gaW50byBzdWNoIGEgcGFnZSBpbnRvIGEgZnVsbCBwYWdlIGxvYWQsXG4gKiAgICBiZWNhdXNlIHRoZSByb3V0ZXIncyBgLmpzb25gIGZldGNoIDQwNCdkOiBtZWFzdXJlZCBhZ2FpbnN0XG4gKiAgICBgdGVzdC9lMmUvbm8tcGFnZS1wcm9wc2AuIE9ubHkgd2hlbiBubyAqdW5nYXRlZCogcnVsZSBtYXRjaGVzLCBmb3IgdGhlIHJlYXNvblxuICogICAgYmVsb3cg4oCUIGEgZHluYW1pYyBwYWdlJ3MgYC/igKYvYmxvZy9oZWxsby5qc29uYCBtdXN0IGtlZXAgcmVzb2x2aW5nIHRvIGl0c1xuICogICAgYFtzbHVnXS5qc29uYCB0ZW1wbGF0ZSwgd2hpY2ggaXMgd2hlcmUgYG54dFBzbHVnYCBjb21lcyBmcm9tLlxuICogMi4gKipDb25jcmV0ZSBwYXRobmFtZXMgd2hvc2UgZHluYW1pYyByb3V0ZSBydWxlIGlzIGdhdGVkLioqIEEgcm91dGUgd2hvc2UgcGFyYW1zXG4gKiAgICBjYW4gbmV2ZXIgYmUgZmlsbGVkIGF0IHJlcXVlc3QgdGltZSDigJQgcm9vdCBwYXJhbXMgYXJlIHRoZSBjYXNlIHRoYXQgcHJvZHVjZWRcbiAqICAgIHRoaXMsIGBhcHAvW2xvY2FsZV0vcGFnZS50c3hgIHdpdGggYGdlbmVyYXRlU3RhdGljUGFyYW1zKClgIGFuZCBub1xuICogICAgYGFwcC9sYXlvdXQudHN4YCDigJQgZ2V0cyBpdHMgYGR5bmFtaWNSb3V0ZXNgIHJ1bGUgZW1pdHRlZCB3aXRoIGEgZHJhZnQtbW9kZVxuICogICAgYGhhc2Agb24gYF9fcHJlcmVuZGVyX2J5cGFzc2AuIE5leHQuanMgaXMgc2F5aW5nOiBpbnZva2UgdGhlIGZ1bmN0aW9uIG9ubHkgaW5cbiAqICAgIGRyYWZ0IG1vZGUsIGFuZCBvdGhlcndpc2Ugc2VydmUgdGhlIHByZXJlbmRlciB5b3Ugd2VyZSBoYW5kZWQuIFZlcmNlbCdzIENETlxuICogICAgZG9lcyB0aGF0IGZyb20gdGhlIG91dHB1dCBpdHNlbGY7IHdlIHJvdXRlIHRoZSByZXF1ZXN0IHRvIHRoZSBvd25pbmdcbiAqICAgIGVudHJ5cG9pbnQsIHdoaWNoIGFuc3dlcnMgaXQgb3V0IG9mIHRoZSBzZWVkZWQgY2FjaGUuIFdpdGhvdXQgdGhpcywgYC9lbmAgaXMgYVxuICogICAgNDA0IHdoaWxlIGBuZXh0IHN0YXJ0YCByZW5kZXJzIGl0IOKAlCBhbmQgc28gaXMgZXZlcnkgYC5yc2NgL2Auc2VnbWVudHNgXG4gKiAgICB2YXJpYW50LCB3aGljaCBpcyB3aHkgYSBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uIGludG8gc3VjaCBhbiBhcHAgbmV2ZXJcbiAqICAgIGNvbXBsZXRlcy5cbiAqXG4gKiBBIGNvbmNyZXRlIHBhdGhuYW1lIGlzIGFkZGVkIG9ubHkgd2hlbiBhIGdhdGVkIHJ1bGUgbWF0Y2hlcyBpdCBhbmQgbm8gdW5nYXRlZFxuICogb25lIGRvZXMg4oCUIHRoZSBzZXQgdGhhdCB3b3VsZCA0MDQgdG9kYXkgKmFuZCogdGhhdCByb3V0aW5nIGNhbiBzdGlsbCBwcm9kdWNlLlxuICogQWRkaW5nIHRoZW0gdW5jb25kaXRpb25hbGx5IHdhcyBtZWFzdXJlZCB0byBiZSBhY3RpdmVseSB3cm9uZyB0d2ljZSBvdmVyOlxuICogYC9pc3IvMWAgcmVzb2x2ZXMgdG8gaXRzZWxmIHJhdGhlciB0aGFuIHRvIGAvaXNyL1tpZF1gLCBsb3NpbmcgdGhlIGBueHRQaWRgXG4gKiBxdWVyeSBwYXJhbSB0aGUgcm91dGUgbmVlZHMsIGFuZCBwYXRobmFtZXMgbm8gcnVsZSBtYXRjaGVzIGF0IGFsbCAoYSBzdGF0aWNcbiAqIHJvdXRlJ3MgYC5zZWdtZW50cy/igKZgIG91dHB1dHMsIHdoaWNoIGByZXNvbHZlUm91dGVzYCBuZXZlciBhc2tzIGZvcikgYXJlIGRlYWRcbiAqIG1hbmlmZXN0IHdlaWdodC4gTWF0Y2hpbmcgbWlycm9ycyBgcmVzb2x2ZVJvdXRlc2AsIHdoaWNoIGlzIGNhc2UtaW5zZW5zaXRpdmUgYnlcbiAqIGRlZmF1bHQuXG4gKlxuICogVGhlIG93bmluZyBlbnRyeXBvaW50IGNvbWVzIGZyb20gYHByZXJlbmRlci5yb3V0ZWAsIHdoaWNoIGlzIHRoZSB1bnByZWZpeGVkIGFuZFxuICogdW5sb2NhbGl6ZWQgc291cmNlIHJvdXRlIChgL2Jsb2cvW3NsdWddYCksIGhlbmNlIHRoZSBiYXNlUGF0aC10aGVuLWJhcmUgbGFkZGVyLlxuICogTG9jYWxlIHZhcmlhbnRzIG9mIG9uZSBwYWdlIHNoYXJlIGEgYGZpbGVQYXRoYCwgc28gYW55IGxvY2FsZSdzIGVudHJ5cG9pbnQgaXNcbiAqIHRoZSByaWdodCB0YXJnZXQuIEFuIFJTQyBvciBzZWdtZW50LXByZWZldGNoIHBhdGhuYW1lIHByZWZlcnMgdGhlIHJvdXRlJ3MgYC5yc2NgXG4gKiBlbnRyeXBvaW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlIGtleSBgcmVzb2x2ZVJvdXRlc2AgcmVzb2x2ZXMgc3VjaCBhIHJlcXVlc3QgdG8uXG4gKi9cbmZ1bmN0aW9uIGFkZFByZXJlbmRlclBhdGhuYW1lcyhcbiAgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PixcbiAgcHJlcmVuZGVyczogQWRhcHRlck91dHB1dHNbXCJwcmVyZW5kZXJzXCJdLFxuICBkeW5hbWljUm91dGVzOiB7XG4gICAgc291cmNlUmVnZXg6IHN0cmluZztcbiAgICBoYXM/OiB1bmtub3duW107XG4gICAgbWlzc2luZz86IHVua25vd25bXTtcbiAgfVtdLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBkYXRhUm91dGVQcmVmaXg6IHN0cmluZyxcbik6IHZvaWQge1xuICBjb25zdCBtYXRjaGVycyA9IGR5bmFtaWNSb3V0ZXMubWFwKChyb3V0ZSkgPT4gKHtcbiAgICByZWdleDogbmV3IFJlZ0V4cChyb3V0ZS5zb3VyY2VSZWdleCwgXCJpXCIpLFxuICAgIGdhdGVkOiBCb29sZWFuKHJvdXRlLmhhcz8ubGVuZ3RoIHx8IHJvdXRlLm1pc3Npbmc/Lmxlbmd0aCksXG4gIH0pKTtcbiAgY29uc3QgbWF0Y2hpbmdSdWxlcyA9IChwYXRobmFtZTogc3RyaW5nKSA9PlxuICAgIG1hdGNoZXJzLmZpbHRlcigoeyByZWdleCB9KSA9PiByZWdleC50ZXN0KHBhdGhuYW1lKSk7XG4gIGNvbnN0IG9ubHlHYXRlZFJ1bGVzTWF0Y2ggPSAocGF0aG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGluZ1J1bGVzKHBhdGhuYW1lKTtcbiAgICByZXR1cm4gbWF0Y2hlZC5sZW5ndGggPiAwICYmIG1hdGNoZWQuZXZlcnkoKHsgZ2F0ZWQgfSkgPT4gZ2F0ZWQpO1xuICB9O1xuICAvKipcbiAgICogTm90aGluZyByZWFjaGVzIHRoaXMgcGF0aG5hbWUgYXQgcmVxdWVzdCB0aW1lOiBlaXRoZXIgbm8gcnVsZSBtYXRjaGVzIGl0IG9yXG4gICAqIGV2ZXJ5IHJ1bGUgdGhhdCBkb2VzIGlzIGdhdGVkLiBUaGUgZ2F0ZWQgaGFsZiBpcyB7QGxpbmsgb25seUdhdGVkUnVsZXNNYXRjaH07XG4gICAqIHRoZSBcIm5vIHJ1bGUgYXQgYWxsXCIgaGFsZiBvbmx5IGV2ZXIgaG9sZHMgZm9yIGEgZGF0YSByb3V0ZSwgYmVjYXVzZSBhIHBhZ2Unc1xuICAgKiBvd24gcGF0aG5hbWUgaXMgYW4gb3V0cHV0LlxuICAgKi9cbiAgY29uc3Qgbm90aGluZ1VuZ2F0ZWRNYXRjaGVzID0gKHBhdGhuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hpbmdSdWxlcyhwYXRobmFtZSkuZXZlcnkoKHsgZ2F0ZWQgfSkgPT4gZ2F0ZWQpO1xuXG4gIGNvbnN0IG9ycGhhbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJlcmVuZGVyIG9mIHByZXJlbmRlcnMpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwcmVyZW5kZXI7XG4gICAgaWYgKGVudHJ5cG9pbnRzW3BhdGhuYW1lXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzVGVtcGxhdGUgPSBwYXRobmFtZS5pbmNsdWRlcyhcIltcIik7XG4gICAgY29uc3QgaXNEYXRhUm91dGUgPVxuICAgICAgcGF0aG5hbWUuc3RhcnRzV2l0aChkYXRhUm91dGVQcmVmaXgpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIik7XG4gICAgY29uc3QgcmVhY2hhYmxlID0gaXNEYXRhUm91dGVcbiAgICAgID8gbm90aGluZ1VuZ2F0ZWRNYXRjaGVzKHBhdGhuYW1lKVxuICAgICAgOiBvbmx5R2F0ZWRSdWxlc01hdGNoKHBhdGhuYW1lKTtcbiAgICBpZiAoIWlzVGVtcGxhdGUgJiYgIXJlYWNoYWJsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeGVzID0gcGF0aG5hbWUuZW5kc1dpdGgoXCIucnNjXCIpID8gW1wiLnJzY1wiLCBcIlwiXSA6IFtcIlwiXTtcbiAgICBjb25zdCBvd25lciA9IHN1ZmZpeGVzXG4gICAgICAuZmxhdE1hcCgoc3VmZml4KSA9PiBbXG4gICAgICAgIGAke2Jhc2VQYXRofSR7cHJlcmVuZGVyLnJvdXRlfSR7c3VmZml4fWAsXG4gICAgICAgIGAke3ByZXJlbmRlci5yb3V0ZX0ke3N1ZmZpeH1gLFxuICAgICAgXSlcbiAgICAgIC5tYXAoKGtleSkgPT4gZW50cnlwb2ludHNba2V5XSlcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGlmICghb3duZXIpIHtcbiAgICAgIG9ycGhhbnMucHVzaChgJHtwYXRobmFtZX0gKHJvdXRlOiBcIiR7cHJlcmVuZGVyLnJvdXRlfVwiKWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudHJ5cG9pbnRzW3BhdGhuYW1lXSA9IHtcbiAgICAgIGlkOiBwcmVyZW5kZXIuaWQsXG4gICAgICBmaWxlUGF0aDogb3duZXIuZmlsZVBhdGgsXG4gICAgICB0eXBlOiBvd25lci50eXBlLFxuICAgIH07XG4gIH1cblxuICBpZiAob3JwaGFucy5sZW5ndGggPiAwKSB7XG4gICAgLy8gV2FybiByYXRoZXIgdGhhbiB0aHJvdzogYW4gdW5tYXBwZWQgcGF0aG5hbWUgZGVncmFkZXMgb25lIFVSTCBzaGFwZSB0byBhXG4gICAgLy8gNDA0LCB3aGljaCBpcyB3aGF0IHdvdWxkIGhhcHBlbiB3aXRob3V0IHRoaXMgZnVuY3Rpb24gYXQgYWxsLiBBIHRocm93XG4gICAgLy8gd291bGQgYnJlYWsgdGhlIGJ1aWxkIG91dHJpZ2h0IG9uIGFuIG91dHB1dCBzaGFwZSBhIGZ1dHVyZSBgbmV4dGAgbWlub3JcbiAgICAvLyBtaWdodCBpbnRyb2R1Y2UuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gJHtvcnBoYW5zLmxlbmd0aH0gcHJlcmVuZGVyIHBhdGhuYW1lKHMpIGhhdmUgbm8gYCArXG4gICAgICAgIGBtYXRjaGluZyByb3V0ZSBlbnRyeXBvaW50IGFuZCB3aWxsIDQwNDogYCArXG4gICAgICAgIGAke29ycGhhbnMuc2xpY2UoMCwgNSkuam9pbihcIiwgXCIpfWAgK1xuICAgICAgICBgJHtvcnBoYW5zLmxlbmd0aCA+IDUgPyBgLCBhbmQgJHtvcnBoYW5zLmxlbmd0aCAtIDV9IG1vcmVgIDogXCJcIn0uYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWlkZGxld2FyZShcbiAgcmVwb1Jvb3Q6IHN0cmluZyxcbiAgbWlkZGxld2FyZTogQWRhcHRlck91dHB1dHNbXCJtaWRkbGV3YXJlXCJdLFxuKTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsIHtcbiAgaWYgKCFtaWRkbGV3YXJlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gYGNvbmZpZy5tYXRjaGVyc2AgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjb3BpZWQgaGVyZTogaXQgYXJyaXZlcyBpbnNpZGVcbiAgLy8gYGN0eC5yb3V0aW5nLm1pZGRsZXdhcmVNYXRjaGVyc2AsIHdoaWNoIGBAbmV4dC9yb3V0aW5nYCBjb25zdW1lcyBkaXJlY3RseS5cbiAgcmV0dXJuIHtcbiAgICBpZDogbWlkZGxld2FyZS5pZCxcbiAgICBmaWxlUGF0aDogdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgbWlkZGxld2FyZS5maWxlUGF0aCkpLFxuICB9O1xufVxuXG4vKipcbiAqIENvcHkgdGhlIHN0YWdpbmcgcGxhbiBpbnRvIGBzdGFnaW5nRGlyYC5cbiAqXG4gKiAqKlN5bWxpbmtzIGFyZSByZWNyZWF0ZWQgYXMgc3ltbGlua3MsIG5vdCBkZXJlZmVyZW5jZWQqKiwgd2hpY2ggaXMgd2hhdFxuICogTmV4dC5qcydzIG93biBgY29weVRyYWNlZEZpbGVzYCBkb2VzIChgbmV4dC9kaXN0L2J1aWxkL3V0aWxzLmpzYDogYHJlYWRsaW5rYFxuICogdGhlbiBgc3ltbGlua2AsIHdpdGggYSBXaW5kb3dzIGp1bmN0aW9uIGZhbGxiYWNrKS4gVW5kZXIgcG5wbSBhIHRyYWNlZCBhc3NldFxuICoga2V5IGlzIGZyZXF1ZW50bHkgYSAqZGlyZWN0b3J5KiBzeW1saW5rIGludG8gdGhlIHN0b3JlXG4gKiAoYG5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi9ub2RlX21vZHVsZXMvcmVhY3RgIOKGkiBgLi4vLi4vcmVhY3RAMTkuMi4zL+KApmApLCBzb1xuICogYGNvcHlGaWxlYCBmYWlscyBvdXRyaWdodCB3aXRoIGBFTk9UU1VQYC4gRGVyZWZlcmVuY2luZyBpbnN0ZWFkIHdvdWxkIHRyaXBsZVxuICogdGhlIHRyZWUg4oCUIGBleGFtcGxlcy9hcHAtcGxheWdyb3VuZGAgbWVhc3VyZXMgMzIgTUIgc3RhZ2VkIHZlcnN1cyA5NiBNQiB3aXRoXG4gKiBgZHUgLXNoTGAsIGFnYWluc3QgYSAyNTAgTUIgdW56aXBwZWQgTGFtYmRhIGNhcCDigJQgYmVjYXVzZSB3aG9sZSBwYWNrYWdlcyBhcmVcbiAqIHJlYWNoYWJsZSB0aHJvdWdoIHNldmVyYWwgc3VjaCBsaW5rcy4gVGhlIGxpbmsgdGFyZ2V0cyBhcmUgdGhlbXNlbHZlcyBzdGFnZWRcbiAqIGtleXMsIHNvIHJlbGF0aXZlIGxpbmtzIHJlc29sdmUgaW5zaWRlIHRoZSBkZXBsb3ltZW50IHJvb3QuXG4gKlxuICogUmVndWxhciBmaWxlcyBhcmUgc3RhZ2VkIGZpcnN0IHNvIHRoYXQgYSBzeW1saW5rIHdob3NlIHBhdGggd2FzIGFscmVhZHlcbiAqIG1hdGVyaWFsaXplZCBhcyBhIHJlYWwgZGlyZWN0b3J5IGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gY2xvYmJlcmluZyBpdC5cbiAqXG4gKiBOb3RoaW5nIG1heSBkZXJlZmVyZW5jZSB0aGVtIGFmdGVyd2FyZHM6IHRoZSBGdW5jdGlvbnMgemlwIGtlZXBzIHRoZW0gYXNcbiAqIGxpbmtzIChgemlwRGlyZWN0b3J5YCksIGFuZCB0aGUgQ29udGFpbmVycyBgQ09QWWAgZG9lcyB0b28uXG4gKi9cbi8qKiBCb3VuZGVkIHNvIGEgbGFyZ2UgYXBwIGRvZXNuJ3QgZXhoYXVzdCBmaWxlIGRlc2NyaXB0b3JzLiAqL1xuY29uc3QgU1RBR0lOR19DT05DVVJSRU5DWSA9IDMyO1xuXG5hc3luYyBmdW5jdGlvbiBzdGFnZUZpbGVzKFxuICBzdGFnaW5nOiBTdGFnaW5nUGxhbixcbiAgc3RhZ2luZ0Rpcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBsYW5uZWQgPSBbLi4uc3RhZ2luZ107XG4gIC8vIExpbmtzIGxhbmQgYnkgcGxhbiBpbmRleCwgc28gdGhlIHBhc3MgYmVsb3cgY3JlYXRlcyB0aGVtIGluIHRoZSBwbGFuJ3NcbiAgLy8gb3JkZXIgd2hhdGV2ZXIgb3JkZXIgdGhlIHdvcmtlcnMgZmluaXNoZWQgaW4uXG4gIGNvbnN0IGxpbmtzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQ+ID0gbmV3IEFycmF5KFxuICAgIHBsYW5uZWQubGVuZ3RoLFxuICApO1xuICBsZXQgbmV4dEVudHJ5ID0gMDtcbiAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChuZXh0RW50cnkgPCBwbGFubmVkLmxlbmd0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSBuZXh0RW50cnkrKztcbiAgICAgIGNvbnN0IFtrZXksIHNvdXJjZV0gPSBwbGFubmVkW2luZGV4XTtcbiAgICAgIGNvbnN0IGxpbmtUYXJnZXQgPSBhd2FpdCByZWFkbGluayhzb3VyY2UpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgaWYgKGxpbmtUYXJnZXQgIT09IG51bGwpIHtcbiAgICAgICAgbGlua3NbaW5kZXhdID0gW2tleSwgc291cmNlLCBsaW5rVGFyZ2V0XTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXN0ID0gam9pbihzdGFnaW5nRGlyLCBrZXkpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShkZXN0KSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBjb3B5RmlsZShzb3VyY2UsIGRlc3QpO1xuICAgIH1cbiAgfTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBNYXRoLm1pbihTVEFHSU5HX0NPTkNVUlJFTkNZLCBwbGFubmVkLmxlbmd0aCkgfSxcbiAgICAgIHdvcmtlcixcbiAgICApLFxuICApO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGlmIChsaW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBba2V5LCBzb3VyY2UsIGxpbmtUYXJnZXRdID0gbGluaztcbiAgICBjb25zdCBkZXN0ID0gam9pbihzdGFnaW5nRGlyLCBrZXkpO1xuICAgIGlmIChleGlzdHNTeW5jKGRlc3QpKSB7XG4gICAgICAvLyBBbHJlYWR5IHN0YWdlZCBhcyByZWFsIGNvbnRlbnQgYnkgdGhlIHBvb2wgYWJvdmU7IHRoZSBsaW5rIHdvdWxkIGFkZFxuICAgICAgLy8gbm90aGluZyBhbmQgd291bGQgcmVwbGFjZSBhIGRpcmVjdG9yeSB3ZSBuZWVkLlxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGVzdCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShkaXJuYW1lKGRlc3QpLCBsaW5rVGFyZ2V0KTtcbiAgICBpZiAocmVzb2x2ZWQgPT09IHN0YWdpbmdEaXIgfHwgcmVzb2x2ZWQuc3RhcnRzV2l0aChzdGFnaW5nRGlyICsgc2VwKSkge1xuICAgICAgYXdhaXQgc3ltbGluayhsaW5rVGFyZ2V0LCBkZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9pbnRzIG91dHNpZGUgdGhlIGRlcGxveW1lbnQgcm9vdCwgc28gdGhlIGxpbmsgd291bGQgZGFuZ2xlIGluIExhbWJkYS5cbiAgICAgIC8vIEFic29sdXRlIHN0b3JlIHBhdGhzIGFyZSB0aGUgcmVhbGlzdGljIGNhc2UgaGVyZS5cbiAgICAgIGF3YWl0IGNwKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGRlcmVmZXJlbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFkZHMge0BsaW5rIFJVTlRJTUVfTkVYVF9NT0RVTEVTfSwgYEBuZXh0L2VudmAsIGFuZCBldmVyeXRoaW5nIHRoZXkgcmVxdWlyZSB0b1xuICogYHN0YWdpbmdgLCBhbmQge0BsaW5rIElNQUdFX05FWFRfTU9EVUxFU30gYW5kIHRoZWlycyB0byBgaW1hZ2VTdGFnaW5nYC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgdGhlIGRlcGxveW1lbnQgaXMgY29tcGxldGUgZm9yIGV2ZXJ5IHJvdXRlIHRoZSBhcHAgaGFzIGFuZCBicm9rZW5cbiAqIGZvciBgL19uZXh0L2ltYWdlYDogdGhlIHRyYWNlZCBgYXNzZXRzYCBvZiBhIGJ1aWxkIG91dHB1dCBjb3ZlciB3aGF0IHRoZSAqYXBwKlxuICogcmVhY2hlcywgYW5kIGFuIGFwcCBuZXZlciByZWFjaGVzIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIsIHNvXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNgIGFuZCBpdHMgY2xvc3VyZSBhcmUgc2ltcGx5IGFic2VudCBhbmRcbiAqIGV2ZXJ5IGltYWdlIHJlcXVlc3QgNTAwcyB3aXRoIGEgYE1PRFVMRV9OT1RfRk9VTkRgIGZyb20gYG5leHRNb2R1bGVgLlxuICpcbiAqIFJlc29sdXRpb24gaXMgYW5jaG9yZWQgaW5zaWRlIGBjdHgucHJvamVjdERpcmAgZm9yIHRoZSBzYW1lIHJlYXNvblxuICogYHVzZU5leHRGcm9tYCBhbmNob3JzIHRoZXJlIGF0IHJ1bnRpbWU6IGl0IGlzIHRoZSBkaXJlY3Rvcnkgd2hvc2VcbiAqIGBub2RlX21vZHVsZXNgIHdhbGsgZmluZHMgdGhlIGFwcCdzIGBuZXh0YC4gQSByZXBvIHdoZXJlIHRoYXQgcmVzb2x1dGlvbiBmYWlsc1xuICogaXMgbm90IGEgcmVhbCBgbmV4dCBidWlsZGAg4oCUIG5vdGhpbmcgZWxzZSB3b3VsZCBoYXZlIHJ1biDigJQgc28gaXQgd2FybnMgYW5kXG4gKiBjb250aW51ZXMgcmF0aGVyIHRoYW4gZmFpbGluZyBhIGJ1aWxkIGZvciBhIHBhY2thZ2UgaXQgY291bGQgbm90IGhhdmUgbmVlZGVkLlxuICogQSBtaXNzaW5nICp0cmFjZXIqIGlzIGRpZmZlcmVudDogYG5leHRgIGlzIHJpZ2h0IHRoZXJlIGFuZCBpbWFnZSBvcHRpbWl6YXRpb25cbiAqIHdvdWxkIHNpbGVudGx5IDUwMCBpbiBwcm9kdWN0aW9uLCBzbyB0aGF0IHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkUnVudGltZU5leHRDbG9zdXJlKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBzdGFnaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBpbWFnZVN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gVGhlIGFuY2hvciBmaWxlIG5lZWRuJ3QgZXhpc3Q7IGBjcmVhdGVSZXF1aXJlYCBvbmx5IHJlYWRzIGl0cyBkaXJlY3RvcnkuXG4gIGNvbnN0IG5leHRSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShcbiAgICBqb2luKGN0eC5wcm9qZWN0RGlyLCBcImNkay1uZXh0anMtbmV4dC1yZXNvbHZlci5janNcIiksXG4gICk7XG5cbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICBsZXQgaW1hZ2VFbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gUlVOVElNRV9ORVhUX01PRFVMRVMubWFwKChzcGVjaWZpZXIpID0+XG4gICAgICBuZXh0UmVxdWlyZS5yZXNvbHZlKHNwZWNpZmllciksXG4gICAgKTtcbiAgICBpbWFnZUVudHJpZXMgPSBJTUFHRV9ORVhUX01PRFVMRVMubWFwKChzcGVjaWZpZXIpID0+XG4gICAgICBuZXh0UmVxdWlyZS5yZXNvbHZlKHNwZWNpZmllciksXG4gICAgKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBuZXh0J3MgaW1hZ2Ugb3B0aW1pemVyIGZyb20gYCArXG4gICAgICAgIGBcIiR7Y3R4LnByb2plY3REaXJ9XCIgKCR7KGNhdXNlIGFzIEVycm9yKS5tZXNzYWdlfSkuIFJlcXVlc3RzIHRvIGAgK1xuICAgICAgICBgL19uZXh0L2ltYWdlIHdpbGwgZmFpbCBhdCBydW50aW1lLmAsXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYGxvYWRFbnZGaWxlc2AgKHJ1bnRpbWUgYG5leHQtbW9kdWxlcy50c2ApIGxvYWRzIHRoZSBzdGFnZWQgZW52IGZpbGVzIHdpdGhcbiAgLy8gYEBuZXh0L2VudmAsIHdoaWNoIGlzIGBuZXh0YCdzIGRlcGVuZGVuY3ksIHNvIHJlc29sdmVkIGZyb20gYG5leHRgJ3MgZGlyLlxuICAvLyBBbiBhcHAgbmV2ZXIgcmVxdWlyZXMgaXQsIHNvIG5vIG91dHB1dCdzIHRyYWNlIGhhcyBpdCBlaXRoZXIuXG4gIGNvbnN0IG5leHRQYWNrYWdlID0gbmV4dFJlcXVpcmUucmVzb2x2ZShcIm5leHQvcGFja2FnZS5qc29uXCIpO1xuICB0cnkge1xuICAgIGVudHJpZXMucHVzaChjcmVhdGVSZXF1aXJlKG5leHRQYWNrYWdlKS5yZXNvbHZlKFwiQG5leHQvZW52XCIpKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBcIkBuZXh0L2VudlwiIGZyb20gdGhlIGFwcCdzIFxcYG5leHRcXGAsIGAgK1xuICAgICAgICBgd2hpY2ggdGhlIGNkay1uZXh0anMgcnVudGltZSB1c2VzIHRvIGxvYWQgLmVudiBmaWxlcy5gLFxuICAgICAgeyBjYXVzZSB9LFxuICAgICk7XG4gIH1cblxuICBsZXQgbm9kZUZpbGVUcmFjZTogTm9kZUZpbGVUcmFjZTtcbiAgdHJ5IHtcbiAgICAoeyBub2RlRmlsZVRyYWNlIH0gPSBuZXh0UmVxdWlyZShORVhUX0ZJTEVfVFJBQ0VSKSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQ291bGQgbm90IGxvYWQgXCIke05FWFRfRklMRV9UUkFDRVJ9XCIsIHdoaWNoIGNkay1uZXh0anMgdXNlcyBgICtcbiAgICAgICAgYHRvIHN0YWdlIHRoZSBcXGBuZXh0XFxgIGZpbGVzIGl0cyBpbWFnZSBvcHRpbWl6ZXIgcmVxdWlyZXMuIFRoaXMgTmV4dC5qcyBgICtcbiAgICAgICAgYHZlcnNpb24gbWF5IGhhdmUgbW92ZWQgaXQ7IHBsZWFzZSBvcGVuIGFuIGlzc3VlLmAsXG4gICAgICB7IGNhdXNlIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFkZCA9IChmaWxlTGlzdDogU2V0PHN0cmluZz4sIHRhcmdldDogTWFwPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIGZvciAoY29uc3QgdHJhY2VkIG9mIGZpbGVMaXN0KSB7XG4gICAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHRyYWNlZCk7XG4gICAgICBpZiAodGFyZ2V0LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc291cmNlID0gam9pbihjdHgucmVwb1Jvb3QsIHRyYWNlZCk7XG4gICAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgICAgIHRhcmdldC5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfTtcbiAgYWRkKFxuICAgIChhd2FpdCBub2RlRmlsZVRyYWNlKGltYWdlRW50cmllcywgeyBiYXNlOiBjdHgucmVwb1Jvb3QgfSkpLmZpbGVMaXN0LFxuICAgIGltYWdlU3RhZ2luZyxcbiAgKTtcbiAgY29uc3QgeyBmaWxlTGlzdCB9ID0gYXdhaXQgbm9kZUZpbGVUcmFjZShlbnRyaWVzLCB7IGJhc2U6IGN0eC5yZXBvUm9vdCB9KTtcbiAgLy8gVGhlIHRyYWNlIHN0YXJ0cyBmcm9tIGBAbmV4dC9lbnZgJ3MgcmVhbCBwYXRoLCBzbyB1bmRlciBwbnBtIGl0IG5ldmVyXG4gIC8vIHBhc3NlcyB0aHJvdWdoIHRoZSBgLnBucG0vbmV4dEDigKYvbm9kZV9tb2R1bGVzL0BuZXh0L2VudmAgbGluayB0aGF0IGBuZXh0YFxuICAvLyByZXNvbHZlcyBpdCBieS4gV2l0aG91dCB0aGUgbGluaywgZXZlcnkgcmVxdWVzdCBmYWlscyBhdCBjb2xkIHN0YXJ0IHdpdGhcbiAgLy8gXCJDYW5ub3QgZmluZCBtb2R1bGUgJ0BuZXh0L2VudidcIi5cbiAgY29uc3QgbmV4dEVudkxpbmsgPSBqb2luKGRpcm5hbWUobmV4dFBhY2thZ2UpLCBcIi4uXCIsIFwiQG5leHRcIiwgXCJlbnZcIik7XG4gIGlmIChsc3RhdFN5bmMobmV4dEVudkxpbmssIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgLy8gYHJlc29sdmVgIHJldHVybnMgcmVhbCBwYXRocywgc28gcmVsYXRpdmUgdG8gdGhlIHJlYWwgcmVwbyByb290LlxuICAgIGZpbGVMaXN0LmFkZChyZWxhdGl2ZShyZWFscGF0aFN5bmMoY3R4LnJlcG9Sb290KSwgbmV4dEVudkxpbmspKTtcbiAgfVxuICBhZGQoZmlsZUxpc3QsIHN0YWdpbmcpO1xufVxuXG4vKipcbiAqIEFkZCBgPGRpc3REaXI+L3JlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCB0byBhIHBsYW4gZXZlcnkgZ3JvdXAgaXMgbWVyZ2VkIHdpdGguXG4gKlxuICogSXQgcmVhY2hlcyBhIGdyb3VwIG90aGVyd2lzZSBvbmx5IGFzIGEgdHJhY2VkIGBhc3NldGAgb2Ygc29tZSBpbnZvY2FibGUgb3V0cHV0LFxuICogd2hpY2ggaXMgbm90IGEgZ3VhcmFudGVlOiBhIGdyb3VwIHdob3NlIHRlbXBsYXRlcyBhcmUgYWxsIGFzc2lnbmVkIGVsc2V3aGVyZVxuICogb3ducyBubyBvdXRwdXRzIGF0IGFsbC4gVGhhdCBpcyByZWFjaGFibGUg4oCUIGEgUGFnZXMtUm91dGVyLW9ubHkgYXBwIHdob3NlIGV2ZXJ5XG4gKiBwYWdlIGZhbGxzIHVuZGVyIHRoZSBjb25maWd1cmVkIGBmdW5jdGlvbkdyb3Vwc2AgbGVhdmVzIHRoZSAqZGVmYXVsdCogZ3JvdXBcbiAqIHRlbXBsYXRlLWVtcHR5LCBhbmQgdGhlIGRlZmF1bHQgZ3JvdXAgaXMgc3RpbGwgd2hhdCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHRoZVxuICogc3RhdGljIGZpbGVzLCBhbmQgdGhlIGRpc3RyaWJ1dGlvbidzIGNhdGNoLWFsbC5cbiAqXG4gKiBJdHMgYWJzZW5jZSBpcyBub3QgYSBwYXJ0aWFsIGZhaWx1cmU6IGBsb2FkUnVudGltZWAgcHJvYmVzIGZvciBleGFjdGx5IHRoaXMgZmlsZVxuICogYmVmb3JlIGl0IHdpbGwgc2VydmUgYW55dGhpbmcsIGFuZCBgaW1hZ2UudHNgIHJlYWRzIHRoZSBpbWFnZSBjb25maWcgb3V0IG9mIGl0LFxuICogc28gdGhlIHdob2xlIHJvb3QgYW5zd2VycyBcInRoZSBkZXBsb3ltZW50IHBhY2thZ2UgaXMgaW5jb21wbGV0ZVwiLiBDaGVhcCB0byBtYWtlXG4gKiB1bmNvbmRpdGlvbmFsLCBzbyBtYWtlIGl0IHVuY29uZGl0aW9uYWwuXG4gKlxuICogTm90IHRyYWNlZCBsaWtlIHtAbGluayBSVU5USU1FX05FWFRfTU9EVUxFU30sIGJlY2F1c2UgaXQgaXMgZGF0YSByYXRoZXIgdGhhbiBhXG4gKiBtb2R1bGU6IG5vdGhpbmcgYHJlcXVpcmVgcyBpdCwgc28gbm8gZmlsZSB0cmFjZXIgY2FuIGZpbmQgaXQuXG4gKlxuICogQWJzZW5jZSBpcyBsZWZ0IHRvIGBsb2FkUnVudGltZWAsIHdoaWNoIG5hbWVzIHRoZSBmaWxlIGFuZCB0aGUgbGF5b3V0IGNvbnRyYWN0XG4gKiBpdCBiZWxvbmdzIHRvLiBgbmV4dCBidWlsZGAgYWx3YXlzIHdyaXRlcyBpdCwgc28gdGhlcmUgaXMgbm8gYnVpbGQtdGltZSBlcnJvclxuICogd29ydGggaW52ZW50aW5nIGhlcmUgZm9yIGEgZmlsZSB0aGlzIHN0ZXAgZG9lcyBub3Qgb3duLlxuICovXG5mdW5jdGlvbiBhZGRSZXF1aXJlZFNlcnZlckZpbGVzKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBzdGFnaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oY3R4LmRpc3REaXIsIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIik7XG4gIGNvbnN0IGtleSA9IHRvUG9zaXgocmVsYXRpdmUoY3R4LnJlcG9Sb290LCBzb3VyY2UpKTtcbiAgaWYgKHN0YWdpbmcuaGFzKGtleSkgfHwgIWV4aXN0c1N5bmMoc291cmNlKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgc3RhZ2luZy5zZXQoa2V5LCBzb3VyY2UpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN0YWdlZCBwYXRoIG11c3QgbGFuZCBpbnNpZGUgdGhlIHN0YWdpbmcgdHJlZSBhbmQgbXVzdCBub3Qgc2hhZG93IHRoZVxuICogcmVzZXJ2ZWQgZGlyZWN0b3J5IGNkay1uZXh0anMgY29waWVzIGl0cyBvd24gcnVudGltZSBpbnRvIGF0IHN5bnRoLlxuICovXG5mdW5jdGlvbiBhc3NlcnRTdGFnaW5nS2V5KGtleTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoa2V5ID09PSBcIlwiIHx8IGtleS5zdGFydHNXaXRoKFwiL1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIi4uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQnVpbGQgb3V0cHV0IGFzc2V0IFwiJHtzb3VyY2V9XCIgcmVzb2x2ZXMgdG8gdGhlIHN0YWdpbmcga2V5IGAgK1xuICAgICAgICBgXCIke2tleX1cIiwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgZGVwbG95bWVudCByb290LiBTZXQgYCArXG4gICAgICAgIGBcXGBvdXRwdXRGaWxlVHJhY2luZ1Jvb3RcXGAgc28gYWxsIHRyYWNlZCBmaWxlcyBsaXZlIHVuZGVyIG9uZSByb290LmAsXG4gICAgKTtcbiAgfVxuICBpZiAoa2V5ID09PSBSVU5USU1FX0RJUl9OQU1FIHx8IGtleS5zdGFydHNXaXRoKGAke1JVTlRJTUVfRElSX05BTUV9L2ApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQnVpbGQgb3V0cHV0IGFzc2V0IFwiJHtzb3VyY2V9XCIgcmVzb2x2ZXMgdG8gdGhlIHN0YWdpbmcga2V5IGAgK1xuICAgICAgICBgXCIke2tleX1cIiwgYnV0IFwiJHtSVU5USU1FX0RJUl9OQU1FfS9cIiBpcyByZXNlcnZlZCBmb3IgY2RrLW5leHRqcydzIG93biBgICtcbiAgICAgICAgYHJ1bnRpbWUgZmlsZXMuYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUG9zaXgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlcCA9PT0gXCIvXCIgPyBwYXRoIDogcGF0aC5zcGxpdChzZXApLmpvaW4oXCIvXCIpO1xufVxuXG5mdW5jdGlvbiBzb3J0ZWRVbmlxdWUodmFsdWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KHZhbHVlcyldLnNvcnQoKTtcbn1cbiJdfQ==
|