@shipfox/api-integration-sentry 4.0.0 → 6.0.0
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/.turbo/turbo-build.log +7 -7
- package/CHANGELOG.md +49 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -5
- package/dist/config.js.map +1 -1
- package/dist/core/install.d.ts +6 -0
- package/dist/core/install.d.ts.map +1 -1
- package/dist/core/install.js +8 -5
- package/dist/core/install.js.map +1 -1
- package/dist/core/signature.d.ts +1 -1
- package/dist/core/signature.d.ts.map +1 -1
- package/dist/core/signature.js.map +1 -1
- package/dist/core/webhook-processor.d.ts +16 -0
- package/dist/core/webhook-processor.d.ts.map +1 -0
- package/dist/core/webhook-processor.js +198 -0
- package/dist/core/webhook-processor.js.map +1 -0
- package/dist/core/webhook.d.ts +4 -4
- package/dist/core/webhook.d.ts.map +1 -1
- package/dist/core/webhook.js +63 -49
- package/dist/core/webhook.js.map +1 -1
- package/dist/db/db.d.ts +8 -4
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/installations.d.ts +35 -13
- package/dist/db/installations.d.ts.map +1 -1
- package/dist/db/installations.js +89 -31
- package/dist/db/installations.js.map +1 -1
- package/dist/db/schema/installations.d.ts +5 -3
- package/dist/db/schema/installations.d.ts.map +1 -1
- package/dist/db/schema/installations.js +6 -6
- package/dist/db/schema/installations.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/presentation/routes/webhooks.d.ts +4 -1
- package/dist/presentation/routes/webhooks.d.ts.map +1 -1
- package/dist/presentation/routes/webhooks.js +69 -43
- package/dist/presentation/routes/webhooks.js.map +1 -1
- package/dist/temporal/activities/prune-unclaimed-installations.d.ts +1 -0
- package/dist/temporal/activities/prune-unclaimed-installations.d.ts.map +1 -1
- package/dist/temporal/activities/prune-unclaimed-installations.js.map +1 -1
- package/dist/temporal/workflows/index.bundle.js +7 -2
- package/dist/temporal/workflows/prune-unclaimed-installations-cron.d.ts.map +1 -1
- package/dist/temporal/workflows/prune-unclaimed-installations-cron.js +6 -1
- package/dist/temporal/workflows/prune-unclaimed-installations-cron.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +20 -28
- package/src/config.ts +4 -5
- package/src/core/install.ts +21 -7
- package/src/core/signature.ts +1 -1
- package/src/core/webhook-processor.test.ts +304 -0
- package/src/core/webhook-processor.ts +224 -0
- package/src/core/webhook.ts +74 -53
- package/src/db/installations.test.ts +163 -17
- package/src/db/installations.ts +136 -35
- package/src/db/schema/installations.ts +7 -7
- package/src/index.test.ts +4 -1
- package/src/index.ts +16 -0
- package/src/presentation/routes/webhooks.test.ts +6 -5
- package/src/presentation/routes/webhooks.ts +88 -29
- package/src/temporal/activities/prune-unclaimed-installations.test.ts +24 -2
- package/src/temporal/activities/prune-unclaimed-installations.ts +4 -1
- package/src/temporal/workflows/prune-unclaimed-installations-cron.ts +4 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/presentation/routes/installation-handler.d.ts +0 -9
- package/dist/presentation/routes/installation-handler.d.ts.map +0 -1
- package/dist/presentation/routes/installation-handler.js +0 -70
- package/dist/presentation/routes/installation-handler.js.map +0 -1
- package/dist/presentation/routes/issue-handler.d.ts +0 -9
- package/dist/presentation/routes/issue-handler.d.ts.map +0 -1
- package/dist/presentation/routes/issue-handler.js +0 -50
- package/dist/presentation/routes/issue-handler.js.map +0 -1
- package/dist/presentation/routes/webhook-delivery.d.ts +0 -28
- package/dist/presentation/routes/webhook-delivery.d.ts.map +0 -1
- package/dist/presentation/routes/webhook-delivery.js +0 -56
- package/dist/presentation/routes/webhook-delivery.js.map +0 -1
- package/dist/presentation/routes/webhook-request.d.ts +0 -10
- package/dist/presentation/routes/webhook-request.d.ts.map +0 -1
- package/dist/presentation/routes/webhook-request.js +0 -56
- package/dist/presentation/routes/webhook-request.js.map +0 -1
- package/src/presentation/routes/installation-handler.ts +0 -76
- package/src/presentation/routes/issue-handler.ts +0 -52
- package/src/presentation/routes/webhook-delivery.ts +0 -61
- package/src/presentation/routes/webhook-request.ts +0 -66
|
@@ -11240,7 +11240,12 @@ const { pruneUnclaimedSentryInstallationsActivity } = (0,_temporalio_workflow__W
|
|
|
11240
11240
|
startToCloseTimeout: '5 minutes'
|
|
11241
11241
|
});
|
|
11242
11242
|
async function pruneUnclaimedSentryInstallationsCron() {
|
|
11243
|
-
const { tombstoned } = await pruneUnclaimedSentryInstallationsActivity();
|
|
11243
|
+
const { releasedPending, tombstoned } = await pruneUnclaimedSentryInstallationsActivity();
|
|
11244
|
+
if (releasedPending > 0) {
|
|
11245
|
+
_temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__.log.info('Released stale pending Sentry installation claims', {
|
|
11246
|
+
releasedPending
|
|
11247
|
+
});
|
|
11248
|
+
}
|
|
11244
11249
|
if (tombstoned > 0) {
|
|
11245
11250
|
_temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__.log.info('Tombstoned stale unclaimed Sentry installations', {
|
|
11246
11251
|
tombstoned
|
|
@@ -11358,4 +11363,4 @@ exports.importInterceptors = function importInterceptors() {
|
|
|
11358
11363
|
__TEMPORAL__ = __webpack_exports__;
|
|
11359
11364
|
/******/ })()
|
|
11360
11365
|
;
|
|
11361
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuRCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUM5RixJQUFJLENB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OztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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U0FBUyxtQkFBTyw0QkFBNEIsOEVBQWdHO0FBQzVJOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2FjdGl2aXR5LWNhbmNlbGxhdGlvbi1kZXRhaWxzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2FjdGl2aXR5LW9wdGlvbnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udGludWUtYXMtbmV3LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvZmFpbHVyZS1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3BheWxvYWQtY29kZWMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3BheWxvYWQtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLXNlYXJjaC1hdHRyaWJ1dGVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci90eXBlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9kZXByZWNhdGVkLXRpbWUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZW5jb2RpbmcudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZXJyb3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ZhaWx1cmUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJjZXB0b3JzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyZmFjZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcm5hbC13b3JrZmxvdy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcm5hbC13b3JrZmxvdy9vYmplY3RzLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvbG9nZ2VyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL21ldHJpY3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvcHJpb3JpdHkudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvcmVzZXJ2ZWQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvcmV0cnktcG9saWN5LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3NlYXJjaC1hdHRyaWJ1dGVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3RpbWUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdHlwZS1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3VzZXItbWV0YWRhdGEudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdmVyc2lvbmluZy1pbnRlbnQtZW51bS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy92ZXJzaW9uaW5nLWludGVudC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZXItZGVwbG95bWVudHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctZGVmaW5pdGlvbi1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWhhbmRsZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZmxvdy1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9hbGVhLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9jYW5jZWxsYXRpb24tc2NvcGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2N1cnJlbnQtcmFuZG9tLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9lcnJvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ZsYWdzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9nbG9iYWwtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLW92ZXJyaWRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmNlcHRvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyZmFjZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVybmFscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbG9ncy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbWV0cmljcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbmV4dXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3BrZy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcmFuZG9tLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3JhbmRvbS1zdHJlYW0tc2VlZC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcmFuZG9tLXN0cmVhbXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3NpbmtzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9zdGFjay1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy90cmlnZ2VyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy91cGRhdGUtc2NvcGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3dvcmtlci1pbnRlcmZhY2UudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3dvcmtmbG93LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL2hhbmRsZXItZXJyb3IudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9jb21tb24vaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9jb21tb24vb3BlcmF0aW9uLWVycm9yLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvb3BlcmF0aW9uLWhhbmRsZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL3NlcnZpY2UtaGFuZGxlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvc3RhcnQtb3BlcmF0aW9uLXJlc3VsdC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaW50ZXJuYWwvb2JqZWN0LXV0aWxzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaW50ZXJuYWwvc3ltYm9sLWluc3RhbmNlb2YudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9zZXJ2aWNlL2hlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9zZXJ2aWNlL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9zZXJ2aWNlLWRlZmluaXRpb24udHMiLCJpZ25vcmVkfC9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9saWJ8X190ZW1wb3JhbF9jdXN0b21fZmFpbHVyZV9jb252ZXJ0ZXIiLCJpZ25vcmVkfC9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9saWJ8X190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXIiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL21zQDMuMC4wLWNhbmFyeS4xL25vZGVfbW9kdWxlcy9tcy9kaXN0L2luZGV4Lm1qcyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbG9uZ0A1LjMuMi9ub2RlX21vZHVsZXMvbG9uZy9pbmRleC5qcyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9saWJzL2FwaS9pbnRlZ3JhdGlvbi9zZW50cnkvc3JjL3RlbXBvcmFsL3dvcmtmbG93cy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9saWJzL2FwaS9pbnRlZ3JhdGlvbi9zZW50cnkvc3JjL3RlbXBvcmFsL3dvcmtmbG93cy9wcnVuZS11bmNsYWltZWQtaW5zdGFsbGF0aW9ucy1jcm9uLnRzIiwid2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9saWJzL2FwaS9pbnRlZ3JhdGlvbi9zZW50cnkvZGlzdC90ZW1wb3JhbC93b3JrZmxvd3MvaW5kZXgtYXV0b2dlbmVyYXRlZC1lbnRyeXBvaW50LmNqcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc0hvbGRlciB7XG4gIGRldGFpbHM/OiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzT3B0aW9ucyB7XG4gIG5vdEZvdW5kPzogYm9vbGVhbjtcbiAgY2FuY2VsUmVxdWVzdGVkPzogYm9vbGVhbjtcbiAgcGF1c2VkPzogYm9vbGVhbjtcbiAgdGltZWRPdXQ/OiBib29sZWFuO1xuICB3b3JrZXJTaHV0ZG93bj86IGJvb2xlYW47XG4gIHJlc2V0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgcmVhc29ucyBmb3IgdGhlIGFjdGl2aXR5J3MgY2FuY2VsbGF0aW9uLiBDYW5jZWxsYXRpb24gZGV0YWlscyBhcmUgc2V0IG9uY2UgYW5kIGRvIG5vdCBjaGFuZ2Ugb25jZSBzZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMge1xuICByZWFkb25seSBub3RGb3VuZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBib29sZWFuO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRpbWVkT3V0OiBib29sZWFuO1xuICByZWFkb25seSB3b3JrZXJTaHV0ZG93bjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVzZXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubm90Rm91bmQgPSBvcHRpb25zLm5vdEZvdW5kID8/IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gb3B0aW9ucy5jYW5jZWxSZXF1ZXN0ZWQgPz8gZmFsc2U7XG4gICAgdGhpcy5wYXVzZWQgPSBvcHRpb25zLnBhdXNlZCA/PyBmYWxzZTtcbiAgICB0aGlzLnRpbWVkT3V0ID0gb3B0aW9ucy50aW1lZE91dCA/PyBmYWxzZTtcbiAgICB0aGlzLndvcmtlclNodXRkb3duID0gb3B0aW9ucy53b3JrZXJTaHV0ZG93biA/PyBmYWxzZTtcbiAgICB0aGlzLnJlc2V0ID0gb3B0aW9ucy5yZXNldCA/PyBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUHJvdG8oXG4gICAgcHJvdG86IGNvcmVzZGsuYWN0aXZpdHlfdGFzay5JQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMge1xuICAgIGlmIChwcm90byA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbmV3IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscygpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyh7XG4gICAgICBub3RGb3VuZDogcHJvdG8uaXNOb3RGb3VuZCA/PyBmYWxzZSxcbiAgICAgIGNhbmNlbFJlcXVlc3RlZDogcHJvdG8uaXNDYW5jZWxsZWQgPz8gZmFsc2UsXG4gICAgICBwYXVzZWQ6IHByb3RvLmlzUGF1c2VkID8/IGZhbHNlLFxuICAgICAgdGltZWRPdXQ6IHByb3RvLmlzVGltZWRPdXQgPz8gZmFsc2UsXG4gICAgICB3b3JrZXJTaHV0ZG93bjogcHJvdG8uaXNXb3JrZXJTaHV0ZG93biA/PyBmYWxzZSxcbiAgICAgIHJlc2V0OiBwcm90by5pc1Jlc2V0ID8/IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IFByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSc7XG5cbi8vIE5vdGU6IFRoZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgaGVyZSBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoZXkgc2hvdWxkIGhhdmUgYmVlbiBkZWZpbmVkXG4vLyBpbiB0aGUgJ3dvcmtmbG93JyBwYWNrYWdlLCBpbnN0ZWFkIG9mICdjb21tb24nLiBUaGV5IGFyZSBub3cgcmVleHBvcnRlZCBmcm9tIHRoZSAnd29ya2Zsb3cnXG4vLyBwYWNrYWdlLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBpbXBvcnQgdGhlbSwgYnV0IHdlIHVuZm9ydHVuYXRlbHkgY2FuJ3QgcmVtb3ZlIHRoZW0gZnJvbVxuLy8gaGVyZSBhcyB0aGF0IHdvdWxkIGJlIGEgYnJlYWtpbmcgY2hhbmdlLlxuXG4vKipcbiAqIERldGVybWluZXM6XG4gKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAqXG4gKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gKi9cbi8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eU9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgYW5kXG4vLyAgICAgICAgICAgICAgYExvY2FsQWN0aXZpdHlPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkcyBsYXRlciBpbiB0aGlzIGZpbGUuXG5leHBvcnQgY29uc3QgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIEFjdGl2aXR5LCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvblxuICAgKiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYWN0dWFsbHkgYmUgZGVsaXZlcmVkIHRvIHRoZSBBY3Rpdml0eTsgZS5nLiB0aGUgY2FsbGluZyBXb3JrZmxvd1xuICAgKiBtYXkgZXhpdCBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGNvbXBsZXRlZCwgb3IgdGhlIEFjdGl2aXR5IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseVxuICAgKiBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZSBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlXG4gICAqIHdvcmtmbG93IHRoaW5rcyB0aGUgYWN0aXZpdHkgd2FzIGNhbmNlbGxlZCwgYnV0IHRoZSBhY3Rpdml0eSBhY3R1YWxseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBUbyBlbnN1cmUgdGhhdCB0aGUgV29ya2Zsb3cgaXMgcHJvcGVybHkgaW5mb3JtZWQgb2YgdGhlIEFjdGl2aXR5J3MgZmluYWwgc3RhdGUgKGkuZS4gZWl0aGVyXG4gICAqIGNvbXBsZXRpb24gb3IgY2FuY2VsbGF0aW9uKSwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5LCBhbmQgd2FpdCBmb3IgdGhlIGFjdGl2aXR5XG4gICAqIHRvIGNvbXBsZXRlIGl0cyBleGVjdXRpb24gKGVpdGhlciBzdWNjZXNzZnVsbHksIHVuY2Vzc2Z1bGx5LCBvciBhcyBjYW5jZWxsZWQpLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIEFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IHRvIHJlY2VpdmUgYSBjYW5jZWxsYXRpb24gbm90aWZpY2F0aW9uLiBUaGlzIGNhbiBibG9ja1xuICAgKiB0aGUgV29ya2Zsb3cncyBjYW5jZWxsYXRpb24gZm9yIGEgbG9uZyB0aW1lIGlmIHRoZSBBY3Rpdml0eSBkb2Vzbid0IGhlYXJ0YmVhdCBvciBjaG9vc2VzIHRvXG4gICAqIGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuXG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9ICh0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsIGRlY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDAsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAxLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDIsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG5vbi1sb2NhbCBhY3Rpdml0eSBpbnZvY2F0aW9uIGluc2lkZSBhIHdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgdG8gdXNlIGZvciB0cmFja2luZyB0aGUgYWN0aXZpdHkgaW4gV29ya2Zsb3cgaGlzdG9yeS5cbiAgICogVGhlIGBhY3Rpdml0eUlkYCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIGFjdGl2aXR5IGZ1bmN0aW9uLlxuICAgKiBEb2VzIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyXG4gICAqL1xuICBhY3Rpdml0eUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGN1cnJlbnQgd29ya2VyIHRhc2sgcXVldWVcbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSGVhcnRiZWF0IGludGVydmFsLiBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCBiZWZvcmUgdGhpcyBpbnRlcnZhbCBwYXNzZXMgYWZ0ZXIgYSBsYXN0IGhlYXJ0YmVhdCBvciBhY3Rpdml0eSBzdGFydC5cbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBoZWFydGJlYXRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lIGhvdyBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBzZXJ2ZXItZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuIFRvIGVuc3VyZSB6ZXJvIHJldHJpZXMsIHNldCBtYXhpbXVtIGF0dGVtcHRzIHRvIDEuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgb2YgYSBzaW5nbGUgQWN0aXZpdHkgZXhlY3V0aW9uIGF0dGVtcHQuIE5vdGUgdGhhdCB0aGUgVGVtcG9yYWwgU2VydmVyIGRvZXNuJ3QgZGV0ZWN0IFdvcmtlciBwcm9jZXNzXG4gICAqIGZhaWx1cmVzIGRpcmVjdGx5OiBpbnN0ZWFkLCBpdCByZWxpZXMgb24gdGhpcyB0aW1lb3V0IHRvIGRldGVjdCB0aGF0IGFuIEFjdGl2aXR5IGRpZG4ndCBjb21wbGV0ZSBvbiB0aW1lLiBUaGVyZWZvcmUsIHRoaXNcbiAgICogdGltZW91dCBzaG91bGQgYmUgYXMgc2hvcnQgYXMgdGhlIGxvbmdlc3QgcG9zc2libGUgZXhlY3V0aW9uIG9mIHRoZSBBY3Rpdml0eSBib2R5LiBQb3RlbnRpYWxseSBsb25nLXJ1bm5pbmdcbiAgICogQWN0aXZpdGllcyBtdXN0IHNwZWNpZnkge0BsaW5rIGhlYXJ0YmVhdFRpbWVvdXR9IGFuZCBjYWxsIHtAbGluayBhY3Rpdml0eS5Db250ZXh0LmhlYXJ0YmVhdH0gcGVyaW9kaWNhbGx5IGZvclxuICAgKiB0aW1lbHkgZmFpbHVyZSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRpbWUgdGhhdCB0aGUgQWN0aXZpdHkgVGFzayBjYW4gc3RheSBpbiB0aGUgVGFzayBRdWV1ZSBiZWZvcmUgaXQgaXMgcGlja2VkIHVwIGJ5IGEgV29ya2VyLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHRpbWVvdXQgdW5sZXNzIHVzaW5nIGhvc3Qtc3BlY2lmaWMgVGFzayBRdWV1ZXMgZm9yIEFjdGl2aXR5IFRhc2tzIGFyZSBiZWluZyB1c2VkIGZvciByb3V0aW5nLlxuICAgKiBgc2NoZWR1bGVUb1N0YXJ0VGltZW91dGAgaXMgYWx3YXlzIG5vbi1yZXRyeWFibGUuIFJldHJ5aW5nIGFmdGVyIHRoaXMgdGltZW91dCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgaXQgd291bGQganVzdCBwdXQgdGhlIEFjdGl2aXR5IFRhc2sgYmFjayBpbnRvIHRoZSBzYW1lIFRhc2sgUXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRvdGFsIHRpbWUgdGhhdCBhIHdvcmtmbG93IGlzIHdpbGxpbmcgdG8gd2FpdCBmb3IgdGhlIEFjdGl2aXR5IHRvIGNvbXBsZXRlLlxuICAgKiBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgbGltaXRzIHRoZSB0b3RhbCB0aW1lIG9mIGFuIEFjdGl2aXR5J3MgZXhlY3V0aW9uIGluY2x1ZGluZyByZXRyaWVzICh1c2Uge0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IHRvIGxpbWl0IHRoZSB0aW1lIG9mIGEgc2luZ2xlIGF0dGVtcHQpLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHk7IGFuZFxuICAgKiAtIHdoZW4gc2hvdWxkIHRoZSBBY3Rpdml0eSBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgdG8gV29ya2Zsb3cgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGVcbiAgICogICBBY3Rpdml0eSBjYWxsJ3MgcHJvbWlzZSBmYWlsIHdpdGggYW4gYEFjdGl2aXR5RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBjYW5jZWxsYXRpb24gYmVpbmdcbiAgICogZXh0ZXJuYWxseSByZXF1ZXN0ZWQgb24gdGhlIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlXG4gICAqIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlIEFjdGl2aXR5IGNhbGwgd2FzIG1hZGUuIFRlcm1pbmF0aW9uIG9mIGEgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqIGFsd2F5cyByZXN1bHRzIGluIGNhbmNlbGxhdGlvbiBvZiBpdHMgb3V0c3RhbmRpbmcgQWN0aXZpdHkgZXhlY3V0aW9ucywgcmVnYXJkbGVzcyBvZiB0aG9zZVxuICAgKiBBY3Rpdml0aWVzJyB7QGxpbmsgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBFYWdlciBkaXNwYXRjaCBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBpbXByb3ZlcyB0aGUgdGhyb3VnaHB1dCBhbmQgbG9hZCBvbiB0aGUgc2VydmVyIGZvciBzY2hlZHVsaW5nIEFjdGl2aXRpZXMuXG4gICAqIFdoZW4gdXNlZCwgdGhlIHNlcnZlciB3aWxsIGhhbmQgb3V0IEFjdGl2aXR5IHRhc2tzIGJhY2sgdG8gdGhlIFdvcmtlciB3aGVuIGl0IGNvbXBsZXRlcyBhIFdvcmtmbG93IHRhc2suXG4gICAqIEl0IGlzIGF2YWlsYWJsZSBmcm9tIHNlcnZlciB2ZXJzaW9uIDEuMTcgYmVoaW5kIHRoZSBgc3lzdGVtLmVuYWJsZUFjdGl2aXR5RWFnZXJFeGVjdXRpb25gIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogRWFnZXIgZGlzcGF0Y2ggd2lsbCBvbmx5IGJlIHVzZWQgaWYgYGFsbG93RWFnZXJEaXNwYXRjaGAgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIGFuZCB7QGxpbmsgdGFza1F1ZXVlfSBpcyBlaXRoZXJcbiAgICogb21pdHRlZCBvciB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dFYWdlckRpc3BhdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBBY3Rpdml0eSBzaG91bGQgcnVuIG9uIGFcbiAgICogd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgYWN0aXZpdHlcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lcyBob3cgYW4gYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgU0RLLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLlxuICAgKiBOb3RlIHRoYXQgbG9jYWwgYWN0aXZpdGllcyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgbWF4aW11bSBhdHRlbXB0cyBpcyBzZXQgdG8gMSBkdWUgdG8gV29ya2Zsb3cgdGFzayByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHRhc2sgaXMgZGlzcGF0Y2hlZC4gVGhpc1xuICAgKiB0aW1lb3V0IGlzIGFsd2F5cyByZXRyeWFibGUuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqIElmIHNldCwgdGhpcyBtdXN0IGJlIDw9IHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbWl0cyB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBjYW4gaWRsZSBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBleGVjdXRlZC4gVGhhdCBjYW4gaGFwcGVuIGlmXG4gICAqIHRoZSB3b3JrZXIgaXMgY3VycmVudGx5IGF0IG1heCBjb25jdXJyZW50IGxvY2FsIGFjdGl2aXR5IGV4ZWN1dGlvbnMuIFRoaXMgdGltZW91dCBpcyBhbHdheXNcbiAgICogbm9uIHJldHJ5YWJsZSBhcyBhbGwgYSByZXRyeSB3b3VsZCBhY2hpZXZlIGlzIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHNhbWUgcXVldWUuIERlZmF1bHRzXG4gICAqIHRvIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpZiBub3Qgc3BlY2lmaWVkIGFuZCB0aGF0IGlzIHNldC4gTXVzdCBiZSA8PVxuICAgKiB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gd2hlbiBzZXQsIG90aGVyd2lzZSwgaXQgd2lsbCBiZSBjbGFtcGVkIGRvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0IGZvciBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uLiBMaW1pdHMgaG93XG4gICAqIGxvbmcgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZC5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWN0aXZpdHkgaXMgcmV0cnlpbmcgYW5kIGJhY2tvZmYgd291bGQgZXhjZWVkIHRoaXMgdmFsdWUsIGEgc2VydmVyIHNpZGUgdGltZXIgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gICAqIE90aGVyd2lzZSwgYmFja29mZiB3aWxsIGhhcHBlbiBpbnRlcm5hbGx5IGluIHRoZSBTREsuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiovXG4gIGxvY2FsUmV0cnlUaHJlc2hvbGQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gICAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICAgKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICAgKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAgICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gICAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgTWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gPSB7XG4gIEhJU1RPUllfU0laRV9UT09fTEFSR0U6ICdISVNUT1JZX1NJWkVfVE9PX0xBUkdFJyxcbiAgVE9PX01BTllfSElTVE9SWV9FVkVOVFM6ICdUT09fTUFOWV9ISVNUT1JZX0VWRU5UUycsXG4gIFRPT19NQU5ZX1VQREFURVM6ICdUT09fTUFOWV9VUERBVEVTJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9ICh0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24pW2tleW9mIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLCBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gICdTVUdHRVNUX0NPTlRJTlVFX0FTX05FV19SRUFTT05fJ1xuPihcbiAge1xuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5ISVNUT1JZX1NJWkVfVE9PX0xBUkdFXTogMSxcbiAgICBbU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24uVE9PX01BTllfSElTVE9SWV9FVkVOVFNdOiAyLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9VUERBVEVTXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4pO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uc0Zyb21Qcm90byhcbiAgcmVhc29uczogdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlYXNvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZXM6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlYXNvbnMpIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24ocik7XG4gICAgaWYgKGRlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnB1c2goZGVjb2RlZCk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciB9IGZyb20gJy4vZmFpbHVyZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29kZWMgfSBmcm9tICcuL3BheWxvYWQtY29kZWMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQcm90b0ZhaWx1cmUgfSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7XG4gIEFjdGl2aXR5RmFpbHVyZSxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksXG4gIGRlY29kZVJldHJ5U3RhdGUsXG4gIGRlY29kZVRpbWVvdXRUeXBlLFxuICBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZW5jb2RlUmV0cnlTdGF0ZSxcbiAgZW5jb2RlVGltZW91dFR5cGUsXG4gIEZBSUxVUkVfU09VUkNFLFxuICBOZXh1c09wZXJhdGlvbkZhaWx1cmUsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJy4uL3RpbWUnO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBhcnJheUZyb21QYXlsb2FkcywgZnJvbVBheWxvYWRzQXRJbmRleCwgdG9QYXlsb2Fkc1dpdGhDb250ZXh0IH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuXG4vLyBDYW4ndCBpbXBvcnQgcHJvdG8gZW51bXMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgdXNlIHRoaXMgaGVscGVyIHR5cGUgYW5kIGVudW0gY29udmVydGVyIGluc3RlYWQuXG5jb25zdCBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgPSB7XG4gIFJFVFJZQUJMRTogJ1JFVFJZQUJMRScsXG4gIE5PTl9SRVRSWUFCTEU6ICdOT05fUkVUUllBQkxFJyxcbn0gYXMgY29uc3Q7XG50eXBlIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9XG4gICh0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKVtrZXlvZiB0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXTtcblxuY29uc3QgW2VuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciwgZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gICdORVhVU19IQU5ETEVSX0VSUk9SX1JFVFJZX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLlJFVFJZQUJMRV06IDEsXG4gICAgW05leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvci5OT05fUkVUUllBQkxFXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuKTtcblxuZnVuY3Rpb24gY29tYmluZVJlZ0V4cCguLi5yZWdleHBzOiBSZWdFeHBbXSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cHMubWFwKCh4KSA9PiBgKD86JHt4LnNvdXJjZX0pYCkuam9pbignfCcpKTtcbn1cblxuLyoqXG4gKiBTdGFjayB0cmFjZXMgd2lsbCBiZSBjdXRvZmYgd2hlbiBvbiBvZiB0aGVzZSBwYXR0ZXJucyBpcyBtYXRjaGVkXG4gKi9cbmNvbnN0IENVVE9GRl9TVEFDS19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBBY3Rpdml0eSBleGVjdXRpb24gKi9cbiAgL1xccythdCAoQWN0aXZpdHlcXC4pP2V4ZWN1dGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIE5leHVzIGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0KCBhc3luYyk/IChOZXh1c0hhbmRsZXJcXC4pP2ludm9rZVVzZXJDb2RlIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11uZXh1c1tcXFxcL11pbmRleFxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBhY3RpdmF0aW9uIChpbmJvdW5kIGhhbmRsZXJzIG9ubHkpICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKEFjdGl2YXRvclxcLik/KHN0YXJ0V29ya2Zsb3d8cXVlcnlXb3JrZmxvd3xzaWduYWxXb3JrZmxvd3x1cGRhdGV8dmFsaWRhdGVVcGRhdGUpTmV4dEhhbmRsZXIgXFwoLipcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogV29ya2Zsb3cgcnVuIGFueXRoaW5nIGluIGNvbnRleHQgKi9cbiAgL1xccythdCAoU2NyaXB0XFwuKT9ydW5JbkNvbnRleHQgXFwobmF0aXZlfHVua25vd258KD86KD86bm9kZTp2bXx2bVxcLmpzKTpcXGQrOlxcZCspXFwpL1xuKTtcblxuLyoqXG4gKiBBbnkgc3RhY2sgdHJhY2UgZnJhbWVzIHRoYXQgbWF0Y2ggYW55IG9mIHRob3NlIHdpbCBiZSBkb3BwZWQuXG4gKiBUaGUgXCJudWxsLlwiIHByZWZpeCBvbiBzb21lIGNhc2VzIGlzIHRvIGF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDI0MTdcbiAqL1xuY29uc3QgRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP25leHQgXFwoLipbXFxcXC9dY29tbW9uW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVyY2VwdG9yc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/ZXhlY3V0ZU5leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQ3V0cyBvdXQgdGhlIGZyYW1ld29yayBwYXJ0IG9mIGEgc3RhY2sgdHJhY2UsIGxlYXZpbmcgb25seSB1c2VyIGNvZGUgZW50cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3V0b2ZmU3RhY2tUcmFjZShzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gKHN0YWNrID8/ICcnKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBhY2MgPSBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChDVVRPRkZfU1RBQ0tfUEFUVEVSTlMudGVzdChsaW5lKSkgYnJlYWs7XG4gICAgaWYgKCFEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUy50ZXN0KGxpbmUpKSBhY2MucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gYWNjLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEEgYEZhaWx1cmVDb252ZXJ0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGZyb20gcHJvdG8gYEZhaWx1cmVgIGluc3RhbmNlcyB0byBKUyBgRXJyb3JzYCBhbmQgYmFjay5cbiAqXG4gKiBXZSByZWNvbW1lbmRlZCB1c2luZyB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpbnN0ZWFkIG9mIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGluIG9yZGVyXG4gKiB0byBtYWludGFpbiBjcm9zcy1sYW5ndWFnZSBGYWlsdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2F1Z2h0IGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlLlxuICAgKi9cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm90b0ZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgZXJyb3IgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBgVGVtcG9yYWxGYWlsdXJlYC5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9yKGVycjogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgXCJzaGFwZVwiIG9mIHRoZSBhdHRyaWJ1dGVzIHNldCBhcyB0aGUge0BsaW5rIFByb3RvRmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlc30gcGF5bG9hZCBpbiBjYXNlXG4gKiB7QGxpbmsgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcy5lbmNvZGVDb21tb25BdHRyaWJ1dGVzfSBpcyBzZXQgdG8gYHRydWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXMge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrX3RyYWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5jb2RlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgKGZvciBlbmNyeXB0aW5nIHRoZXNlIGF0dHJpYnV0ZXMgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30pLlxuICAgKi9cbiAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0LCBjcm9zcy1sYW5ndWFnZS1jb21wYXRpYmxlIEZhaWx1cmUgY29udmVydGVyLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGl0IHdpbGwgbGVhdmUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyBhcyBwbGFpbiB0ZXh0LiBJbiBvcmRlciB0byBlbmNyeXB0IHRoZW0sIHNldFxuICogYGVuY29kZUNvbW1vbkF0dHJpYnV0ZXNgIHRvIGB0cnVlYCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBhbmQgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30gdGhhdCBjYW4gZW5jcnlwdCAvXG4gKiBkZWNyeXB0IFBheWxvYWRzIGluIHlvdXIge0BsaW5rIFdvcmtlck9wdGlvbnMuZGF0YUNvbnZlcnRlciB8IFdvcmtlcn0gYW5kXG4gKiB7QGxpbmsgQ2xpZW50T3B0aW9ucy5kYXRhQ29udmVydGVyIHwgQ2xpZW50IG9wdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGYWlsdXJlQ29udmVydGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgeyBlbmNvZGVDb21tb25BdHRyaWJ1dGVzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuY29kZUNvbW1vbkF0dHJpYnV0ZXM6IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgPz8gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogRG9lcyBub3Qgc2V0IGNvbW1vbiBwcm9wZXJ0aWVzLCB0aGF0IGlzIGRvbmUgaW4ge0BsaW5rIGZhaWx1cmVUb0Vycm9yfS5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9ySW5uZXIoXG4gICAgZmFpbHVyZTogUHJvdG9GYWlsdXJlLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IEVycm9yIHtcbiAgICBpZiAoZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLnR5cGUsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5jYXRlZ29yeSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnNlcnZlckZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFNlcnZlckZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRpbWVvdXRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmcm9tUGF5bG9hZHNBdEluZGV4KHBheWxvYWRDb252ZXJ0ZXIsIDAsIGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIGRlY29kZVRpbWVvdXRUeXBlKGZhaWx1cmUudGltZW91dEZhaWx1cmVJbmZvLnRpbWVvdXRUeXBlKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUudGVybWluYXRlZEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IFRlcm1pbmF0ZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuY2FuY2VsZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWRGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMsIGNvbnRleHQpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgJ1Jlc2V0V29ya2Zsb3cnLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5yZXNldFdvcmtmbG93RmFpbHVyZUluZm8ubGFzdEhlYXJ0YmVhdERldGFpbHM/LnBheWxvYWRzLCBjb250ZXh0KSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgY29uc3QgeyBuYW1lc3BhY2UsIHdvcmtmbG93VHlwZSwgd29ya2Zsb3dFeGVjdXRpb24sIHJldHJ5U3RhdGUgfSA9IGZhaWx1cmUuY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvO1xuICAgICAgaWYgKCEod29ya2Zsb3dUeXBlPy5uYW1lICYmIHdvcmtmbG93RXhlY3V0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgb24gY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENoaWxkV29ya2Zsb3dGYWlsdXJlKFxuICAgICAgICBuYW1lc3BhY2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgd29ya2Zsb3dUeXBlLm5hbWUsXG4gICAgICAgIGRlY29kZVJldHJ5U3RhdGUocmV0cnlTdGF0ZSksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvKSB7XG4gICAgICBpZiAoIWZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGU/Lm5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3Rpdml0eVR5cGU/Lm5hbWUgb24gYWN0aXZpdHlGYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0eUZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eVR5cGUubmFtZSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5yZXRyeVN0YXRlKSxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmlkZW50aXR5ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvKSB7XG4gICAgICBsZXQgcmV0cnlhYmxlT3ZlcnJpZGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXRyeUJlaGF2aW9yID0gZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8ucmV0cnlCZWhhdmlvcik7XG4gICAgICBzd2l0Y2ggKHJldHJ5QmVoYXZpb3IpIHtcbiAgICAgICAgY2FzZSAnUkVUUllBQkxFJzpcbiAgICAgICAgICByZXRyeWFibGVPdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ05PTl9SRVRSWUFCTEUnOlxuICAgICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd0Vycm9yVHlwZSA9IGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8udHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHJlc29sdmVkVHlwZTogbmV4dXMuSGFuZGxlckVycm9yVHlwZSA9IE9iamVjdC5oYXNPd24obmV4dXMuSGFuZGxlckVycm9yVHlwZSwgcmF3RXJyb3JUeXBlKVxuICAgICAgICA/IG5leHVzLkhhbmRsZXJFcnJvclR5cGVbcmF3RXJyb3JUeXBlIGFzIGtleW9mIHR5cGVvZiBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlXVxuICAgICAgICA6ICdVTktOT1dOJztcblxuICAgICAgcmV0dXJuIG5ldyBuZXh1cy5IYW5kbGVyRXJyb3IocmVzb2x2ZWRUeXBlLCBmYWlsdXJlLm1lc3NhZ2UgPz8gJ05leHVzIGhhbmRsZXIgZXJyb3InLCB7XG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUsXG4gICAgICAgIHJhd0Vycm9yVHlwZSxcbiAgICAgICAgb3JpZ2luYWxGYWlsdXJlOiB0aGlzLnRlbXBvcmFsRmFpbHVyZVRvTmV4dXNGYWlsdXJlKGZhaWx1cmUpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgTmV4dXNPcGVyYXRpb25GYWlsdXJlKFxuICAgICAgICAvLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgc2V0IGEgZGVmYXVsdCBtZXNzYWdlIGhlcmUsIG9uY2Ugd2UndmUgZGVjaWRlZCBvbiBlcnJvciBoYW5kbGluZy5cbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLnNjaGVkdWxlZEV2ZW50SWQ/LnRvTnVtYmVyKCksXG4gICAgICAgIC8vIFdlIGFzc3VtZSB0aGVzZSB3aWxsIGFsd2F5cyBiZSBzZXQgb3IgZ3JhY2VmdWxseSBzZXQgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLmVuZHBvaW50ID8/ICcnLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8uc2VydmljZSA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvbiA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLm9wZXJhdGlvblRva2VuID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVtcG9yYWxGYWlsdXJlKFxuICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogRXJyb3Ige1xuICAgIGlmIChmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhdHRycyA9IHBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQ8RGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcz4oZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcywgY29udGV4dCk7XG4gICAgICAvLyBEb24ndCBhcHBseSBlbmNvZGVkQXR0cmlidXRlcyB1bmxlc3MgdGhleSBjb25mb3JtIHRvIGFuIGV4cGVjdGVkIHNjaGVtYVxuICAgICAgaWYgKHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgYXR0cnMgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja190cmFjZSB9ID0gYXR0cnM7XG4gICAgICAgIC8vIEF2b2lkIG11dGF0aW5nIHRoZSBhcmd1bWVudFxuICAgICAgICBmYWlsdXJlID0geyAuLi5mYWlsdXJlIH07XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhY2tfdHJhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmFpbHVyZS5zdGFja1RyYWNlID0gc3RhY2tfdHJhY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcklubmVyKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICAgIGVyci5zdGFjayA9IGZhaWx1cmUuc3RhY2tUcmFjZSA/PyAnJztcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICBlcnIuZmFpbHVyZSA9IGZhaWx1cmU7XG4gICAgfVxuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFByb3RvRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IHRoaXMuZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnIsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jb2RlQ29tbW9uQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja1RyYWNlIH0gPSBmYWlsdXJlO1xuICAgICAgZmFpbHVyZS5tZXNzYWdlID0gJ0VuY29kZWQgZmFpbHVyZSc7XG4gICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSAnJztcbiAgICAgIGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlOiBzdGFja1RyYWNlIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlSW5uZXIoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm90b0ZhaWx1cmUge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlICYmIGVyci5mYWlsdXJlKSByZXR1cm4gZXJyLmZhaWx1cmU7XG4gICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoZXJyLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2aXR5RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgYWN0aXZpdHlUeXBlOiB7IG5hbWU6IGVyci5hY3Rpdml0eVR5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IGVyci5leGVjdXRpb24sXG4gICAgICAgICAgICB3b3JrZmxvd1R5cGU6IHsgbmFtZTogZXJyLndvcmtmbG93VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhcHBsaWNhdGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgIG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSxcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIGVyci5kZXRhaWxzKSB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuZXh0UmV0cnlEZWxheTogbXNPcHRpb25hbFRvVHMoZXJyLm5leHRSZXRyeURlbGF5KSxcbiAgICAgICAgICAgIGNhdGVnb3J5OiBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeShlcnIuY2F0ZWdvcnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgY2FuY2VsZWRGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgZGV0YWlsczpcbiAgICAgICAgICAgICAgZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB7IHBheWxvYWRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQocGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0aW1lb3V0RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHRpbWVvdXRUeXBlOiBlbmNvZGVUaW1lb3V0VHlwZShlcnIudGltZW91dFR5cGUpLFxuICAgICAgICAgICAgbGFzdEhlYXJ0YmVhdERldGFpbHM6IGVyci5sYXN0SGVhcnRiZWF0RGV0YWlsc1xuICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBbZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzXSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFNlcnZlckZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHNlcnZlckZhaWx1cmVJbmZvOiB7IG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlcm1pbmF0ZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0ZXJtaW5hdGVkRmFpbHVyZUluZm86IHt9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIG5leHVzLkhhbmRsZXJFcnJvcikge1xuICAgICAgICBpZiAoZXJyLm9yaWdpbmFsRmFpbHVyZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGVyci5vcmlnaW5hbEZhaWx1cmUsIGVyci5yZXRyeWFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXRyeUJlaGF2aW9yOiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHN3aXRjaCAoZXJyLnJldHJ5YWJsZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IgPSBlbmNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoJ1JFVFJZQUJMRScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgICAgICAgIHJldHJ5QmVoYXZpb3IgPSBlbmNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoJ05PTl9SRVRSWUFCTEUnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgICBuZXh1c0hhbmRsZXJGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5leHVzT3BlcmF0aW9uRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgbmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgc2NoZWR1bGVkRXZlbnRJZDogZXJyLnNjaGVkdWxlZEV2ZW50SWQgPyBMb25nLmZyb21OdW1iZXIoZXJyLnNjaGVkdWxlZEV2ZW50SWQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZW5kcG9pbnQ6IGVyci5lbmRwb2ludCxcbiAgICAgICAgICAgIHNlcnZpY2U6IGVyci5zZXJ2aWNlLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiBlcnIub3BlcmF0aW9uLFxuICAgICAgICAgICAgb3BlcmF0aW9uVG9rZW46IGVyci5vcGVyYXRpb25Ub2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gSnVzdCBhIFRlbXBvcmFsRmFpbHVyZVxuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IHtcbiAgICAgIHNvdXJjZTogRkFJTFVSRV9TT1VSQ0UsXG4gICAgfTtcblxuICAgIGlmIChpc0Vycm9yKGVycikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIG1lc3NhZ2U6IFN0cmluZyhlcnIubWVzc2FnZSA/PyAnJyksXG4gICAgICAgIHN0YWNrVHJhY2U6IGN1dG9mZlN0YWNrVHJhY2UoZXJyLnN0YWNrKSxcbiAgICAgICAgY2F1c2U6IHRoaXMub3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKChlcnIgYXMgYW55KS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gYCBbQSBub24tRXJyb3IgdmFsdWUgd2FzIHRocm93biBmcm9tIHlvdXIgY29kZS4gV2UgcmVjb21tZW5kIHRocm93aW5nIEVycm9yIG9iamVjdHMgc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSBhIHN0YWNrIHRyYWNlXWA7XG5cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IGVyciArIHJlY29tbWVuZGF0aW9uIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgIHRyeSB7XG4gICAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShlcnIpO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICBtZXNzYWdlID0gU3RyaW5nKGVycik7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBtZXNzYWdlICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBTdHJpbmcoZXJyKSArIHJlY29tbWVuZGF0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICovXG4gIG9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihcbiAgICBmYWlsdXJlOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IEVycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZmFpbHVyZSA/IHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gZXJyb3IgdG8gYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgaWYgZGVmaW5lZCBvciByZXR1cm5zIHVuZGVmaW5lZFxuICAgKi9cbiAgb3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKFxuICAgIGVycjogdW5rbm93bixcbiAgICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICAgIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuICApOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBlcnIgPyB0aGlzLmVycm9yVG9GYWlsdXJlKGVyciwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIG5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGZhaWx1cmU6IG5leHVzLkZhaWx1cmUsIHJldHJ5YWJsZTogYm9vbGVhbik6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGZhaWx1cmUubWV0YWRhdGE/LnR5cGUgPT09ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJykge1xuICAgICAgaWYgKGZhaWx1cmUuZGV0YWlscyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtaXNzaW5nIGRldGFpbHMgZm9yIE5leHVzIEZhaWx1cmUgb2YgdHlwZSAndGVtcG9yYWwuYXBpLmZhaWx1cmUudjEuRmFpbHVyZSdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVyZS5kZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhbEZhaWx1cmU6IFByb3RvRmFpbHVyZSA9IHt9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8gPSB7XG4gICAgICAgIHR5cGU6ICdOZXh1c0ZhaWx1cmUnLFxuICAgICAgICBub25SZXRyeWFibGU6ICFyZXRyeWFibGUsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBwYXlsb2FkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBlbmNvZGluZzogZW5jb2RlKCdqc29uL3BsYWluJykgfSxcbiAgICAgICAgICAgICAgZGF0YTogZW5jb2RlKEpTT04uc3RyaW5naWZ5KHsgLi4uZmFpbHVyZSwgbWVzc2FnZTogJycgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHRlbXBvcmFsRmFpbHVyZS5tZXNzYWdlID0gZmFpbHVyZS5tZXNzYWdlO1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLnN0YWNrVHJhY2UgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgICByZXR1cm4gdGVtcG9yYWxGYWlsdXJlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGVtcG9yYWxGYWlsdXJlVG9OZXh1c0ZhaWx1cmUoZmFpbHVyZTogUHJvdG9GYWlsdXJlKTogbmV4dXMuRmFpbHVyZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGZhaWx1cmUubWVzc2FnZSA/PyAnJyxcbiAgICAgIG1ldGFkYXRhOiB7IHR5cGU6ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJyB9LFxuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgUHJvdG9GYWlsdXJlIGFzIHRoZSBOZXh1cyBmYWlsdXJlIGRldGFpbHMgc28gaXQgY2FuIGJlIHJvdW5kLXRyaXBwZWRcbiAgICAgIC8vIGxvc3NsZXNzbHkgYmFjayB0byBhIFByb3RvRmFpbHVyZSB2aWEgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUuXG4gICAgICBkZXRhaWxzOiB7IC4uLmZhaWx1cmUgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5cbi8qKlxuICogYFBheWxvYWRDb2RlY2AgaXMgYW4gb3B0aW9uYWwgc3RlcCB0aGF0IGhhcHBlbnMgYmV0d2VlbiB0aGUgd2lyZSBhbmQgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyfTpcbiAqXG4gKiBUZW1wb3JhbCBTZXJ2ZXIgPC0tPiBXaXJlIDwtLT4gYFBheWxvYWRDb2RlY2AgPC0tPiBgUGF5bG9hZENvbnZlcnRlcmAgPC0tPiBVc2VyIGNvZGVcbiAqXG4gKiBJbXBsZW1lbnQgdGhpcyB0byB0cmFuc2Zvcm0gYW4gYXJyYXkgb2Yge0BsaW5rIFBheWxvYWR9cyB0by9mcm9tIHRoZSBmb3JtYXQgc2VudCBvdmVyIHRoZSB3aXJlIGFuZCBzdG9yZWQgYnkgVGVtcG9yYWwgU2VydmVyLlxuICogQ29tbW9uIHRyYW5zZm9ybWF0aW9ucyBhcmUgZW5jcnlwdGlvbiBhbmQgY29tcHJlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvZGVjIHtcbiAgLyoqXG4gICAqIEVuY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIGZvciBzZW5kaW5nIG92ZXIgdGhlIHdpcmUuXG4gICAqIEBwYXJhbSBwYXlsb2FkcyBNYXkgaGF2ZSBsZW5ndGggMC5cbiAgICovXG4gIGVuY29kZShwYXlsb2FkczogUGF5bG9hZFtdLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUHJvbWlzZTxQYXlsb2FkW10+O1xufVxuIiwiaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgeyBQYXlsb2FkQ29udmVydGVyRXJyb3IsIFZhbHVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgZW5jb2RpbmdLZXlzLCBlbmNvZGluZ1R5cGVzLCBNRVRBREFUQV9FTkNPRElOR19LRVkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgbGlrZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLlxuICpcbiAqIFRoaXMgaXMgY2FsbGVkIGluc2lkZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RldGVybWluaXNtIHwgV29ya2Zsb3cgaXNvbGF0ZX0uXG4gKiBUbyB3cml0ZSBhc3luYyBjb2RlIG9yIHVzZSBOb2RlIEFQSXMgKG9yIHVzZSBwYWNrYWdlcyB0aGF0IHVzZSBOb2RlIEFQSXMpLCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBTaG91bGQgdGhyb3cge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSB2YWx1ZXMgSlMgdmFsdWVzIHRvIGNvbnZlcnQgdG8gUGF5bG9hZHNcbiAqIEByZXR1cm4gbGlzdCBvZiB7QGxpbmsgUGF5bG9hZH1zXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIGZhaWxlZCBmb3IgYW55XG4gKiAgICAgcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXlsb2Fkcyhjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIC4uLnZhbHVlczogdW5rbm93bltdKTogUGF5bG9hZFtdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvUGF5bG9hZHNXaXRoQ29udGV4dChjb252ZXJ0ZXIsIHVuZGVmaW5lZCwgdmFsdWVzKTtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGNvbnZlcnNpb24gb2YgYSBsaXN0IG9mIHZhbHVlcyB3aXRoIGFuIG9wdGlvbmFsIHNlcmlhbGl6YXRpb24gY29udGV4dC5cbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BheWxvYWRzV2l0aENvbnRleHQoXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgY29udGV4dDogU2VyaWFsaXphdGlvbkNvbnRleHQgfCB1bmRlZmluZWQsXG4gIHZhbHVlczogdW5rbm93bltdXG4pOiBQYXlsb2FkW10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBhbiBvcHRpb25hbCB2YWx1ZSwgYW5kIHRoZW4gZW5jb2RlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICB2YWx1ZTogdW5rbm93bixcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBQYXlsb2FkIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdmFsdWU7XG5cbiAgcmV0dXJuIHBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBlYWNoIHZhbHVlIGluIHRoZSBtYXAuXG4gKlxuICogQHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgY29udmVyc2lvbiBvZiBhbnkgdmFsdWUgaW4gdGhlIG1hcCBmYWlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nLCBUID0gYW55PihcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBtYXA6IFJlY29yZDxLLCBUPixcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBSZWNvcmQ8SywgUGF5bG9hZD4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcCkubWFwKChbaywgdl0pOiBbSywgUGF5bG9hZF0gPT4gW2sgYXMgSywgY29udmVydGVyLnRvUGF5bG9hZCh2LCBjb250ZXh0KV0pXG4gICkgYXMgUmVjb3JkPEssIFBheWxvYWQ+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzLiBVc2VmdWwgZm9yIGRlc2VyaWFsaXppbmdcbiAqIGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBpbnZvY2F0aW9ucy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyXG4gKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIHZhbHVlIGluIHRoZSBwYXlsb2Fkc1xuICogQHBhcmFtIHBheWxvYWRzIHNlcmlhbGl6ZWQgdmFsdWUgdG8gY29udmVydCB0byBKUyB2YWx1ZXMuXG4gKiBAcmV0dXJuIGNvbnZlcnRlZCBKUyB2YWx1ZVxuICogQHRocm93cyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlckVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSBkYXRhIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUGF5bG9hZHNBdEluZGV4PFQ+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIHBheWxvYWRzPzogUGF5bG9hZFtdIHwgbnVsbCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBUIHtcbiAgLy8gVG8gbWFrZSBhZGRpbmcgYXJndW1lbnRzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlXG4gIGlmIChwYXlsb2FkcyA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWRzID09PSBudWxsIHx8IGluZGV4ID49IHBheWxvYWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBwYXlsb2Fkcz8uW2luZGV4XTtcbiAgaWYgKCFwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGcm9tUGF5bG9hZHMoXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgcGF5bG9hZHM/OiBQYXlsb2FkW10gfCBudWxsLFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IHVua25vd25bXSB7XG4gIGlmICghcGF5bG9hZHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIHBheWxvYWRzLm1hcCgocGF5bG9hZDogUGF5bG9hZCkgPT4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQsIGNvbnRleHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEZyb21QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nLCBUID0gdW5rbm93bj4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgbWFwPzogUmVjb3JkPEssIFBheWxvYWQ+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiBSZWNvcmQ8SywgVD4gfCB1bmRlZmluZWQge1xuICBpZiAobWFwID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCBwYXlsb2FkXSk6IFtLLCB1bmtub3duXSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkIGFzIFBheWxvYWQsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtrIGFzIEssIHZhbHVlXTtcbiAgICB9KVxuICApIGFzIFJlY29yZDxLLCBUPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgY29uc3QgcmF3UGF5bG9hZFR5cGVCcmFuZDogdW5pcXVlIHN5bWJvbDtcbi8qKlxuICogUmF3VmFsdWUgaXMgYSB3cmFwcGVyIG92ZXIgYSBwYXlsb2FkLlxuICogQSBwYXlsb2FkIHRoYXQgYmVsb25ncyB0byBhIFJhd1ZhbHVlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBieXBhc3NlcyB1c2VyLWRlZmluZWQgcGF5bG9hZCBjb252ZXJ0ZXJzLFxuICogaW5zdGVhZCB1c2luZyB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlci4gVGhlIHBheWxvYWQgc3RpbGwgdW5kZXJnb2VzIGNvZGVjIGNvbnZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXdWYWx1ZTxUID0gdW5rbm93bj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9wYXlsb2FkOiBQYXlsb2FkO1xuICBwcml2YXRlIHJlYWRvbmx5IFtyYXdQYXlsb2FkVHlwZUJyYW5kXTogVCA9IHVuZGVmaW5lZCBhcyBUO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyID0gZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSwgY29udGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVBheWxvYWQocDogUGF5bG9hZCk6IFJhd1ZhbHVlIHtcbiAgICByZXR1cm4gbmV3IFJhd1ZhbHVlKHAsIGlkZW50aXR5UGF5bG9hZENvbnZlcnRlcik7XG4gIH1cblxuICBnZXQgcGF5bG9hZCgpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0sIG9yIGB1bmRlZmluZWRgIGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUO1xuXG4gIHJlYWRvbmx5IGVuY29kaW5nVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyaWVzIHRvIGNvbnZlcnQgdmFsdWVzIHRvIHtAbGluayBQYXlsb2FkfXMgdXNpbmcgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nfXMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBpbiB0aGUgb3JkZXIgcHJvdmlkZWQuXG4gKlxuICogQ29udmVydHMgUGF5bG9hZHMgdG8gdmFsdWVzIGJhc2VkIG9uIHRoZSBgUGF5bG9hZC5tZXRhZGF0YS5lbmNvZGluZ2AgZmllbGQsIHdoaWNoIG1hdGNoZXMgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nLmVuY29kaW5nVHlwZX1cbiAqIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBjcmVhdGVkIHRoZSBQYXlsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICByZWFkb25seSBjb252ZXJ0ZXJzOiBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nW107XG4gIHJlYWRvbmx5IGNvbnZlcnRlckJ5RW5jb2Rpbmc6IE1hcDxzdHJpbmcsIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXSkge1xuICAgIGlmIChjb252ZXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFBheWxvYWRDb252ZXJ0ZXJFcnJvcignTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJ0ZXJzID0gY29udmVydGVycztcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlckJ5RW5jb2Rpbmcuc2V0KGNvbnZlcnRlci5lbmNvZGluZ1R5cGUsIGNvbnZlcnRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJ1biBgLnRvUGF5bG9hZCh2YWx1ZSlgIG9uIGVhY2ggY29udmVydGVyIGluIHRoZSBvcmRlciBwcm92aWRlZCBhdCBjb25zdHJ1Y3Rpb24uXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0LCB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciB0aGF0IGNhbiBoYW5kbGUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHRvUGF5bG9hZDxUPih2YWx1ZTogVCwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUGF5bG9hZCB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5wYXlsb2FkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0ICR7dmFsdWV9IHRvIHBheWxvYWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZnJvbVBheWxvYWR9IGJhc2VkIG9uIHRoZSBgZW5jb2RpbmdgIG1ldGFkYXRhIG9mIHRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkLm1ldGFkYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jb2RpbmcgPSBkZWNvZGUocGF5bG9hZC5tZXRhZGF0YVtNRVRBREFUQV9FTkNPRElOR19LRVldISk7XG4gICAgY29uc3QgY29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXJCeUVuY29kaW5nLmdldChlbmNvZGluZyk7XG4gICAgaWYgKGNvbnZlcnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5rbm93biBlbmNvZGluZzogJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkLCBjb250ZXh0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gSlMgdW5kZWZpbmVkIGFuZCBOVUxMIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTDtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihfY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55OyAvLyBKdXN0IHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gYmluYXJ5IGRhdGEgdHlwZXMgYW5kIFJBVyBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW5hcnlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVztcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19SQVcsXG4gICAgICB9LFxuICAgICAgZGF0YTogdmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIFdyYXAgd2l0aCBVaW50OEFycmF5IGZyb20gdGhpcyBjb250ZXh0IHRvIGVuc3VyZSBgaW5zdGFuY2VvZmAgd29ya3NcbiAgICAgIChcbiAgICAgICAgY29udGVudC5kYXRhID8gbmV3IFVpbnQ4QXJyYXkoY29udGVudC5kYXRhLmJ1ZmZlciwgY29udGVudC5kYXRhLmJ5dGVPZmZzZXQsIGNvbnRlbnQuZGF0YS5sZW5ndGgpIDogY29udGVudC5kYXRhXG4gICAgICApIGFzIGFueVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIG5vbi11bmRlZmluZWQgdmFsdWVzIGFuZCBzZXJpYWxpemVkIEpTT04gUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgSnNvblBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTjtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IGpzb247XG4gICAgdHJ5IHtcbiAgICAgIGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19KU09OLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IGVuY29kZShqc29uKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KGNvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAoY29udGVudC5kYXRhID09PSB1bmRlZmluZWQgfHwgY29udGVudC5kYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignR290IHBheWxvYWQgd2l0aCBubyBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZShjb250ZW50LmRhdGEpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgZXh0ZW5kcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIHtcbiAgLy8gTWF0Y2ggdGhlIG9yZGVyIHVzZWQgaW4gb3RoZXIgU0RLcywgYnV0IGV4Y2x1ZGUgUHJvdG9idWYgY29udmVydGVycyBzbyB0aGF0IHRoZSBjb2RlLCBpbmNsdWRpbmdcbiAgLy8gYHByb3RvMy1qc29uLXNlcmlhbGl6ZXJgLCBkb2Vzbid0IHRha2Ugc3BhY2UgaW4gV29ya2Zsb3cgYnVuZGxlcyB0aGF0IGRvbid0IHVzZSBQcm90b2J1ZnMuIFRvIHVzZSBQcm90b2J1ZnMsIHVzZVxuICAvLyB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJXaXRoUHJvdG9idWZzfS5cbiAgLy9cbiAgLy8gR28gU0RLOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVtcG9yYWxpby9zZGstZ28vYmxvYi81ZTU2NDVmMGM1NTBkY2Y3MTdjMDk1YWUzMmM3NmE3MDg3ZDJlOTg1L2NvbnZlcnRlci9kZWZhdWx0X2RhdGFfY29udmVydGVyLmdvI0wyOFxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihuZXcgVW5kZWZpbmVkUGF5bG9hZENvbnZlcnRlcigpLCBuZXcgQmluYXJ5UGF5bG9hZENvbnZlcnRlcigpLCBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0gdXNlZCBieSB0aGUgU0RLLiBTdXBwb3J0cyBgVWludDhBcnJheWAgYW5kIEpTT04gc2VyaWFsaXphYmxlcyAoc28gaWZcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9KU09OL3N0cmluZ2lmeSNkZXNjcmlwdGlvbiB8IGBKU09OLnN0cmluZ2lmeSh5b3VyQXJnT3JSZXR2YWwpYH1cbiAqIHdvcmtzLCB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlciB3aWxsIHdvcmspLlxuICpcbiAqIFRvIGFsc28gc3VwcG9ydCBQcm90b2J1ZnMsIGNyZWF0ZSBhIGN1c3RvbSBwYXlsb2FkIGNvbnZlcnRlciB3aXRoIHtAbGluayBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcn06XG4gKlxuICogYGNvbnN0IG15Q29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKHsgcHJvdG9idWZSb290IH0pYFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBUaGUgaWRlbnRpdHkgcGF5bG9hZCBjb252ZXJ0ZXIgcmV0dXJucyB0aGUgaW5wdXRzIGl0IHdhcyBnaXZlbi5cbiAqL1xuY2xhc3MgSWRlbnRpdHlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQge1xuICAgIHJldHVybiB2YWx1ZSBhcyBQYXlsb2FkO1xuICB9XG5cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiBwYXlsb2FkIGFzIFQ7XG4gIH1cbn1cblxuY29uc3QgaWRlbnRpdHlQYXlsb2FkQ29udmVydGVyID0gbmV3IElkZW50aXR5UGF5bG9hZENvbnZlcnRlcigpO1xuIiwiaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hBdHRyaWJ1dGVzLCBTZWFyY2hBdHRyaWJ1dGVQYWlyLCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyIH0gZnJvbSAnLi4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHtcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBpc1ZhbGlkVmFsdWVGb3JUeXBlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlLFxufSBmcm9tICcuLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IEpzb25QYXlsb2FkQ29udmVydGVyLCBtYXBGcm9tUGF5bG9hZHMsIG1hcFRvUGF5bG9hZHMgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcblxuLyoqXG4gKiBDb252ZXJ0cyBTZWFyY2ggQXR0cmlidXRlIHZhbHVlcyB1c2luZyBKc29uUGF5bG9hZENvbnZlcnRlclxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG4gIHZhbGlkTm9uRGF0ZVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlczogdW5rbm93bik6IFBheWxvYWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgU2VhcmNoQXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBmaXJzdFR5cGUgPSB0eXBlb2YgZmlyc3RWYWx1ZTtcbiAgICAgIGlmIChmaXJzdFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBhcnJheXMgb2Ygc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIERhdGVzLiBUaGUgdmFsdWUgJHt2YWx1ZX0gYXQgaW5kZXggJHtpZHh9IGlzIG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZE5vbkRhdGVUeXBlcy5pbmNsdWRlcyhmaXJzdFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBmaXJzdFR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgQWxsIFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlLiBUaGUgZmlyc3QgdmFsdWUgJHtmaXJzdFZhbHVlfSBvZiB0eXBlICR7Zmlyc3RUeXBlfSBkb2Vzbid0IG1hdGNoIHZhbHVlICR7dmFsdWV9IG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9IGF0IGluZGV4ICR7aWR4fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgdGFrZXMgY2FyZSBvZiBjb252ZXJ0aW5nIERhdGVzIHRvIElTTyBzdHJpbmdzXG4gICAgY29uc3QgcmV0ID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZXMpO1xuICAgIGlmIChyZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHBheWxvYWRzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogRGF0ZXRpbWUgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBgRGF0ZWBzXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuanNvbkNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcbiAgICBsZXQgYXJyYXlXcmFwcGVkVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICBjb25zdCBzZWFyY2hBdHRyaWJ1dGVUeXBlID0gcGF5bG9hZC5tZXRhZGF0YS50eXBlID8gZGVjb2RlKHBheWxvYWQubWV0YWRhdGEudHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlYXJjaEF0dHJpYnV0ZVR5cGUgPT09ICdEYXRldGltZScpIHtcbiAgICAgIGFycmF5V3JhcHBlZFZhbHVlID0gYXJyYXlXcmFwcGVkVmFsdWUubWFwKChkYXRlU3RyaW5nKSA9PiBuZXcgRGF0ZShkYXRlU3RyaW5nKSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVdyYXBwZWRWYWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcigpO1xuXG5leHBvcnQgY2xhc3MgVHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKTtcblxuICBwdWJsaWMgdG9QYXlsb2FkPFQ+KGF0dHI6IFQpOiBQYXlsb2FkIHtcbiAgICBpZiAoIShhdHRyIGluc3RhbmNlb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSB8fCBhdHRyIGluc3RhbmNlb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgRXhwZWN0IGlucHV0IHRvIGJlIGluc3RhbmNlIG9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUgb3IgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSwgZ290OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGF0dHJcbiAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdlIGNoZWNrIGZvciBkZWxldGlvbiBhcyB3ZWxsIGFzIHJlZ3VsYXIgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXMuXG4gICAgaWYgKGF0dHIudmFsdWUgIT09IG51bGwgJiYgIWlzVmFsaWRWYWx1ZUZvclR5cGUoYXR0ci50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgc2VhcmNoIGF0dHJpYnV0ZSB2YWx1ZSAke2F0dHIudmFsdWV9IGZvciBnaXZlbiB0eXBlICR7YXR0ci50eXBlfWApO1xuICAgIH1cblxuICAgIC8vIEZvciBzZXJ2ZXIgc2VhcmNoIGF0dHJpYnV0ZXMgdG8gd29yayBwcm9wZXJseSwgd2UgY2Fubm90IHNldCB0aGUgbWV0YWRhdGFcbiAgICAvLyB0eXBlIHdoZW4gd2Ugc2V0IG51bGxcbiAgICBpZiAoYXR0ci52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQoYXR0ci52YWx1ZSk7XG4gICAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCB0eXBlZCBzZWFyY2ggYXR0cmlidXRlIHRvIHBheWxvYWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cblxuICAgIC8vIEpTT04uc3RyaW5naWZ5IHRha2VzIGNhcmUgb2YgY29udmVydGluZyBEYXRlcyB0byBJU08gc3RyaW5nc1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKGF0dHIudmFsdWUpO1xuICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCB0eXBlZCBzZWFyY2ggYXR0cmlidXRlIHRvIHBheWxvYWQnKTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiB0aGlzIHNob3VsZG4ndCBiZSB0aGUgY2FzZSBidXQgdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB3aXRob3V0IHRoaXMgY2hlY2suXG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cbiAgICAvLyBBZGQgZW5jb2RlZCB0eXBlIG9mIHNlYXJjaCBhdHRyaWJ1dGUgdG8gbWV0YXRkYXRhXG4gICAgcGF5bG9hZC5tZXRhZGF0YVsndHlwZSddID0gZW5jb2RlKFR5cGVkU2VhcmNoQXR0cmlidXRlcy50b01ldGFkYXRhVHlwZShhdHRyLnR5cGUpKTtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8vIE5vdGU6IHR5cGUgY2FzdGluZyB1bmRlZmluZWQgdmFsdWVzIGlzIG5vdCBjbGVhciB0byBjYWxsZXIuXG4gIC8vIFdlIGNhbid0IGNoYW5nZSB0aGUgdHlwaW5nIG9mIHRoZSBtZXRob2QgdG8gcmV0dXJuIHVuZGVmaW5lZCwgaXQncyBub3QgYWxsb3dlZCBieSB0aGUgaW50ZXJmYWNlLlxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyAndHlwZScgbWV0YWRhdGEgZmllbGQgb3Igbm8gZ2l2ZW4gdmFsdWUsIHdlIHNraXAuXG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEudHlwZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMudG9TZWFyY2hBdHRyaWJ1dGVUeXBlKGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpKTtcbiAgICAvLyBVbnJlY29nbml6ZWQgbWV0YWRhdGEgdHlwZSAoc2FuaXR5IGNoZWNrKS5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gdGhpcy5qc29uQ29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpO1xuXG4gICAgLy8gSGFuZGxlIGxlZ2FjeSB2YWx1ZXMgd2l0aG91dCBLRVlXT1JEX0xJU1QgdHlwZS5cbiAgICBpZiAodHlwZSAhPT0gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1QgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIENhbm5vdCBoYXZlIGFuIGFycmF5IHdpdGggbXVsdGlwbGUgdmFsdWVzIGZvciBub24tS0VZV09SRF9MSVNUIHR5cGUuXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgICB9XG4gICAgICAvLyBVbnBhY2sgc2luZ2xlIHZhbHVlIGFycmF5LlxuICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgJiYgdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZm9yIHRoZSBnaXZlbiB0eXBlLiBJZiBub3QsIHNraXAuXG4gICAgaWYgKCFpc1ZhbGlkVmFsdWVGb3JUeXBlKHR5cGUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUodHlwZSwgdmFsdWUpIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuLy8gSWYgYm90aCBwYXJhbXMgYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLlxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKFxuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcyxcbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaEF0dHJpYnV0ZXMgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpIDoge30pLFxuICAgIC4uLih0eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgID8gbWFwVG9QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+KFxuICAgICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0eXBlZFNlYXJjaEF0dHJpYnV0ZXMpID8gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzIDogdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldEFsbCgpKS5tYXAoXG4gICAgICAgICAgICAgIChwYWlyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYWlyLmtleS5uYW1lLCBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhpbmRleGVkRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB8IHVuZGVmaW5lZCB8IG51bGwpOiBTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgaWYgKCFpbmRleGVkRmllbGRzKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwRnJvbVBheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIGluZGV4ZWRGaWVsZHMpIGFzIFNlYXJjaEF0dHJpYnV0ZXMpLmZpbHRlcihcbiAgICAgIChbXywgdl0pID0+IHYgJiYgdi5sZW5ndGggPiAwXG4gICAgKSAvLyBGaWx0ZXIgb3V0IGVtcHR5IGFycmF5cyByZXR1cm5lZCBieSBwcmUgMS4xOCBzZXJ2ZXJzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoXG4gIGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbFxuKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgcmV0dXJuIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICBtYXBGcm9tUGF5bG9hZHM8c3RyaW5nLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlPFNlYXJjaEF0dHJpYnV0ZVR5cGU+IHwgdW5kZWZpbmVkPihcbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxuICAgICAgICBpbmRleGVkRmllbGRzXG4gICAgICApID8/IHt9XG4gICAgKS5yZWR1Y2U8U2VhcmNoQXR0cmlidXRlUGFpcltdPigoYWNjLCBbaywgYXR0cl0pID0+IHtcbiAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIGNvbnZlcnRlci5cbiAgICAgIGlmICghYXR0cikge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0geyBuYW1lOiBrLCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIEVuc3VyZSBpcyB2YWxpZCBwYWlyLlxuICAgICAgaWYgKGlzVmFsaWRWYWx1ZUZvclR5cGUoa2V5LnR5cGUsIGF0dHIudmFsdWUpKSB7XG4gICAgICAgIGFjYy5wdXNoKHsga2V5LCB2YWx1ZTogYXR0ci52YWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVBhaXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX0VOQ09ESU5HX0tFWSA9ICdlbmNvZGluZyc7XG5leHBvcnQgY29uc3QgZW5jb2RpbmdUeXBlcyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogJ2JpbmFyeS9udWxsJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiAnYmluYXJ5L3BsYWluJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogJ2pzb24vcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRl9KU09OOiAnanNvbi9wcm90b2J1ZicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiAnYmluYXJ5L3Byb3RvYnVmJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBFbmNvZGluZ1R5cGUgPSAodHlwZW9mIGVuY29kaW5nVHlwZXMpW2tleW9mIHR5cGVvZiBlbmNvZGluZ1R5cGVzXTtcblxuZXhwb3J0IGNvbnN0IGVuY29kaW5nS2V5cyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1JBVzogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT04pLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUYpLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX01FU1NBR0VfVFlQRV9LRVkgPSAnbWVzc2FnZVR5cGUnO1xuIiwiaW1wb3J0ICogYXMgdGltZSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyB0eXBlIFRpbWVzdGFtcCB9IGZyb20gJy4vdGltZSc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUudHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNOdW1iZXJUb1RzKG1pbGxpcyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb1RzKHN0cjogRHVyYXRpb24gfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5tc09wdGlvbmFsVG9UcyhzdHIpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb051bWJlcih2YWwpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvTnVtYmVyKHZhbDogRHVyYXRpb24pOiBudW1iZXIge1xuICByZXR1cm4gdGltZS5tc1RvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9EYXRlKHRzOiBUaW1lc3RhbXApOiBEYXRlIHtcbiAgcmV0dXJuIHRpbWUudHNUb0RhdGUodHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm9wdGlvbmFsVHNUb0RhdGUodHMpO1xufVxuIiwiLy8gUGFzdGVkIHdpdGggbW9kaWZpY2F0aW9ucyBmcm9tOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYW5vbnljby9GYXN0ZXN0U21hbGxlc3RUZXh0RW5jb2RlckRlY29kZXIvbWFzdGVyL0VuY29kZXJEZWNvZGVyVG9nZXRoZXIuc3JjLmpzXG4vKiBlc2xpbnQgbm8tZmFsbHRocm91Z2g6IDAgKi9cblxuY29uc3QgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbmNvbnN0IGVuY29kZXJSZWdleHAgPSAvW1xceDgwLVxcdUQ3ZmZcXHVEQzAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0/L2c7XG5jb25zdCB0bXBCdWZmZXJVMTYgPSBuZXcgVWludDE2QXJyYXkoMzIpO1xuXG5leHBvcnQgY2xhc3MgVGV4dERlY29kZXIge1xuICBkZWNvZGUoaW5wdXRBcnJheU9yQnVmZmVyOiBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5wdXRBczggPSBpbnB1dEFycmF5T3JCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gaW5wdXRBcnJheU9yQnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5wdXRBcnJheU9yQnVmZmVyKTtcblxuICAgIGxldCByZXN1bHRpbmdTdHJpbmcgPSAnJyxcbiAgICAgIHRtcFN0ciA9ICcnLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbmV4dEVuZCA9IDAsXG4gICAgICBjcDAgPSAwLFxuICAgICAgY29kZVBvaW50ID0gMCxcbiAgICAgIG1pbkJpdHMgPSAwLFxuICAgICAgY3AxID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICB0bXAgPSAtMTtcbiAgICBjb25zdCBsZW4gPSBpbnB1dEFzOC5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGxlbk1pbnVzMzIgPSAobGVuIC0gMzIpIHwgMDtcbiAgICAvLyBOb3RlIHRoYXQgdG1wIHJlcHJlc2VudHMgdGhlIDJuZCBoYWxmIG9mIGEgc3Vycm9nYXRlIHBhaXIgaW5jYXNlIGEgc3Vycm9nYXRlIGdldHMgZGl2aWRlZCBiZXR3ZWVuIGJsb2Nrc1xuICAgIGZvciAoOyBpbmRleCA8IGxlbjsgKSB7XG4gICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICBmb3IgKDsgcG9zIDwgbmV4dEVuZDsgaW5kZXggPSAoaW5kZXggKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgY3AwID0gaW5wdXRBczhbaW5kZXhdICYgMHhmZjtcbiAgICAgICAgc3dpdGNoIChjcDAgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgaWYgKGNwMSA+PiA2ICE9PSAwYjEwIHx8IDBiMTExMTAxMTEgPCBjcDApIHtcbiAgICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZVBvaW50ID0gKChjcDAgJiAwYjExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gNTsgLy8gMjAgZW5zdXJlcyBpdCBuZXZlciBwYXNzZXMgLT4gYWxsIGludmFsaWQgcmVwbGFjZW1lbnRzXG4gICAgICAgICAgICBjcDAgPSAweDEwMDsgLy8gIGtlZXAgdHJhY2sgb2YgdGggYml0IHNpemVcbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gY3AxID4+IDYgPT09IDBiMTAgPyAobWluQml0cyArIDQpIHwgMCA6IDI0OyAvLyAyNCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IChjcDAgKyAweDEwMCkgJiAweDMwMDsgLy8ga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPDw9IDY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgfD0gKChjcDAgJiAwYjExMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSAobWluQml0cyArIDcpIHwgMDtcblxuICAgICAgICAgICAgLy8gTm93LCBwcm9jZXNzIHRoZSBjb2RlIHBvaW50XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsZW4gJiYgY3AxID4+IDYgPT09IDBiMTAgJiYgY29kZVBvaW50ID4+IG1pbkJpdHMgJiYgY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY3AwID0gY29kZVBvaW50O1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSAoY29kZVBvaW50IC0gMHgxMDAwMCkgfCAwO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb2RlUG9pbnQgLyoweGZmZmYgPCBjb2RlUG9pbnQqLykge1xuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICAgICAgLy9uZXh0RW5kID0gbmV4dEVuZCAtIDF8MDtcblxuICAgICAgICAgICAgICAgIHRtcCA9ICgoY29kZVBvaW50ID4+IDEwKSArIDB4ZDgwMCkgfCAwOyAvLyBoaWdoU3Vycm9nYXRlXG4gICAgICAgICAgICAgICAgY3AwID0gKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApIHwgMDsgLy8gbG93U3Vycm9nYXRlICh3aWxsIGJlIGluc2VydGVkIGxhdGVyIGluIHRoZSBzd2l0Y2gtc3RhdGVtZW50KVxuXG4gICAgICAgICAgICAgICAgaWYgKHBvcyA8IDMxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBub3RpY2UgMzEgaW5zdGVhZCBvZiAzMlxuICAgICAgICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSB0bXA7XG4gICAgICAgICAgICAgICAgICBwb3MgPSAocG9zICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgICAgdG1wID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIGVsc2UsIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dEFzOCBhbmQgbGV0IHRtcDAgYmUgZmlsbGVkIGluIGxhdGVyIG9uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFIHRoYXQgY3AxIGlzIGJlaW5nIHVzZWQgYXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIHRoZSBzd2FwcGluZyBvZiB0bXAgd2l0aCBjcDBcbiAgICAgICAgICAgICAgICAgIGNwMSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHRtcCA9IGNwMDtcbiAgICAgICAgICAgICAgICAgIGNwMCA9IGNwMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBuZXh0RW5kID0gKG5leHRFbmQgKyAxKSB8IDA7IC8vIGJlY2F1c2Ugd2UgYXJlIGFkdmFuY2luZyBpIHdpdGhvdXQgYWR2YW5jaW5nIHBvc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb2RlIHBvaW50IG1lYW5zIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgd2l0aCBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgY3AwID4+PSA4O1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIGNwMCAtIDEpIHwgMDsgLy8gcmVzZXQgaW5kZXggIGJhY2sgdG8gd2hhdCBpdCB3YXMgYmVmb3JlXG4gICAgICAgICAgICAgIGNwMCA9IDB4ZmZmZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluYWxseSwgcmVzZXQgdGhlIHZhcmlhYmxlcyBmb3IgdGhlIG5leHQgZ28tYXJvdW5kXG4gICAgICAgICAgICBtaW5CaXRzID0gMDtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDA7XG4gICAgICAgICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICAgICAgLypjYXNlIDExOlxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICBjYXNlIDk6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjb2RlUG9pbnQgPyBjb2RlUG9pbnQgPSAwIDogY3AwID0gMHhmZmZkOyAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgY29udGludWU7Ki9cbiAgICAgICAgICBkZWZhdWx0OiAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gY3AwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgIH1cbiAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgfVxuICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZShcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls1XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls4XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMThdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzFdXG4gICAgICApO1xuICAgICAgaWYgKHBvcyA8IDMyKSB0bXBTdHIgPSB0bXBTdHIuc2xpY2UoMCwgKHBvcyAtIDMyKSB8IDApOyAvLy0oMzItcG9zKSk7XG4gICAgICBpZiAoaW5kZXggPCBsZW4pIHtcbiAgICAgICAgLy9mcm9tQ2hhckNvZGUuYXBwbHkoMCwgdG1wQnVmZmVyVTE2IDogVWludDhBcnJheSA/ICB0bXBCdWZmZXJVMTYuc3ViYXJyYXkoMCxwb3MpIDogdG1wQnVmZmVyVTE2LnNsaWNlKDAscG9zKSk7XG4gICAgICAgIHRtcEJ1ZmZlclUxNlswXSA9IHRtcDtcbiAgICAgICAgcG9zID0gfnRtcCA+Pj4gMzE7IC8vdG1wICE9PSAtMSA/IDEgOiAwO1xuICAgICAgICB0bXAgPSAtMTtcblxuICAgICAgICBpZiAodG1wU3RyLmxlbmd0aCA8IHJlc3VsdGluZ1N0cmluZy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICh0bXAgIT09IC0xKSB7XG4gICAgICAgIHRtcFN0ciArPSBmcm9tQ2hhckNvZGUodG1wKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0aW5nU3RyaW5nICs9IHRtcFN0cjtcbiAgICAgIHRtcFN0ciA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdTdHJpbmc7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGVuY29kZXJSZXBsYWNlcihub25Bc2NpaUNoYXJzOiBzdHJpbmcpIHtcbiAgLy8gbWFrZSB0aGUgVVRGIHN0cmluZyBpbnRvIGEgYmluYXJ5IFVURi04IGVuY29kZWQgc3RyaW5nXG4gIGxldCBwb2ludCA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgwKSB8IDA7XG4gIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICBpZiAocG9pbnQgPD0gMHhkYmZmKSB7XG4gICAgICBjb25zdCBuZXh0Y29kZSA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgxKSB8IDA7IC8vIGRlZmF1bHRzIHRvIDAgd2hlbiBOYU4sIGNhdXNpbmcgbnVsbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblxuICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgcG9pbnQgPSAoKHBvaW50IDw8IDEwKSArIG5leHRjb2RlIC0gMHgzNWZkYzAwKSB8IDA7XG4gICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZilcbiAgICAgICAgICByZXR1cm4gZnJvbUNoYXJDb2RlKFxuICAgICAgICAgICAgKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gMTIpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH1cbiAgfVxuICAvKmlmIChwb2ludCA8PSAweDAwN2YpIHJldHVybiBub25Bc2NpaUNoYXJzO1xuICBlbHNlICovIGlmIChwb2ludCA8PSAweDA3ZmYpIHtcbiAgICByZXR1cm4gZnJvbUNoYXJDb2RlKCgweDYgPDwgNSkgfCAocG9pbnQgPj4gNiksICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKSk7XG4gIH0gZWxzZVxuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAoMHhlIC8qMGIxMTEwKi8gPDwgNCkgfCAocG9pbnQgPj4gMTIpLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqL1xuICAgICk7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0RW5jb2RlciB7XG4gIHB1YmxpYyBlbmNvZGUoaW5wdXRTdHJpbmc6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIC8vIDB4YzAgPT4gMGIxMTAwMDAwMDsgMHhmZiA9PiAwYjExMTExMTExOyAweGMwLTB4ZmYgPT4gMGIxMXh4eHh4eFxuICAgIC8vIDB4ODAgPT4gMGIxMDAwMDAwMDsgMHhiZiA9PiAwYjEwMTExMTExOyAweDgwLTB4YmYgPT4gMGIxMHh4eHh4eFxuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAnJyArIGlucHV0U3RyaW5nLFxuICAgICAgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwO1xuICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheSgoKGxlbiA8PCAxKSArIDgpIHwgMCk7XG4gICAgbGV0IHRtcFJlc3VsdDogVWludDhBcnJheTtcbiAgICBsZXQgaSA9IDAsXG4gICAgICBwb3MgPSAwLFxuICAgICAgcG9pbnQgPSAwLFxuICAgICAgbmV4dGNvZGUgPSAwO1xuICAgIGxldCB1cGdyYWRlZGVkQXJyYXlTaXplID0gIVVpbnQ4QXJyYXk7IC8vIG5vcm1hbCBhcnJheXMgYXJlIGF1dG8tZXhwYW5kaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwLCBwb3MgPSAocG9zICsgMSkgfCAwKSB7XG4gICAgICBwb2ludCA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKSB8IDA7XG4gICAgICBpZiAocG9pbnQgPD0gMHgwMDdmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gcG9pbnQ7XG4gICAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgICAgICByZXN1bHRbcG9zXSA9ICgweDYgPDwgNSkgfCAocG9pbnQgPj4gNik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkZW5DaGVjazoge1xuICAgICAgICAgIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICAgICAgICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgICAgICAgICAgbmV4dGNvZGUgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoKGkgPSAoaSArIDEpIHwgMCkpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICAgICAgICAgIGlmICgweGRjMDAgPD0gbmV4dGNvZGUgJiYgbmV4dGNvZGUgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3NdID0gKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrIHdpZGVuQ2hlY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdXBncmFkZWRlZEFycmF5U2l6ZSAmJiBpIDw8IDEgPCBwb3MgJiYgaSA8PCAxIDwgKChwb3MgLSA3KSB8IDApKSB7XG4gICAgICAgICAgICB1cGdyYWRlZGVkQXJyYXlTaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIHRtcFJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbiAqIDMpO1xuICAgICAgICAgICAgdG1wUmVzdWx0LnNldChyZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdG1wUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcG9zXSA9ICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVaW50OEFycmF5ID8gcmVzdWx0LnN1YmFycmF5KDAsIHBvcykgOiByZXN1bHQuc2xpY2UoMCwgcG9zKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmNvZGVJbnRvKGlucHV0U3RyaW5nOiBzdHJpbmcsIHU4QXJyOiBVaW50OEFycmF5KTogeyB3cml0dGVuOiBudW1iZXI7IHJlYWQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbmNvZGVkU3RyaW5nID0gaW5wdXRTdHJpbmcgPT09IHZvaWQgMCA/ICcnIDogKCcnICsgaW5wdXRTdHJpbmcpLnJlcGxhY2UoZW5jb2RlclJlZ2V4cCwgZW5jb2RlclJlcGxhY2VyKTtcbiAgICBsZXQgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwLFxuICAgICAgaSA9IDAsXG4gICAgICBjaGFyID0gMCxcbiAgICAgIHJlYWQgPSAwO1xuICAgIGNvbnN0IHU4QXJyTGVuID0gdThBcnIubGVuZ3RoIHwgMDtcbiAgICBjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0U3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgaWYgKHU4QXJyTGVuIDwgbGVuKSBsZW4gPSB1OEFyckxlbjtcbiAgICBwdXRDaGFyczoge1xuICAgICAgZm9yICg7IGkgPCBsZW47IGkgPSAoaSArIDEpIHwgMCkge1xuICAgICAgICBjaGFyID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgICAgc3dpdGNoIChjaGFyID4+IDQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgIC8vIGV4dGVuc2lvbiBwb2ludHM6XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBpZiAoKChpICsgMSkgfCAwKSA8IHU4QXJyTGVuKSB7XG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGlmICgoKGkgKyAyKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgLy9pZiAoIShjaGFyID09PSAweEVGICYmIGVuY29kZWRTdHJpbmcuc3Vic3RyKGkrMXwwLDIpID09PSBcIlxceEJGXFx4QkRcIikpXG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGlmICgoKGkgKyAzKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWsgcHV0Q2hhcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWFkID0gcmVhZCArICgoY2hhciA+PiA2KSAhPT0gMikgfDA7XG4gICAgICAgIHU4QXJyW2ldID0gY2hhcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogaSwgcmVhZDogaW5wdXRMZW5ndGggPCByZWFkID8gaW5wdXRMZW5ndGggOiByZWFkIH07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUocyk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgVWludDhBcnJheSBpbnRvIGEgVVRGLTggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoYTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlKGEpO1xufVxuIiwiaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8qKlxuICogVGhyb3duIGZyb20gY29kZSB0aGF0IHJlY2VpdmVzIGEgdmFsdWUgdGhhdCBpcyB1bmV4cGVjdGVkIG9yIHRoYXQgaXQncyB1bmFibGUgdG8gaGFuZGxlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1ZhbHVlRXJyb3InKVxuZXhwb3J0IGNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgUGF5bG9hZCBDb252ZXJ0ZXIgaXMgbWlzY29uZmlndXJlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdQYXlsb2FkQ29udmVydGVyRXJyb3InKVxuZXhwb3J0IGNsYXNzIFBheWxvYWRDb252ZXJ0ZXJFcnJvciBleHRlbmRzIFZhbHVlRXJyb3Ige31cblxuLyoqXG4gKiBTaWduYWxzIHRoYXQgYSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbid0IGJlIGNvbXBsZXRlZCBiZWNhdXNlIGl0IGlzIGlsbGVnYWwgZ2l2ZW4gdGhlXG4gKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBvYmplY3Q7IGUuZy4gdHJ5aW5nIHRvIHVzZSBhIHJlc291cmNlIGFmdGVyIGl0IGhhcyBiZWVuIGNsb3NlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdJbGxlZ2FsU3RhdGVFcnJvcicpXG5leHBvcnQgY2xhc3MgSWxsZWdhbFN0YXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgV29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gSWQgaXMgbm90IGtub3duIHRvIFRlbXBvcmFsIFNlcnZlci5cbiAqIEl0IGNvdWxkIGJlIGJlY2F1c2U6XG4gKiAtIElkIHBhc3NlZCBpcyBpbmNvcnJlY3RcbiAqIC0gV29ya2Zsb3cgaXMgY2xvc2VkIChmb3Igc29tZSBjYWxscywgZS5nLiBgdGVybWluYXRlYClcbiAqIC0gV29ya2Zsb3cgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgU2VydmVyIGFmdGVyIHJlYWNoaW5nIGl0cyByZXRlbnRpb24gbGltaXRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd05vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ05hbWVzcGFjZU5vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHN1cGVyKGBOYW1lc3BhY2Ugbm90IGZvdW5kOiAnJHtuYW1lc3BhY2V9J2ApO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3cgdGhpcyBlcnJvciBmcm9tIGFuIEFjdGl2aXR5IGluIG9yZGVyIHRvIG1ha2UgdGhlIFdvcmtlciBmb3JnZXQgYWJvdXQgdGhpcyBBY3Rpdml0eS5cbiAqXG4gKiBUaGUgQWN0aXZpdHkgY2FuIHRoZW4gYmUgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5IChmcm9tIGFueXdoZXJl4oCUdXN1YWxseSBvdXRzaWRlIHRoZSBXb3JrZXIpIHVzaW5nXG4gKiB0aGUgQ2xpZW50J3MgYWN0aXZpdHkgaGFuZGxlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqaW1wb3J0IHsgQ29tcGxldGVBc3luY0Vycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vYWN0aXZpdHknO1xuICpcbiAqZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15QWN0aXZpdHkoKTogUHJvbWlzZTxuZXZlcj4ge1xuICogIC8vIC4uLlxuICogIHRocm93IG5ldyBDb21wbGV0ZUFzeW5jRXJyb3IoKTtcbiAqfVxuICogYGBgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29tcGxldGVBc3luY0Vycm9yJylcbmV4cG9ydCBjbGFzcyBDb21wbGV0ZUFzeW5jRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSwgaXNSZWNvcmQsIFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG5leHBvcnQgY29uc3QgRkFJTFVSRV9TT1VSQ0UgPSAnVHlwZVNjcmlwdFNESyc7XG5leHBvcnQgdHlwZSBQcm90b0ZhaWx1cmUgPSB0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5JRmFpbHVyZTtcblxuZXhwb3J0IGNvbnN0IFRpbWVvdXRUeXBlID0ge1xuICBTVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcbiAgU0NIRURVTEVfVE9fU1RBUlQ6ICdTQ0hFRFVMRV9UT19TVEFSVCcsXG4gIFNDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuICBIRUFSVEJFQVQ6ICdIRUFSVEJFQVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNUQVJUX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU1RBUlRfVE9fQ0xPU0U6ICdTVEFSVF9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU0NIRURVTEVfVE9fU1RBUlR9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19DTE9TRX0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEhFQVJUQkVBVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX0hFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUaW1lb3V0VHlwZSA9ICh0eXBlb2YgVGltZW91dFR5cGUpW2tleW9mIHR5cGVvZiBUaW1lb3V0VHlwZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlVGltZW91dFR5cGUsIGRlY29kZVRpbWVvdXRUeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVGltZW91dFR5cGUsXG4gIHR5cGVvZiBUaW1lb3V0VHlwZSxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4+KFxuICB7XG4gICAgW1RpbWVvdXRUeXBlLlNUQVJUX1RPX0NMT1NFXTogMSxcbiAgICBbVGltZW91dFR5cGUuU0NIRURVTEVfVE9fU1RBUlRdOiAyLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19DTE9TRV06IDMsXG4gICAgW1RpbWVvdXRUeXBlLkhFQVJUQkVBVF06IDQsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdUSU1FT1VUX1RZUEVfJ1xuKTtcblxuZXhwb3J0IGNvbnN0IFJldHJ5U3RhdGUgPSB7XG4gIElOX1BST0dSRVNTOiAnSU5fUFJPR1JFU1MnLFxuICBOT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuICBUSU1FT1VUOiAnVElNRU9VVCcsXG4gIE1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG4gIFJFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6ICdJTlRFUk5BTF9TRVJWRVJfRVJST1InLFxuICBDQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSU5fUFJPR1JFU1N9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOX1BST0dSRVNTOiAnSU5fUFJPR1JFU1MnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5PTl9SRVRSWUFCTEVfRkFJTFVSRX0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfTk9OX1JFVFJZQUJMRV9GQUlMVVJFOiAnTk9OX1JFVFJZQUJMRV9GQUlMVVJFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBUSU1FT1VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9USU1FT1VUOiAnVElNRU9VVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQ6ICdNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFVFJZX1BPTElDWV9OT1RfU0VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9SRVRSWV9QT0xJQ1lfTk9UX1NFVDogJ1JFVFJZX1BPTElDWV9OT1RfU0VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTlRFUk5BTF9TRVJWRVJfRVJST1J9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ0FOQ0VMX1JFUVVFU1RFRH0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfQ0FOQ0VMX1JFUVVFU1RFRDogJ0NBTkNFTF9SRVFVRVNURUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHVuZGVmaW5lZGAgaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZXRyeVN0YXRlID0gKHR5cGVvZiBSZXRyeVN0YXRlKVtrZXlvZiB0eXBlb2YgUmV0cnlTdGF0ZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlUmV0cnlTdGF0ZSwgZGVjb2RlUmV0cnlTdGF0ZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICB0eXBlb2YgUmV0cnlTdGF0ZSxcbiAgJ1JFVFJZX1NUQVRFXydcbj4oXG4gIHtcbiAgICBbUmV0cnlTdGF0ZS5JTl9QUk9HUkVTU106IDEsXG4gICAgW1JldHJ5U3RhdGUuTk9OX1JFVFJZQUJMRV9GQUlMVVJFXTogMixcbiAgICBbUmV0cnlTdGF0ZS5USU1FT1VUXTogMyxcbiAgICBbUmV0cnlTdGF0ZS5NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRURdOiA0LFxuICAgIFtSZXRyeVN0YXRlLlJFVFJZX1BPTElDWV9OT1RfU0VUXTogNSxcbiAgICBbUmV0cnlTdGF0ZS5JTlRFUk5BTF9TRVJWRVJfRVJST1JdOiA2LFxuICAgIFtSZXRyeVN0YXRlLkNBTkNFTF9SRVFVRVNURURdOiA3LFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUkVUUllfU1RBVEVfJ1xuKTtcblxuLyoqXG4gKiBBIGNhdGVnb3J5IHRvIGRlc2NyaWJlIHRoZSBzZXZlcml0eSBhbmQgY2hhbmdlIHRoZSBvYnNlcnZhYmlsaXR5IGJlaGF2aW9yIG9mIGFuIGFwcGxpY2F0aW9uIGZhaWx1cmUuXG4gKlxuICogQ3VycmVudGx5LCBvYnNlcnZhYmlsaXR5IGJlaGF2aW9yIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG86XG4gKiAtIGFjdGl2aXRpZXMgdGhhdCBmYWlsIGR1ZSB0byBhIEJFTklHTiBhcHBsaWNhdGlvbiBmYWlsdXJlIGVtaXQgREVCVUcgbGV2ZWwgbG9ncyBhbmQgZG8gbm90IHJlY29yZCBtZXRyaWNzXG4gKlxuICogQGV4cGVyaW1lbnRhbCBDYXRlZ29yeSBpcyBhIG5ldyBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSA9IHtcbiAgQkVOSUdOOiAnQkVOSUdOJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSA9ICh0eXBlb2YgQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkpW2tleW9mIHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksIGRlY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgJ0FQUExJQ0FUSU9OX0VSUk9SX0NBVEVHT1JZXydcbj4oXG4gIHtcbiAgICBbQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkuQkVOSUdOXTogMSxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0FQUExJQ0FUSU9OX0VSUk9SX0NBVEVHT1JZXydcbik7XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RXhlY3V0aW9uID0gdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JV29ya2Zsb3dFeGVjdXRpb247XG5cbi8qKlxuICogUmVwcmVzZW50cyBmYWlsdXJlcyB0aGF0IGNhbiBjcm9zcyBXb3JrZmxvdyBhbmQgQWN0aXZpdHkgYm91bmRhcmllcy5cbiAqXG4gKiAqKk5ldmVyIGV4dGVuZCB0aGlzIGNsYXNzIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4uKipcbiAqXG4gKiBUaGUgb25seSBjaGlsZCBjbGFzcyB5b3Ugc2hvdWxkIGV2ZXIgdGhyb3cgZnJvbSB5b3VyIGNvZGUgaXMge0BsaW5rIEFwcGxpY2F0aW9uRmFpbHVyZX0uXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGVtcG9yYWxGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZW1wb3JhbEZhaWx1cmUgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgZmFpbHVyZSB0aGF0IGNvbnN0cnVjdGVkIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIE9ubHkgcHJlc2VudCBpZiB0aGlzIGVycm9yIHdhcyBnZW5lcmF0ZWQgZnJvbSBhbiBleHRlcm5hbCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmFpbHVyZT86IFByb3RvRmFpbHVyZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlID8/IHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuLyoqIEV4Y2VwdGlvbnMgb3JpZ2luYXRlZCBhdCB0aGUgVGVtcG9yYWwgc2VydmljZS4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignU2VydmVyRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgU2VydmVyRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbm9uUmV0cnlhYmxlOiBib29sZWFuLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogYEFwcGxpY2F0aW9uRmFpbHVyZWBzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZhaWx1cmVzIGluIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllcy5cbiAqXG4gKiBUaGUge0BsaW5rIHR5cGV9IHByb3BlcnR5IGlzIG1hdGNoZWQgYWdhaW5zdCB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30gdG8gZGV0ZXJtaW5lIGlmIGFuIGluc3RhbmNlXG4gKiBvZiB0aGlzIGVycm9yIGlzIHJldHJ5YWJsZS4gQW5vdGhlciB3YXkgdG8gYXZvaWQgcmV0cnlpbmcgaXMgYnkgc2V0dGluZyB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyB0byBgdHJ1ZWAuXG4gKlxuICogSW4gV29ya2Zsb3dzLCBpZiB5b3UgdGhyb3cgYSBub24tYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHRoZSBXb3JrZmxvdyBUYXNrIHdpbGwgZmFpbCBhbmQgYmUgcmV0cmllZC4gSWYgeW91IHRocm93IGFuXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiB3aWxsIGZhaWwuXG4gKlxuICogSW4gQWN0aXZpdGllcywgeW91IGNhbiBlaXRoZXIgdGhyb3cgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAgb3IgYW5vdGhlciBgRXJyb3JgIHRvIGZhaWwgdGhlIEFjdGl2aXR5IFRhc2suIEluIHRoZVxuICogbGF0dGVyIGNhc2UsIHRoZSBgRXJyb3JgIHdpbGwgYmUgY29udmVydGVkIHRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLiBUaGUgY29udmVyc2lvbiBpcyBkb25lIGFzIGZvbGxvd2luZzpcbiAqXG4gKiAtIGB0eXBlYCBpcyBzZXQgdG8gYGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWVgXG4gKiAtIGBtZXNzYWdlYCBpcyBzZXQgdG8gYGVycm9yLm1lc3NhZ2VgXG4gKiAtIGBub25SZXRyeWFibGVgIGlzIHNldCB0byBmYWxzZVxuICogLSBgZGV0YWlsc2AgYXJlIHNldCB0byBudWxsXG4gKiAtIHN0YWNrIHRyYWNlIGlzIGNvcGllZCBmcm9tIHRoZSBvcmlnaW5hbCBlcnJvclxuICpcbiAqIFdoZW4gYW4ge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9hY3Rpdml0eS1leGVjdXRpb24jYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkgfCB1bmRlZmluZWQgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgZnJvbSBhbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEZpcnN0IGNhbGxzIHtAbGluayBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUgfCBgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKWB9IGFuZCB0aGVuIG92ZXJyaWRlcyBhbnkgZmllbGRzXG4gICAqIHByb3ZpZGVkIGluIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yIHwgdW5rbm93biwgb3ZlcnJpZGVzPzogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcik7XG4gICAgT2JqZWN0LmFzc2lnbihmYWlsdXJlLCBvdmVycmlkZXMpO1xuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBiZSByZXRyeWFibGUgKHVubGVzcyBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSA9IGZhbHNlLCBkZXRhaWxzLCBuZXh0UmV0cnlEZWxheSwgY2F1c2UsIGNhdGVnb3J5IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSwgY2F0ZWdvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBjYXRlZ29yeSBvZiB0aGUgYXBwbGljYXRpb24gZXJyb3IuXG4gICAqIEFmZmVjdHMgd29ya2VyLXNpZGUgbG9nZ2luZyBhbmQgbWV0cmljcyBiZWhhdmlvciBvZiB0aGlzIGZhaWx1cmUuXG4gICAqL1xuICBjYXRlZ29yeT86IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5O1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIE5leHVzIE9wZXJhdGlvbiBleGVjdXRlZCBpbnNpZGUgYSBXb3JrZmxvdyBmYWlscy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOZXh1c09wZXJhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIE5leHVzT3BlcmF0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZEV2ZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgYWRkIGEgTmV4dXNIYW5kbGVyRmFpbHVyZSBjbGFzcyBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG5cbi8qKlxuICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gKiAgLSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElEIGlzIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGlzIGBXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfRkFJTGBcbiAqICAtIFRoZXJlIGlzIGEgY2xvc2VkIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWBcbiAqICAtIFRoZXJlIGlzIGNsb3NlZCBXb3JrZmxvdyBpbiB0aGUgYENvbXBsZXRlZGAgc3RhdGUgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFlgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBgZXJyb3JgIGlzIGFscmVhZHkgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHJldHVybnMgYGVycm9yYC5cbiAqXG4gKiBPdGhlcndpc2UsIGNvbnZlcnRzIGBlcnJvcmAgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoOlxuICpcbiAqIC0gYG1lc3NhZ2VgOiBgZXJyb3IubWVzc2FnZWAgb3IgYFN0cmluZyhlcnJvcilgXG4gKiAtIGB0eXBlYDogYGVycm9yLmNvbnN0cnVjdG9yLm5hbWVgIG9yIGBlcnJvci5uYW1lYFxuICogLSBgc3RhY2tgOiBgZXJyb3Iuc3RhY2tgIG9yIGAnJ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5tZXNzYWdlKSkgfHwgU3RyaW5nKGVycm9yKTtcbiAgY29uc3QgdHlwZSA9IChpc1JlY29yZChlcnJvcikgJiYgKGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlOiBmYWxzZSB9KTtcbiAgZmFpbHVyZS5zdGFjayA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLnN0YWNrKSkgfHwgJyc7XG4gIHJldHVybiBmYWlsdXJlO1xufVxuXG4vKipcbiAqIElmIGBlcnJgIGlzIGFuIEVycm9yIGl0IGlzIHR1cm5lZCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICpcbiAqIElmIGBlcnJgIHdhcyBhbHJlYWR5IGEgYFRlbXBvcmFsRmFpbHVyZWAsIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yLlxuICpcbiAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggYFN0cmluZyhlcnIpYCBhcyB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnI6IHVua25vd24pOiBUZW1wb3JhbEZhaWx1cmUge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICByZXR1cm4gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycik7XG59XG5cbi8qKlxuICogR2V0IHRoZSByb290IGNhdXNlIG1lc3NhZ2Ugb2YgZ2l2ZW4gYGVycm9yYC5cbiAqXG4gKiBJbiBjYXNlIGBlcnJvcmAgaXMgYSB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSwgcmVjdXJzZSB0aGUgYGNhdXNlYCBjaGFpbiBhbmQgcmV0dXJuIHRoZSByb290IGBjYXVzZS5tZXNzYWdlYC5cbiAqIE90aGVyd2lzZSwgcmV0dXJuIGBlcnJvci5tZXNzYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RDYXVzZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZSA/IHJvb3RDYXVzZShlcnJvci5jYXVzZSkgOiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIiwiLyoqXG4gKiBDb21tb24gbGlicmFyeSBmb3IgY29kZSB0aGF0J3MgdXNlZCBhY3Jvc3MgdGhlIENsaWVudCwgV29ya2VyLCBhbmQvb3IgV29ya2Zsb3dcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1vcHRpb25zJztcbmV4cG9ydCB7IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMsIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB9IGZyb20gJy4vYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMnO1xuZXhwb3J0IHsgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gfSBmcm9tICcuL2NvbnRpbnVlLWFzLW5ldyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgU2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG59IGZyb20gJy4vY29udmVydGVyL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2RlcHJlY2F0ZWQtdGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhaWx1cmUnO1xuZXhwb3J0IHsgSGVhZGVycywgTmV4dCB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3ByaW9yaXR5JztcbmV4cG9ydCAqIGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5leHBvcnQgdHlwZSB7IFRpbWVzdGFtcCwgRHVyYXRpb24sIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi90aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2VyLWRlcGxveW1lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctZGVmaW5pdGlvbi1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmV4cG9ydCB7XG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2RpbmcuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYXJyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShhcnIpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvckNvZGUoZXJyb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlGdW5jLCBPbWl0TGFzdFBhcmFtIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGludGVyY2VwdG9yIGZ1bmN0aW9uXG4gKlxuICogQ2FsbGVkIGZyb20gYW4gaW50ZXJjZXB0b3IgdG8gY29udGludWUgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG5leHBvcnQgdHlwZSBOZXh0PElGLCBGTiBleHRlbmRzIGtleW9mIElGPiA9IFJlcXVpcmVkPElGPltGTl0gZXh0ZW5kcyBBbnlGdW5jID8gT21pdExhc3RQYXJhbTxSZXF1aXJlZDxJRj5bRk5dPiA6IG5ldmVyO1xuXG4vKiogSGVhZGVycyBhcmUganVzdCBhIG1hcHBpbmcgb2YgaGVhZGVyIG5hbWUgdG8gUGF5bG9hZCAqL1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG50eXBlIFdyYXBOZXh0ID0gPEYgZXh0ZW5kcyBBbnlGdW5jPihuZXh0OiBGKSA9PiBGO1xuXG4vKipcbiAqIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJjZXB0b3IgY2hhaW5pbmcuXG4gKlxuICogVGhlIHdvcmtmbG93IHBhY2thZ2UgbmVlZHMgb25lIHNtYWxsIGJlaGF2aW9yYWwgZXh0ZW5zaW9uIG92ZXIgdGhlIGdlbmVyaWMgaW50ZXJjZXB0b3JcbiAqIHNlbWFudGljczogZXZlcnkgYG5leHQoLi4uKWAgY29udGludWF0aW9uIGl0IGhhbmRzIHRvIHdvcmtmbG93IGludGVyY2VwdG9ycyBtdXN0IGZpcnN0XG4gKiByZXN0b3JlIHRoZSB3b3JrZmxvdyByYW5kb20gc2NvcGUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHRoYXQgY29udGludWF0aW9uIHdhcyBjcmVhdGVkLlxuICpcbiAqIFdlIGtlZXAgdGhlIGNoYWluLWNvbnN0cnVjdGlvbiBsb29wIGhlcmUgYXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggc28gb3JkZXJpbmcgYW5kXG4gKiBiYXNpYyBjb21wb3NpdGlvbiBiZWhhdmlvciBjYW5ub3QgZHJpZnQgYmV0d2VlbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IGNsaWVudCxcbiAqIHdvcmtlciwgYWN0aXZpdHksIGFuZCBuZXh1cyBjb2RlIGFuZCB0aGUgd29ya2Zsb3ctc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gdGhhdCBkZWNvcmF0ZXNcbiAqIGBuZXh0KC4uLilgIGF0IGVhY2ggYm91bmRhcnkuIFRoZSBvbmx5IGJlaGF2aW9yIHRoYXQgdmFyaWVzIGJldHdlZW4gY2FsbGVycyBpcyB0aGVcbiAqIGB3cmFwTmV4dGAgaG9vazogbW9zdCBwYWNrYWdlcyB1c2UgdGhlIGlkZW50aXR5IHdyYXBwZXIsIHdoaWxlIHdvcmtmbG93IGNvZGUgc3VwcGxpZXMgYVxuICogd3JhcHBlciB0aGF0IHJlLWVudGVycyB0aGUgY2FwdHVyZWQgd29ya2Zsb3cgYXN5bmMtbG9jYWwgcmFuZG9tIHNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUludGVyY2VwdG9yc1dpdGg8SSwgTSBleHRlbmRzIGtleW9mIEk+KFxuICBpbnRlcmNlcHRvcnM6IElbXSxcbiAgbWV0aG9kOiBNLFxuICBuZXh0OiBOZXh0PEksIE0+LFxuICB3cmFwTmV4dDogV3JhcE5leHRcbik6IE5leHQ8SSwgTT4ge1xuICBsZXQgY29tcG9zZWROZXh0OiBhbnkgPSBuZXh0O1xuICBmb3IgKGxldCBpID0gaW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcnNbaV07XG4gICAgaWYgKGludGVyY2VwdG9yPy5bbWV0aG9kXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcmV2ID0gd3JhcE5leHQoY29tcG9zZWROZXh0KTtcbiAgICAgIC8vIFdlIGxvc2UgdHlwZSBzYWZldHkgaGVyZSBiZWNhdXNlIFR5cGVzY3JpcHQgY2FuJ3QgZGVkdWNlIHRoYXQgaW50ZXJjZXB0b3JbbWV0aG9kXSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAgLy8gdGhlIHNhbWUgdHlwZSBhcyBOZXh0PEksIE0+XG4gICAgICBjb21wb3NlZE5leHQgPSAoKGlucHV0OiBhbnkpID0+IChpbnRlcmNlcHRvclttZXRob2RdIGFzIGFueSkoaW5wdXQsIHByZXYpKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wb3NlZE5leHQ7XG59XG5cbi8qKlxuICogQ29tcG9zZSBhbGwgaW50ZXJjZXB0b3IgbWV0aG9kcyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIENhbGxpbmcgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uIHJlc3VsdHMgaW4gY2FsbGluZyBlYWNoIG9mIHRoZSBwcm92aWRlZCBpbnRlcmNlcHRvciwgaW4gb3JkZXIgKGZyb20gdGhlIGZpcnN0IHRvXG4gKiB0aGUgbGFzdCksIGZvbGxvd2VkIGJ5IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBwcm92aWRlZCBhcyBhcmd1bWVudCB0byBgY29tcG9zZUludGVyY2VwdG9ycygpYC5cbiAqXG4gKiBAcGFyYW0gaW50ZXJjZXB0b3JzIGEgbGlzdCBvZiBpbnRlcmNlcHRvcnNcbiAqIEBwYXJhbSBtZXRob2QgdGhlIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIG1ldGhvZCB0byBjb21wb3NlXG4gKiBAcGFyYW0gbmV4dCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW50ZXJjZXB0aW9uIGNoYWluXG4gKi9cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0IChpbXBvcnRlZCB2aWEgbGliL2ludGVyY2VwdG9ycylcbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIHJldHVybiBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aChpbnRlcmNlcHRvcnMsIG1ldGhvZCwgbmV4dCwgKCh3cmFwcGVkTmV4dCkgPT4gd3JhcHBlZE5leHQpIGFzIFdyYXBOZXh0KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbmV4cG9ydCB0eXBlIFBheWxvYWQgPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQYXlsb2FkO1xuXG4vKiogVHlwZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tIGEgV29ya2Zsb3cgYGV4ZWN1dGVgIGZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JldHVyblR5cGUgPSBQcm9taXNlPGFueT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZVR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55PiB8IGFueTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSA9IHtcbiAgaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgdmFsaWRhdG9yPzogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbFR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1NpZ25hbFR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5VHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGUgPSB7IGhhbmRsZXI6IFdvcmtmbG93UXVlcnlUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEJyb2FkIFdvcmtmbG93IGZ1bmN0aW9uIGRlZmluaXRpb24sIHNwZWNpZmljIFdvcmtmbG93cyB3aWxsIHR5cGljYWxseSB1c2UgYSBuYXJyb3dlciB0eXBlIGRlZmluaXRpb24sIGUuZzpcbiAqIGBgYHRzXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyhhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvdyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlO1xuXG5kZWNsYXJlIGNvbnN0IGFyZ3NCcmFuZDogdW5pcXVlIHN5bWJvbDtcbmRlY2xhcmUgY29uc3QgcmV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHVwZGF0ZSBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVVcGRhdGV9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSB1cGRhdGUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3VwZGF0ZSc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHNpZ25hbCBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWZpbml0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICdzaWduYWwnO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgU2lnbmFsRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyBxdWVyeSBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVF1ZXJ5fVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBhbmQgYFJldGAgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHF1ZXJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3F1ZXJ5JztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKiBHZXQgdGhlIFwidW53cmFwcGVkXCIgcmV0dXJuIHR5cGUgKHdpdGhvdXQgUHJvbWlzZSkgb2YgdGhlIGV4ZWN1dGUgaGFuZGxlciBmcm9tIFdvcmtmbG93IHR5cGUgYFdgICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdFR5cGU8VyBleHRlbmRzIFdvcmtmbG93PiA9IFJldHVyblR5cGU8Vz4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFI+ID8gUiA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RnVuY3Rpb248UCBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+IHtcbiAgKC4uLmFyZ3M6IFApOiBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICogQGRlcHJlY2F0ZWQgbm90IHJlcXVpcmVkIGFueW1vcmUsIGZvciB1bnR5cGVkIGFjdGl2aXRpZXMgdXNlIHtAbGluayBVbnR5cGVkQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2UgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVW50eXBlZEFjdGl2aXRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBBIHdvcmtmbG93J3MgaGlzdG9yeSBhbmQgSUQuIFVzZWZ1bCBmb3IgcmVwbGF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBbmRXb3JrZmxvd0lkIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBoaXN0b3J5OiB0ZW1wb3JhbC5hcGkuaGlzdG9yeS52MS5IaXN0b3J5IHwgdW5rbm93biB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZGVmaW5pbmcgYWN0aW9ucyB0YWtlbiB3aGVuIGEgd29ya2Zsb3cgZXhpdHMgd2hpbGUgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVubmluZy5cbiAqIFRoZSB3b3JrZmxvdyBleGl0IG1heSBiZSBkdWUgdG8gc3VjY2Vzc2Z1bCByZXR1cm4sIGZhaWx1cmUsIGNhbmNlbGxhdGlvbiwgb3IgY29udGludWUtYXMtbmV3LlxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaW4gYWRkaXRpb24gdG8gYWJhbmRvbmluZyB0aGUgaGFuZGxlciBleGVjdXRpb24uIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiB0aGUgd29ya2Zsb3cgZmFpbHMuXG4gICAqL1xuICBXQVJOX0FORF9BQkFORE9OOiAnV0FSTl9BTkRfQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIEFiYW5kb24gdGhlIGhhbmRsZXIgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBhbiB1cGRhdGUgaGFuZGxlciB0aGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW5cbiAgICogdGhlIHVwZGF0ZSByZXN1bHQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSAodHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5KVtrZXlvZiB0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ldO1xuIiwiaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEV4YWN0LCBSZW1vdmVQcmVmaXgsIFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgbnVtZXJpYyBgZW51bWAgdHlwZXMgcHJvZHVjZWQgYnkgb3VyXG4gKiBQcm90b2J1ZiBjb21waWxlciBhbmQgXCJjb25zdCBvYmplY3Qgb2Ygc3RyaW5nc1wiIGVudW0gdmFsdWVzIHRoYXQgd2UgZXhwb3NlIGluIG91ciBwdWJsaWMgQVBJcy5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBOZXdseSBpbnRyb2R1Y2VkIGVudW1zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gKiAgICAgICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuICogICAgICAgQUJBTkRPTjogJ0FCQU5ET04nLFxuICogICAgICAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG4gKiAgICAgfSBhcyBjb25zdDtcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqXG4gKiAgICAgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSAvL1xuICogICAgICAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gKiAgICAgICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nICAvLyBUaGlzIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3RvIGVudW0gZG9lc24ndCBhZGQgYSByZXBlYXRlZCBwcmVmaXggb24gdmFsdWVzXG4gKiAgICAgICA+KFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsIC8vIFRoZXNlIG51bWJlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBpbiB0aGUgcHJvdG8gZW51bVxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICpcbiAqICAgICAgICAgICBVTlNQRUNJRklFRDogMCxcbiAqICAgICAgICAgfSBhcyBjb25zdCxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuICogICAgICAgKTtcbiAqIGBgYFxuICpcbiAqIGBtYWtlUHJvdG9FbnVtQ29udmVydGVyc2Agc3VwcG9ydHMgb3RoZXIgdXNhZ2UgcGF0dGVybnMsIGJ1dCB0aGV5IGFyZSBvbmx5IG1lYW50IGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGZvcm1lciBlbnVtIGRlZmluaXRpb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBlbnVtcy5cbiAqXG4gKiAjIyMgQ29udGV4dFxuICpcbiAqIFRlbXBvcmFsJ3MgUHJvdG9idWYgQVBJcyBkZWZpbmUgc2V2ZXJhbCBgZW51bWAgdHlwZXM7IG91ciBQcm90b2J1ZiBjb21waWxlciB0cmFuc2Zvcm1zIHRoZXNlIHRvXG4gKiB0cmFkaXRpb25hbCAoaS5lLiBub24tY29uc3QpIFtUeXBlU2NyaXB0IG51bWVyaWMgYGVudW1gc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNudW1lcmljLWVudW1zKS5cbiAqXG4gKiBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIGZhciBmcm9tIGlkZWFsOlxuICpcbiAqICAtIER1ZSB0byB0aGUgZHVhbCBuYXR1cmUgb2Ygbm9uLWNvbnN0IFR5cGVTY3JpcHQgYGVudW1gcyAodGhleSBhcmUgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUpLFxuICogICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlZmVyIHRvIGFuIGVudW0gdmFsdWUgZnJvbSBjb2RlIHdpdGhvdXQgYSBcInJlYWxcIiBpbXBvcnQgb2YgdGhlIGVudW0gdHlwZVxuICogICAgKGkuZS4gY2FuJ3Qgc2ltcGx5IGRvIGBpbXBvcnQgdHlwZSAuLi5gKS4gSW4gV29ya2Zsb3cgY29kZSwgc3VjaCBhbiBpbXBvcnQgd291bGQgcmVzdWx0IGluXG4gKiAgICBsb2FkaW5nIG91ciBlbnRpcmUgUHJvdG9idWYgZGVmaW5pdGlvbnMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgYWRkaW5nIHNldmVyYWwgbWVnYWJ5dGVzIHRvXG4gKiAgICB0aGUgcGVyLXdvcmtmbG93IG1lbW9yeSBmb290cHJpbnQsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZTsgdG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBtYWludGFpblxuICogICAgYSBtaXJyb3IgY29weSBvZiBlYWNoIGVudW0gdHlwZXMgdXNlZCBieSBpbi13b3JrZmxvdyBBUElzLCBhbmQgZXhwb3J0IHRoZXNlIGZyb20gZWl0aGVyXG4gKiAgICBgQHRlbXBvcmFsaW8vY29tbW9uYCBvciBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgLlxuICogIC0gSXQgaXMgbm90IGRlc2lyYWJsZSBmb3IgdXNlcnMgdG8gbmVlZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGBAdGVtcG9yYWxpby9wcm90b2AganVzdCB0b1xuICogICAgZ2V0IGFjY2VzcyB0byB0aGVzZSBlbnVtIHR5cGVzOyB3ZSB0aGVyZWZvcmUgbWFkZSBpdCBhIGNvbW1vbiBwcmFjdGljZSB0byByZWV4cG9ydCB0aGVzZSBlbnVtc1xuICogICAgZnJvbSBvdXIgcHVibGljIGZhY2luZyBwYWNrYWdlcy4gSG93ZXZlciwgZXhwZXJpZW5jZSBkZW1vbnRyYXRlZCB0aGF0IHRoZXNlIHJlZXhwb3J0cyBlZmZlY3RpdmVseVxuICogICAgcmVzdWx0ZWQgaW4gcG9vciBhbmQgaW5jb25zaXN0ZW50IGRvY3VtZW50YXRpb24gY292ZXJhZ2UgY29tcGFyZWQgdG8gbWlycm9yZWQgZW51bXMgdHlwZXMuXG4gKiAgLSBPdXIgUHJvdG9idWYgZW51bSB0eXBlcyB0ZW5kIHRvIGZvbGxvdyBhIHZlcmJvc2UgYW5kIHJlZHVuZGFudCBuYW1pbmcgY29udmVudGlvbiwgd2hpY2ggZmVlbHNcbiAqICAgIHVuYXR1cmFsIGFuZCBleGNlc3NpdmUgYWNjb3JkaW5nIHRvIG1vc3QgVHlwZVNjcmlwdCBzdHlsZSBndWlkZXM7IGUuZy4gaW5zdGVhZCBvZlxuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYCxcbiAqICAgIGEgVHlwZVNjcmlwdCBkZXZlbG9wZXIgd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWV0aGluZyBzaW1pbGFyIHRvXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiAnUkVKRUNUX0RVUExJQ0FURSdgLlxuICogIC0gQmVjYXVzZSBvZiB0aGUgd2F5IFByb3RvYnVmIHdvcmtzLCBtYW55IG9mIG91ciBlbnVtIHR5cGVzIGNvbnRhaW4gYW4gYFVOU1BFQ0lGSUVEYCB2YWx1ZSwgd2hpY2hcbiAqICAgIGlzIHVzZWQgdG8gZXhwbGljaXRseSBpZGVudGlmeSBhIHZhbHVlIHRoYXQgaXMgdW5zZXQuIEluIFR5cGVTY3JpcHQgY29kZSwgdGhlIGB1bmRlZmluZWRgIHZhbHVlXG4gKiAgICBhbHJlYWR5IHNlcnZlcyB0aGF0IHB1cnBvc2UsIGFuZCBpcyBkZWZpbml0ZWx5IG1vcmUgaWRpb21hdGljIHRvIFRTIGRldmVsb3BlcnMsIHdoZXJlYXMgdGhlc2VcbiAqICAgIGBVTlNQRUNJRklFRGAgdmFsdWVzIGNyZWF0ZSBub2lzZSBhbmQgY29uZnVzaW9uIGluIG91ciBBUElzLlxuICogIC0gVHlwZVNjcmlwdCBlZGl0b3JzIGdlbmVyYWxseSBkbyBhIHZlcnkgYmFkIGpvYiBhdCBwcm92aWRpbmcgYXV0b2NvbXBsZXRpb24gdGhhdCBpbXBsaWVzIHJlYWNoaW5nXG4gKiAgICBmb3IgdmFsdWVzIG9mIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUsIGZvcmNpbmcgZGV2ZWxvcGVycyB0byBleHBsaWNpdGx5IHR5cGUgaW4gYXQgbGVhc3QgcGFydFxuICogICAgb2YgdGhlIG5hbWUgb2YgdGhlIGVudW0gdHlwZSBiZWZvcmUgdGhleSBjYW4gZ2V0IGF1dG9jb21wbGV0aW9uIGZvciBpdHMgdmFsdWVzLiBPbiB0aGUgb3RoZXJcbiAqICAgIGhhbmQsIGFsbCBUUyBlZGl0b3JzIGltbWVkaWF0ZWx5IHByb3ZpZGUgYXV0b2NvbXBsZXRpb24gZm9yIHN0cmluZyB1bmlvbiB0eXBlcy5cbiAqICAtIFRoZSBbVHlwZVNjcmlwdCdzIG9mZmljaWFsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjb2JqZWN0cy12cy1lbnVtcylcbiAqICAgIGl0c2VsZiBzdWdnZXN0cyB0aGF0LCBpbiBtb2Rlcm4gVHlwZVNjcmlwdCwgdGhlIHVzZSBvZiBgYXMgY29uc3RgIG9iamVjdHMgbWF5IGdlbmVyYWxseSBzdWZmaWNlXG4gKiAgICBhbmQgbWF5IGJlIGFkdmFudGFnZW91cyBvdmVyIHRoZSB1c2Ugb2YgYGVudW1gIHR5cGVzLlxuICpcbiAqIEEgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MsIGNvbWJpbmVkIHdpdGggYSB1bmlvbiB0eXBlIG9mIHBvc3NpYmxlIHN0cmluZyB2YWx1ZXMsIHByb3ZpZGVzIGEgbXVjaFxuICogbW9yZSBpZGlvbWF0aWMgc3ludGF4IGFuZCBhIGJldHRlciBEWCBmb3IgVHlwZVNjcmlwdCBkZXZlbG9wZXJzLiBUaGlzIGhvd2V2ZXIgcmVxdWlyZXMgYSB3YXkgdG9cbiAqIGNvbnZlcnQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgYGVudW1gIHZhbHVlcyBwcm9kdWNlZCBieSB0aGUgUHJvdG9idWYgY29tcGlsZXIgYW5kIHRoZVxuICogZXF1aXZhbGVudCBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFRoaXMgaGVscGVyIGR5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gUHJvdG9idWYgZW51bSB0eXBlLFxuICogc3Ryb25nbHkgYnVpbGRpbmcgdXBvbiBzcGVjaWZpYyBjb252ZW50aW9ucyB0aGF0IHdlIGhhdmUgYWRvcHRlZCBpbiBvdXIgUHJvdG9idWYgZGVmaW5pdGlvbnMuXG4gKlxuICogIyMjIFZhbGlkYXRpb25zXG4gKlxuICogVGhlIGNvbXBsZXggdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBoZWxwZXIgaXMgdGhlcmUgdG8gcHJldmVudCBtb3N0IHBvdGVudGlhbCBpbmNvaGVyZW5jaWVzXG4gKiB0aGF0IGNvdWxkIHJlc3VsdCBmcm9tIGhhdmluZyB0byBtYW51YWxseSBzeW5jaHJvbml6ZSB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBhbmQgdGhlXG4gKiBjb252ZXJzaW9uIHRhYmxlIHdpdGggdGhlIHByb3RvIGVudW0sIHdoaWxlIG5vdCByZXF1aXJpbmcgYSByZWd1bGFyIGltcG9ydCBvbiB0aGUgUHJvdG9idWYgZW51bVxuICogaXRzZWxmIChzbyBpdCBjYW4gYmUgdXNlZCBzYWZlbHkgZm9yIGVudW1zIG1lYW50IHRvIGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb2RlKS5cbiAqXG4gKiBJbiBwYXJ0aWN1bGFyLCBmYWlsaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgd2lsbCByZXN1bHQgaW4gYnVpbGQgdGltZSBlcnJvcnM6XG4gKlxuICogLSBGb3IgZXZlcnkga2V5IG9mIHRoZSBmb3JtIGBQUkVGSVhfS0VZOiBudW1iZXJgIGluIHRoZSBwcm90byBlbnVtLCBleGNsdWRpbmcgdGhlIGBVTlNQRUNJRklFRGAga2V5OlxuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6ICdLRVknYCBlbnRyeSBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bTtcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfS0VZOiAnS0VZJ2AgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqICAgICAodGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHN1Y2ggYWxpYXNlcyBzaG91bGRcbiAqICAgICBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBhbmQgZW51bSBlbnRyaWVzIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZCk7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogbnVtYmVyYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gSWYgdGhlIHByb3RvIGVudW0gY29udGFpbnMgYSBgUFJFRklYX1VOU1BFQ0lGSUVEYCBlbnRyeSwgdGhlbjpcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGAgYW5kL29yIGBVTlNQRUNJRklFRDogdW5kZWZpbmVkYFxuICogICAgIGVudHJpZXMgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0g4oCUIHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogICAgIHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHRoaXMgYWxpYXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZDtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGFuIGBVTlNQRUNJRklFRDogMGAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIFRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBvclxuICogICBvcHRpb25hbGx5IGFsbG93ZWQgYmUgdGhlIHByZWNlZWRpbmcgcnVsZXMuXG4gKiAtIFRoZSBtYXBwaW5nIHRhYmxlIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBhYm92ZS5cbiAqXG4gKiBUaGVzZSBydWxlcyBub3RhYmx5IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIFByb3RvIGVudW0sIHRoZSBjb2RlXG4gKiB3aWxsIGZhaWwgdG8gY29tcGlsZSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpcyBhZGRlZCBvbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogYW5kIHRoZSBtYXBwaW5nIHRhYmxlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBTdHJpbmdFbnVtVHlwZUFjdHVhbCBleHRlbmRzIEV4YWN0PFN0cmluZ0VudW1UeXBlLCBTdHJpbmdFbnVtVHlwZUFjdHVhbD4sXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgLy9cbiAgLy8gUGFyYW1ldGVycyBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgaW5mZXJyZWQ7IHRoZXkncmUgbm90IG1lYW50IG5vdCB0byBiZSBzcGVjaWZpZWQgYnkgZGV2ZWxvcGVyc1xuICBVbnNwZWNpZmllZCA9IFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH1VTlNQRUNJRklFRGAgPyAnVU5TUEVDSUZJRUQnIDogbmV2ZXIsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4gPSBFeGNsdWRlPFxuICAgIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4gICAgVW5zcGVjaWZpZWRcbiAgPixcbiAgU3RyaW5nRW51bVR5cGUgZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkXG4gID4gPSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBNYXBUYWJsZSBleHRlbmRzIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+ID0gUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4sXG4+KFxuICBtYXBUYWJsZTogTWFwVGFibGUsXG4gIHByZWZpeDogUHJlZml4XG4pOiBbXG4gIChcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSA9PiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCwgLy9cbiAgKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpID0+IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCwgLy9cbl0ge1xuICBjb25zdCByZXZlcnNlVGFibGU6IFJlY29yZDxQcm90b0VudW1WYWx1ZSwgU2hvcnRTdHJpbmdFbnVtS2V5PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBUYWJsZSkubWFwKChbaywgdl0pID0+IFt2LCBrXSlcbiAgKTtcbiAgY29uc3QgaGFzVW5zcGVjaWZpZWQgPSAobWFwVGFibGUgYXMgYW55KVsnVU5TUEVDSUZJRUQnXSA9PT0gMCB8fCAobWFwVGFibGUgYXMgYW55KVtgJHtwcmVmaXh9VU5TUEVDSUZJRURgXSA9PT0gMDtcblxuICBmdW5jdGlvbiBpc1Nob3J0U3RyaW5nRW51bUtleXMoeDogdW5rbm93bik6IHggaXMgU2hvcnRTdHJpbmdFbnVtS2V5IHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHggaW4gbWFwVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc051bWVyaWNFbnVtVmFsdWUoeDogdW5rbm93bik6IHggaXMgUHJvdG9FbnVtW2tleW9mIFByb3RvRW51bV0ge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCBpbiByZXZlcnNlVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGUoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBzaG9ydGVuOiBzdHJpbmcgPSBpbnB1dDtcbiAgICAgIGlmIChzaG9ydGVuLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBzaG9ydGVuID0gc2hvcnRlbi5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3J0U3RyaW5nRW51bUtleXMoc2hvcnRlbikpIHtcbiAgICAgICAgcmV0dXJuIG1hcFRhYmxlW3Nob3J0ZW5dO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9J2ApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGhhc1Vuc3BlY2lmaWVkICYmIGlucHV0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc051bWVyaWNFbnVtVmFsdWUoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlVGFibGVbaW5wdXRdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBnb3QgYSBwcm90byBlbnVtIHZhbHVlIHRoYXQgd2UgZG9uJ3QgeWV0IGtub3cgYWJvdXQgKGkuZS4gaXQgZGlkbid0IGV4aXN0IHdoZW4gdGhpcyBjb2RlXG4gICAgICAvLyB3YXMgY29tcGlsZWQpLiBUaGlzIGlzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgZ2l2ZW4gaG93IG91ciBBUElzIGV2b2x2ZSwgdGhpcyBpcyBpc1xuICAgICAgLy8gdW5saWtlbHkgdG8gYmUgYSB0ZXJyaWJseSBiYWQgdGhpbmcgYnkgaXRzZWxmICh3ZSBhdm9pZCBhZGRpbmcgbmV3IGVudW0gdmFsdWVzIGluIHBsYWNlc1xuICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgZGVwbG95ZWQgY29kZSkuIFRoZXJlZm9yZSwgdGhyb3dpbmdcbiAgICAgIC8vIG9uIFwidW5leHBlY3RlZFwiIHZhbHVlcyBpcyBsaWtlbHkgdG8gZW5kIHVwIGNhdXNpbmcgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IG1pZ2h0IGF2b2lkLFxuICAgICAgLy8gZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoZSBkZWNvZGVkIHZhbHVlIG1heSBhY3R1YWxseSBuZXZlciBnZXQgcmVhZCBhbnd5YXkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0ZWFkIGNoZWF0IG9uIHR5cGUgY29uc3RyYWludHMgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBcInVua25vd25fMjNcIi5cbiAgICAgIC8vIFRoYXQgc29tZXdoYXQgbWlycm9ycyB0aGUgYmVoYXZpb3Igd2UnZCBnZXQgd2l0aCB0aGUgcHVyZSBudW1lcmljYWwgYXBwcm9hY2guXG4gICAgICByZXR1cm4gYHVua25vd25fJHtpbnB1dH1gIGFzIFNob3J0U3RyaW5nRW51bUtleTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBwcm90byBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gIH1cblxuICByZXR1cm4gW2VuY29kZSwgZGVjb2RlXSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSxcbiAqIGUuZy4gdGhlIHR5cGUgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCI7XG4gKiAgIEFCQU5ET046IFwiQUJBTkRPTlwiO1xuICogICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU/OiBcIlRFUk1JTkFURVwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET04/OiBcIkFCQU5ET05cIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTD86IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ/OiB1bmRlZmluZWQ7XG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIHN0cmluZyxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCwgLy8gZS5nLiAnVU5TUEVDSUZJRUQnXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAgfCB7XG4gICAgICAvLyBlLmcuOiBcIlRFUk1JTkFURVwiOiBcIlRFUk1JTkFURVwiXG4gICAgICByZWFkb25seSBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBrO1xuICAgIH1cbiAgfCB7XG4gICAgICBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBQcmVmaXggZXh0ZW5kcyAnJ1xuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcIj86IFwiVEVSTUlOQVRFXCJcbiAgICAgICAgICAgIHJlYWRvbmx5IFtrayBpbiBgJHtQcmVmaXh9JHtrfWBdPzogaztcbiAgICAgICAgICB9O1xuICAgIH1bU2hvcnRTdHJpbmdFbnVtS2V5XVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtQcmVmaXh9JHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlVOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4+O1xuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXBwaW5nIHRhYmxlIHRoYXQgdGhlIHVzZXIgaXNcbiAqIGV4cGVjdGVkIHRvIHByb3ZpZGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgVEVSTUlOQVRFOiAxLFxuICogIEFCQU5ET046IDIsXG4gKiAgUkVRVUVTVF9DQU5DRUw6IDMsXG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gIF9TdHJpbmdFbnVtIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAge1xuICAgIFtrIGluIFByb3RvRW51bUtleV06IHtcbiAgICAgIFtrayBpbiBSZW1vdmVQcmVmaXg8UHJlZml4LCBrPl06IFByb3RvRW51bVtrXSBleHRlbmRzIG51bWJlciA/IFByb3RvRW51bVtrXSA6IG5ldmVyO1xuICAgIH07XG4gIH1bUHJvdG9FbnVtS2V5XVxuPjtcbiIsImV4cG9ydCAqIGZyb20gJy4vZW51bXMtaGVscGVycyc7XG5leHBvcnQge1xuICBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLFxuICBtZXJnZU9iamVjdHMsXG4gIC8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG4gIGRlZXBNZXJnZSxcbn0gZnJvbSAnLi9vYmplY3RzLWhlbHBlcnMnO1xuIiwiLyoqXG4gKiBIZWxwZXIgdG8gcHJldmVudCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHZhbHVlcyBvdmVycmlkaW5nIGRlZmF1bHRzIHdoZW4gbWVyZ2luZyBtYXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT0gbnVsbCkpIGFzIGFueTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb2JqZWN0cywgcG9zc2libHkgcmVtb3Zpbmcga2V5cy5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseTpcbiAqIC0gQW55IGtleS92YWx1ZSBwYWlyIGluIGBkZWx0YWAgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGtleS92YWx1ZSBwYWlyIGluIGBvcmlnaW5hbGA7XG4gKiAtIEEga2V5IHByZXNlbnQgaW4gYGRlbHRhYCB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIHJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByZXN1bHRpbmcgb2JqZWN0O1xuICogLSBJZiBgb3JpZ2luYWxgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYGRlbHRhYDtcbiAqIC0gSWYgYGRlbHRhYCBpcyBgdW5kZWZpbmVkYCBvciBlbXB0eSwgcmV0dXJuIGBvcmlnaW5hbGAgKG9yIHVuZGVmaW5lZCBpZiBgb3JpZ2luYWxgIGlzIGFsc28gdW5kZWZpbmVkKTtcbiAqIC0gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMsIHRoZW4gcmV0dXJuIGBvcmlnaW5hbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9yaWdpbmFsOiBULCBkZWx0YTogVCB8IHVuZGVmaW5lZCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWw6IFQgfCB1bmRlZmluZWQsXG4gIGRlbHRhOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybiBkZWx0YTtcbiAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybiBvcmlnaW5hbDtcblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLm9yaWdpbmFsIH07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgIGlmICh2ICE9PSBtZXJnZWRba10pIHtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSBtZXJnZWRba107XG4gICAgICBlbHNlIG1lcmdlZFtrXSA9IHY7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IChtZXJnZWQgYXMgVCkgOiBvcmlnaW5hbDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBQcm9wZXJ0aWVzIGZyb20gYHNvdXJjZWAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiBgdGFyZ2V0YC5cbiAqIE5lc3RlZCBvYmplY3RzIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuXG4gKlxuICogT2JqZWN0IGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFyZSByZWZlcmVuY2VzLCBhcyBpbixcbiAqIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBQYXJ0aWFsPFQ+KTogVCB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpICYmIGtleSBpbiB0YXJnZXQgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0gYXMgYW55KSkge1xuICAgICAgICBvdXRwdXRba2V5IGFzIGtleW9mIFRdID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAob3V0cHV0IGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIE5leHVzIE9wZXJhdGlvbiBIYW5kbGVyLCB1c2luZyB0aGUgTmV4dXMgY29udGV4dCBsb2dnZXIuXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBuZXh1cyA9ICduZXh1cycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBMb2dNZXRhT3JGdW5jID0gTG9nTWV0YWRhdGEgfCAoKCkgPT4gTG9nTWV0YWRhdGEpO1xuXG4vKipcbiAqIEEgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTG9nZ2VyfSB0aGF0IGFkZHMgbWV0YWRhdGEgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbG9nZ2VyLlxuICAgKlxuICAgKiBOZXcgbWV0YWRhdGEgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIGxvZyBpcyBlbWl0dGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIG1ldGFkYXRhIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShsb2dnZXI6IExvZ2dlciwgbWV0YU9yRnVuYzogTG9nTWV0YU9yRnVuYyk6IExvZ2dlciB7XG4gICAgLy8gRmxhdHRlbiByZWN1cnNpdmUgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEgaW5zdGFuY2VzXG4gICAgaWYgKGxvZ2dlciBpbnN0YW5jZW9mIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKGxvZ2dlci5jb250cmlidXRvcnMsIG1ldGFPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbG9nZ2VyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiBsb2dnZXI7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKGxvZ2dlci5wYXJlbnRMb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCBtZXRhT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLCBjb250cmlidXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXVxuICApIHt9XG5cbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci50cmFjZShtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5pbmZvKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci53YXJuKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZXJyb3IobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWV0YWRhdGEoY29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10sIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogTG9nTWV0YWRhdGEge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFNZXRhKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIG1ldGFkYXRhIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvQ2hhaW4oXG4gIGV4aXN0aW5nQ29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQsXG4gIG5ld0NvbnRyaWJ1dG9yOiBMb2dNZXRhT3JGdW5jXG4pOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIGFuIGVtcHR5IG9iamVjdCwgdGhlbiBpdCByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluXG4gIGlmICh0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG5ld0NvbnRyaWJ1dG9yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gIH1cblxuICAvLyBJZiBleGlzdGluZyBjaGFpbiBpcyBlbXB0eSwgdGhlbiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIHRoZSBjaGFpblxuICBpZiAoZXhpc3RpbmdDb250cmlidXRvcnMgPT0gbnVsbCB8fCBleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW25ld0NvbnRyaWJ1dG9yXTtcbiAgfVxuXG4gIC8vIElmIGJvdGggbGFzdCBjb250cmlidXRvciBhbmQgbmV3IGNvbnRyaWJ1dG9yIGFyZSBwbGFpbiBvYmplY3RzLCBtZXJnZSB0aGVtIHRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29uc3QgbGFzdCA9IGV4aXN0aW5nQ29udHJpYnV0b3JzW2V4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU9iamVjdHMobGFzdCwgbmV3Q29udHJpYnV0b3IpO1xuICAgIGlmIChtZXJnZWQgPT09IGxhc3QpIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgICByZXR1cm4gWy4uLmV4aXN0aW5nQ29udHJpYnV0b3JzLnNsaWNlKDAsIC0xKSwgbWVyZ2VkXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIEEgbWV0ZXIgZm9yIGNyZWF0aW5nIG1ldHJpY3MgdG8gcmVjb3JkIHZhbHVlcyBvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gcmVjb3JkLiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdhdWdlIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgZ2F1Z2UgbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVHYXVnZShuYW1lOiBzdHJpbmcsIHZhbHVlVHlwZT86IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljR2F1Z2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1cC1kb3duIGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHNpZ25lZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSB1cC1kb3duIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgdXAtZG93biBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIHVwLWRvd24gY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKi9cbiAgY3JlYXRlVXBEb3duQ291bnRlcj8obmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgbWV0ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLiBBbGwgbWV0cmljcyBjcmVhdGVkIG9mZiB0aGUgbWV0ZXIgd2lsbFxuICAgKiBoYXZlIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZC5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIG1ldHJpY3MuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pdCBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICB1bml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldHJpYywgaWYgYW55LlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBtZXRyaWMgKGUuZy4gYGNvdW50ZXJgLCBgaGlzdG9ncmFtYCwgYGdhdWdlYCkuXG4gICAqL1xuICBraW5kOiBNZXRyaWNLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB2YWx1ZSByZWNvcmRlZCBieSB0aGUgbWV0cmljLiBFaXRoZXIgYGludGAgb3IgYGZsb2F0YC5cbiAgICovXG4gIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBUYWdzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWUgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIG9mIG51bWVyaWNhbCB2YWx1ZXMgcmVjb3JkZWQgYnkgYSBtZXRyaWMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgcmVwcmVzZW50cyB0aGUgX2NvbmZpZ3VyYXRpb25fIG9mIHRoZSBtZXRyaWM7IGhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZG9lc24ndFxuICogaGF2ZSBkaWZmZXJlbnQgcnVudGltZSByZXByZXNlbnRhdGlvbiBmb3IgaW50ZWdlcnMgYW5kIGZsb2F0cywgdGhlIGFjdHVhbCB2YWx1ZSB0eXBlIGlzIGFsd2F5c1xuICogYSBKUyAnbnVtYmVyJy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyB8ICdmbG9hdCc7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYSBtZXRyaWMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSBNZXRyaWNLaW5kID0gJ2NvdW50ZXInIHwgJ2hpc3RvZ3JhbScgfCAnZ2F1Z2UnIHwgJ3VwLWRvd24tY291bnRlcic7XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgdmFsdWVzIGFzIGEgY291bnRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljQ291bnRlciBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBjb3VudGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYWRkLlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGNvdW50ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0NvdW50ZXI7XG5cbiAga2luZDogJ2NvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgcmVjb3JkaW5nIHZhbHVlcyBvbiBhIGhpc3RvZ3JhbS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljSGlzdG9ncmFtIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGhpc3RvZ3JhbS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHJlY29yZC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFZhbHVlIHdpbGwgYmUgY2FzdGVkIHRvIHRoZSBnaXZlblxuICAgKiAgICAgICAgICAgICAge0BsaW5rIHZhbHVlVHlwZX0uIExvc3Mgb2YgcHJlY2lzaW9uIG1heSBvY2N1ciBpZiB0aGUgdmFsdWUgaXMgbm90IGFscmVhZHkgb2YgdGhlXG4gICAqICAgICAgICAgICAgICBjb3JyZWN0IHR5cGUuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgaGlzdG9ncmFtLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW07XG5cbiAga2luZDogJ2hpc3RvZ3JhbSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBzZXR0aW5nIHZhbHVlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljR2F1Z2UgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgZ2F1Z2UuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXQuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBzZXQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgZ2F1Z2UsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlO1xuXG4gIGtpbmQ6ICdnYXVnZSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgc2lnbmVkIHZhbHVlcyBhcyBhbiB1cC1kb3duIGNvdW50ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1VwRG93bkNvdW50ZXIgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgdXAtZG93biBjb3VudGVyLiBWYWx1ZSBtYXkgYmUgbmVnYXRpdmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQgKGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgdXAtZG93biBjb3VudGVyLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNVcERvd25Db3VudGVyO1xuXG4gIGtpbmQ6ICd1cC1kb3duLWNvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuY2xhc3MgTm9vcE1ldHJpY01ldGVyIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2NvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2hpc3RvZ3JhbScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHJlY29yZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnZ2F1Z2UnLFxuICAgICAgdmFsdWVUeXBlLFxuXG4gICAgICBzZXQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAndXAtZG93bi1jb3VudGVyJyxcbiAgICAgIHZhbHVlVHlwZTogJ2ludCcsXG5cbiAgICAgIGFkZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgd2l0aFRhZ3MoX2V4dHJhVGFnczogTWV0cmljVGFncyk6IE1ldHJpY01ldGVyIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgbm9vcE1ldHJpY01ldGVyID0gbmV3IE5vb3BNZXRyaWNNZXRlcigpO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3NPckZ1bmMgPSBNZXRyaWNUYWdzIHwgKCgpID0+IE1ldHJpY1RhZ3MpO1xuXG4vKipcbiAqIEEgbWV0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhZGRzIHRhZ3MgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbWV0ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTWV0cmljTWV0ZXJ9IHRoYXQgYWRkcyB0YWdzIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IG1ldGVyLlxuICAgKlxuICAgKiBOZXcgdGFncyBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uIGV2YWx1YXRlZFxuICAgKiBldmVyeSB0aW1lIGEgbWV0cmljIGlzIHJlY29yZGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIHRhZ3MgYXMgbG93IGFzIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0ZXIgVGhlIHBhcmVudCBtZXRlciB0byBkZWxlZ2F0ZSBjYWxscyB0by5cbiAgICogQHBhcmFtIHRhZ3NPckZ1bmMgTmV3IHRhZ3MgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyByZWNvcmRlZCB0aGF0IHdpbGwgcmV0dXJuIGEgZGVsdGEgb2JqZWN0LlxuICAgKiBAcGFyYW0gZm9yY2UgaWYgYHRydWVgLCB0aGVuIGEgYE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFnc2Agd2lsbCBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlcmVcbiAgICogICAgICAgICAgICAgIGlzIG5vIHRhZ3MgdG8gYWRkLiBUaGlzIGlzIHVzZWZ1bCB0byBhZGQgdGFncyBzdXBwb3J0IHRvIGFuIHVuZGVybHlpbmcgbWV0ZXJcbiAgICogICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb21wb3NlKG1ldGVyOiBNZXRyaWNNZXRlciwgdGFnc09yRnVuYzogTWV0cmljVGFnc09yRnVuYywgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IE1ldHJpY01ldGVyIHtcbiAgICBpZiAobWV0ZXIgaW5zdGFuY2VvZiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MpIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4obWV0ZXIuY29udHJpYnV0b3JzLCB0YWdzT3JGdW5jKTtcbiAgICAgIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpbiwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3IG1ldGVyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gbWV0ZXI7XG4gICAgICByZXR1cm4gbmV3IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyhtZXRlci5wYXJlbnRNZXRlciwgY29udHJpYnV0b3JzID8/IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih1bmRlZmluZWQsIHRhZ3NPckZ1bmMpO1xuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIG1ldGVyO1xuICAgICAgcmV0dXJuIG5ldyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MobWV0ZXIsIGNvbnRyaWJ1dG9ycyA/PyBbXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1ldGVyOiBNZXRyaWNNZXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBwYXJlbnRDb3VudGVyID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVDb3VudGVyKG5hbWUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0NvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHBhcmVudENvdW50ZXIsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIGNvbnN0IHBhcmVudEhpc3RvZ3JhbSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlSGlzdG9ncmFtKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyhwYXJlbnRIaXN0b2dyYW0sIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBjb25zdCBwYXJlbnRHYXVnZSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlR2F1Z2UobmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNHYXVnZVdpdGhDb21wb3NlZFRhZ3MocGFyZW50R2F1Z2UsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBndWFyZCBvbmNlIHVwLWRvd24tY291bnRlciBzdXBwb3J0IGlzIGNvbXBsZXRlIG9uIGFsbCBNZXRyaWNNZXRlclxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBhbmQgYGNyZWF0ZVVwRG93bkNvdW50ZXJgIGlzIG5vIGxvbmdlciBvcHRpb25hbCBvbiBNZXRyaWNNZXRlci5cbiAgICBpZiAoIXRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVVcERvd25Db3VudGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgbWV0ZXInKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q291bnRlciA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyhwYXJlbnRDb3VudGVyLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MuY29tcG9zZSh0aGlzLCB0YWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY0NvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRIaXN0b2dyYW06IE1ldHJpY0hpc3RvZ3JhbSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50SGlzdG9ncmFtLnJlY29yZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50SGlzdG9ncmFtLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0ubmFtZTtcbiAgfVxuXG4gIGdldCB2YWx1ZVR5cGUoKTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0uZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRHYXVnZTogTWV0cmljR2F1Z2UsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEdhdWdlLnNldCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudEdhdWdlLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS52YWx1ZVR5cGU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5jbGFzcyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICd1cC1kb3duLWNvdW50ZXInO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlID0gJ2ludCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRDb3VudGVyOiBNZXRyaWNVcERvd25Db3VudGVyLFxuICAgIHByaXZhdGUgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRDb3VudGVyLmFkZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKTtcbiAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBuZXcgTWV0cmljVXBEb3duQ291bnRlcldpdGhDb21wb3NlZFRhZ3ModGhpcy5wYXJlbnRDb3VudGVyLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLm5hbWU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIudW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIuZGVzY3JpcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ3MoY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW10sIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiBNZXRyaWNUYWdzIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7fTtcbiAgZm9yIChjb25zdCBjb250cmlidXRvciBvZiBjb250cmlidXRvcnMpIHtcbiAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkLCB0eXBlb2YgY29udHJpYnV0b3IgPT09ICdmdW5jdGlvbicgPyBjb250cmlidXRvcigpIDogY29udHJpYnV0b3IpO1xuICB9XG4gIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIGV4dHJhVGFncyk7XG4gIHJldHVybiBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkKHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBBcHBlbmQgYSB0YWdzIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBwb3NzaWJsZS5cbiAqXG4gKiBJZiBhcHBlbmRpbmcgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluIG9mIGNvbnRyaWJ1dG9ycywgcmV0dXJuXG4gKiBgZXhpc3RpbmdDb250cmlidXRvcnNgOyBpbiB0aGF0IGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBpZiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9DaGFpbihcbiAgZXhpc3RpbmdDb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCxcbiAgbmV3Q29udHJpYnV0b3I6IE1ldHJpY1RhZ3NPckZ1bmNcbik6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCB7XG4gIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgYW4gZW1wdHkgb2JqZWN0LCB0aGVuIGl0IHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW5cbiAgaWYgKHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobmV3Q29udHJpYnV0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgfVxuXG4gIC8vIElmIGV4aXN0aW5nIGNoYWluIGlzIGVtcHR5LCB0aGVuIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgdGhlIGNoYWluXG4gIGlmIChleGlzdGluZ0NvbnRyaWJ1dG9ycyA9PSBudWxsIHx8IGV4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbbmV3Q29udHJpYnV0b3JdO1xuICB9XG5cbiAgLy8gSWYgYm90aCBsYXN0IGNvbnRyaWJ1dG9yIGFuZCBuZXcgY29udHJpYnV0b3IgYXJlIHBsYWluIG9iamVjdHMsIG1lcmdlIHRoZW0gdG8gYSBzaW5nbGUgb2JqZWN0LlxuICBjb25zdCBsYXN0ID0gZXhpc3RpbmdDb250cmlidXRvcnNbZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoIC0gMV07XG4gIGlmICh0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlT2JqZWN0cyhsYXN0LCBuZXdDb250cmlidXRvcik7XG4gICAgaWYgKG1lcmdlZCA9PT0gbGFzdCkgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICAgIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMuc2xpY2UoMCwgLTEpLCBtZXJnZWQhXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogUHJpb3JpdHkgY29udGFpbnMgbWV0YWRhdGEgdGhhdCBjb250cm9scyByZWxhdGl2ZSBvcmRlcmluZyBvZiB0YXNrIHByb2Nlc3Npbmcgd2hlbiB0YXNrcyBhcmVcbiAqIGJhY2tsb2dnZWQgaW4gYSBxdWV1ZS4gSW5pdGlhbGx5LCBQcmlvcml0eSB3aWxsIGJlIHVzZWQgaW4gYWN0aXZpdHkgYW5kIHdvcmtmbG93IHRhc2sgcXVldWVzLFxuICogd2hpY2ggYXJlIHR5cGljYWxseSB3aGVyZSBiYWNrbG9ncyBleGlzdC5cbiAqIFByaW9yaXR5IGlzIChmb3Igbm93KSBhdHRhY2hlZCB0byB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuIEFjdGl2aXRpZXMgYW5kIGNoaWxkIHdvcmtmbG93c1xuICogaW5oZXJpdCBQcmlvcml0eSBmcm9tIHRoZSB3b3JrZmxvdyB0aGF0IGNyZWF0ZWQgdGhlbSwgYnV0IG1heSBvdmVycmlkZSBmaWVsZHMgd2hlbiB0aGV5IGFyZVxuICogc3RhcnRlZCBvciBtb2RpZmllZC4gRm9yIGVhY2ggZmllbGQgb2YgYSBQcmlvcml0eSBvbiBhbiBhY3Rpdml0eS93b3JrZmxvdywgbm90IHByZXNlbnQgb3IgZXF1YWxcbiAqIHRvIHplcm8vZW1wdHkgc3RyaW5nIG1lYW5zIHRvIGluaGVyaXQgdGhlIHZhbHVlIGZyb20gdGhlIGNhbGxpbmcgd29ya2Zsb3csIG9yIGlmIHRoZXJlIGlzIG5vXG4gKiBjYWxsaW5nIHdvcmtmbG93LCB0aGVuIHVzZSB0aGUgZGVmYXVsdCAoZG9jdW1lbnRlZCBvbiB0aGUgZmllbGQpLlxuICogVGhlIG92ZXJhbGwgc2VtYW50aWNzIG9mIFByaW9yaXR5IGFyZTpcbiAqIDEuIEZpcnN0LCBjb25zaWRlciBcInByaW9yaXR5X2tleVwiOiBsb3dlciBudW1iZXIgZ29lcyBmaXJzdC5cbiAqIDIuIFRoZW4sIGNvbnNpZGVyIGZhaXJuZXNzOiB0aGUgZmFpcm5lc3MgbWVjaGFuaXNtIGF0dGVtcHRzIHRvIGRpc3BhdGNoIHRhc2tzIGZvciBhIGdpdmVuIGtleSBpblxuICogICAgcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW9yaXR5IHtcbiAgLyoqXG4gICAqIFByaW9yaXR5IGtleSBpcyBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSAxIHRvIG4sIHdoZXJlIHNtYWxsZXIgaW50ZWdlcnNcbiAgICogY29ycmVzcG9uZCB0byBoaWdoZXIgcHJpb3JpdGllcyAodGFza3MgcnVuIHNvb25lcikuIEluIGdlbmVyYWwsIHRhc2tzIGluXG4gICAqIGEgcXVldWUgc2hvdWxkIGJlIHByb2Nlc3NlZCBpbiBjbG9zZSB0byBwcmlvcml0eSBvcmRlciwgYWx0aG91Z2ggc21hbGxcbiAgICogZGV2aWF0aW9ucyBhcmUgcG9zc2libGUuXG4gICAqXG4gICAqIFRoZSBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIChtaW5pbXVtIHByaW9yaXR5KSBpcyBkZXRlcm1pbmVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmRcbiAgICogZGVmYXVsdHMgdG8gNS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgKG1pbittYXgpLzIuIFdpdGggdGhlIGRlZmF1bHQgbWF4IG9mIDUgYW5kIG1pbiBvZiAxLCB0aGF0IGNvbWVzIG91dCB0byAzLlxuICAgKi9cbiAgcHJpb3JpdHlLZXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzS2V5IGlzIGEgc2hvcnQgc3RyaW5nIHRoYXQncyB1c2VkIGFzIGEga2V5IGZvciBhIGZhaXJuZXNzXG4gICAqIGJhbGFuY2luZyBtZWNoYW5pc20uIEl0IG1heSBjb3JyZXNwb25kIHRvIGEgdGVuYW50IGlkLCBvciB0byBhIGZpeGVkXG4gICAqIHN0cmluZyBsaWtlIFwiaGlnaFwiIG9yIFwibG93XCIuIFRoZSBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gICAqIHByb3BvcnRpb24gdG8gaXRzIHdlaWdodC4gRm9yIGV4YW1wbGUsIHVzaW5nIGEgdGhvdXNhbmQgZGlzdGluY3QgdGVuYW50XG4gICAqIGlkcywgZWFjaCB3aXRoIGEgd2VpZ2h0IG9mIDEuMCAodGhlIGRlZmF1bHQpIHdpbGwgcmVzdWx0IGluIGVhY2ggdGVuYW50XG4gICAqIGdldHRpbmcgYSByb3VnaGx5IGVxdWFsIHNoYXJlIG9mIHRhc2sgZGlzcGF0Y2ggdGhyb3VnaHB1dC5cbiAgICpcbiAgICogRmFpcm5lc3Mga2V5cyBhcmUgbGltaXRlZCB0byA2NCBieXRlcy5cbiAgICovXG4gIGZhaXJuZXNzS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlybmVzc1dlaWdodCBmb3IgYSB0YXNrIGNhbiBjb21lIGZyb20gbXVsdGlwbGUgc291cmNlcyBmb3JcbiAgICogZmxleGliaWxpdHkuIEZyb20gaGlnaGVzdCB0byBsb3dlc3QgcHJlY2VkZW5jZTpcbiAgICogMS4gV2VpZ2h0cyBmb3IgYSBzbWFsbCBzZXQgb2Yga2V5cyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0YXNrIHF1ZXVlXG4gICAqICAgIGNvbmZpZ3VyYXRpb24gd2l0aCBhbiBBUEkuXG4gICAqIDIuIEl0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgd29ya2Zsb3cvYWN0aXZpdHkgaW4gdGhpcyBmaWVsZC5cbiAgICogMy4gVGhlIGRlZmF1bHQgd2VpZ2h0IG9mIDEuMCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFdlaWdodCB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gdGhlIHJhbmdlIFswLjAwMSwgMTAwMF0uXG4gICAqL1xuICBmYWlybmVzc1dlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUdXJuIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eSBpbnRvIGEgVFMgUHJpb3JpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVByaW9yaXR5KHByaW9yaXR5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkgfCBudWxsKTogUHJpb3JpdHkge1xuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eT8ucHJpb3JpdHlLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eT8uZmFpcm5lc3NLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzV2VpZ2h0OiBwcmlvcml0eT8uZmFpcm5lc3NXZWlnaHQgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBQcmlvcml0eSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByaW9yaXR5KHByaW9yaXR5OiBQcmlvcml0eSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVByaW9yaXR5IHtcbiAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5ICE9PSB1bmRlZmluZWQgJiYgcHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IG51bGwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocHJpb3JpdHkucHJpb3JpdHlLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmlvcml0eUtleSBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcmlvcml0eUtleTogcHJpb3JpdHkucHJpb3JpdHlLZXkgPz8gMCxcbiAgICBmYWlybmVzc0tleTogcHJpb3JpdHkuZmFpcm5lc3NLZXkgPz8gJycsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5LmZhaXJuZXNzV2VpZ2h0ID8/IDAsXG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYID0gJ19fdGVtcG9yYWxfJztcbmV4cG9ydCBjb25zdCBTVEFDS19UUkFDRV9RVUVSWV9OQU1FID0gJ19fc3RhY2tfdHJhY2UnO1xuZXhwb3J0IGNvbnN0IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19lbmhhbmNlZF9zdGFja190cmFjZSc7XG5cbi8qKlxuICogVmFsaWQgZW50aXR5IHR5cGVzIHRoYXQgY2FuIGJlIGNoZWNrZWQgZm9yIHJlc2VydmVkIG5hbWUgdmlvbGF0aW9uc1xuICovXG5leHBvcnQgdHlwZSBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlID0gJ3F1ZXJ5JyB8ICdzaWduYWwnIHwgJ3VwZGF0ZScgfCAnYWN0aXZpdHknIHwgJ3Rhc2sgcXVldWUnIHwgJ3NpbmsnIHwgJ3dvcmtmbG93JztcblxuLyoqXG4gKiBXaXJlIGlkZW50aWZpZXJzIHVzZWQgYnkgZmlyc3QtcGFydHkgU0RLIGNvbnRyaWIgcGFja2FnZXMuIEVhY2ggZW50cnkgcGFpcnNcbiAqIGEgbmFtZSB3aXRoIHRoZSBlbnRpdHkgdHlwZSBpdCdzIGFsbG93ZWQgdG8gcmVnaXN0ZXIgYXM7IHRoYXQgcGFpciBieXBhc3Nlc1xuICogdGhlIHtAbGluayBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9IGNoZWNrIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiBSZWdpc3RlcmluZ1xuICogdGhlIHNhbWUgbmFtZSBhcyBhIGRpZmZlcmVudCBlbnRpdHkgdHlwZSBpcyBzdGlsbCByZWplY3RlZC5cbiAqL1xuY29uc3QgSU5URVJOQUxfSEFORExFUl9OQU1FX0FMTE9XTElTVDogUmVhZG9ubHlNYXA8c3RyaW5nLCBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlPiA9IG5ldyBNYXAoW1xuICAvLyBAdGVtcG9yYWxpby93b3JrZmxvdy1zdHJlYW1zXG4gIFsnX190ZW1wb3JhbF93b3JrZmxvd19zdHJlYW1fcHVibGlzaCcsICdzaWduYWwnXSxcbiAgWydfX3RlbXBvcmFsX3dvcmtmbG93X3N0cmVhbV9wb2xsJywgJ3VwZGF0ZSddLFxuICBbJ19fdGVtcG9yYWxfd29ya2Zsb3dfc3RyZWFtX29mZnNldCcsICdxdWVyeSddLFxuXSk7XG5cbi8qKlxuICogVmFsaWRhdGVzIGlmIHRoZSBwcm92aWRlZCBuYW1lIGNvbnRhaW5zIGFueSByZXNlcnZlZCBwcmVmaXhlcyBvciBtYXRjaGVzIGFueSByZXNlcnZlZCBuYW1lcy5cbiAqIFRocm93cyBhIFR5cGVFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzLCB3aXRoIGEgc3BlY2lmaWMgbWVzc2FnZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGlzc3VlXG4gKiBpcyB3aXRoIGEgcmVzZXJ2ZWQgcHJlZml4IG9yIGFuIGV4YWN0IG1hdGNoIHRvIGEgcmVzZXJ2ZWQgbmFtZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSBUaGUgZW50aXR5IHR5cGUgYmVpbmcgY2hlY2tlZFxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gY2hlY2sgYWdhaW5zdCByZXNlcnZlZCBwcmVmaXhlcy9uYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZlJlc2VydmVkTmFtZSh0eXBlOiBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmIElOVEVSTkFMX0hBTkRMRVJfTkFNRV9BTExPV0xJU1QuZ2V0KG5hbWUpICE9PSB0eXBlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSAke3R5cGV9IG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gIH1cblxuICBpZiAobmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fCBuYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSAke3R5cGV9IG5hbWU6ICcke25hbWV9Jywgd2hpY2ggaXMgYSByZXNlcnZlZCBuYW1lYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9OdW1iZXIsIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIG9wdGlvbmFsVHNUb01zIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXRyeWluZyBXb3JrZmxvd3MgYW5kIEFjdGl2aXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBDb2VmZmljaWVudCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV4dCByZXRyeSBpbnRlcnZhbC5cbiAgICogVGhlIG5leHQgcmV0cnkgaW50ZXJ2YWwgaXMgcHJldmlvdXMgaW50ZXJ2YWwgbXVsdGlwbGllZCBieSB0aGlzIGNvZWZmaWNpZW50LlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIGJhY2tvZmZDb2VmZmljaWVudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludGVydmFsIG9mIHRoZSBmaXJzdCByZXRyeS5cbiAgICogSWYgY29lZmZpY2llbnQgaXMgMSB0aGVuIGl0IGlzIHVzZWQgZm9yIGFsbCByZXRyaWVzXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiBAZGVmYXVsdCAxIHNlY29uZFxuICAgKi9cbiAgaW5pdGlhbEludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cy4gV2hlbiBleGNlZWRlZCwgcmV0cmllcyBzdG9wIChldmVuIGlmIHtAbGluayBBY3Rpdml0eU9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dH1cbiAgICogaGFzbid0IGJlZW4gcmVhY2hlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEluZmluaXR5XG4gICAqL1xuICBtYXhpbXVtQXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGludGVydmFsIGJldHdlZW4gcmV0cmllcy5cbiAgICogRXhwb25lbnRpYWwgYmFja29mZiBsZWFkcyB0byBpbnRlcnZhbCBpbmNyZWFzZS5cbiAgICogVGhpcyB2YWx1ZSBpcyB0aGUgY2FwIG9mIHRoZSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAweCBvZiB7QGxpbmsgaW5pdGlhbEludGVydmFsfVxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIG1heGltdW1JbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFwcGxpY2F0aW9uIGZhaWx1cmVzIHR5cGVzIHRvIG5vdCByZXRyeS5cbiAgICovXG4gIG5vblJldHJ5YWJsZUVycm9yVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgVFMgUmV0cnlQb2xpY3kgaW50byBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVSZXRyeVBvbGljeShyZXRyeVBvbGljeTogUmV0cnlQb2xpY3kpOiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB7XG4gIGlmIChyZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgIT0gbnVsbCAmJiByZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICB9XG4gIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgIT0gbnVsbCkge1xuICAgIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgLy8gZHJvcCBmaWVsZCAoSW5maW5pdHkgaXMgdGhlIGRlZmF1bHQpXG4gICAgICBjb25zdCB7IG1heGltdW1BdHRlbXB0czogXywgLi4ud2l0aG91dCB9ID0gcmV0cnlQb2xpY3k7XG4gICAgICByZXRyeVBvbGljeSA9IHdpdGhvdXQ7XG4gICAgfSBlbHNlIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIocmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF4aW11bUludGVydmFsID0gbXNPcHRpb25hbFRvTnVtYmVyKHJldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCk7XG4gIGNvbnN0IGluaXRpYWxJbnRlcnZhbCA9IG1zVG9OdW1iZXIocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsID8/IDEwMDApO1xuICBpZiAobWF4aW11bUludGVydmFsID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgMCcpO1xuICB9XG4gIGlmIChpbml0aWFsSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKG1heGltdW1JbnRlcnZhbCAhPSBudWxsICYmIG1heGltdW1JbnRlcnZhbCA8IGluaXRpYWxJbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwgY2Fubm90IGJlIGxlc3MgdGhhbiBpdHMgaW5pdGlhbEludGVydmFsJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG1zVG9Ucyhpbml0aWFsSW50ZXJ2YWwpLFxuICAgIG1heGltdW1JbnRlcnZhbDogbXNPcHRpb25hbFRvVHMobWF4aW11bUludGVydmFsKSxcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFJldHJ5UG9saWN5IGludG8gYSBUUyBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb21waWxlUmV0cnlQb2xpY3koXG4gIHJldHJ5UG9saWN5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUmV0cnlQb2xpY3kgfCBudWxsXG4pOiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmV0cnlQb2xpY3kpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUF0dGVtcHRzOiByZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPz8gdW5kZWZpbmVkLFxuICAgIG1heGltdW1JbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKSxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG9wdGlvbmFsVHNUb01zKHJldHJ5UG9saWN5LmluaXRpYWxJbnRlcnZhbCksXG4gICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogcmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlcyA/PyB1bmRlZmluZWQsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5ID0gU2VhcmNoQXR0cmlidXRlVmFsdWUgfCBSZWFkb25seTxTZWFyY2hBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVzID0gUmVjb3JkPHN0cmluZywgU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5Pjtcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVbXTtcblxuZXhwb3J0IGNvbnN0IFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSB7XG4gIFRFWFQ6ICdURVhUJyxcbiAgS0VZV09SRDogJ0tFWVdPUkQnLFxuICBJTlQ6ICdJTlQnLFxuICBET1VCTEU6ICdET1VCTEUnLFxuICBCT09MOiAnQk9PTCcsXG4gIERBVEVUSU1FOiAnREFURVRJTUUnLFxuICBLRVlXT1JEX0xJU1Q6ICdLRVlXT1JEX0xJU1QnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSAodHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGUpW2tleW9mIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuLy8gTm90ZTogZW5jb2RlU2VhcmNoQXR0cmlidXRlSW5kZXhlZFZhbHVlVHlwZSBleHBvcnRlZCBmb3IgdXNlIGluIHRlc3RzIHRvIHJlZ2lzdGVyIHNlYXJjaCBhdHRyaWJ1dGVzXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVTZWFyY2hBdHRyaWJ1dGVJbmRleGVkVmFsdWVUeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICAnSU5ERVhFRF9WQUxVRV9UWVBFXydcbj4oXG4gIHtcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUXTogMSxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEXTogMixcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5JTlRdOiAzLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRV06IDQsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTF06IDUsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUVdOiA2LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdJTkRFWEVEX1ZBTFVFX1RZUEVfJ1xuKTtcblxuaW50ZXJmYWNlIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nIHtcbiAgVEVYVDogc3RyaW5nO1xuICBLRVlXT1JEOiBzdHJpbmc7XG4gIElOVDogbnVtYmVyO1xuICBET1VCTEU6IG51bWJlcjtcbiAgQk9PTDogYm9vbGVhbjtcbiAgREFURVRJTUU6IERhdGU7XG4gIEtFWVdPUkRfTElTVDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVmFsdWVGb3JUeXBlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihcbiAgdHlwZTogVCxcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUU6XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEF0dHJpYnV0ZUtleTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZWFyY2hBdHRyaWJ1dGVLZXk8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KG5hbWU6IHN0cmluZywgdHlwZTogVCk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPiB7XG4gIHJldHVybiB7IG5hbWUsIHR5cGUgfTtcbn1cblxuY2xhc3MgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlLCBWID0gSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZTogVDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFY7XG5cbiAgY29uc3RydWN0b3IodHlwZTogVCwgdmFsdWU6IFYpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogViB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG59XG5cbi8vIEludGVybmFsIHR5cGUgZm9yIGNsYXNzIHByaXZhdGUgZGF0YS5cbi8vIEV4cG9ydGVkIGZvciB1c2UgaW4gcGF5bG9hZCBjb252ZXJzaW9uLlxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQ+IHt9XG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFxuICBULFxuICBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGxcbj4ge31cblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB9O1xufVtTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGwgfTtcbn1bU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICBwcml2YXRlIHNlYXJjaEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10pIHtcbiAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcGFpciBvZiBpbml0aWFsQXR0cmlidXRlcykge1xuICAgICAgaWYgKHBhaXIua2V5Lm5hbWUgaW4gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHNlYXJjaCBhdHRyaWJ1dGUga2V5OiAke3BhaXIua2V5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQ8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+KTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNba2V5Lm5hbWVdO1xuICAgIC8vIEtleSBub3QgZm91bmQgb3IgdHlwZSBtaXNtYXRjaC5cbiAgICBpZiAoYXR0ciA9PT0gdW5kZWZpbmVkIHx8ICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGtleS50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHIudmFsdWU7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIGluc3RhbmNlICovXG4gIGNvcHkoKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgbGV0IHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIC8vIEZvciBub24tcHJpbWl0aXZlIHR5cGVzLCBjcmVhdGUgYSBkZWVwIGNvcHlcbiAgICAgIGlmIChhdHRyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKGF0dHIudmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGF0dHIudmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gWy4uLmF0dHIudmFsdWVdO1xuICAgICAgfVxuICAgICAgc3RhdGVba2V5XSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKGF0dHIudHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXR1cm4gdmFsdWUgd2l0aCBtYW51YWxseSBhc3NpZ25lZCBzdGF0ZS5cbiAgICBjb25zdCByZXMgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKCk7XG4gICAgcmVzLnNlYXJjaEF0dHJpYnV0ZXMgPSBzdGF0ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICogUmV0dXJuIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBhcyBTZWFyY2hBdHRyaWJ1dGVQYWlyW11cbiAgICogRGVmYXVsdCB0b0pTT04gbWV0aG9kIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQncyBKU09OIHJlcHJlc2VudGF0aW9uIGluY2x1ZGVzIHByaXZhdGUgc3RhdGUuXG4gICAqL1xuICB0b0pTT04oKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgaW5zdGFuY2Ugd2l0aCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGVzLiAqL1xuICB1cGRhdGVDb3B5KHVwZGF0ZXM6IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgIGNvbnN0IHJlcyA9IHRoaXMuY29weSgpO1xuICAgIC8vIEFwcGx5IHVwZGF0ZXMuXG4gICAgcmVzLnVwZGF0ZSh1cGRhdGVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gUGVyZm9ybXMgZGlyZWN0IG11dGF0aW9uIG9uIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICBwcml2YXRlIHVwZGF0ZSh1cGRhdGVzOiBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pIHtcbiAgICAvLyBBcHBseSB1cGRhdGVzLlxuICAgIGZvciAoY29uc3QgcGFpciBvZiB1cGRhdGVzKSB7XG4gICAgICAvLyBEZWxldGUgYXR0cmlidXRlLlxuICAgICAgaWYgKHBhaXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRGVsZXRlIG9ubHkgaWYgdGhlIHVwZGF0ZSBtYXRjaGVzIGEga2V5IGFuZCB0eXBlLlxuICAgICAgICBjb25zdCBhdHRyVmFsID0gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbCAmJiBhdHRyVmFsLnR5cGUgPT09IHBhaXIua2V5LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSBhdHRyaWJ1dGUuXG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwoKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICBjb25zdCByZXM6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cktleSA9IHsgbmFtZToga2V5LCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIFNhbml0eSBjaGVjaywgc2hvdWxkIGFsd2F5cyBiZSBsZWdhbC5cbiAgICAgIGlmIChpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHJLZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgcmVzLnB1c2goeyBrZXk6IGF0dHJLZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0S2V5RnJvbVVudHlwZWQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seVxuICApOiBTZWFyY2hBdHRyaWJ1dGVLZXk8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVW5wYWNrIHNpbmdsZS1lbGVtZW50IGFycmF5cy5cbiAgICBjb25zdCB2YWwgPSB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbCkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgLy8gQ2hlY2sgaWYgdmFsIGlzIGFuIElTTyBzdHJpbmcsIGlmIHNvLCByZXR1cm4gYSBEQVRFVElNRSBrZXkuXG4gICAgICAgIGlmICghaXNOYU4oRGF0ZS5wYXJzZSh2YWwpKSAmJiBEYXRlLnBhcnNlKHZhbCkgPT09IG5ldyBEYXRlKHZhbCkuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQgfTtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgIHR5cGU6IE51bWJlci5pc0ludGVnZXIodmFsKSA/IFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UIDogU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEUsXG4gICAgICAgIH07XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0wgfTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZToga2V5LCB0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b01ldGFkYXRhVHlwZSh0eXBlOiBTZWFyY2hBdHRyaWJ1dGVUeXBlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUOlxuICAgICAgICByZXR1cm4gJ1RleHQnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICAgIHJldHVybiAnS2V5d29yZCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgICByZXR1cm4gJ0ludCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFOlxuICAgICAgICByZXR1cm4gJ0RvdWJsZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgICAgcmV0dXJuICdCb29sJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTpcbiAgICAgICAgcmV0dXJuICdEYXRldGltZSc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUOlxuICAgICAgICByZXR1cm4gJ0tleXdvcmRMaXN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWFyY2ggYXR0cmlidXRlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdG9TZWFyY2hBdHRyaWJ1dGVUeXBlKHR5cGU6IHN0cmluZyk6IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIFRoZSB0eXBlIG1ldGFkYXRhIGlzIHVzdWFsbHkgaW4gUGFzY2FsQ2FzZSAoZS5nLiBcIktleXdvcmRMaXN0XCIpIGJ1dCBpblxuICAgIC8vIHJhcmUgY2FzZXMgbWF5IGJlIGluIFNDUkVBTUlOR19TTkFLRV9DQVNFIChlLmcuIFwiSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVFwiKS5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ1RleHQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX1RFWFQnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUO1xuICAgICAgY2FzZSAnS2V5d29yZCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ7XG4gICAgICBjYXNlICdJbnQnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0lOVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLklOVDtcbiAgICAgIGNhc2UgJ0RvdWJsZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfRE9VQkxFJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFO1xuICAgICAgY2FzZSAnQm9vbCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfQk9PTCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkJPT0w7XG4gICAgICBjYXNlICdEYXRldGltZSc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfREFURVRJTUUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTtcbiAgICAgIGNhc2UgJ0tleXdvcmRMaXN0JzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEX0xJU1QnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5pbXBvcnQgbXMgZnJvbSAnbXMnO1xuaW1wb3J0IHR5cGUgeyBnb29nbGUgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBOT1RFOiB0aGVzZSBhcmUgdGhlIHNhbWUgaW50ZXJmYWNlIGluIEpTXG4vLyBnb29nbGUucHJvdG9idWYuSUR1cmF0aW9uO1xuLy8gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG4vLyBUaGUgY29udmVyc2lvbiBmdW5jdGlvbnMgYmVsb3cgc2hvdWxkIHdvcmsgZm9yIGJvdGhcblxuZXhwb3J0IHR5cGUgVGltZXN0YW1wID0gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG5cbi8qKlxuICogQSBkdXJhdGlvbiwgZXhwcmVzc2VkIGVpdGhlciBhcyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIG9yIGFzIGEge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uID0gU3RyaW5nVmFsdWUgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCwgdGhyb3dzIGEgVHlwZUVycm9yLCB3aXRoIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJHtmaWVsZE5hbWV9IHRvIGJlIGEgdGltZXN0YW1wLCBnb3QgJHt0c31gKTtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIGNvbnN0IHsgc2Vjb25kcywgbmFub3MgfSA9IHRzO1xuICByZXR1cm4gKHNlY29uZHMgfHwgTG9uZy5VWkVSTylcbiAgICAubXVsKDEwMDApXG4gICAgLmFkZChNYXRoLmZsb29yKChuYW5vcyB8fCAwKSAvIDEwMDAwMDApKVxuICAgIC50b051bWJlcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7XG4gIGNvbnN0IG5hbm9zID0gKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMDtcbiAgaWYgKE51bWJlci5pc05hTihzZWNvbmRzKSB8fCBOdW1iZXIuaXNOYU4obmFub3MpKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgbWlsbGlzICR7bWlsbGlzfWApO1xuICB9XG4gIHJldHVybiB7IHNlY29uZHM6IExvbmcuZnJvbU51bWJlcihzZWNvbmRzKSwgbmFub3MgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIG1zTnVtYmVyVG9Ucyhtc1RvTnVtYmVyKHN0cikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyID8gbXNUb1RzKHN0cikgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1zVG9OdW1iZXIodmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcmV0dXJuIG1zV2l0aFZhbGlkYXRpb24odmFsKTtcbn1cblxuZnVuY3Rpb24gbXNXaXRoVmFsaWRhdGlvbihzdHI6IFN0cmluZ1ZhbHVlKTogbnVtYmVyIHtcbiAgY29uc3QgbWlsbGlzID0gbXMoc3RyKTtcbiAgaWYgKG1pbGxpcyA9PSBudWxsIHx8IGlzTmFOKG1pbGxpcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGR1cmF0aW9uIHN0cmluZzogJyR7c3RyfSdgKTtcbiAgfVxuICByZXR1cm4gbWlsbGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUodHNUb01zKHRzKSk7XG59XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHJlcXVpcmVkVHNUb01zKHRzLCBmaWVsZE5hbWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHQgKGltcG9ydGVkIHZpYSBzY2hlZHVsZS1oZWxwZXJzLnRzKVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRGF0ZVRvVHMoZGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICBpZiAoZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IGRhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBtc1RvVHMoZGF0ZS5nZXRUaW1lKCkpO1xufVxuIiwiZXhwb3J0IHR5cGUgTm9uTnVsbGFibGVPYmplY3Q8VD4gPSB7IFtQIGluIGtleW9mIFRdLT86IE5vbk51bGxhYmxlPFRbUF0+IH07XG5cbi8qKiBTaG9ydGhhbmQgYWxpYXMgKi9cbmV4cG9ydCB0eXBlIEFueUZ1bmMgPSAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuLyoqIEEgdHVwbGUgd2l0aG91dCBpdHMgbGFzdCBlbGVtZW50ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdDxUPiA9IFQgZXh0ZW5kcyBbLi4uaW5mZXIgUkVTVCwgYW55XSA/IFJFU1QgOiBuZXZlcjtcblxuLyoqIEYgd2l0aCBhbGwgYXJndW1lbnRzIGJ1dCB0aGUgbGFzdCAqL1xuZXhwb3J0IHR5cGUgT21pdExhc3RQYXJhbTxGIGV4dGVuZHMgQW55RnVuYz4gPSAoLi4uYXJnczogT21pdExhc3Q8UGFyYW1ldGVyczxGPj4pID0+IFJldHVyblR5cGU8Rj47XG5cbmV4cG9ydCB0eXBlIE9taXRGaXJzdDxUPiA9IFQgZXh0ZW5kcyBbYW55LCAuLi5pbmZlciBSRVNUXSA/IFJFU1QgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgT21pdEZpcnN0UGFyYW08VD4gPSBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgPyAoLi4uYXJnczogT21pdEZpcnN0PFBhcmFtZXRlcnM8VD4+KSA9PiBSZXR1cm5UeXBlPFQ+XG4gIDogbmV2ZXI7XG5cbi8qKiBSZXF1aXJlIHRoYXQgVCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzIGRlZmluZWQgKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVBdExlYXN0T25lPFQsIEtleXMgZXh0ZW5kcyBrZXlvZiBUID0ga2V5b2YgVD4gPSBQaWNrPFQsIEV4Y2x1ZGU8a2V5b2YgVCwgS2V5cz4+ICZcbiAge1xuICAgIFtLIGluIEtleXNdLT86IFJlcXVpcmVkPFBpY2s8VCwgSz4+ICYgUGFydGlhbDxQaWNrPFQsIEV4Y2x1ZGU8S2V5cywgSz4+PjtcbiAgfVtLZXlzXTtcblxuLyoqIFZlcmlmeSB0aGF0IGFuIHR5cGUgX0NvcHkgZXh0ZW5kcyBfT3JpZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRXh0ZW5kczxfT3JpZywgX0NvcHkgZXh0ZW5kcyBfT3JpZz4oKTogdm9pZCB7XG4gIC8vIG5vb3AsIGp1c3QgdHlwZSBjaGVja1xufVxuXG5leHBvcnQgdHlwZSBSZXBsYWNlPEJhc2UsIE5ldz4gPSBPbWl0PEJhc2UsIGtleW9mIE5ldz4gJiBOZXc7XG5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS91bmlvbi10by1pbnRlcnNlY3Rpb24uZC50c1xuLy8gTUlUIG9yIENDMC0xLjAg4oCUIEl0IGlzIG1lYW50IHRvIGJlIGNvcGllZCBpbnRvIHlvdXIgY29kZWJhc2UgcmF0aGVyIHRoYW4gYmVpbmcgdXNlZCBhcyBhIGRlcGVuZGVuY3kuXG5leHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9XG4gIC8vIGBleHRlbmRzIHVua25vd25gIGlzIGFsd2F5cyBnb2luZyB0byBiZSB0aGUgY2FzZSBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBgVW5pb25gIGludG8gYVxuICAvLyBbZGlzdHJpYnV0aXZlIGNvbmRpdGlvbmFsIHR5cGVdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL3JlbGVhc2Utbm90ZXMvdHlwZXNjcmlwdC0yLTguaHRtbCNkaXN0cmlidXRpdmUtY29uZGl0aW9uYWwtdHlwZXMpLlxuICAoXG4gICAgVW5pb24gZXh0ZW5kcyB1bmtub3duXG4gICAgICA/IC8vIFRoZSB1bmlvbiB0eXBlIGlzIHVzZWQgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gYSBmdW5jdGlvbiBzaW5jZSB0aGUgdW5pb25cbiAgICAgICAgLy8gb2YgZnVuY3Rpb24gYXJndW1lbnRzIGlzIGFuIGludGVyc2VjdGlvbi5cbiAgICAgICAgKGRpc3RyaWJ1dGVkVW5pb246IFVuaW9uKSA9PiB2b2lkXG4gICAgICA6IC8vIFRoaXMgd29uJ3QgaGFwcGVuLlxuICAgICAgICBuZXZlclxuICApIGV4dGVuZHMgLy8gSW5mZXIgdGhlIGBJbnRlcnNlY3Rpb25gIHR5cGUgc2luY2UgVHlwZVNjcmlwdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbmFsXG4gIC8vIGFyZ3VtZW50cyBvZiB1bmlvbnMgb2YgZnVuY3Rpb25zIGFzIGFuIGludGVyc2VjdGlvbiBvZiB0aGUgdW5pb24uXG4gIChtZXJnZWRJbnRlcnNlY3Rpb246IGluZmVyIEludGVyc2VjdGlvbikgPT4gdm9pZFxuICAgID8gLy8gVGhlIGAmIFVuaW9uYCBpcyB0byBhbGxvdyBpbmRleGluZyBieSB0aGUgcmVzdWx0aW5nIHR5cGVcbiAgICAgIEludGVyc2VjdGlvbiAmIFVuaW9uXG4gICAgOiBuZXZlcjtcblxudHlwZSBJc0VxdWFsPEEsIEI+ID0gKDxHPigpID0+IEcgZXh0ZW5kcyBBID8gMSA6IDIpIGV4dGVuZHMgPEc+KCkgPT4gRyBleHRlbmRzIEIgPyAxIDogMiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN5bWJvbCB8IGJpZ2ludDtcblxudHlwZSBJc051bGw8VD4gPSBbVF0gZXh0ZW5kcyBbbnVsbF0gPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNVbmtub3duPFQ+ID0gdW5rbm93biBleHRlbmRzIFQgLy8gYFRgIGNhbiBiZSBgdW5rbm93bmAgb3IgYGFueWBcbiAgPyBJc051bGw8VD4gZXh0ZW5kcyBmYWxzZSAvLyBgYW55YCBjYW4gYmUgYG51bGxgLCBidXQgYHVua25vd25gIGNhbid0IGJlXG4gICAgPyB0cnVlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG50eXBlIE9iamVjdFZhbHVlPFQsIEs+ID0gSyBleHRlbmRzIGtleW9mIFRcbiAgPyBUW0tdXG4gIDogVG9TdHJpbmc8Sz4gZXh0ZW5kcyBrZXlvZiBUXG4gICAgPyBUW1RvU3RyaW5nPEs+XVxuICAgIDogSyBleHRlbmRzIGAke2luZmVyIE51bWJlcksgZXh0ZW5kcyBudW1iZXJ9YFxuICAgICAgPyBOdW1iZXJLIGV4dGVuZHMga2V5b2YgVFxuICAgICAgICA/IFRbTnVtYmVyS11cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBuZXZlcjtcblxudHlwZSBUb1N0cmluZzxUPiA9IFQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgPyBgJHtUfWAgOiBuZXZlcjtcblxudHlwZSBLZXlzT2ZVbmlvbjxPYmplY3RUeXBlPiA9IE9iamVjdFR5cGUgZXh0ZW5kcyB1bmtub3duID8ga2V5b2YgT2JqZWN0VHlwZSA6IG5ldmVyO1xuXG50eXBlIEFycmF5RWxlbWVudDxUPiA9IFQgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10gPyBUWzBdIDogbmV2ZXI7XG5cbnR5cGUgRXhhY3RPYmplY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9IHtcbiAgW0tleSBpbiBrZXlvZiBQYXJhbWV0ZXJUeXBlXTogRXhhY3Q8UGFyYW1ldGVyVHlwZVtLZXldLCBPYmplY3RWYWx1ZTxJbnB1dFR5cGUsIEtleT4+O1xufSAmIFJlY29yZDxFeGNsdWRlPGtleW9mIElucHV0VHlwZSwgS2V5c09mVW5pb248UGFyYW1ldGVyVHlwZT4+LCBuZXZlcj47XG5cbmV4cG9ydCB0eXBlIEV4YWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gPVxuICAvLyBCZWZvcmUgZGlzdHJpYnV0aW5nLCBjaGVjayBpZiB0aGUgdHdvIHR5cGVzIGFyZSBlcXVhbCBhbmQgaWYgc28sIHJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGUgaW1tZWRpYXRlbHlcbiAgSXNFcXVhbDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGFyYW1ldGVyVHlwZVxuICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIHByaW1pdGl2ZSwgcmV0dXJuIGl0IGFzIGlzIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGl0IGJlaW5nIGNvbnZlcnRlZCB0byBhIGNvbXBsZXggdHlwZVxuICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIFByaW1pdGl2ZVxuICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gdW5rbm93biwgcmV0dXJuIGl0IGFzIGlzIGltbWVkaWF0ZWx5IHRvIGF2b2lkIGl0IGJlaW5nIGNvbnZlcnRlZCB0byBhIGNvbXBsZXggdHlwZVxuICAgICAgICBJc1Vua25vd248UGFyYW1ldGVyVHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgICAgID8gdW5rbm93blxuICAgICAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBGdW5jdGlvbiwgcmV0dXJuIGl0IGFzIGlzIGJlY2F1c2UgdGhpcyB0eXBlIGlzIG5vdCBjYXBhYmxlIG9mIGhhbmRsaW5nIGZ1bmN0aW9uLCBsZWF2ZSBpdCB0byBUeXBlU2NyaXB0XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBGdW5jdGlvblxuICAgICAgICAgID8gUGFyYW1ldGVyVHlwZVxuICAgICAgICAgIDogLy8gQ29udmVydCB1bmlvbiBvZiBhcnJheSB0byBhcnJheSBvZiB1bmlvbjogQVtdICYgQltdID0+IChBICYgQilbXVxuICAgICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIHVua25vd25bXVxuICAgICAgICAgICAgPyBBcnJheTxFeGFjdDxBcnJheUVsZW1lbnQ8UGFyYW1ldGVyVHlwZT4sIEFycmF5RWxlbWVudDxJbnB1dFR5cGU+Pj5cbiAgICAgICAgICAgIDogLy8gSW4gVHlwZVNjcmlwdCwgQXJyYXkgaXMgYSBzdWJ0eXBlIG9mIFJlYWRvbmx5QXJyYXksIHNvIGFsd2F5cyB0ZXN0IEFycmF5IGJlZm9yZSBSZWFkb25seUFycmF5LlxuICAgICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdXG4gICAgICAgICAgICAgID8gUmVhZG9ubHlBcnJheTxFeGFjdDxBcnJheUVsZW1lbnQ8UGFyYW1ldGVyVHlwZT4sIEFycmF5RWxlbWVudDxJbnB1dFR5cGU+Pj5cbiAgICAgICAgICAgICAgOiBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+O1xuLy8gRW5kIG9mIGJvcnJvdyBmcm9tICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG5cbmV4cG9ydCB0eXBlIFJlbW92ZVByZWZpeDxQcmVmaXggZXh0ZW5kcyBzdHJpbmcsIEtleXMgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBbayBpbiBLZXlzXTogayBleHRlbmRzIGAke1ByZWZpeH0ke2luZmVyIFN1ZmZpeH1gID8gU3VmZml4IDogbmV2ZXI7XG59W0tleXNdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydHk8WCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICByZWNvcmQ6IFgsXG4gIHByb3A6IFlcbik6IHJlY29yZCBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIHByb3AgaW4gcmVjb3JkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duUHJvcGVydGllczxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcHM6IFlbXVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcHMuZXZlcnkoKHByb3ApID0+IHByb3AgaW4gcmVjb3JkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciB7XG4gIHJldHVybiAoXG4gICAgaXNSZWNvcmQoZXJyb3IpICYmXG4gICAgdHlwZW9mIGVycm9yLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgKGVycm9yLnN0YWNrID09IG51bGwgfHwgdHlwZW9mIGVycm9yLnN0YWNrID09PSAnc3RyaW5nJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yICYgeyBuYW1lOiAnQWJvcnRFcnJvcicgfSB7XG4gIHJldHVybiBpc0Vycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcic7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5tZXNzYWdlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBFcnJvcldpdGhDb2RlIHtcbiAgY29kZTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvcldpdGhDb2RlIHtcbiAgcmV0dXJuIGlzUmVjb3JkKGVycm9yKSAmJiB0eXBlb2YgZXJyb3IuY29kZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5jb2RlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgc29tZSB0eXBlIGlzIHRoZSBuZXZlciB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROZXZlcihtc2c6IHN0cmluZywgeDogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IobXNnICsgJzogJyArIHgpO1xufVxuXG5leHBvcnQgdHlwZSBDbGFzczxFIGV4dGVuZHMgRXJyb3I+ID0ge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogRTtcbiAgcHJvdG90eXBlOiBFO1xufTtcblxuLyoqXG4gKiBBIGRlY29yYXRvciB0byBiZSB1c2VkIG9uIGVycm9yIGNsYXNzZXMuIEl0IGFkZHMgdGhlICduYW1lJyBwcm9wZXJ0eSBBTkQgcHJvdmlkZXMgYSBjdXN0b21cbiAqICdpbnN0YW5jZW9mJyBoYW5kbGVyIHRoYXQgd29ya3MgY29ycmVjdGx5IGFjcm9zcyBleGVjdXRpb24gY29udGV4dHMuXG4gKlxuICogIyMjIERldGFpbHMgIyMjXG4gKlxuICogQWNjb3JkaW5nIHRvIHRoZSBFY21hU2NyaXB0J3Mgc3BlYywgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSmF2YVNjcmlwdCdzIGB4IGluc3RhbmNlb2YgWWAgb3BlcmF0b3IgaXMgdG8gd2FsayB1cCB0aGVcbiAqIHByb3RvdHlwZSBjaGFpbiBvZiBvYmplY3QgJ3gnLCBjaGVja2luZyBpZiBhbnkgY29uc3RydWN0b3IgaW4gdGhhdCBoaWVyYXJjaHkgaXMgX2V4YWN0bHkgdGhlIHNhbWUgb2JqZWN0XyBhcyB0aGVcbiAqIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICdZJy5cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCBpdCBoYXBwZW5zIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGF0IGRpZmZlcmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBvYmplY3RzIGdldCBjcmVhdGVkIGZvciB3aGF0XG4gKiBhcHBlYXJzIHRvIGJlIHRoZSB2ZXJ5IHNhbWUgY2xhc3MuIFRoaXMgbGVhZHMgdG8gc3VycHJpc2luZyBiZWhhdmlvciB3aGVyZSBgaW5zdGFuY2VvZmAgcmV0dXJucyBmYWxzZSB0aG91Z2ggaXQgaXNcbiAqIGtub3duIHRoYXQgdGhlIG9iamVjdCBpcyBpbmRlZWQgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4gT25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgd2hlbiBjb25zdHJ1Y3RvclxuICogJ1knIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGUgY29uc3R1Y3RvciB3aXRoIHdoaWNoICd4JyB3YXMgaW5zdGFudGlhdGVkLiBBbm90aGVyIGNhc2UgaXMgd2hlbiB0d28gY29waWVzXG4gKiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGdldHMgbG9hZGVkIGluIHRoZSBzYW1lIHJlYWxtLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIHRlbmRzIHRvIGNhdXNlIGlzc3VlcyB3aGVuIGNyb3NzaW5nIHRoZSB3b3JrZmxvdy1zYW5kYm94aW5nIGJvdW5kYXJ5IChzaW5jZSBOb2RlJ3Mgdm0gbW9kdWxlXG4gKiByZWFsbHkgY3JlYXRlcyBuZXcgZXhlY3V0aW9uIHJlYWxtcyksIGFzIHdlbGwgYXMgd2hlbiBydW5uaW5nIHRlc3RzIHVzaW5nIEplc3QgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdGpzL2plc3QvaXNzdWVzLzI1NDlcbiAqIGZvciBzb21lIGRldGFpbHMgb24gdGhhdCBvbmUpLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW5qZWN0cyBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBpbnRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6Jywgd2hpY2ggaXMgYm90aCBjcm9zcy1yZWFsbSBzYWZlIGFuZFxuICogY3Jvc3MtY29waWVzLW9mLXRoZS1zYW1lLWxpYiBzYWZlLiBJdCB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIHN5bWJvbCBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIGFuZCB0aGVuXG4gKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoYXQgc3ltYm9sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3I8RSBleHRlbmRzIEVycm9yPihtYXJrZXJOYW1lOiBzdHJpbmcpOiAoY2xheno6IENsYXNzPEU+KSA9PiB2b2lkIHtcbiAgcmV0dXJuIChjbGF6ejogQ2xhc3M8RT4pOiB2b2lkID0+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBTeW1ib2wuZm9yKGBfX3RlbXBvcmFsX2lzJHttYXJrZXJOYW1lfWApO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgJ25hbWUnLCB7IHZhbHVlOiBtYXJrZXJOYW1lLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYmplY3Qtc2hvcnRoYW5kXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKHRoaXM6IGFueSwgZXJyb3I6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcyA9PT0gY2xhenopIHtcbiAgICAgICAgICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIChlcnJvciBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gJ3RoaXMnIG11c3QgYmUgYSBfc3ViY2xhc3NfIG9mIGNsYXp6IHRoYXQgZG9lc24ndCByZWRlZmluZWQgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIHNvIHRoYXQgaXQgaW5oZXJpdGVkXG4gICAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAgIC8vIGB4IGluc3RhbmNlb2YgU3ViY2xhc3NPZlBhcmVudGAgd291bGQgcmV0dXJuIHRydWUgZm9yIGFueSBpbnN0YW5jZSBvZiAnUGFyZW50Jywgd2hpY2ggaXMgY2xlYXJseSB3cm9uZy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAgIC8vIHJlZGVmaW5lIFtTeW1ib2wuaGFzSW5zdGFuY2VdLCBidXQgd2UgY2FuJ3QgZW5mb3JjZSB0aGF0LiBXZSB0aGVyZWZvcmUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2VvZlxuICAgICAgICAgIC8vIGJlaGF2aW9yICh3aGljaCBpcyBOT1QgY3Jvc3MtcmVhbG0gc2FmZSkuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZXJyb3IpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZCB9IGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL2NvbnZlcnRlci9zZXJpYWxpemF0aW9uLWNvbnRleHQnO1xuXG4vKipcbiAqIFVzZXIgbWV0YWRhdGEgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gd29ya2Zsb3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1ldGFkYXRhIHtcbiAgLyoqIEBleHBlcmltZW50YWwgQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2UgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcbiAgLyoqIEBleHBlcmltZW50YWwgRml4ZWQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjb21tYW5kIGZvciBsb25nZXItdGV4dCBkZXNjcmlwdGlvbiwgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJNZXRhZGF0YVRvUGF5bG9hZChcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgc3RhdGljU3VtbWFyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdGF0aWNEZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuKTogdGVtcG9yYWwuYXBpLnNkay52MS5JVXNlck1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN0YXRpY1N1bW1hcnkgPT0gbnVsbCAmJiBzdGF0aWNEZXRhaWxzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3VtbWFyeSA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNTdW1tYXJ5LCBjb250ZXh0KTtcbiAgY29uc3QgZGV0YWlscyA9IGNvbnZlcnRPcHRpb25hbFRvUGF5bG9hZChwYXlsb2FkQ29udmVydGVyLCBzdGF0aWNEZXRhaWxzLCBjb250ZXh0KTtcblxuICBpZiAoc3VtbWFyeSA9PSBudWxsICYmIGRldGFpbHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBzdW1tYXJ5LCBkZXRhaWxzIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgYXMgVmVyc2lvbmluZ0ludGVudFN0cmluZyB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGNoZWNrRXh0ZW5kcyB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLy8gQXZvaWQgaW1wb3J0aW5nIHRoZSBwcm90byBpbXBsZW1lbnRhdGlvbiB0byByZWR1Y2Ugd29ya2Zsb3cgYnVuZGxlIHNpemVcbi8vIENvcGllZCBmcm9tIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnRcbi8qKlxuICogUHJvdG9idWYgZW51bSByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgVmVyc2lvbmluZ0ludGVudFN0cmluZ30uXG4gKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25pbmdJbnRlbnQge1xuICBVTlNQRUNJRklFRCA9IDAsXG4gIENPTVBBVElCTEUgPSAxLFxuICBERUZBVUxUID0gMixcbn1cblxuY2hlY2tFeHRlbmRzPGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQsIFZlcnNpb25pbmdJbnRlbnQ+KCk7XG5jaGVja0V4dGVuZHM8VmVyc2lvbmluZ0ludGVudCwgY29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudD4oKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKGludGVudDogVmVyc2lvbmluZ0ludGVudFN0cmluZyB8IHVuZGVmaW5lZCk6IFZlcnNpb25pbmdJbnRlbnQge1xuICBzd2l0Y2ggKGludGVudCkge1xuICAgIGNhc2UgJ0RFRkFVTFQnOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuREVGQVVMVDtcbiAgICBjYXNlICdDT01QQVRJQkxFJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkNPTVBBVElCTEU7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5VTlNQRUNJRklFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIoJ1VuZXhwZWN0ZWQgVmVyc2lvbmluZ0ludGVudCcsIGludGVudCk7XG4gIH1cbn1cbiIsIi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaW50ZW5kcyBjZXJ0YWluIGNvbW1hbmRzIHRvIGJlIHJ1biBvbiBhIGNvbXBhdGlibGUgd29ya2VyIEJ1aWxkIElkIHZlcnNpb24gb3Igbm90LlxuICpcbiAqIGBDT01QQVRJQkxFYCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcnVuIG9uIGEgd29ya2VyIHdpdGggY29tcGF0aWJsZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLiBJdCBtYXkgbm90IGJlXG4gKiBwb3NzaWJsZSBpZiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUgZG9lcyBub3QgYWxzbyBoYXZlIGtub3dsZWRnZSBvZiB0aGUgY3VycmVudCB3b3JrZXIncyBCdWlsZCBJZC5cbiAqXG4gKiBgREVGQVVMVGAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiB0aGUgdGFyZ2V0IHRhc2sgcXVldWUncyBjdXJyZW50IG92ZXJhbGwtZGVmYXVsdCBCdWlsZCBJZC5cbiAqXG4gKiBXaGVyZSB0aGlzIHR5cGUgaXMgYWNjZXB0ZWQgb3B0aW9uYWxseSwgYW4gdW5zZXQgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIFNESyBzaG91bGQgY2hvb3NlIHRoZSBtb3N0IHNlbnNpYmxlIGRlZmF1bHRcbiAqIGJlaGF2aW9yIGZvciB0aGUgdHlwZSBvZiBjb21tYW5kLCBhY2NvdW50aW5nIGZvciB3aGV0aGVyIHRoZSBjb21tYW5kIHdpbGwgYmUgcnVuIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgdGhlXG4gKiBjdXJyZW50IHdvcmtlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHN0YXJ0aW5nIFdvcmtmbG93cyBpcyBgREVGQVVMVGAuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBXb3JrZmxvd3Mgc3RhcnRpbmdcbiAqIEFjdGl2aXRpZXMsIHN0YXJ0aW5nIENoaWxkIFdvcmtmbG93cywgb3IgQ29udGludWluZyBBcyBOZXcgaXMgYENPTVBBVElCTEVgLlxuICpcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nSW50ZW50ID0gJ0NPTVBBVElCTEUnIHwgJ0RFRkFVTFQnO1xuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBhIHNwZWNpZmljIHdvcmtlciBkZXBsb3ltZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICByZWFkb25seSBkZXBsb3ltZW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gb2YgYSBkZXBsb3ltZW50IHZlcnNpb24sIHdoaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXRcbiAqIGBkZXBsb3ltZW50TmFtZS5idWlsZElkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsU3RyaW5nKHZlcnNpb246IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3ZlcnNpb24uZGVwbG95bWVudE5hbWV9LiR7dmVyc2lvbi5idWlsZElkfWA7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHdoZW4gYSB3b3JrZmxvdyBtaWdodCBtb3ZlIGZyb20gYSB3b3JrZXIgb2Ygb25lIEJ1aWxkIElkIHRvIGFub3RoZXIuXG4gKlxuICogKiAnUElOTkVEJyAtIFRoZSB3b3JrZmxvdyB3aWxsIGJlIHBpbm5lZCB0byB0aGUgY3VycmVudCBCdWlsZCBJRCB1bmxlc3MgbWFudWFsbHkgbW92ZWQuXG4gKiAqICdBVVRPX1VQR1JBREUnIC0gVGhlIHdvcmtmbG93IHdpbGwgYXV0b21hdGljYWxseSBtb3ZlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiAoZGVmYXVsdCBCdWlsZCBJRFxuICogICAgb2YgdGhlIHRhc2sgcXVldWUpIHdoZW4gdGhlIG5leHQgdGFzayBpcyBkaXNwYXRjaGVkLlxuICovXG5leHBvcnQgY29uc3QgVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBQSU5ORUQ6ICdQSU5ORUQnLFxuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yKVtrZXlvZiB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZVZlcnNpb25pbmdCZWhhdmlvcl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW1ZlcnNpb25pbmdCZWhhdmlvci5QSU5ORURdOiAxLFxuICAgIFtWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHZlcnNpb25pbmcgb3ZlcnJpZGVzLiBGb3IgZXhhbXBsZSwgd2hlbiBzdGFydGluZyB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdPdmVycmlkZSA9IFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB8ICdBVVRPX1VQR1JBREUnO1xuXG4vKipcbiAqIFdvcmtmbG93IHdpbGwgYmUgcGlubmVkIHRvIGEgc3BlY2lmaWMgZGVwbG95bWVudCB2ZXJzaW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpbm5lZFZlcnNpb25pbmdPdmVycmlkZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2VyIGRlcGxveW1lbnQgdmVyc2lvbiB0byBwaW4gdGhlIHdvcmtmbG93IHRvLlxuICAgKi9cbiAgcGlubmVkVG86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdyB3aWxsIGF1dG8tdXBncmFkZSB0byB0aGUgY3VycmVudCBkZXBsb3ltZW50IHZlcnNpb24gb24gdGhlIG5leHQgd29ya2Zsb3cgdGFzay5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b1VwZ3JhZGVWZXJzaW9uaW5nT3ZlcnJpZGUgPSAnQVVUT19VUEdSQURFJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2ZXJzaW9uaW5nIGJlaGF2aW9yIHRvIGJlIHVzZWQgYnkgdGhlIGZpcnN0IHRhc2sgb2YgYSBuZXcgd29ya2Zsb3cgcnVuIGluIGEgY29udGludWUtYXMtbmV3IGNoYWluLlxuICpcbiAqIEFVVE9fVVBHUkFERSAtIFN0YXJ0IHRoZSBuZXcgcnVuIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IuIFVzZSB0aGUgVGFyZ2V0IFZlcnNpb24gb2YgdGhlIHdvcmtmbG93J3MgdGFzayBxdWV1ZSBhdFxuICogICBzdGFydC10aW1lLCBhcyBBdXRvVXBncmFkZSB3b3JrZmxvd3MgZG8uIEFmdGVyIHRoZSBmaXJzdCB3b3JrZmxvdyB0YXNrIGNvbXBsZXRlcywgdXNlIHdoYXRldmVyXG4gKiAgIFZlcnNpb25pbmcgQmVoYXZpb3IgdGhlIHdvcmtmbG93IGlzIGFubm90YXRlZCB3aXRoIGluIHRoZSB3b3JrZmxvdyBjb2RlLlxuICpcbiAqICAgTm90ZSB0aGF0IGlmIHRoZSBwcmV2aW91cyB3b3JrZmxvdyBoYWQgYSBQaW5uZWQgb3ZlcnJpZGUsIHRoYXQgb3ZlcnJpZGUgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlXG4gKiAgIG5ldyB3b3JrZmxvdyBydW4gcmVnYXJkbGVzcyBvZiB0aGUgQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvciBzcGVjaWZpZWQgaW4gdGhlIGNvbnRpbnVlLWFzLW5ld1xuICogICBjb21tYW5kLiBJZiBhIFBpbm5lZCBvdmVycmlkZSBpcyBpbmhlcml0ZWQgYnkgdGhlIG5ldyBydW4sIGFuZCB0aGUgbmV3IHJ1biBzdGFydHMgd2l0aCBBdXRvVXBncmFkZVxuICogICBiZWhhdmlvciwgdGhlIGJhc2UgdmVyc2lvbiBvZiB0aGUgbmV3IHJ1biB3aWxsIGJlIHRoZSBUYXJnZXQgVmVyc2lvbiBhcyBkZXNjcmliZWQgYWJvdmUsIGJ1dCB0aGVcbiAqICAgZWZmZWN0aXZlIHZlcnNpb24gd2lsbCBiZSB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIFZlcnNpb25pbmcgT3ZlcnJpZGUgdW50aWwgdGhlIG92ZXJyaWRlIGlzIHJlbW92ZWQuXG4gKlxuICogVVNFX1JBTVBJTkdfVkVSU0lPTiAtIFVzZSB0aGUgUmFtcGluZyBWZXJzaW9uIG9mIHRoZSB3b3JrZmxvdydzIHRhc2sgcXVldWUgYXQgc3RhcnQgdGltZSwgcmVnYXJkbGVzcyBvZiB0aGUgd29ya2Zsb3cnc1xuICogICBUYXJnZXQgVmVyc2lvbiAoYWNjb3JkaW5nIHRvIGYod29ya2Zsb3dfaWQsIHJhbXBfcGVyY2VudGFnZSkpLiBBZnRlciB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBjb21wbGV0ZXMsXG4gKiAgIHRoZSB3b3JrZmxvdyB3aWxsIHVzZSB3aGF0ZXZlciBWZXJzaW9uaW5nIEJlaGF2aW9yIGl0IGlzIGFubm90YXRlZCB3aXRoLiBJZiB0aGVyZSBpcyBubyBSYW1waW5nXG4gKiAgIFZlcnNpb24gYnkgdGhlIHRpbWUgdGhhdCB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBpcyBkaXNwYXRjaGVkLCBpdCB3aWxsIGJlIHNlbnQgdG8gdGhlIEN1cnJlbnQgVmVyc2lvbi5cbiAqXG4gKiAgIEl0IGlzIGhpZ2hseSBkaXNjb3VyYWdlZCB0byB1c2UgdGhpcyBpZiB0aGUgd29ya2Zsb3cgaXMgYW5ub3RhdGVkIHdpdGggQXV0b1VwZ3JhZGUgYmVoYXZpb3IsIGJlY2F1c2VcbiAqICAgdGhpcyBzZXR0aW5nIE9OTFkgYXBwbGllcyB0byB0aGUgZmlyc3QgdGFzayBvZiB0aGUgd29ya2Zsb3cuIElmLCBhZnRlciB0aGUgZmlyc3QgdGFzaywgdGhlIHdvcmtmbG93XG4gKiAgIGlzIEF1dG9VcGdyYWRlLCBpdCB3aWxsIGJlaGF2ZSBsaWtlIGEgbm9ybWFsIEF1dG9VcGdyYWRlIHdvcmtmbG93IGFuZCBnbyB0byB0aGUgVGFyZ2V0IFZlcnNpb24sIHdoaWNoXG4gKiAgIG1heSBiZSB0aGUgQ3VycmVudCBWZXJzaW9uIGluc3RlYWQgb2YgdGhlIFJhbXBpbmcgVmVyc2lvbi5cbiAqXG4gKiAgIE5vdGUgdGhhdCBpZiB0aGUgd29ya2Zsb3cgYmVpbmcgY29udGludWVkIGhhcyBhIFBpbm5lZCBvdmVycmlkZSwgdGhhdCBvdmVycmlkZSB3aWxsIGJlIGluaGVyaXRlZCBieSB0aGVcbiAqICAgbmV3IHdvcmtmbG93IHJ1biByZWdhcmRsZXNzIG9mIHRoZSBDb250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yIHNwZWNpZmllZCBpbiB0aGUgY29udGludWUtYXMtbmV3XG4gKiAgIGNvbW1hbmQuIFZlcnNpb25pbmcgT3ZlcnJpZGUgYWx3YXlzIHRha2VzIHByZWNlZGVuY2UgdW50aWwgaXQncyByZW1vdmVkIG1hbnVhbGx5IHZpYSBVcGRhdGVXb3JrZmxvd0V4ZWN1dGlvbk9wdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yID0ge1xuICBBVVRPX1VQR1JBREU6ICdBVVRPX1VQR1JBREUnLFxuICBVU0VfUkFNUElOR19WRVJTSU9OOiAnVVNFX1JBTVBJTkdfVkVSU0lPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvciA9ICh0eXBlb2YgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcilba2V5b2YgdHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3JdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsIGRlY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gICdDT05USU5VRV9BU19ORVdfVkVSU0lPTklOR19CRUhBVklPUl8nXG4+KFxuICB7XG4gICAgW0luaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IuQVVUT19VUEdSQURFXTogMSxcbiAgICBbSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvci5VU0VfUkFNUElOR19WRVJTSU9OXTogMixcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0NPTlRJTlVFX0FTX05FV19WRVJTSU9OSU5HX0JFSEFWSU9SXydcbik7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGVwbG95bWVudFZlcnNpb24oXG4gIHY6IGNvcmVzZGsuY29tbW9uLklXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB8IG51bGwgfCB1bmRlZmluZWRcbik6IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2IHx8ICF2LmJ1aWxkSWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBidWlsZElkOiB2LmJ1aWxkSWQsXG4gICAgZGVwbG95bWVudE5hbWU6IHYuZGVwbG95bWVudE5hbWUgPz8gJycsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdCZWhhdmlvciB9IGZyb20gJy4vd29ya2VyLWRlcGxveW1lbnRzJztcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBkZWZpbmluZyBhIHdvcmtmbG93IHZpYSB7QGxpbmsgc2V0V29ya2Zsb3dPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIHtcbiAgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZXMgb2YgZXJyb3JzIHRoYXQsIGlmIHRocm93biBieSB0aGUgV29ya2Zsb3cgZnVuY3Rpb24sIGEgc2lnbmFsIGhhbmRsZXIsIG9yIGFuIHVwZGF0ZVxuICAgKiBoYW5kbGVyLCB3aWxsIGNhdXNlIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gb3IgdGhlIFVwZGF0ZSB0byBmYWlsIGluc3RlYWQgb2YgZmFpbGluZyB0aGVcbiAgICogV29ya2Zsb3cgVGFzayAod2hpY2ggd291bGQgcmVzdWx0IGluIHJldHJ5aW5nIHRoZSBXb3JrZmxvdyBUYXNrIHVudGlsIGl0IGV2ZW50dWFsbHkgc3VjY2VlZHMpLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgcGVyLVdvcmtmbG93LXR5cGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfS5cbiAgICogQm90aCBzZXR0aW5ncyBhcmUgZXZhbHVhdGVkOyBhbiBlcnJvciBtYXRjaGluZyBlaXRoZXIgd2lsbCBjYXVzZSBXb3JrZmxvdyBmYWlsdXJlLlxuICAgKiBVbmxpa2UgdGhlIHN0cmluZy1iYXNlZCB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSwgdGhpcyBhY2NlcHRzXG4gICAqIGFjdHVhbCBjbGFzcyByZWZlcmVuY2VzLCBlbmFibGluZyBzdWJjbGFzcyBtYXRjaGluZyB2aWEgYGluc3RhbmNlb2ZgLCBidXQgZG9lc24ndCBhbGxvd1xuICAgKiBmYWlsaW5nIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gb24gX25vbi1kZXRlcm1pbmlzbSBlcnJvcnNfLiBGYWlsaW5nIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gb25cbiAgICogbm9uLWRldGVybWluaXNtIGVycm9ycyBjYW4gb25seSBiZSBzZXQgdmlhIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9LlxuICAgKlxuICAgKiBQYXNzaW5nIHRoZSBgRXJyb3JgIGNsYXNzIHRvIHRoaXMgc2V0dGluZyB3aWxsIGZhaWwgdGhlIFdvcmtmbG93IG9uIGFueSBlcnJvciwgZXhjZXB0XG4gICAqIG5vbi1kZXRlcm1pbmlzbSBlcnJvcnMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSBzdWJjbGFzc2VzIGFuZCBjYW5jZWxsYXRpb24gZXJyb3JzIHRoYXQgYnViYmxlcyBvdXRcbiAgICogb2YgdGhlIFdvcmtmbG93IGFsd2F5cyBmYWlsIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgZWl0aGVyIHRoaXMgYW5kIHRoZVxuICAgKiB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSBzZXR0aW5ncy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzPzogQXJyYXk8bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gRXJyb3I+O1xufVxuXG50eXBlIEFzeW5jRnVuY3Rpb248QXJncyBleHRlbmRzIGFueVtdLCBSZXR1cm5UeXBlPiA9ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJldHVyblR5cGU+O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyID0gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyB8ICgoKSA9PiBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zKTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqIEEgd29ya2Zsb3cgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiBkZWZpbmVkIHdpdGggb3B0aW9ucyBmcm9tIHtAbGluayBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdLCBSZXR1cm5UeXBlPiBleHRlbmRzIEFzeW5jRnVuY3Rpb248QXJncywgUmV0dXJuVHlwZT4ge1xuICB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zOiBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zT3JHZXR0ZXI7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93LCBXb3JrZmxvd1Jlc3VsdFR5cGUsIFNpZ25hbERlZmluaXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEJhc2UgV29ya2Zsb3dIYW5kbGUgaW50ZXJmYWNlLCBleHRlbmRlZCBpbiB3b3JrZmxvdyBhbmQgY2xpZW50IGxpYnMuXG4gKlxuICogVHJhbnNmb3JtcyBhIHdvcmtmbG93IGludGVyZmFjZSBgVGAgaW50byBhIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVdvcmtmbG93SGFuZGxlPFQgZXh0ZW5kcyBXb3JrZmxvdz4ge1xuICAvKipcbiAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlc1xuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuICAvKipcbiAgICogU2lnbmFsIGEgcnVubmluZyBXb3JrZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIGRlZiBhIHNpZ25hbCBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogYXdhaXQgaGFuZGxlLnNpZ25hbChpbmNyZW1lbnRTaWduYWwsIDMpO1xuICAgKiBgYGBcbiAgICovXG4gIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHwgc3RyaW5nLFxuICAgIC4uLmFyZ3M6IEFyZ3NcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIHdvcmtmbG93SWQgb2YgdGhlIGN1cnJlbnQgV29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZztcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEF0dHJpYnV0ZVBhaXIsIFNlYXJjaEF0dHJpYnV0ZXMsIFR5cGVkU2VhcmNoQXR0cmlidXRlcyB9IGZyb20gJy4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBQcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMgfSBmcm9tICcuL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucyc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGFcbiAqIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogQ29uY2VwdDoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvdy1leGVjdXRpb24vd29ya2Zsb3dpZC1ydW5pZCN3b3JrZmxvdy1pZC1yZXVzZS1wb2xpY3kgfCBXb3JrZmxvdyBJZCBSZXVzZSBQb2xpY3l9XG4gKlxuICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlLlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZSB0aGF0IGlzIG5vdCBDb21wbGV0ZWQuXG4gICAqL1xuICBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2Fubm90IGJlIHN0YXJ0ZWQuXG4gICAqL1xuICBSRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBXb3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nOyBvdGhlcndpc2UgYWxsb3cgcmV1c2luZyB0aGUgV29ya2Zsb3cgSUQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURX0gaW5zdGVhZCwgYW5kXG4gICAqICAgICAgICAgICAgIHNldCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgdG9cbiAgICogICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVEVSTUlOQVRFX0VYSVNUSU5HfS5cbiAgICogICAgICAgICAgICAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIG11c3QgYmUgbGVmdCB1bnNwZWNpZmllZC5cbiAgICovXG4gIFRFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBObyBuZWVkIHRvIHVzZSB0aGlzLiBJZiBhIGBXb3JrZmxvd0lkUmV1c2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFl9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFSkVDVF9EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVEVSTUlOQVRFX0lGX1JVTk5JTkd9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9URVJNSU5BVEVfSUZfUlVOTklORzogJ1RFUk1JTkFURV9JRl9SVU5OSU5HJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSAodHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSlba2V5b2YgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVdOiAxLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZXTogMixcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlJFSkVDVF9EVVBMSUNBVEVdOiAzLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuVEVSTUlOQVRFX0lGX1JVTk5JTkddOiA0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuKTtcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3dcbiAqIHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiAqTm90ZTogSXQgaXMgbmV2ZXIgcG9zc2libGUgdG8gaGF2ZSB0d28gX2FjdGl2ZWx5IHJ1bm5pbmdfIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByYWlzZSBhIGBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3JgLlxuICAgKi9cbiAgRkFJTDogJ0ZBSUwnLFxuXG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmV0dXJuIGEgV29ya2Zsb3cgSGFuZGxlIGZvciB0aGUgYWxyZWFkeSBSdW5uaW5nIFdvcmtmbG93LlxuICAgKi9cbiAgVVNFX0VYSVNUSU5HOiAnVVNFX0VYSVNUSU5HJyxcblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgV29ya2Zsb3csIHRlcm1pbmF0aW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqL1xuICBURVJNSU5BVEVfRVhJU1RJTkc6ICdURVJNSU5BVEVfRVhJU1RJTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LkZBSUxdOiAxLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVVNFX0VYSVNUSU5HXTogMixcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlRFUk1JTkFURV9FWElTVElOR106IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICAgKlxuICAgKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICAgKlxuICAgKiBAZGVmYXVsdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURVxuICAgKi9cbiAgd29ya2Zsb3dJZFJldXNlUG9saWN5PzogV29ya2Zsb3dJZFJldXNlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVU5TUEVDSUZJRURcbiAgICovXG4gIHdvcmtmbG93SWRDb25mbGljdFBvbGljeT86IFdvcmtmbG93SWRDb25mbGljdFBvbGljeTtcblxuICAvKipcbiAgICogQ29udHJvbHMgaG93IGEgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIHJldHJpZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFdvcmtmbG93IEV4ZWN1dGlvbnMgYXJlIG5vdCByZXRyaWVkLiBEbyBub3Qgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZW5jeWNsb3BlZGlhL3JldHJ5LXBvbGljaWVzIHwgTW9yZSBpbmZvcm1hdGlvbn0uXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjcm9uIHNjaGVkdWxlIGZvciBXb3JrZmxvdy4gSWYgYSBjcm9uIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIFdvcmtmbG93IHdpbGwgcnVuIGFzIGEgY3JvbiBiYXNlZCBvbiB0aGVcbiAgICogc2NoZWR1bGUuIFRoZSBzY2hlZHVsaW5nIHdpbGwgYmUgYmFzZWQgb24gVVRDIHRpbWUuIFRoZSBzY2hlZHVsZSBmb3IgdGhlIG5leHQgcnVuIG9ubHkgaGFwcGVucyBhZnRlciB0aGUgY3VycmVudFxuICAgKiBydW4gaXMgY29tcGxldGVkL2ZhaWxlZC90aW1lb3V0LiBJZiBhIFJldHJ5UG9saWN5IGlzIGFsc28gc3VwcGxpZWQsIGFuZCB0aGUgV29ya2Zsb3cgZmFpbGVkIG9yIHRpbWVkIG91dCwgdGhlXG4gICAqIFdvcmtmbG93IHdpbGwgYmUgcmV0cmllZCBiYXNlZCBvbiB0aGUgcmV0cnkgcG9saWN5LiBXaGlsZSB0aGUgV29ya2Zsb3cgaXMgcmV0cnlpbmcsIGl0IHdvbid0IHNjaGVkdWxlIGl0cyBuZXh0IHJ1bi5cbiAgICogSWYgdGhlIG5leHQgc2NoZWR1bGUgaXMgZHVlIHdoaWxlIHRoZSBXb3JrZmxvdyBpcyBydW5uaW5nIChvciByZXRyeWluZyksIHRoZW4gaXQgd2lsbCBza2lwIHRoYXQgc2NoZWR1bGUuIENyb25cbiAgICogV29ya2Zsb3cgd2lsbCBub3Qgc3RvcCB1bnRpbCBpdCBpcyB0ZXJtaW5hdGVkIG9yIGNhbmNlbGxlZCAoYnkgcmV0dXJuaW5nIHRlbXBvcmFsLkNhbmNlbGVkRXJyb3IpLlxuICAgKiBodHRwczovL2Nyb250YWIuZ3VydS8gaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHlvdXIgY3JvbiBleHByZXNzaW9ucy5cbiAgICovXG4gIGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgbm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIFRoZSB2YWx1ZXMgY2FuIGJlIGFueXRoaW5nIHRoYXRcbiAgICogaXMgc2VyaWFsaXphYmxlIGJ5IHtAbGluayBEYXRhQ29udmVydGVyfS5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIEdlbmVyYWwgZml4ZWQgZGV0YWlscyBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0IGFuZCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgc2luZ2xlLWxpbmUgZml4ZWQgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgYSB3b3JrZmxvd1xuICAgKi9cbiAgcHJpb3JpdHk/OiBQcmlvcml0eTtcbn1cblxuZXhwb3J0IHR5cGUgV2l0aFdvcmtmbG93QXJnczxXIGV4dGVuZHMgV29ya2Zsb3csIFQ+ID0gVCAmXG4gIChQYXJhbWV0ZXJzPFc+IGV4dGVuZHMgW2FueSwgLi4uYW55W11dXG4gICAgPyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M6IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBXb3JrZmxvd1xuICAgICAgICAgKi9cbiAgICAgICAgYXJncz86IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdvcmtmbG93IHJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90XG4gICAqIHJlbHkgb24gcnVuIHRpbWVvdXQgZm9yIGJ1c2luZXNzIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVyc1xuICAgKiBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBleGVjdXRpb24gKHdoaWNoIGluY2x1ZGVzIHJ1biByZXRyaWVzIGFuZCBjb250aW51ZSBhcyBuZXcpIGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBzZXJ2aWNlLiBEbyBub3QgcmVseSBvbiBleGVjdXRpb24gdGltZW91dCBmb3IgYnVzaW5lc3NcbiAgICogbGV2ZWwgdGltZW91dHMuIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgaW4gd29ya2Zsb3cgdGltZXJzIGZvciB0aGlzIHB1cnBvc2UuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgb2YgYSBzaW5nbGUgd29ya2Zsb3cgdGFzay4gRGVmYXVsdCBpcyAxMCBzZWNvbmRzLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93VGFza1RpbWVvdXQ/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tbW9uV29ya2Zsb3dPcHRpb25zID0gQmFzZVdvcmtmbG93T3B0aW9ucyAmIFdvcmtmbG93RHVyYXRpb25PcHRpb25zO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFdvcmtmbG93VHlwZTxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT5cbik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnc3RyaW5nJykgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYyBhcyBzdHJpbmc7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHdvcmtmbG93VHlwZU9yRnVuYz8ubmFtZSkgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYy5uYW1lO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd29ya2Zsb3cgdHlwZTogdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGFub255bW91cycpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYEludmFsaWQgd29ya2Zsb3cgdHlwZTogZXhwZWN0ZWQgZWl0aGVyIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24sIGdvdCAnJHt0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jfSdgXG4gICk7XG59XG4iLCIvLyBBIHBvcnQgb2YgYW4gYWxnb3JpdGhtIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxuLy8gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25xdWlubGFuL2JldHRlci1yYW5kb20tbnVtYmVycy1mb3ItamF2YXNjcmlwdC1taXJyb3Jcbi8vIE9yaWdpbmFsIHdvcmsgaXMgdW5kZXIgTUlUIGxpY2Vuc2UgLVxuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5vcmc+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLy8gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkYmF1L3NlZWRyYW5kb20vYmxvYi9yZWxlYXNlZC9saWIvYWxlYS5qc1xuXG5jbGFzcyBBbGVhIHtcbiAgcHVibGljIGM6IG51bWJlcjtcbiAgcHVibGljIHMwOiBudW1iZXI7XG4gIHB1YmxpYyBzMTogbnVtYmVyO1xuICBwdWJsaWMgczI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZWVkOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG1hc2ggPSBuZXcgTWFzaCgpO1xuICAgIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgICB0aGlzLmMgPSAxO1xuICAgIHRoaXMuczAgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMSA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMyID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczAgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMwIDwgMCkge1xuICAgICAgdGhpcy5zMCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnMxIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMSA8IDApIHtcbiAgICAgIHRoaXMuczEgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMiAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczIgPCAwKSB7XG4gICAgICB0aGlzLnMyICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ID0gMjA5MTYzOSAqIHRoaXMuczAgKyB0aGlzLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIHRoaXMuczAgPSB0aGlzLnMxO1xuICAgIHRoaXMuczEgPSB0aGlzLnMyO1xuICAgIHJldHVybiAodGhpcy5zMiA9IHQgLSAodGhpcy5jID0gdCB8IDApKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSTkcgPSAoKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGVhKHNlZWQ6IG51bWJlcltdKTogUk5HIHtcbiAgY29uc3QgeGcgPSBuZXcgQWxlYShzZWVkKTtcbiAgcmV0dXJuIHhnLm5leHQuYmluZCh4Zyk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXNoIHtcbiAgcHJpdmF0ZSBuID0gMHhlZmM4MjQ5ZDtcblxuICBwdWJsaWMgbWFzaChkYXRhOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgbGV0IHsgbiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG4gKz0gZGF0YVtpXSE7XG4gICAgICBsZXQgaCA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBoICo9IG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXG4gICAgfVxuICAgIHRoaXMubiA9IG47XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IENhbmNlbGxlZEZhaWx1cmUsIElsbGVnYWxTdGF0ZUVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb051bWJlciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFNka0ZsYWdzIH0gZnJvbSAnLi9mbGFncyc7XG5cbi8vIEFzeW5jTG9jYWxTdG9yYWdlIGlzIGluamVjdGVkIHZpYSB2bSBtb2R1bGUgaW50byBnbG9iYWwgc2NvcGUuXG4vLyBJbiBjYXNlIFdvcmtmbG93IGNvZGUgaXMgaW1wb3J0ZWQgaW4gTm9kZS5qcyBjb250ZXh0LCByZXBsYWNlIHdpdGggYW4gZW1wdHkgY2xhc3MuXG5leHBvcnQgY29uc3QgQXN5bmNMb2NhbFN0b3JhZ2U6IG5ldyA8VD4oKSA9PiBBTFM8VD4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLkFzeW5jTG9jYWxTdG9yYWdlID8/IGNsYXNzIHt9O1xuXG4vKiogTWFnaWMgc3ltYm9sIHVzZWQgdG8gY3JlYXRlIHRoZSByb290IHNjb3BlIC0gaW50ZW50aW9uYWxseSBub3QgZXhwb3J0ZWQgKi9cbmNvbnN0IE5PX1BBUkVOVCA9IFN5bWJvbCgnTk9fUEFSRU5UJyk7XG5cbi8qKlxuICogT3B0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBDYW5jZWxsYXRpb25TY29wZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgdGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgcHJldmVudCBvdXRlciBjYW5jZWxsYXRpb24gZnJvbSBwcm9wYWdhdGluZyB0byBpbm5lciBzY29wZXMsIEFjdGl2aXRpZXMsIHRpbWVycywgYW5kIFRyaWdnZXJzLCBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiAoU2NvcGUgc3RpbGwgcHJvcGFnYXRlcyBDYW5jZWxsZWRGYWlsdXJlIHRocm93biBmcm9tIHdpdGhpbikuXG4gICAqL1xuICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENhbmNlbGxhdGlvblNjb3BlICh1c2VmdWwgZm9yIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrcykuXG4gICAqIFRoZSBgTk9fUEFSRU5UYCBzeW1ib2wgaXMgcmVzZXJ2ZWQgZm9yIHRoZSByb290IHNjb3BlLlxuICAgKi9cbiAgcGFyZW50PzogQ2FuY2VsbGF0aW9uU2NvcGUgfCB0eXBlb2YgTk9fUEFSRU5UO1xufVxuXG4vKipcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgcHJvdmlkZSB0aGUgbWVjaGFuaWMgYnkgd2hpY2ggYSBXb3JrZmxvdyBtYXkgZ3JhY2VmdWxseSBoYW5kbGUgaW5jb21pbmcgcmVxdWVzdHMgZm9yIGNhbmNlbGxhdGlvblxuICogKGUuZy4gaW4gcmVzcG9uc2UgdG8ge0BsaW5rIFdvcmtmbG93SGFuZGxlLmNhbmNlbH0gb3IgdGhyb3VnaCB0aGUgVUkgb3IgQ0xJKSwgYXMgd2VsbCBhcyByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZlxuICogY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBpdCBvd25zIChlLmcuIEFjdGl2aXRpZXMsIFRpbWVycywgQ2hpbGQgV29ya2Zsb3dzLCBldGMpLlxuICpcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgZm9ybSBhIHRyZWUsIHdpdGggdGhlIFdvcmtmbG93J3MgbWFpbiBmdW5jdGlvbiBydW5uaW5nIGluIHRoZSByb290IHNjb3BlIG9mIHRoYXQgdHJlZS5cbiAqIEJ5IGRlZmF1bHQsIGNhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIGRvd24gZnJvbSBhIHBhcmVudCBzY29wZSB0byBpdHMgY2hpbGRyZW4gYW5kIGl0cyBjYW5jZWxsYWJsZSBvcGVyYXRpb25zLlxuICogQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIHJlY2VpdmUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLCBidXQgaXMgbmV2ZXIgZWZmZWN0aXZlbHkgY29uc2lkZXJlZCBhcyBjYW5jZWxsZWQsXG4gKiB0aHVzIHNoaWVsZGRpbmcgaXRzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGl0IHJlY2VpdmVzLlxuICpcbiAqIFNjb3BlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBjb25zdHJ1Y3RvciBvciB0aGUgc3RhdGljIGhlbHBlciBtZXRob2RzIHtAbGluayBjYW5jZWxsYWJsZX0sXG4gKiB7QGxpbmsgbm9uQ2FuY2VsbGFibGV9IGFuZCB7QGxpbmsgd2l0aFRpbWVvdXR9LiBgd2l0aFRpbWVvdXRgIGNyZWF0ZXMgYSBzY29wZSB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGYgYWZ0ZXJcbiAqIHNvbWUgZHVyYXRpb24uXG4gKlxuICogQ2FuY2VsbGF0aW9uIG9mIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVzdWx0cyBpbiBhbGwgb3BlcmF0aW9ucyBjcmVhdGVkIGRpcmVjdGx5IGluIHRoYXQgc2NvcGUgdG8gdGhyb3cgYVxuICoge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IChlaXRoZXIgZGlyZWN0bHksIG9yIGFzIHRoZSBgY2F1c2VgIG9mIGFuIHtAbGluayBBY3Rpdml0eUZhaWx1cmV9IG9yIGFcbiAqIHtAbGluayBDaGlsZFdvcmtmbG93RmFpbHVyZX0pLiBGdXJ0aGVyIGF0dGVtcHQgdG8gY3JlYXRlIG5ldyBjYW5jZWxsYWJsZSBzY29wZXMgb3IgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyB3aXRoaW4gYVxuICogc2NvcGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZCB3aWxsIGFsc28gaW1tZWRpYXRlbHkgdGhyb3cgYSB7QGxpbmsgQ2FuY2VsbGVkRmFpbHVyZX0gZXhjZXB0aW9uLiBJdCBpcyBob3dldmVyXG4gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgYXQgdGhhdCBwb2ludDsgdGhpcyBpcyBvZnRlbiB1c2VkIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb3IgY2xlYW51cFxuICogb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coLi4uKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIHRyeSB7XG4gKiAgICAgLy8gVGhpcyBhY3Rpdml0eSBydW5zIGluIHRoZSByb290IGNhbmNlbGxhdGlvbiBzY29wZS4gVGhlcmVmb3JlLCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IG9uXG4gKiAgICAgLy8gdGhlIFdvcmtmbG93IGV4ZWN1dGlvbiAoZS5nLiB0aHJvdWdoIHRoZSBVSSBvciBDTEkpIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlcyB0byB0aGlzXG4gKiAgICAgLy8gYWN0aXZpdHkuIEFzc3VtaW5nIHRoYXQgdGhlIGFjdGl2aXR5IHByb3Blcmx5IGhhbmRsZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIHRoZW4gdGhlXG4gKiAgICAgLy8gY2FsbCBiZWxvdyB3aWxsIHRocm93IGFuIGBBY3Rpdml0eUZhaWx1cmVgIGV4Y2VwdGlvbiwgd2l0aCBgY2F1c2VgIHNldHMgdG8gYW5cbiAqICAgICAvLyBpbnN0YW5jZSBvZiBgQ2FuY2VsbGVkRmFpbHVyZWAuXG4gKiAgICAgYXdhaXQgc29tZUFjdGl2aXR5KCk7XG4gKiAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZSkpIHtcbiAqICAgICAgIC8vIFJ1biBjbGVhbnVwIGFjdGl2aXR5IGluIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlXG4gKiAgICAgICBhd2FpdCBDYW5jZWxsYXRpb25TY29wZS5ub25DYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gKiAgICAgICAgIGF3YWl0IGNsZWFudXBBY3Rpdml0eSgpO1xuICogICAgICAgfVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aHJvdyBlO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQSBjYW5jZWxsYWJsZSBzY29wZSBtYXkgYmUgcHJvZ3JhbWF0aWNhbGx5IGNhbmNlbGxlZCBieSBjYWxsaW5nIHtAbGluayBjYW5jZWx8YHNjb3BlLmNhbmNlbCgpYH1gLiBUaGlzIG1heSBiZSB1c2VkLFxuICogZm9yIGV4YW1wbGUsIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gQWN0aXZpdHkgb3IgQ2hpbGQgV29ya2Zsb3c6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICogY29uc3QgYWN0aXZpdHlQcm9taXNlID0gY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlLnJ1bigoKSA9PiBzb21lQWN0aXZpdHkoKSk7XG4gKiBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUuY2FuY2VsKCk7IC8vIENhbmNlbHMgdGhlIGFjdGl2aXR5XG4gKiBhd2FpdCBhY3Rpdml0eVByb21pc2U7IC8vIFRocm93cyBgQWN0aXZpdHlGYWlsdXJlYCB3aXRoIGBjYXVzZWAgc2V0IHRvIGBDYW5jZWxsZWRGYWlsdXJlYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCB0aGVuIHRoaXMgc2NvcGUgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIGNhbmNlbGxlZCwgZXZlbiBpZiBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGlzIHJlY2VpdmVkIChlaXRoZXJcbiAgICogZGlyZWN0bHkgYnkgY2FsbGluZyBgc2NvcGUuY2FuY2VsKClgIG9yIGluZGlyZWN0bHkgYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuIFRoaXMgZWZmZWN0aXZlbHlcbiAgICogc2hpZWxkcyB0aGUgc2NvcGUncyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBtYWRlIG9uIHRoZVxuICAgKiBub24tY2FuY2VsbGFibGUgc2NvcGUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgUHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYHJ1bmAgZnVuY3Rpb24gb2Ygbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSBzdGlsbCB0aHJvdyBhIGBDYW5jZWxsZWRGYWlsdXJlYFxuICAgKiBpZiBzdWNoIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB3aXRoaW4gdGhhdCBzY29wZSAoZS5nLiBieSBkaXJlY3RseSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgY2hpbGQgc2NvcGUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbGxhYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLCBkZWZhdWx0cyB0byB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudH0oKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlO1xuXG4gIC8qKlxuICAgKiBBIFByb21pc2UgdGhhdCB0aHJvd3Mgd2hlbiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlY2VpdmVzIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIGVpdGhlciBkaXJlY3RseVxuICAgKiAoaS5lLiBgc2NvcGUuY2FuY2VsKClgKSwgb3IgaW5kaXJlY3RseSAoYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBtYXkgcmVjZWl2ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMsIHJlc3VsdGluZyBpbiB0aGUgYGNhbmNlbFJlcXVlc3RlZGAgcHJvbWlzZSBmb3JcbiAgICogdGhhdCBzY29wZSB0byB0aHJvdywgdGhvdWdoIHRoZSBzY29wZSB3aWxsIG5vdCBlZmZlY3RpdmVseSBnZXQgY2FuY2VsbGVkIChpLmUuIGBjb25zaWRlcmVkQ2FuY2VsbGVkYCB3aWxsIHN0aWxsXG4gICAqIHJldHVybiBgZmFsc2VgLCBhbmQgY2FuY2VsbGF0aW9uIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gY2hpbGQgc2NvcGVzIGFuZCBjb250YWluZWQgb3BlcmF0aW9ucykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBQcm9taXNlPG5ldmVyPjtcblxuICAjY2FuY2VsUmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gbXNPcHRpb25hbFRvTnVtYmVyKG9wdGlvbnM/LnRpbWVvdXQpO1xuICAgIHRoaXMuY2FuY2VsbGFibGUgPSBvcHRpb25zPy5jYW5jZWxsYWJsZSA/PyB0cnVlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUU0MgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5XG4gICAgICB0aGlzLnJlamVjdCA9IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkKTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICAgIGlmIChvcHRpb25zPy5wYXJlbnQgIT09IE5PX1BBUkVOVCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zPy5wYXJlbnQgfHwgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxsYWJsZSB8fFxuICAgICAgICAodGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZCAmJlxuICAgICAgICAgICFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCA9IHRoaXMucGFyZW50LiNjYW5jZWxSZXF1ZXN0ZWQ7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdChlcnIpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2NvcGUgd2FzIGVmZmVjdGl2ZWx5IGNhbmNlbGxlZC4gQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25zaWRlcmVkQ2FuY2VsbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgJiYgdGhpcy5jYW5jZWxsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc2NvcGUgYXMgY3VycmVudCBhbmQgcnVuICBgZm5gXG4gICAqXG4gICAqIEFueSB0aW1lcnMsIEFjdGl2aXRpZXMsIFRyaWdnZXJzIGFuZCBDYW5jZWxsYXRpb25TY29wZXMgY3JlYXRlZCBpbiB0aGUgYm9keSBvZiBgZm5gXG4gICAqIGF1dG9tYXRpY2FsbHkgbGluayB0aGVpciBjYW5jZWxsYXRpb24gdG8gdGhpcyBzY29wZS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCB0aGlzLnJ1bkluQ29udGV4dC5iaW5kKHRoaXMsIGZuKSBhcyAoKSA9PiBQcm9taXNlPFQ+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdGhhdCBydW5zIGEgZnVuY3Rpb24gaW4gQXN5bmNMb2NhbFN0b3JhZ2UgY29udGV4dC5cbiAgICpcbiAgICogQ291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gYXMgYW5vbnltb3VzIGZ1bmN0aW9uLCBtYWRlIGludG8gYSBtZXRob2QgZm9yIGltcHJvdmVkIHN0YWNrIHRyYWNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBydW5JbkNvbnRleHQ8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGltZXJTY29wZTogQ2FuY2VsbGF0aW9uU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHRpbWVyU2NvcGVcbiAgICAgICAgICAucnVuKCgpID0+IHNsZWVwKHRoaXMudGltZW91dCBhcyBudW1iZXIpKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5jYW5jZWwoKSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gc2NvcGUgd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBpZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGltZXJTY29wZSAmJlxuICAgICAgICAhdGltZXJTY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkICYmXG4gICAgICAgIGdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aW1lclNjb3BlLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIGNhbmNlbCB0aGUgc2NvcGUgYW5kIGxpbmtlZCBjaGlsZHJlblxuICAgKi9cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdDYW5jZWxsYXRpb24gc2NvcGUgY2FuY2VsbGVkJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHNjb3BlXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpOiBDYW5jZWxsYXRpb25TY29wZSB7XG4gICAgLy8gVXNpbmcgZ2xvYmFscyBkaXJlY3RseSBpbnN0ZWFkIG9mIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydFxuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCkgPz8gKGdsb2JhbFRoaXMgYXMgYW55KS5fX1RFTVBPUkFMX0FDVElWQVRPUl9fLnJvb3RTY29wZTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIGNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyBub25DYW5jZWxsYWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiBmYWxzZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgd2l0aFRpbWVvdXQ8VD4odGltZW91dDogRHVyYXRpb24sIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUsIHRpbWVvdXQgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlOiBBTFM8Q2FuY2VsbGF0aW9uU2NvcGU+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbmV4cG9ydCBjbGFzcyBSb290Q2FuY2VsbGF0aW9uU2NvcGUgZXh0ZW5kcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgY2FuY2VsbGFibGU6IHRydWUsIHBhcmVudDogTk9fUEFSRU5UIH0pO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdXb3JrZmxvdyBjYW5jZWxsZWQnKSk7XG4gIH1cbn1cblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGlzIG1vZHVsZSBhbmQgd29ya2Zsb3cudHMgKi9cbmxldCBzbGVlcCA9IChfOiBEdXJhdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGhhcyBub3QgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZCcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbihmbjogdHlwZW9mIHNsZWVwKTogdm9pZCB7XG4gIHNsZWVwID0gZm47XG59XG4iLCJpbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFJhbmRvbSgpOiBudW1iZXIge1xuICByZXR1cm4gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93IHJhbmRvbSBBUElzIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpLmN1cnJlbnRSYW5kb20oKTtcbn1cbiIsImltcG9ydCB7IEFjdGl2aXR5RmFpbHVyZSwgQ2FuY2VsbGVkRmFpbHVyZSwgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsIE5leHVzT3BlcmF0aW9uRmFpbHVyZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgd29ya2Zsb3cgZXJyb3JzXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIGluIHdvcmtmbG93IHdoZW4gaXQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIHRoYXQgbm9uLWRldGVybWluaXN0aWMgc3VjaCBhcyBjb25zdHJ1Y3QgYSBXZWFrUmVmKClcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yJylcbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7fVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgbWFya2VyIGZvciB0aGlzIHNwZWNpYWwgcmVzdWx0IHR5cGVcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmJylcbmV4cG9ydCBjbGFzcyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmFja29mZjogY29yZXNkay5hY3Rpdml0eV9yZXN1bHQuSURvQmFja29mZikge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgcHJvdmlkZWQgYGVycmAgaXMgY2F1c2VkIGJ5IGNhbmNlbGxhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb24oZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSB8fFxuICAgICgoZXJyIGluc3RhbmNlb2YgQWN0aXZpdHlGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIE5leHVzT3BlcmF0aW9uRmFpbHVyZSkgJiZcbiAgICAgIGVyci5jYXVzZSBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUpXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIFNka0ZsYWcgPSB7XG4gIGdldCBpZCgpOiBudW1iZXI7XG4gIGdldCBkZWZhdWx0KCk6IGJvb2xlYW47XG4gIGdldCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnMoKTogQWx0Q29uZGl0aW9uRm5bXSB8IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGZsYWdzUmVnaXN0cnk6IE1hcDxudW1iZXIsIFNka0ZsYWc+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgY29uc3QgU2RrRmxhZ3MgPSB7XG4gIC8qKlxuICAgKiBUaGlzIGZsYWcgZ2F0ZXMgbXVsdGlwbGUgZml4ZXMgcmVsYXRlZCB0byBjYW5jZWxsYXRpb24gc2NvcGVzIGFuZCB0aW1lcnMgaW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wOlxuICAgKiAtIENhbmNlbGxhdGlvbiBvZiBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBubyBsb25nZXIgcHJvcGFnYXRlcyB0byBjaGlsZHJlbiBzY29wZXNcbiAgICogICAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW1wb3JhbGlvL3Nkay10eXBlc2NyaXB0L2lzc3Vlcy8xNDIzKS5cbiAgICogLSBDYW5jZWxsYXRpb25TY29wZS53aXRoVGltZW91dChmbikgbm93IGNhbmNlbCB0aGUgdGltZXIgaWYgYGZuYCBjb21wbGV0ZXMgYmVmb3JlIGV4cGlyYXRpb25cbiAgICogICBvZiB0aGUgdGltZW91dCwgc2ltaWxhciB0byBob3cgYGNvbmRpdGlvbihmbiwgdGltZW91dClgIHdvcmtzLlxuICAgKiAtIFRpbWVycyBjcmVhdGVkIHVzaW5nIHNldFRpbWVvdXQgY2FuIG5vdyBiZSBpbnRlcmNlcHRlZC5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMC4yLzEuMTEuMC4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3MgdjEuMTEuMCBhbmQgdjEuMTEuMSB3ZXJlIG5vdFxuICAgKiAgICAgICAgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmcgaW4gTkRFIG9uIHJlcGxheS4gV2UgdGhlcmVmb3JlXG4gICAqICAgICAgICBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMSB0byBpbXBsaWNpdGx5IGhhdmUgdGhpcyBmbGFnIG9uLlxuICAgKi9cbiAgTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbjogZGVmaW5lRmxhZygxLCB0cnVlLCBbYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKC8xXFwuMTFcXC5bMDFdLyldKSxcblxuICAvKipcbiAgICogUHJpb3IgdG8gMS4xMS4wLCB3aGVuIHByb2Nlc3NpbmcgYSBXb3JrZmxvdyBhY3RpdmF0aW9uLCB0aGUgU0RLIHdvdWxkIGV4ZWN1dGUgYG5vdGlmeUhhc1BhdGNoYFxuICAgKiBhbmQgYHNpZ25hbFdvcmtmbG93YCBqb2JzIGluIGRpc3RpbmN0IHBoYXNlcywgYmVmb3JlIG90aGVyIHR5cGVzIG9mIGpvYnMuIFRoZSBwcmltYXJ5IHJlYXNvblxuICAgKiBiZWhpbmQgdGhhdCBtdWx0aS1waGFzZSBhbGdvcml0aG0gd2FzIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGEgV29ya2Zsb3cgZXhlY3V0aW9uIG1pZ2h0XG4gICAqIGNvbXBsZXRlIGJlZm9yZSBhbGwgaW5jb21pbmcgc2lnbmFscyBoYXZlIGJlZW4gZGlzcGF0Y2hlZCAoYXQgbGVhc3QgdG8gdGhlIHBvaW50IHRoYXQgdGhlXG4gICAqIF9zeW5jaHJvbm91c18gcGFydCBvZiB0aGUgaGFuZGxlciBmdW5jdGlvbiBoYXMgYmVlbiBleGVjdXRlZCkuXG4gICAqXG4gICAqIFRoaXMgZmxhZyByZXBsYWNlcyB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3aXRoIGEgc2ltcGxlciBvbmUgd2hlcmUgam9icyBhcmUgc2ltcGx5IHNvcnRlZCBhc1xuICAgKiBgKHNpZ25hbHMgYW5kIHVwZGF0ZXMpIC0+IG90aGVyc2AsIGJ1dCB3aXRob3V0IHByb2Nlc3NpbmcgdGhlbSBhcyBkaXN0aW5jdCBiYXRjaGVzIChpLmUuIHdpdGhvdXRcbiAgICogbGVhdmluZy9yZWVudGVyaW5nIHRoZSBWTSBjb250ZXh0IGJldHdlZW4gZWFjaCBncm91cCwgd2hpY2ggYXV0b21hdGljYWxseSB0cmlnZ2VycyB0aGUgZXhlY3V0aW9uXG4gICAqIG9mIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzKS4gVGhhdCBzaW5nbGUtcGhhc2UgYXBwcm9hY2ggcmVzb2x2ZXMgYSBudW1iZXIgb2YgcXVpcmtzIG9mIHRoZVxuICAgKiBmb3JtZXIgYWxnb3JpdGhtLCBhbmQgeWV0IHN0aWxsIHNhdGlzZmllcyB0byB0aGUgb3JpZ2luYWwgcmVxdWlyZW1lbnQgb2YgZW5zdXJpbmcgdGhhdCBldmVyeVxuICAgKiBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgLSBhbmQgbm93IGBkb1VwZGF0ZWAgam9icyBhcyB3ZWxsIC0gaGF2ZSBiZWVuIGdpdmVuIGEgcHJvcGVyIGNoYW5jZSB0b1xuICAgKiBleGVjdXRlIGJlZm9yZSB0aGUgV29ya2Zsb3cgbWFpbiBmdW5jdGlvbiBtaWdodCBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTEuMC4gVGhpcyBjaGFuZ2UgaXMgbm90IHJvbGxiYWNrLXNhZmUuIEhvd2V2ZXIsIGR1ZSB0byBhbiBTREsgYnVnLCBTREtzXG4gICAqICAgICAgICB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90IHByb3Blcmx5IHdyaXRpbmcgYmFjayB0aGUgZmxhZ3MgdG8gaGlzdG9yeSwgcG9zc2libHkgcmVzdWx0aW5nXG4gICAqICAgICAgICBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmUgY29uc2lkZXIgdGhhdCBhIFdGVCBlbWl0dGVkIGJ5IFdvcmtlciB2MS4xMS4wIG9yIHYxLjExLjFcbiAgICogICAgICAgIHRvIGltcGxpY2l0ZWx5IGhhdmUgdGhpcyBmbGFnIG9uLlxuICAgKi9cbiAgUHJvY2Vzc1dvcmtmbG93QWN0aXZhdGlvbkpvYnNBc1NpbmdsZUJhdGNoOiBkZWZpbmVGbGFnKDIsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjExLjUgdGhlIGBoYW5kbGVTaWduYWxgIGludGVyY2VwdG9yIHdhcyBhZGRlZCB0byBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeVxuICAgKiB3aGljaCBhZGRlZCBhIHlpZWxkIHBvaW50LiBUaGUgYWRkZWQgeWllbGQgcG9pbnQgY2FuIGNhdXNlIE5ERSBpZiB0aGVyZSB3YXMgYSBzaWduYWwgaGFuZGxlciBhbmRcbiAgICogdGhlIHdvcmtmbG93IHdhcyBzdGFydGVkIHdpdGggYSBzaWduYWwuXG4gICAqXG4gICAqIFRoaXMgeWllbGQgcG9pbnQgd2FzIHJlbW92ZWQgaW4gMS4xMy4yLCBidXQgaW4gb3JkZXIgdG8gcHJldmVudCB3b3JrZmxvd3MgZnJvbSB0aGVcbiAgICogYWZmZWN0ZWQgdmVyc2lvbnMgcmVzdWx0aW5nIGluIE5ERSwgd2UgaGF2ZSB0byBpbmplY3QgdGhlIHlpZWxkIHBvaW50IG9uIHJlcGxheS5cbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yLlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc1RyYWNlc0luYm91bmRTaWduYWxzOiBkZWZpbmVGbGFnKDMsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDExLCBwYXRjaDogNSB9KV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjExLjYsIHRoZSBgc2NoZWR1bGVMb2NhbEFjdGl2aXR5YCBpbnRlcmNlcHRvciB3YXMgYWRkZWQgdG9cbiAgICogYEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5YCB3aGljaCBhZGRlZCBhIHlpZWxkIHBvaW50IHRvIHRoZVxuICAgKiBvdXRib3VuZCBpbnRlcmNlcHRvci4gVGhpcyB5aWVsZCBwb2ludCB3YXMgcmVtb3ZlZCBpbiAxLjEzLjIuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuMlxuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc1RyYWNlc0xvY2FsQWN0aXZpdGllczogZGVmaW5lRmxhZyg0LCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMSwgcGF0Y2g6IDYgfSldKSxcblxuICAvKipcbiAgICogVGhlIGludGVyY2VwdG9ycyBwcm92aWRlZCBieSBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeSBpbml0aWFsbHkgaGFkIHVubmVjZXNzYXJ5XG4gICAqIHlpZWxkIHBvaW50cyBvbiBjYWxsaW5nIHRvIGBleHRyYWN0Q29udGV4dEZyb21IZWFkZXJzYC5cbiAgICogSWYgcmVwbGF5aW5nIGEgd29ya2Zsb3cgY3JlYXRlZCBmcm9tIHRoZXNlIHZlcnNpb25zIGEgeWllbGQgcG9pbnQgaXMgaW5qZWN0ZWQgdG8gcHJldmVudCBhbnkgTkRFLlxuICAgKlxuICAgKiBJZiB0aGUgaGlzdG9yeSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBTREsgdmVyc2lvbiwgZGVmYXVsdCB0byBleHRyYSB5aWVsZHMgc2luY2UgdGhlIHlpZWxkcyB3ZXJlIHByZXNlbnQgc2luY2UgdGhlIE9URUxcbiAgICogcGFja2FnZSB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXBvcnNBdm9pZHNFeHRyYVlpZWxkczogZGVmaW5lRmxhZyg1LCB0cnVlLCBbaXNBdExlYXN0KHsgbWFqb3I6IDEsIG1pbm9yOiAxMywgcGF0Y2g6IDIgfSldKSxcblxuICAvKipcbiAgICogSW4gMS4xMy4zLCBhbGwgcmVtYWluaW5nIGludGVyY2VwdG9yIG1ldGhvZHMgd2VyZSBpbXBsZW1lbnRlZCBpbiBAdGVtcG9yYWxpby9pbnRlcmNlcHRvcnMtb3BlbnRlbGVtZXRyeVxuICAgKiBpbmNsdWRpbmcgYGhhbmRsZVVwZGF0ZWAsIGB2YWxpZGF0ZVVwZGF0ZWAsIGBoYW5kbGVRdWVyeWAsIGBzdGFydFRpbWVyYCwgYW5kIGBzdGFydE5leHVzT3BlcmF0aW9uYC5cbiAgICogVGhlc2UgYWRkIGluc3RydW1lbnRhdGlvbiBhbmQgeWllbGQgcG9pbnRzIHRoYXQgd2VyZSBub3QgcHJlc2VudCBpbiBlYXJsaWVyIHZlcnNpb25zLlxuICAgKiBUaGlzIGZsYWcgZ2F0ZXMgdGhlc2UgbmV3IGludGVyY2VwdG9yIG1ldGhvZHMgdG8gcHJldmVudCBOREUgb24gcmVwbGF5IG9mIHdvcmtmbG93cyBmcm9tIGVhcmxpZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTMuM1xuICAgKi9cbiAgT3BlblRlbGVtZXRyeUludGVyY2VwdG9yc0luc3RydW1lbnRzQWxsTWV0aG9kczogZGVmaW5lRmxhZyg2LCB0cnVlKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGRlZmluZUZsYWcoaWQ6IG51bWJlciwgZGVmOiBib29sZWFuLCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnM/OiBBbHRDb25kaXRpb25GbltdKTogU2RrRmxhZyB7XG4gIGNvbnN0IGZsYWcgPSB7IGlkLCBkZWZhdWx0OiBkZWYsIGFsdGVybmF0aXZlQ29uZGl0aW9ucyB9O1xuICBmbGFnc1JlZ2lzdHJ5LnNldChpZCwgZmxhZyk7XG4gIHJldHVybiBmbGFnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRGbGFnKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFmbGFnc1JlZ2lzdHJ5LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gU0RLIGZsYWc6ICR7aWR9YCk7XG59XG5cbi8qKlxuICogQW4gU0RLIEZsYWcgQWx0ZXJuYXRlIENvbmRpdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZsYWdcbiAqIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREtcbiAqIHRoYXQgZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVFxuICogZW1pdHRlZCBieSBwcmV2aW91cyBTREtzIHRoYXQgY29udGFpbmVkIGEgYnVnLlxuICpcbiAqIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcsIGFuZCBvbmx5IGlmIHRoZSBjb3JyZXNwb25pbmcgZmxhZyBpc1xuICogbm90IGFscmVhZHkgc2V0LiBBbHNvLCBhbHRlcm5hdGUgY29uZGl0aW9ucyB3aWxsIG5vdCBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlXG4gKiBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrcyBtYXkgbm90IHJlZmxlY3QgdGhpcyBmbGFnIGlmIHRoZVxuICogY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3QgYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvd1xuICogRXhlY3V0aW9uIGhhcyBnb25lIHRocm91Z2ggYSBuZXdlciBTREsgdmVyc2lvbiB0aGVuIGFnYWluIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICovXG50eXBlIEFsdENvbmRpdGlvbkZuID0gKGN0eDogeyBpbmZvOiBXb3JrZmxvd0luZm87IHNka1ZlcnNpb24/OiBzdHJpbmcgfSkgPT4gYm9vbGVhbjtcblxuZnVuY3Rpb24gYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKHZlcnNpb246IFJlZ0V4cCk6IEFsdENvbmRpdGlvbkZuIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeQHRlbXBvcmFsaW8vd29ya2VyQCgke3ZlcnNpb24uc291cmNlfSlbK11gKTtcbiAgcmV0dXJuICh7IGluZm8gfSkgPT4gaW5mby5jdXJyZW50QnVpbGRJZCAhPSBudWxsICYmIHJlZ2V4LnRlc3QoaW5mby5jdXJyZW50QnVpbGRJZCk7XG59XG5cbnR5cGUgU2VtVmVyID0ge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGBBbHRDb25kaXRpb25GbmAgdGhhdCBjaGVja3MgaWYgdGhlIFNESyB2ZXJzaW9uIGlzIGVxdWFsIHRvIG9yIGFmdGVyIHRoZSBwcm92aWRlZCB2ZXJzaW9uLlxuICogQW4gb3B0aW9uYWwgZGVmYXVsdCBjYW4gYmUgcHJvdmlkZWQgaW4gY2FzZSB0aGUgU0RLIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNBdExlYXN0KGNvbXBhcmU6IFNlbVZlciwgbWlzc2luZ0RlZmF1bHQ/OiBib29sZWFuKTogQWx0Q29uZGl0aW9uRm4ge1xuICByZXR1cm4gKGN0eCkgPT4ge1xuICAgIHJldHVybiBpc0NvbXBhcmVkKGNvbXBhcmUsIC0xLCBtaXNzaW5nRGVmYXVsdCkoY3R4KSB8fCBpc0NvbXBhcmVkKGNvbXBhcmUsIDAsIG1pc3NpbmdEZWZhdWx0KShjdHgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc0NvbXBhcmVkKGNvbXBhcmU6IFNlbVZlciwgY29tcGFyaXNvbjogLTEgfCAwIHwgMSwgbWlzc2luZ0RlZmF1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IEFsdENvbmRpdGlvbkZuIHtcbiAgcmV0dXJuICh7IHNka1ZlcnNpb24gfSkgPT4ge1xuICAgIGlmICghc2RrVmVyc2lvbikgcmV0dXJuIG1pc3NpbmdEZWZhdWx0O1xuICAgIGNvbnN0IHZlcnNpb24gPSBwYXJzZVNlbXZlcihzZGtWZXJzaW9uKTtcbiAgICBpZiAoIXZlcnNpb24pIHJldHVybiBtaXNzaW5nRGVmYXVsdDtcbiAgICByZXR1cm4gY29tcGFyZVNlbXZlcihjb21wYXJlLCB2ZXJzaW9uKSA9PT0gY29tcGFyaXNvbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTZW12ZXIodmVyc2lvbjogc3RyaW5nKTogU2VtVmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBbXywgbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uLm1hdGNoKC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvKSE7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ham9yOiBOdW1iZXIucGFyc2VJbnQobWFqb3IhKSxcbiAgICAgIG1pbm9yOiBOdW1iZXIucGFyc2VJbnQobWlub3IhKSxcbiAgICAgIHBhdGNoOiBOdW1iZXIucGFyc2VJbnQocGF0Y2ghKSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogU2VtVmVyLCBiOiBTZW1WZXIpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEubWFqb3IgPCBiLm1ham9yKSByZXR1cm4gLTE7XG4gIGlmIChhLm1ham9yID4gYi5tYWpvcikgcmV0dXJuICsxO1xuICBpZiAoYS5taW5vciA8IGIubWlub3IpIHJldHVybiAtMTtcbiAgaWYgKGEubWlub3IgPiBiLm1pbm9yKSByZXR1cm4gKzE7XG4gIGlmIChhLnBhdGNoIDwgYi5wYXRjaCkgcmV0dXJuIC0xO1xuICBpZiAoYS5wYXRjaCA+IGIucGF0Y2gpIHJldHVybiArMTtcbiAgcmV0dXJuIDA7XG59XG4iLCJpbXBvcnQgeyBJbGxlZ2FsU3RhdGVFcnJvciwgdHlwZSBXb3JrZmxvdyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIFRoZSBfX1RFTVBPUkFMX18gb2JqZWN0IHdpbGwgYmUgYXNzaWduZWQgYnkgV2VicGFjayB0byB0aGUgZXhwb3J0cyBvZiB0aGUgZW50cnlwb2ludCBtb2R1bGVcbiAgLy8gZmlsZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGJ1bmRsZXIgKHNlZSB3b3JrZmxvdy9idW5kbGVyLnRzI2dlbkVudHJ5cG9pbnQoKSkuXG4gIC8vXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLiBJIHByZXNlcnZlZCB0aGUgdXBwZXJjYXNlIG5hbWUgZm9yIGJhY2t3YXJkXG4gIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBidW5kbGVzIGdlbmVyYXRlZCBieSAxLjE0LjAuIFdlIGdlbmVyYWxseSBkbyBub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgb2ZcbiAgLy8gYnVuZGxlcyB3aXRoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgU0RLLCBidXQgaW4gdGhpcyBzcGVjaWZpYyBjYXNlLCB0aGVyZSdzIHJlYWxseSBub1xuICAvLyB1c2VyLXNpZGUgdmFsdWUgaW4gcmVuYW1pbmcgdGhpcywgc28gbWFraW5nIGEgYnJlYWtpbmcgY2hhbmdlIGZvciB0aGF0IHdvdWxkIG5vdCBiZSBqdXN0aWZpZWQuXG4gIC8vXG5cbiAgdmFyIF9fVEVNUE9SQUxfXzoge1xuICAgIGFwaTogdHlwZW9mIGltcG9ydCgnLi93b3JrZXItaW50ZXJmYWNlLnRzJyk7XG4gICAgcHJlbG9hZE1vZHVsZXM/OiAoKSA9PiB2b2lkO1xuICAgIGltcG9ydFdvcmtmbG93czogKCkgPT4gUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+O1xuICAgIGltcG9ydEludGVyY2VwdG9yczogKCkgPT4gW3sgaW50ZXJjZXB0b3JzOiBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfV07XG4gIH07XG5cbiAgLy8gRGVzdHJ1Y3RvcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNoYXJlZCBzYW5kYm94IGlzIGRlc3Ryb3llZC5cblxuICB2YXIgX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM6ICgoKSA9PiB2b2lkKVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEZJWE1FOiBSZW5hbWUgdG8gbG93ZXJjYXNlIHN5bnRheCBiZWZvcmUgMS4xNS4wLlxuXG4gIHZhciBfX1RFTVBPUkFMX0FDVElWQVRPUl9fOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX0FDVElWQVRPUl9fID0gYWN0aXZhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF5YmVHZXRBY3RpdmF0b3IoKTogQWN0aXZhdG9yIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuX19URU1QT1JBTF9BQ1RJVkFUT1JfXztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyk6IEFjdGl2YXRvciB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UpO1xuICByZXR1cm4gYWN0aXZhdG9yO1xufVxuXG4vLyBUaGlzIGlzIHJlYWxseSBqdXN0IGFuIGFsaWFzIGZvciBgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHRgIHdpdGggYSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UsXG4vLyBiZWNhdXNlIHRoYXQgbmFtZSBiZXR0ZXIgY29udmV5cyB0aGUgaW50ZW50IGluIHNvbWUgdmVyeSBjb21tb24gdXNlIGNhc2VzLlxuZXhwb3J0IGNvbnN0IGdldEFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LmJpbmQobnVsbCwgJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiIsIi8qKlxuICogT3ZlcnJpZGVzIHNvbWUgZ2xvYmFsIG9iamVjdHMgdG8gbWFrZSB0aGVtIGRldGVybWluaXN0aWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtc1RvVHMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBjdXJyZW50UmFuZG9tIH0gZnJvbSAnLi9jdXJyZW50LXJhbmRvbSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5jb25zdCBPcmlnaW5hbERhdGUgPSBnbG9iYWxUaGlzLkRhdGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUdsb2JhbHMoKTogdm9pZCB7XG4gIC8vIE1vY2sgYW55IHdlYWsgcmVmZXJlbmNlIGJlY2F1c2UgR0MgaXMgbm9uLWRldGVybWluaXN0aWMgYW5kIHRoZSBlZmZlY3QgaXMgb2JzZXJ2YWJsZSBmcm9tIHRoZSBXb3JrZmxvdy5cbiAgLy8gV29ya2Zsb3cgZGV2ZWxvcGVyIHdpbGwgZ2V0IGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaWYgdGhleSB0cnkgdG8gdXNlIHRoZXNlLlxuICBnbG9iYWwuV2Vha1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcignV2Vha1JlZiBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYycpO1xuICB9O1xuICBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoXG4gICAgICAnRmluYWxpemF0aW9uUmVnaXN0cnkgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnXG4gICAgKTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IChPcmlnaW5hbERhdGUgYXMgYW55KSguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5hbERhdGUoZ2V0QWN0aXZhdG9yKCkubm93KTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEFjdGl2YXRvcigpLm5vdztcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5wYXJzZSA9IE9yaWdpbmFsRGF0ZS5wYXJzZS5iaW5kKE9yaWdpbmFsRGF0ZSk7XG4gIGdsb2JhbC5EYXRlLlVUQyA9IE9yaWdpbmFsRGF0ZS5VVEMuYmluZChPcmlnaW5hbERhdGUpO1xuXG4gIGdsb2JhbC5EYXRlLnByb3RvdHlwZSA9IE9yaWdpbmFsRGF0ZS5wcm90b3R5cGU7XG5cbiAgY29uc3QgdGltZW91dENhbmNlbGxhdGlvblNjb3BlcyA9IG5ldyBNYXA8bnVtYmVyLCBDYW5jZWxsYXRpb25TY29wZT4oKTtcblxuICAvKipcbiAgICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICAgKi9cbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoY2I6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBtczogbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IG51bWJlciB7XG4gICAgbXMgPSBNYXRoLm1heCgxLCBtcyk7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gICAgaWYgKGFjdGl2YXRvci5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAvLyBDYXB0dXJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgdGhhdCBzbGVlcCB3aWxsIGFsbG9jYXRlXG4gICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXI7XG4gICAgICBjb25zdCB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSk7XG4gICAgICBjb25zdCBzbGVlcFByb21pc2UgPSB0aW1lclNjb3BlLnJ1bigoKSA9PiBzbGVlcChtcykpO1xuICAgICAgc2xlZXBQcm9taXNlLnRoZW4oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgIGNiKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNsZWVwUHJvbWlzZSk7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLnNldChzZXEsIHRpbWVyU2NvcGUpO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG4gICAgICAvLyBDcmVhdGUgYSBQcm9taXNlIGZvciBBc3luY0xvY2FsU3RvcmFnZSB0byBiZSBhYmxlIHRvIHRyYWNrIHRoaXMgY29tcGxldGlvbiB1c2luZyBwcm9taXNlIGhvb2tzLlxuICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgc3RhcnRUb0ZpcmVUaW1lb3V0OiBtc1RvVHMobXMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSkudGhlbihcbiAgICAgICAgKCkgPT4gY2IoLi4uYXJncyksXG4gICAgICAgICgpID0+IHVuZGVmaW5lZCAvKiBpZ25vcmUgY2FuY2VsbGF0aW9uICovXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gIH07XG5cbiAgZ2xvYmFsLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIChoYW5kbGU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGNvbnN0IHRpbWVyU2NvcGUgPSB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmdldChoYW5kbGUpO1xuICAgIGlmICh0aW1lclNjb3BlKSB7XG4gICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7IC8vIFNob3VsZG4ndCBpbmNyZWFzZSBzZXEgbnVtYmVyLCBidXQgdGhhdCdzIHRoZSBsZWdhY3kgYmVoYXZpb3JcbiAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5kZWxldGUoaGFuZGxlKTtcbiAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgc2VxOiBoYW5kbGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gY3VycmVudFJhbmRvbSgpIGRpc3BhdGNoZXMgdG8gYSBzY29wZWQgc3RyZWFtIHdoZW4gV29ya2Zsb3dSYW5kb21TdHJlYW0ud2l0aCguLi4pIGlzIGFjdGl2ZS5cbiAgTWF0aC5yYW5kb20gPSBjdXJyZW50UmFuZG9tO1xufVxuIiwiLyoqXG4gKiBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdG9vbHMgcmVxdWlyZWQgZm9yIGF1dGhvcmluZyB3b3JrZmxvd3MuXG4gKlxuICogIyMgVXNhZ2VcbiAqIFNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2hlbGxvLXdvcmxkI3dvcmtmbG93cyB8IHR1dG9yaWFsfSBmb3Igd3JpdGluZyB5b3VyIGZpcnN0IHdvcmtmbG93LlxuICpcbiAqICMjIyBUaW1lcnNcbiAqXG4gKiBUaGUgcmVjb21tZW5kZWQgd2F5IG9mIHNjaGVkdWxpbmcgdGltZXJzIGlzIGJ5IHVzaW5nIHRoZSB7QGxpbmsgc2xlZXB9IGZ1bmN0aW9uLiBXZSd2ZSByZXBsYWNlZCBgc2V0VGltZW91dGAgYW5kXG4gKiBgY2xlYXJUaW1lb3V0YCB3aXRoIGRldGVybWluaXN0aWMgdmVyc2lvbnMgc28gdGhlc2UgYXJlIGFsc28gdXNhYmxlIGJ1dCBoYXZlIGEgbGltaXRhdGlvbiB0aGF0IHRoZXkgZG9uJ3QgcGxheSB3ZWxsXG4gKiB3aXRoIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzIHwgY2FuY2VsbGF0aW9uIHNjb3Blc30uXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNsZWVwIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcGVyKG1zID0gMTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGF3YWl0IHNsZWVwKG1zKTtcbiAqICAgY29uc29sZS5sb2coJ3NsZXB0Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgQWN0aXZpdGllc1xuICpcbiAqIFRvIHNjaGVkdWxlIEFjdGl2aXRpZXMsIHVzZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBvYnRhaW4gYW4gQWN0aXZpdHkgZnVuY3Rpb24gYW5kIGNhbGwuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB0eXBlICogYXMgYWN0aXZpdGllcyBmcm9tICcuL2FjdGl2aXRpZXMnO1xuICpcbiAqIGNvbnN0IHsgc2VuZEVtYWlsIH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEgbWludXRlJyxcbiAqIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FtcGxlV29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgc2VuZEVtYWlsKFwidG9AZXhhbXBsZS5jb21cIixcIkhlbGxvLCBUZW1wb3JhbCFcIik7XG59XG5cbiAqIGBgYFxuICogXG4gKiAjIyMgVXBkYXRlcywgU2lnbmFscyBhbmQgUXVlcmllc1xuICpcbiAqIFVzZSB7QGxpbmsgc2V0SGFuZGxlcn0gdG8gc2V0IGhhbmRsZXJzIGZvciBVcGRhdGVzLCBTaWduYWxzLCBhbmQgUXVlcmllcy5cbiAqXG4gKiBVcGRhdGUgYW5kIFNpZ25hbCBoYW5kbGVycyBjYW4gYmUgZWl0aGVyIGFzeW5jIG9yIG5vbi1hc3luYyBmdW5jdGlvbnMuIFVwZGF0ZSBoYW5kbGVycyBtYXkgcmV0dXJuIGEgdmFsdWUsIGJ1dCBzaWduYWxcbiAqIGhhbmRsZXJzIG1heSBub3QgKHJldHVybiBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gKS4gWW91IG1heSB1c2UgQWN0aXZpdGllcywgVGltZXJzLCBjaGlsZCBXb3JrZmxvd3MsIGV0YyBpbiBVcGRhdGVcbiAqIGFuZCBTaWduYWwgaGFuZGxlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZSBkb25lIGNhdXRpb3VzbHk6IGZvciBleGFtcGxlLCBub3RlIHRoYXQgaWYgeW91IGF3YWl0IGFzeW5jIG9wZXJhdGlvbnMgc3VjaCBhc1xuICogdGhlc2UgaW4gYW4gVXBkYXRlIG9yIFNpZ25hbCBoYW5kbGVyLCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHdvcmtmbG93IGRvZXMgbm90IGNvbXBsZXRlIGZpcnN0LlxuICpcbiAqIFF1ZXJ5IGhhbmRsZXJzIG1heSAqKm5vdCoqIGJlIGFzeW5jIGZ1bmN0aW9ucywgYW5kIG1heSAqKm5vdCoqIG11dGF0ZSBhbnkgdmFyaWFibGVzIG9yIHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsXG4gKiBjaGlsZCBXb3JrZmxvd3MsIGV0Yy5cbiAqXG4gKiAjIyMjIEltcGxlbWVudGF0aW9uXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRTaWduYWwgPSB3Zi5kZWZpbmVTaWduYWw8W251bWJlcl0+KCdpbmNyZW1lbnQnKTtcbiAqIGV4cG9ydCBjb25zdCBnZXRWYWx1ZVF1ZXJ5ID0gd2YuZGVmaW5lUXVlcnk8bnVtYmVyPignZ2V0VmFsdWUnKTtcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRBbmRHZXRWYWx1ZVVwZGF0ZSA9IHdmLmRlZmluZVVwZGF0ZTxudW1iZXIsIFtudW1iZXJdPignaW5jcmVtZW50QW5kR2V0VmFsdWUnKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRlcldvcmtmbG93KGluaXRpYWxWYWx1ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGxldCBjb3VudCA9IGluaXRpYWxWYWx1ZTtcbiAqICAgd2Yuc2V0SGFuZGxlcihpbmNyZW1lbnRTaWduYWwsIChhcmc6IG51bWJlcikgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgfSk7XG4gKiAgIHdmLnNldEhhbmRsZXIoZ2V0VmFsdWVRdWVyeSwgKCkgPT4gY291bnQpO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlLCAoYXJnOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgICByZXR1cm4gY291bnQ7XG4gKiAgIH0pO1xuICogICBhd2FpdCB3Zi5jb25kaXRpb24oKCkgPT4gZmFsc2UpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIE1vcmVcbiAqXG4gKiAtIFtEZXRlcm1pbmlzdGljIGJ1aWx0LWluc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20jc291cmNlcy1vZi1ub24tZGV0ZXJtaW5pc20pXG4gKiAtIFtDYW5jZWxsYXRpb24gYW5kIHNjb3Blc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvY2FuY2VsbGF0aW9uLXNjb3BlcylcbiAqICAgLSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9XG4gKiAgIC0ge0BsaW5rIFRyaWdnZXJ9XG4gKiAtIFtTaW5rc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2FwcGxpY2F0aW9uLWRldmVsb3BtZW50L29ic2VydmFiaWxpdHkvP2xhbmc9dHMjbG9nZ2luZylcbiAqICAgLSB7QGxpbmsgU2lua3N9XG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7XG4gIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgQ2FuY2VsbGVkRmFpbHVyZSxcbiAgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBSZXRyeVBvbGljeSxcbiAgcm9vdENhdXNlLFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSxcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2Vycm9ycyc7XG5leHBvcnQge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eUludGVyZmFjZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBQYXlsb2FkLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVudHlwZWRBY3Rpdml0aWVzLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dRdWVyeVR5cGUsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1NpZ25hbFR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3dvcmtmbG93LW9wdGlvbnMnO1xuZXhwb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UsIENhbmNlbGxhdGlvblNjb3BlLCBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5leHBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENvbnRpbnVlQXNOZXcsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFBhcmVudENsb3NlUG9saWN5LFxuICBQYXJlbnRXb3JrZmxvd0luZm8sXG4gIFJvb3RXb3JrZmxvd0luZm8sXG4gIFN0YWNrVHJhY2VTREtJbmZvLFxuICBTdGFja1RyYWNlLFxuICBVbnNhZmVXb3JrZmxvd0luZm8sXG4gIFdvcmtmbG93SW5mbyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7IHByb3h5U2lua3MsIFNpbmssIFNpbmtDYWxsLCBTaW5rRnVuY3Rpb24sIFNpbmtzIH0gZnJvbSAnLi9zaW5rcyc7XG5leHBvcnQgdHlwZSB7IFdvcmtmbG93UmFuZG9tU3RyZWFtIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtcyc7XG5leHBvcnQgeyBnZXRSYW5kb21TdHJlYW0sIHdvcmtmbG93UmFuZG9tIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtcyc7XG5leHBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZ3MnO1xuZXhwb3J0IHsgVHJpZ2dlciB9IGZyb20gJy4vdHJpZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3dvcmtmbG93JztcbmV4cG9ydCB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5leHBvcnQgeyBtZXRyaWNNZXRlciB9IGZyb20gJy4vbWV0cmljcyc7XG5leHBvcnQge1xuICBjcmVhdGVOZXh1c1NlcnZpY2VDbGllbnQsXG4gIE5leHVzU2VydmljZUNsaWVudE9wdGlvbnMsXG4gIE5leHVzU2VydmljZUNsaWVudCxcbiAgTmV4dXNPcGVyYXRpb25IYW5kbGUsXG4gIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbn0gZnJvbSAnLi9uZXh1cyc7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRGVwcmVjYXRlZCBBUElzXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cblxuICBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgYXMgTG9nZ2VyU2lua3MsXG59IGZyb20gJy4vbG9ncyc7XG4iLCJpbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aCwgdHlwZSBOZXh0IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQ29tcG9zZSB3b3JrZmxvdyBpbnRlcmNlcHRvcnMgd2hpbGUgbWFraW5nIGV2ZXJ5IGBuZXh0KC4uLilgIGNvbnRpbnVhdGlvbiByZS1lbnRlclxuICogdGhlIHdvcmtmbG93LXJhbmRvbSBzY29wZSB0aGF0IHdhcyBjdXJyZW50IHdoZW4gdGhhdCBjb250aW51YXRpb24gd2FzIGNyZWF0ZWQuXG4gKlxuICogVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgdGhpbiB3cmFwcGVyIG92ZXIgdGhlIHNoYXJlZCBpbnRlcmNlcHRvciBjb21wb3NpdGlvbiBoZWxwZXJcbiAqIGluIGBwYWNrYWdlcy9jb21tb25gLiBUaGUgc2hhcmVkIGhlbHBlciBvd25zIHRoZSBhY3R1YWwgY2hhaW4tY29uc3RydWN0aW9uIGFsZ29yaXRobSxcbiAqIG9yZGVyaW5nLCBhbmQgYG5leHQoLi4uKWAgd2lyaW5nIHNvIHdvcmtmbG93IGNvZGUgY2Fubm90IHNpbGVudGx5IGRyaWZ0IGF3YXkgZnJvbSB0aGVcbiAqIHNlbWFudGljcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBTREsuXG4gKlxuICogVGhlIHdvcmtmbG93LXNwZWNpZmljIGJlaGF2aW9yIGxpdmVzIGVudGlyZWx5IGluIHRoZSBgd3JhcE5leHRgIGhvb2sgd2UgcGFzcyBpbnRvIHRoYXRcbiAqIHNoYXJlZCBoZWxwZXIuIEVhY2ggYG5leHQoLi4uKWAgY29udGludWF0aW9uIGhhbmRlZCB0byBhIHdvcmtmbG93IGludGVyY2VwdG9yIGlzIHdyYXBwZWRcbiAqIHdpdGggYEFjdGl2YXRvci5iaW5kQ3VycmVudFJhbmRvbSguLi4pYCwgd2hpY2ggY2FwdHVyZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgd29ya2Zsb3dcbiAqIHJhbmRvbSBzY29wZSwgaW5jbHVkaW5nIHRoZSBhYnNlbmNlIG9mIGFueSBzY29wZWQgb3ZlcnJpZGUuIFdoZW4gdGhlIGludGVyY2VwdG9yIGxhdGVyXG4gKiBjYWxscyBgbmV4dCguLi4pYCwgdGhlIHdyYXBwZXIgcmVzdG9yZXMgdGhhdCBjYXB0dXJlZCBzY29wZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlc3Qgb2ZcbiAqIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBvciB0aGUgYmFzZSB3b3JrZmxvdy9ydW50aW1lIGhhbmRsZXIuXG4gKlxuICogVGhhdCBpcyB0aGUgYmVoYXZpb3Igd2UgbmVlZCBmb3IgYFdvcmtmbG93UmFuZG9tU3RyZWFtLndpdGgoLi4uKWA6IGEgdGVtcG9yYXJ5XG4gKiBwbHVnaW4vaW50ZXJjZXB0b3Igc2NvcGUgc2hvdWxkIGFwcGx5IHRvIHRoZSBwbHVnaW4ncyBvd24gY29kZSwgYnV0IGl0IG11c3Qgbm90XG4gKiBsZWFrIHRocm91Z2ggYG5leHQoLi4uKWAgaW50byBkb3duc3RyZWFtIHdvcmtmbG93IGNvZGUgdW5sZXNzIHRoYXQgZG93bnN0cmVhbSBjb2RlXG4gKiBleHBsaWNpdGx5IGVzdGFibGlzaGVzIGl0cyBvd24gc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzPEksIE0gZXh0ZW5kcyBrZXlvZiBJPihpbnRlcmNlcHRvcnM6IElbXSwgbWV0aG9kOiBNLCBuZXh0OiBOZXh0PEksIE0+KTogTmV4dDxJLCBNPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9yc1dpdGgoaW50ZXJjZXB0b3JzLCBtZXRob2QsIG5leHQsICgod3JhcHBlZE5leHQpID0+XG4gICAgYWN0aXZhdG9yLmJpbmRDdXJyZW50UmFuZG9tKHdyYXBwZWROZXh0IGFzIGFueSkpIGFzIDxGIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuICAgIG5leHQ6IEZcbiAgKSA9PiBGKSBhcyB1bmtub3duIGFzIE5leHQ8SSwgTT47XG59XG4iLCIvKipcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIFdvcmtmbG93IGludGVyY2VwdG9ycy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eU9wdGlvbnMsXG4gIER1cmF0aW9uLFxuICBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgTWV0cmljVGFncyxcbiAgVGltZXN0YW1wLFxuICBXb3JrZmxvd0V4ZWN1dGlvbixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IEhlYWRlcnMsIE5leHQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cywgQ29udGludWVBc05ld09wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgfSBmcm9tICcuL25leHVzJztcblxuZXhwb3J0IHsgTmV4dCwgSGVhZGVycyB9O1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpbnN0YW50aWF0ZXMge0BsaW5rIFdvcmtmbG93SW50ZXJjZXB0b3JzfS5cbiAqXG4gKiBXb3JrZmxvdyBpbnRlcmNlcHRvciBtb2R1bGVzIHNob3VsZCBleHBvcnQgYW4gYGludGVyY2VwdG9yc2AgZnVuY3Rpb24gb2YgdGhpcyB0eXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBmdW5jdGlvbiBpbnRlcmNlcHRvcnMoKTogV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICogICByZXR1cm4ge1xuICogICAgIGluYm91bmQ6IFtdLCAgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbmJvdW5kIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICAgIG91dGJvdW5kOiBbXSwgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBvdXRib3VuZCBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgICBpbnRlcm5hbHM6IFtdLCAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW50ZXJuYWxzIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9ICgpID0+IFdvcmtmbG93SW50ZXJjZXB0b3JzO1xuXG4vKipcbiAqIEEgbWFwcGluZyBmcm9tIGludGVyY2VwdG9yIHR5cGUgdG8gYW4gb3B0aW9uYWwgbGlzdCBvZiBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVyY2VwdG9ycyB7XG4gIGluYm91bmQ/OiBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIG91dGJvdW5kPzogV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3JbXTtcbiAgaW50ZXJuYWxzPzogV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvcltdO1xufVxuXG4vLyBXb3JrZmxvdyBJbmJvdW5kIENhbGxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGluYm91bmQgY2FsbHMgbGlrZSBleGVjdXRpb24sIGFuZCBzaWduYWwgYW5kIHF1ZXJ5IGhhbmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgZXhlY3V0ZSBtZXRob2QgaXMgY2FsbGVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBXb3JrZmxvdyBleGVjdXRpb25cbiAgICovXG4gIGV4ZWN1dGU/OiAoaW5wdXQ6IFdvcmtmbG93RXhlY3V0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdleGVjdXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFVwZGF0ZSBoYW5kbGVyIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgVXBkYXRlXG4gICAqL1xuICBoYW5kbGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVVcGRhdGUnPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdXBkYXRlIHZhbGlkYXRvciBjYWxsZWRcbiAgICovXG4gIHZhbGlkYXRlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAndmFsaWRhdGVVcGRhdGUnPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byBhIFdvcmtmbG93IGV4ZWN1dGlvblxuICAgKi9cbiAgaGFuZGxlU2lnbmFsPzogKGlucHV0OiBTaWduYWxJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlU2lnbmFsJz4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgV29ya2Zsb3cgaXMgcXVlcmllZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgcXVlcnlcbiAgICovXG4gIGhhbmRsZVF1ZXJ5PzogKGlucHV0OiBRdWVyeUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVRdWVyeSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5leGVjdXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGVJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlVXBkYXRlfSBhbmQge0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IudmFsaWRhdGVVcGRhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgdXBkYXRlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVNpZ25hbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsSW5wdXQge1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlUXVlcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5SW5wdXQge1xuICByZWFkb25seSBxdWVyeUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8vIFdvcmtmbG93IE91dGJvdW5kIENhbGxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGNvZGUgY2FsbHMgdG8gdGhlIFRlbXBvcmFsIEFQSXMsIGxpa2Ugc2NoZWR1bGluZyBhbiBhY3Rpdml0eVxuICogYW5kIHN0YXJ0aW5nIGEgdGltZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgdGltZXIuXG4gICAqL1xuICBzdGFydFRpbWVyPzogKGlucHV0OiBUaW1lcklucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnRUaW1lcic+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzY2hlZHVsZXMgYW4gQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlQWN0aXZpdHk/OiAoXG4gICAgaW5wdXQ6IEFjdGl2aXR5SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NjaGVkdWxlQWN0aXZpdHknPlxuICApID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhIGxvY2FsIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uXG4gICAqL1xuICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk/OiAoXG4gICAgaW5wdXQ6IExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5Jz5cbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnROZXh1c09wZXJhdGlvbj86IChcbiAgICBpbnB1dDogU3RhcnROZXh1c09wZXJhdGlvbklucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydE5leHVzT3BlcmF0aW9uJz5cbiAgKSA9PiBQcm9taXNlPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBjaGlsZCB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqXG4gICAqIFRoZSBpbnRlcmNlcHRvciBmdW5jdGlvbiByZXR1cm5zIDIgcHJvbWlzZXM6XG4gICAqIC0gVGhlIGZpcnN0IHJlc29sdmVzIHdpdGggdGhlIGBydW5JZGAgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgaGFzIHN0YXJ0ZWQgb3IgcmVqZWN0cyBpZiBmYWlsZWQgdG8gc3RhcnQuXG4gICAqIC0gVGhlIHNlY29uZCByZXNvbHZlcyB3aXRoIHRoZSB3b3JrZmxvdyByZXN1bHQgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgY29tcGxldGVzIG9yIHJlamVjdHMgb24gZmFpbHVyZS5cbiAgICovXG4gIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbj86IChcbiAgICBpbnB1dDogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbic+XG4gICkgPT4gUHJvbWlzZTxbUHJvbWlzZTxzdHJpbmc+LCBQcm9taXNlPHVua25vd24+XT47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNpZ25hbHMgYSBjaGlsZCBvciBleHRlcm5hbCBXb3JrZmxvdy5cbiAgICovXG4gIHNpZ25hbFdvcmtmbG93PzogKFxuICAgIGlucHV0OiBTaWduYWxXb3JrZmxvd0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzaWduYWxXb3JrZmxvdyc+XG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgY2FsbHMgY29udGludWVBc05ldy5cbiAgICovXG4gIGNvbnRpbnVlQXNOZXc/OiAoXG4gICAgaW5wdXQ6IENvbnRpbnVlQXNOZXdJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnY29udGludWVBc05ldyc+XG4gICkgPT4gUHJvbWlzZTxuZXZlcj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGB3b3JrZmxvdy5sb2dgIG1ldGhvZHMuXG4gICAqXG4gICAqIFRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGluIHRoaXMgY2FsbCBhcmUgYXR0YWNoZWQgdG8gZXZlcnkgbG9nIG1lc3NhZ2UuXG4gICAqL1xuICBnZXRMb2dBdHRyaWJ1dGVzPzogKFxuICAgIGlucHV0OiBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2dldExvZ0F0dHJpYnV0ZXMnPlxuICApID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBldmVyeSB0aW1lIGEgbWV0cmljIGlzIGVtaXR0ZWQgZnJvbSBhIFdvcmtmbG93IG1ldHJpYyAoaWUuIGEgbWV0cmljIGNyZWF0ZWRcbiAgICogZnJvbSB7QGxpbmsgd29ya2Zsb3cubWV0cmljTWV0ZXJ9KS5cbiAgICpcbiAgICogVGFncyByZXR1cm5lZCBieSB0aGlzIGhvb2sgYXJlIF9wcmVwZW5kZWRfIHRvIHRhZ3MgZGVmaW5lZCBhdCB0aGUgbWV0cmljIGxldmVsIGFuZCB0YWdzXG4gICAqIGRlZmluZWQgb24gdGhlIGVtaXR0ZXIgZnVuY3Rpb24gaXRzZWxmLlxuICAgKi9cbiAgZ2V0TWV0cmljVGFncz86IChcbiAgICBpbnB1dDogR2V0TWV0cmljVGFnc0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdnZXRNZXRyaWNUYWdzJz5cbiAgKSA9PiBNZXRyaWNUYWdzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRUaW1lcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lcklucHV0IHtcbiAgcmVhZG9ubHkgZHVyYXRpb25NczogbnVtYmVyO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3B0aW9ucz86IFRpbWVyT3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHRpbWVyIChpLmUuIHNsZWVwKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGZpeGVkLCBzaW5nbGUgbGluZSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kJ3MgcHVycG9zZVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2NoZWR1bGVBY3Rpdml0eX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUxvY2FsQWN0aXZpdHl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgb3JpZ2luYWxTY2hlZHVsZVRpbWU/OiBUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0TmV4dXNPcGVyYXRpb259LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGlucHV0OiB1bmtub3duO1xuICByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBOZXh1cyBPcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGVuZCB0byBlbmQgdGltZW91dCBmb3IgdGhlIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIFRlbXBvcmFsIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIG9wZXJhdGlvbiBtYXkgd2FpdCBiZWZvcmUgaXQgYmVnaW5zIGV4ZWN1dGluZy4gSWYgdGhlIG9wZXJhdGlvbiBoYXMgbm90IHN0YXJ0ZWRcbiAgICogd2l0aGluIHRoaXMgd2luZG93LCBhIHRpbWVvdXQgZXJyb3Igd2l0aCB0eXBlIFNDSEVEVUxFX1RPX1NUQVJUIGlzIHJhaXNlZC5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIG5vIHRpbWVvdXQuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGFuIGFzeW5jIG9wZXJhdGlvbiBtYXkgdGFrZSB0byBjb21wbGV0ZSBhZnRlciBpdCBoYXMgc3RhcnRlZC4gSWYgdGhlIG9wZXJhdGlvbiBkb2VzXG4gICAqIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhpcyB3aW5kb3csIGEgdGltZW91dCBlcnJvciB3aXRoIHR5cGUgU1RBUlRfVE9fQ0xPU0UgaXMgcmFpc2VkLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gbm8gdGltZW91dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIE9wZXJhdGlvbidzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIG9wZXJhdGlvbidzIHJlc3VsdCBwcm9taXNlIGZhaWwgd2l0aCBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmVgLFxuICAgKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAgICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAgICogT3BlcmF0aW9uIGNhbGwgd2FzIG1hZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICByZWFkb25seSBjYW5jZWxsYXRpb25UeXBlPzogTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBBIGZpeGVkLCBzaW5nbGUtbGluZSBzdW1tYXJ5IGZvciB0aGlzIE5leHVzIE9wZXJhdGlvbiB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gc2luZ2xlLWxpbmUgVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE91dHB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0TmV4dXNPcGVyYXRpb259LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQge1xuICAvKipcbiAgICogVGhlIHRva2VuIGZvciB0aGUgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBVbmRlZmluZWQgaWYgdGhlIE5leHVzIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseSwgaW4gd2hpY2ggY2FzZSB0aGUge0BsaW5rIHJlc3VsdH1cbiAgICogd2lsbCBiZSBpbW1lZGlhdGVseSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgTmV4dXMgT3BlcmF0aW9uIGNvbXBsZXRlcywgZWl0aGVyIHdpdGggdGhlIHJlc3VsdCBvZiB0aGVcbiAgICogT3BlcmF0aW9uIGlmIGl0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG9yIGEgZmFpbHVyZSBpZiB0aGUgTmV4dXMgT3BlcmF0aW9uIGZhaWxlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQge1xuICByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2lnbmFsV29ya2Zsb3d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdvcmtmbG93SW5wdXQge1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2lnbmFsTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHRhcmdldDpcbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogJ2V4dGVybmFsJztcbiAgICAgICAgcmVhZG9ubHkgd29ya2Zsb3dFeGVjdXRpb246IFdvcmtmbG93RXhlY3V0aW9uO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICByZWFkb25seSB0eXBlOiAnY2hpbGQnO1xuICAgICAgICByZWFkb25seSBjaGlsZFdvcmtmbG93SWQ6IHN0cmluZztcbiAgICAgIH07XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3SW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3fS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29udGludWVBc05ld0lucHV0T3B0aW9ucyA9IENvbnRpbnVlQXNOZXdPcHRpb25zICYgUmVxdWlyZWQ8UGljazxDb250aW51ZUFzTmV3T3B0aW9ucywgJ3dvcmtmbG93VHlwZSc+PjtcblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldExvZ0F0dHJpYnV0ZXN9LlxuICovXG5leHBvcnQgdHlwZSBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldE1ldHJpY1RhZ3N9LlxuICovXG5leHBvcnQgdHlwZSBHZXRNZXRyaWNUYWdzSW5wdXQgPSBNZXRyaWNUYWdzO1xuXG4vLyBXb3JrZmxvdyBJbnRlcm5hbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBJbnRlcmNlcHRvciBmb3IgdGhlIGludGVybmFscyBvZiB0aGUgV29ya2Zsb3cgcnVudGltZS5cbiAqXG4gKiBVc2UgdG8gbWFuaXB1bGF0ZSBvciB0cmFjZSBXb3JrZmxvdyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIGlzIGZvciBhZHZhbmNlZCB1c2UgY2FzZXMgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBXb3JrZmxvdyBydW50aW1lIHJ1bnMgYSBXb3JrZmxvd0FjdGl2YXRpb25Kb2IuXG4gICAqL1xuICBhY3RpdmF0ZT8oaW5wdXQ6IEFjdGl2YXRlSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2FjdGl2YXRlJz4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYWxsIGBXb3JrZmxvd0FjdGl2YXRpb25Kb2JgcyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBhbiBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBDYW4gbWFuaXB1bGF0ZSB0aGUgY29tbWFuZHMgZ2VuZXJhdGVkIGJ5IHRoZSBXb3JrZmxvd1xuICAgKi9cbiAgY29uY2x1ZGVBY3RpdmF0aW9uPyhpbnB1dDogQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2NvbmNsdWRlQWN0aXZhdGlvbic+KTogQ29uY2x1ZGVBY3RpdmF0aW9uT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYmVmb3JlIGRpc3Bvc2luZyB0aGUgV29ya2Zsb3cgaXNvbGF0ZSBjb250ZXh0LlxuICAgKlxuICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSBhbnkgcmVzb3VyY2UgY2xlYW51cC5cbiAgICovXG4gIGRpc3Bvc2U/KGlucHV0OiBEaXNwb3NlSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2Rpc3Bvc2UnPik6IHZvaWQ7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmFjdGl2YXRlfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2YXRlSW5wdXQge1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgYmF0Y2hJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5kaXNwb3NlfVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VJbnB1dCB7fVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb259XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQge1xuICByZWFkb25seSBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW107XG59XG5cbi8qKlxuICogT3V0cHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb259XG4gKi9cbmV4cG9ydCB0eXBlIENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dCA9IENvbmNsdWRlQWN0aXZhdGlvbklucHV0O1xuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgUmV0cnlQb2xpY3ksXG4gIENvbW1vbldvcmtmbG93T3B0aW9ucyxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgRHVyYXRpb24sXG4gIFZlcnNpb25pbmdJbnRlbnQsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlUGFpcixcbiAgUHJpb3JpdHksXG4gIFdvcmtlckRlcGxveW1lbnRWZXJzaW9uLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogV29ya2Zsb3cgRXhlY3V0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBXb3JrZmxvdywgdGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBjbGllbnQgZHVyaW5nIFdvcmtmbG93IGNyZWF0aW9uLlxuICAgKiBBIHNpbmdsZSBXb3JrZmxvdyBtYXkgcnVuIG11bHRpcGxlIHRpbWVzIGUuZy4gd2hlbiBzY2hlZHVsZWQgd2l0aCBjcm9uLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBhIHNpbmdsZSBXb3JrZmxvdyBydW5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdvcmtmbG93IGZ1bmN0aW9uJ3MgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLCBleHBvc2VkIHRocm91Z2ggYW4gaW50ZXJmYWNlLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogTm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaW5mbyAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ2hpbGQgV29ya2Zsb3cpXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBQYXJlbnRXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSByb290IHdvcmtmbG93IGV4ZWN1dGlvbiwgZGVmaW5lZCBhcyBmb2xsb3dzOlxuICAgKiAxLiBBIHdvcmtmbG93IHdpdGhvdXQgYSBwYXJlbnQgd29ya2Zsb3cgaXMgaXRzIG93biByb290IHdvcmtmbG93LlxuICAgKiAyLiBBIHdvcmtmbG93IHdpdGggYSBwYXJlbnQgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXNcbiAgICogaXRzIHBhcmVudC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBubyBwYXJlbnQgd29ya2Zsb3csIGkuZS4sIHRoZSB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3csXG4gICAqIHRoaXMgZmllbGQgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBDb250aW51ZS1hcy1OZXcgKG9yIHJlc2V0KSBwcm9wYWdhdGVzIHRoZSB3b3JrZmxvdyBwYXJlbnRhZ2UgcmVsYXRpb25zaGlwLFxuICAgKiBhbmQgdGhlcmVmb3JlLCB3aGV0aGVyIHRoZSBuZXcgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgKiBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaGFkIGEgcGFyZW50LlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdD86IFJvb3RXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgaWYgdGhpcyBpcyBhIENyb24gV29ya2Zsb3cgb3Igd2FzIENvbnRpbnVlZCBBcyBOZXcpLlxuICAgKlxuICAgKiBBbiBhcnJheSBvZiB2YWx1ZXMsIHNpbmNlIG90aGVyIFNES3MgbWF5IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgZnJvbSBhIFdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFJlc3VsdD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEZhaWx1cmUgZnJvbSB0aGUgcHJldmlvdXMgUnVuIChwcmVzZW50IHdoZW4gdGhpcyBSdW4gaXMgYSByZXRyeSwgb3IgdGhlIGxhc3QgUnVuIG9mIGEgQ3JvbiBXb3JrZmxvdyBmYWlsZWQpXG4gICAqL1xuICByZWFkb25seSBsYXN0RmFpbHVyZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgV29ya2Zsb3cgaGlzdG9yeSB1cCB1bnRpbCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiBXb3JrZmxvdyBoaXN0b3J5IGluIGJ5dGVzIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgemVybyBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKlxuICAgKiBZb3UgbWF5IHNhZmVseSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hlbiB0byB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgV29ya2Zsb3dUYXNrU3RhcnRlZCBldmVudCByZWNvbW1lbmRpbmcgd2hldGhlciB0b1xuICAgKiB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgYGZhbHNlYCBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVBc05ld1N1Z2dlc3RlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cncyBUYXJnZXQgV29ya2VyIERlcGxveW1lbnQgVmVyc2lvbiBoYXMgY2hhbmdlZCBmcm9tIGl0cyBQaW5uZWQgVmVyc2lvbi5cbiAgICogV2hlbiB0cnVlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGNvbnNpZGVyIGNvbnRpbnVpbmctYXMtbmV3IHdpdGhcbiAgICogYGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6ICdBVVRPX1VQR1JBREUnYCB0byBtb3ZlIHRvIHRoZSBuZXcgdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVwZ3JhZGUtb24tQ29udGludWUtYXMtTmV3IGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFdvcmtlckRlcGxveW1lbnRWZXJzaW9uQ2hhbmdlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVhc29uKHMpIHdoeSBjb250aW51ZSBhcyBuZXcgaXMgc3VnZ2VzdGVkLiBDYW4gcG90ZW50aWFsbHkgYmUgbXVsdGlwbGUgcmVhc29ucy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBNYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRDb250aW51ZUFzTmV3UmVhc29ucz86IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW107XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgb25cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tRdWV1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgaW5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW4gSWQgb2YgdGhlIGZpcnN0IFJ1biBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RFeGVjdXRpb25SdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBSdW4gSWQgaW4gdGhpcyBFeGVjdXRpb24gQ2hhaW5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRpbnVlZEZyb21FeGVjdXRpb25SdW5JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGlzIFtXb3JrZmxvdyBFeGVjdXRpb24gQ2hhaW5dKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvd3Mjd29ya2Zsb3ctZXhlY3V0aW9uLWNoYWluKSB3YXMgc3RhcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBjdXJyZW50IFdvcmtmbG93IFJ1biBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBydW5TdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gZXhwaXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uRXhwaXJhdGlvblRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIFdvcmtmbG93IFJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgU2VydmVyLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1blRpbWVvdXRNcz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhIFdvcmtmbG93IFRhc2sgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSB0YXNrVGltZW91dE1zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHJ5IFBvbGljeSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5yZXRyeX0uXG4gICAqL1xuICByZWFkb25seSByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgYXQgMSBhbmQgaW5jcmVtZW50cyBmb3IgZXZlcnkgcmV0cnkgaWYgdGhlcmUgaXMgYSBgcmV0cnlQb2xpY3lgXG4gICAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyb24gU2NoZWR1bGUgZm9yIHRoaXMgRXhlY3V0aW9uLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMuY3JvblNjaGVkdWxlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGJldHdlZW4gQ3JvbiBSdW5zXG4gICAqL1xuICByZWFkb25seSBjcm9uU2NoZWR1bGVUb1NjaGVkdWxlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBCdWlsZCBJRCBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWQgaWYgdGhlXG4gICAqIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgQnVpbGQgSUQuIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmUgZXhlY3V0aW5nIHRoaXNcbiAgICogdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIEJ1aWxkIElEIHNldCwgdGhlbiBpdHMgSUQgd2lsbCBiZSB1c2VkLiBUaGlzIHZhbHVlIG1heSBjaGFuZ2VcbiAgICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIHdvcmtmbG93IHJ1biwgYnV0IGlzIGRldGVybWluaXN0aWMgYW5kIHNhZmUgdG8gdXNlIGZvciBicmFuY2hpbmcuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY3VycmVudERlcGxveW1lbnRWZXJzaW9uYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QnVpbGRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIERlcGxveW1lbnQgVmVyc2lvbiBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWRcbiAgICogaWYgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgRGVwbG95bWVudCBWZXJzaW9uLiBJZiB0aGlzIHdvcmtlciBpcyB0aGUgb25lXG4gICAqIGV4ZWN1dGluZyB0aGlzIHRhc2sgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBoYXMgYSBEZXBsb3ltZW50IFZlcnNpb24gc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlXG4gICAqIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmRcbiAgICogc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnREZXBsb3ltZW50VmVyc2lvbj86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xuXG4gIHJlYWRvbmx5IHVuc2FmZTogVW5zYWZlV29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBQcmlvcml0eSBvZiB0aGlzIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86IFByaW9yaXR5O1xufVxuXG4vKipcbiAqIFVuc2FmZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24uXG4gKlxuICogTmV2ZXIgcmVseSBvbiB0aGlzIGluZm9ybWF0aW9uIGluIFdvcmtmbG93IGxvZ2ljIGFzIGl0IHdpbGwgY2F1c2Ugbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zYWZlV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIFRoZSBzYWZlIHZlcnNpb24gb2YgdGltZSBpcyBgbmV3IERhdGUoKWAgYW5kIGBEYXRlLm5vdygpYCwgd2hpY2ggYXJlIHNldCBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBhIFdvcmtmbG93XG4gICAqIFRhc2sgYW5kIHN0YXkgY29uc3RhbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgVGFzayBhbmQgZHVyaW5nIHJlcGxheS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdyBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmc6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcgaGlzdG9yeSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byB7QGxpbmsgaXNSZXBsYXlpbmd9LCBidXQgcmV0dXJucyBgZmFsc2VgIGR1cmluZyBxdWVyeSBoYW5kbGVycyBhbmQgdXBkYXRlXG4gICAqIHZhbGlkYXRvcnMsIHdoaWNoIGFyZSBsaXZlIHJlYWQtb25seSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHJlcGxheWluZ1xuICAgKiBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHRydWUsIHdvcmtmbG93IGxvZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCBhbmQgc2lua3MgZGVmaW5lZCB3aXRoXG4gICAqIGNhbGxEdXJpbmdSZXBsYXk9ZmFsc2Ugd29uJ3QgZ2V0IHByb2Nlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHdvcmtmbG93IHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmZvIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90IGFuIGFjdHVhbCBlcnJvciwgdXNlZCBieSB0aGUgV29ya2Zsb3cgcnVudGltZSB0byBhYm9ydCBleGVjdXRpb24gd2hlbiB7QGxpbmsgY29udGludWVBc05ld30gaXMgY2FsbGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29udGludWVBc05ldycpXG5leHBvcnQgY2xhc3MgQ29udGludWVBc05ldyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSUNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbikge1xuICAgIHN1cGVyKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb250aW51aW5nIGEgV29ya2Zsb3cgYXMgbmV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld09wdGlvbnMge1xuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXb3JrZmxvdyB0eXBlIG5hbWUsIGUuZy4gdGhlIGZpbGVuYW1lIGluIHRoZSBOb2RlLmpzIFNESyBvciBjbGFzcyBuYW1lIGluIEphdmFcbiAgICovXG4gIHdvcmtmbG93VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gY29udGludWUgdGhlIFdvcmtmbG93IGluXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciB0aGUgZW50aXJlIFdvcmtmbG93IHJ1blxuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGEgc2luZ2xlIFdvcmtmbG93IHRhc2tcbiAgICogQGZvcm1hdCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogTm9uLXNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKiBOb3RlIHRoYXQgc2VhcmNoIGF0dHJpYnV0ZXMgYXJlIG5vdCBlbmNvZGVkLCBhcyBzdWNoLCBkbyBub3QgaW5jbHVkZSBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBJZiBib3RoIHtAbGluayBzZWFyY2hBdHRyaWJ1dGVzfSBhbmQge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gYXJlIHByb3ZpZGVkLCBjb25mbGljdGluZyBrZXlzIHdpbGwgYmUgb3ZlcndyaXR0ZW5cbiAgICogYnkge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30uXG4gICAqL1xuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10gfCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXM7XG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIFdvcmtmbG93IHNob3VsZFxuICAgKiBDb250aW51ZS1hcy1OZXcgb250byBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50O1xuICAvKipcbiAgICogRGVmaW5lcyB0aGUgdmVyc2lvbmluZyBiZWhhdmlvciB0byBiZSB1c2VkIGJ5IHRoZSBmaXJzdCB0YXNrIG9mIGEgbmV3IHdvcmtmbG93IHJ1biBpbiBhIGNvbnRpbnVlLWFzLW5ldyBjaGFpbi5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBWZXJzaW9uaW5nIHNlbWFudGljcyB3aXRoIGNvbnRpbnVlLWFzLW5ldyBhcmUgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICBpbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yPzogSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCBhbmRcbiAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSdzIG9yIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH0nc1xuICogICBwcm9taXNlIGZhaWwgd2l0aCBhIGBDaGlsZFdvcmtmbG93RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICogUGFyZW50IFdvcmtmbG93IGlzIGNvbnRyb2xsZWQgYnkgdGhlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeX0gc2V0dGluZy5cbiAqXG4gKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYENoaWxkV29ya2Zsb3dPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgQ2hpbGQsIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uXG4gICAqIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFBhcmVudC1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGFjdHVhbGx5IGJlIGF0b21pY2FsbHkgYWRkZWQgdG8gdGhlIENoaWxkIHdvcmtmbG93J3MgaGlzdG9yeS5cbiAgICogSW4gcGFydGljdWxhciwgdGhlIENoaWxkIG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIFBhcmVudCB3b3JrZmxvdyB0aGlua3MgaXRzIGNoaWxkXG4gICAqIHdhcyBjYW5jZWxsZWQsIGJ1dCB0aGUgY2hpbGQgYWN0dWFsbHkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogVG8gZ3VhcmFudGVlIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIENoaWxkIFdvcmtmbG93IGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyByZWNvcmRlZCBpbiBpdHMgaGlzdG9yeS5cbiAgICpcbiAgICogVGhpcyBjYW5jZWxsYXRpb24gdHlwZSBndWFyYW50ZWVzIHRoYXQgdGhlIENoaWxkIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgKHRoYXQgaXMsIHVubGVzcyB0aGUgQ2hpbGQgdGVybWluYXRlcyBpbmJldHdlZW4gZHVlIHRvIHVuZXhwZWN0ZWQgY2F1c2VzKS5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIENoaWxkIFdvcmtmbG93LlxuICAgKlxuICAgKiBUaGUgQ2hpbGQgbWF5IHJlc3BlY3QgY2FuY2VsbGF0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBQYXJlbnQncyBgZXhlY3V0ZUNoaWxkYCBvclxuICAgKiBgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHRgIHByb21pc2Ugd2lsbCBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWBcbiAgICogc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIENoaWxkIG1heSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LFxuICAgKiBpbiB3aGljaCBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb21pc2Ugd2lsbCBlaXRoZXIgcmVzb2x2ZSB3aXRoIGEgcmVzdWx0IChpZiBDaGlsZCBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5KSBvciByZWplY3Qgd2l0aCBhIGRpZmZlcmVudCBjYXVzZSAoaWYgQ2hpbGQgY29tcGxldGVkIHVuY2Vzc2Z1bGx5KS5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMCxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDEsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDIsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIEhvdyBhIENoaWxkIFdvcmtmbG93IHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcGFyZW50LWNsb3NlLXBvbGljeS8gfCBQYXJlbnQgQ2xvc2UgUG9saWN5fVxuICovXG5leHBvcnQgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqL1xuICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcblxuICAvLy8gQW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGhhcyBiZWVuIGRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSWYgYSBgUGFyZW50Q2xvc2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIHNlcnZlciBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRWl0aGVyIGxlYXZlIHByb3BlcnR5IGB1bmRlZmluZWRgLCBvciBzZXQgYW4gZXhwbGljaXQgcG9saWN5IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBUZXJtaW5hdGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURX0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksIGRlY29kZVBhcmVudENsb3NlUG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEVdOiAxLFxuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkV29ya2Zsb3dPcHRpb25zIGV4dGVuZHMgT21pdDxDb21tb25Xb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3knPiB7XG4gIC8qKlxuICAgKiBXb3JrZmxvdyBpZCB0byB1c2Ugd2hlbiBzdGFydGluZy4gSWYgbm90IHNwZWNpZmllZCBhIFVVSUQgaXMgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgaXQgaXNcbiAgICogZGFuZ2Vyb3VzIGFzIGluIGNhc2Ugb2YgY2xpZW50IHNpZGUgcmV0cmllcyBubyBkZWR1cGxpY2F0aW9uIHdpbGwgaGFwcGVuIGJhc2VkIG9uIHRoZVxuICAgKiBnZW5lcmF0ZWQgaWQuIFNvIHByZWZlciBhc3NpZ25pbmcgYnVzaW5lc3MgbWVhbmluZ2Z1bCBpZHMgaWYgcG9zc2libGUuXG4gICAqL1xuICB3b3JrZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIHRvIHVzZSBmb3IgV29ya2Zsb3cgdGFza3MuIEl0IHNob3VsZCBtYXRjaCBhIHRhc2sgcXVldWUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYVxuICAgKiBgV29ya2VyYCB0aGF0IGhvc3RzIHRoZSBXb3JrZmxvdyBjb2RlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIGNoaWxkIGlzIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBUYXNrIFF1ZXVlIGFzIHRoZSBwYXJlbnQuXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgYW5kXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBzaG91bGQgdGhlIENoaWxkJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFBhcmVudCBXb3JrZmxvd1xuICAgKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIHtAbGluayBleGVjdXRlQ2hpbGR9J3Mgb3Ige0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fSdzXG4gICAqICAgcHJvbWlzZSBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICAgKiBDaGlsZCBXb3JrZmxvdyBjYWxsIHdhcyBtYWRlLiBFdmVudHVhbCBDYW5jZWxsYXRpb24gb2YgYSBDaGlsZCBXb3JrZmxvdyBvbiBjb21wbGV0aW9uIG9mIHRoZVxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaXMgY29udHJvbGxlZCBieSB0aGUge0BsaW5rIFBhcmVudENsb3NlUG9saWN5fSBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZWAgZW51bVxuICBjYW5jZWxsYXRpb25UeXBlPzogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdGhlIENoaWxkIHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJlbnRDbG9zZVBvbGljeS5QQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURVxuICAgKi9cbiAgcGFyZW50Q2xvc2VQb2xpY3k/OiBQYXJlbnRDbG9zZVBvbGljeTtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBDaGlsZCBXb3JrZmxvdyBzaG91bGQgcnVuIG9uXG4gICAqIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnMgPSBSZXF1aXJlZDxQaWNrPENoaWxkV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZCcgfCAnY2FuY2VsbGF0aW9uVHlwZSc+PiAmIHtcbiAgYXJnczogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMgPSBDaGlsZFdvcmtmbG93T3B0aW9ucyAmIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZVNES0luZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2xpY2Ugb2YgYSBmaWxlIHN0YXJ0aW5nIGF0IGxpbmVPZmZzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlRmlsZVNsaWNlIHtcbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBwb3NzaWJsZSB0byB0cmltIHRoZSBmaWxlIHdpdGhvdXQgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy5cbiAgICovXG4gIGxpbmVfb2Zmc2V0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBzbGljZSBvZiBhIGZpbGUgd2l0aCBgXFxuYCAobmV3bGluZSkgbGluZSB0ZXJtaW5hdG9yLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIGEgZmlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24ge1xuICAvKipcbiAgICogUGF0aCB0byBzb3VyY2UgZmlsZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpLlxuICAgKiBXaGVuIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCwgbWFrZSBzdXJlIGFsbCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgcm9vdC5cbiAgICovXG4gIGZpbGVfcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIElmIHBvc3NpYmxlLCBTREsgc2hvdWxkIHNlbmQgdGhpcywgcmVxdWlyZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGNvZGUgbG9jYXRpb24uXG4gICAqL1xuICBsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLlxuICAgKi9cbiAgY29sdW1uPzogbnVtYmVyO1xuICAvKipcbiAgICogRnVuY3Rpb24gbmFtZSB0aGlzIGxpbmUgYmVsb25ncyB0byAoaWYgYXBwbGljYWJsZSkuXG4gICAqIFVzZWQgZm9yIGZhbGxpbmcgYmFjayB0byBzdGFjayB0cmFjZSB2aWV3LlxuICAgKi9cbiAgZnVuY3Rpb25fbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEZsYWcgdG8gbWFyayB0aGlzIGFzIGludGVybmFsIFNESyBjb2RlIGFuZCBoaWRlIGJ5IGRlZmF1bHQgaW4gdGhlIFVJLlxuICAgKi9cbiAgaW50ZXJuYWxfY29kZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlIHtcbiAgbG9jYXRpb25zOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgcmVzdWx0IGZvciB0aGUgZW5oYW5jZWQgc3RhY2sgdHJhY2UgcXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFN0YWNrVHJhY2Uge1xuICBzZGs6IFN0YWNrVHJhY2VTREtJbmZvO1xuICAvKipcbiAgICogTWFwcGluZyBvZiBmaWxlIHBhdGggdG8gZmlsZSBjb250ZW50cy5cbiAgICogU0RLIG1heSBjaG9vc2UgdG8gc2VuZCBubywgc29tZSBvciBhbGwgc291cmNlcy5cbiAgICogU291cmNlcyBtaWdodCBiZSB0cmltbWVkLCBhbmQgc29tZSB0aW1lIG9ubHkgdGhlIGZpbGUocykgb2YgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSB0cmFjZSB3aWxsIGJlIHNlbnQuXG4gICAqL1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+O1xuICBzdGFja3M6IFN0YWNrVHJhY2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBpbmZvOiBXb3JrZmxvd0luZm87XG4gIHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXTtcbiAgbm93OiBudW1iZXI7XG4gIHNob3dTdGFja1RyYWNlU291cmNlczogYm9vbGVhbjtcbiAgZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIGV4dGVuZHMgV29ya2Zsb3dDcmVhdGVPcHRpb25zIHtcbiAgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG4gIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcbiAgZ2V0VGltZU9mRGF5KCk6IGJpZ2ludDtcbiAgc3RhY2tUcmFjZXNFbmFibGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24sIFNpZ25hbERlZmluaXRpb24gb3IgUXVlcnlEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyPFxuICBSZXQsXG4gIEFyZ3MgZXh0ZW5kcyBhbnlbXSxcbiAgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPiB8IFNpZ25hbERlZmluaXRpb248QXJncz4gfCBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPixcbj4gPSBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxpbmZlciBSLCBpbmZlciBBPlxuICA/ICguLi5hcmdzOiBBKSA9PiBSIHwgUHJvbWlzZTxSPlxuICA6IFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPGluZmVyIEE+XG4gICAgPyAoLi4uYXJnczogQSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cbiAgICA6IFQgZXh0ZW5kcyBRdWVyeURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBzaWduYWwgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsTmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgdXBkYXRlIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRVcGRhdGVIYW5kbGVyID0gKHVwZGF0ZU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFF1ZXJ5SGFuZGxlciA9IChxdWVyeU5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuXG4vKipcbiAqIEEgdmFsaWRhdGlvbiBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZVZhbGlkYXRvcjxBcmdzIGV4dGVuZHMgYW55W10+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQ7XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHF1ZXJ5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5SGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHNpZ25hbCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBTaWduYWxIYW5kbGVyT3B0aW9ucyA9IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSB9O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGFuZCBkZXNjcmlwdGlvbiBvZiBhbiB1cGRhdGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdPiA9IHtcbiAgdmFsaWRhdG9yPzogVXBkYXRlVmFsaWRhdG9yPEFyZ3M+O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeT86IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbiAgdXNlZEludGVybmFsRmxhZ3M6IG51bWJlcltdO1xuICB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgRmFpbHVyZUNvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgUHJvdG9GYWlsdXJlLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zLFxuICBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMsXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQge1xuICBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgYXJyYXlGcm9tUGF5bG9hZHMsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBlbnN1cmVUZW1wb3JhbEZhaWx1cmUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBJbGxlZ2FsU3RhdGVFcnJvcixcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgbWFwRnJvbVBheWxvYWRzLFxuICBmcm9tUGF5bG9hZHNBdEluZGV4LFxuICBSYXdWYWx1ZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrLCB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7XG4gIFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCxcbiAgU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgdHlwZSB7IFJORyB9IGZyb20gJy4vYWxlYSc7XG5pbXBvcnQgeyBhbGVhIH0gZnJvbSAnLi9hbGVhJztcbmltcG9ydCB7IFJvb3RDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlLCBVcGRhdGVTY29wZSB9IGZyb20gJy4vdXBkYXRlLXNjb3BlJztcbmltcG9ydCB7IGRlcml2ZUFsZWFTZWVkIH0gZnJvbSAnLi9yYW5kb20tc3RyZWFtLXNlZWQnO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciwgTG9jYWxBY3Rpdml0eURvQmFja29mZiwgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIFF1ZXJ5SW5wdXQsXG4gIFNpZ25hbElucHV0LFxuICBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LFxuICBVcGRhdGVJbnB1dCxcbiAgV29ya2Zsb3dFeGVjdXRlSW5wdXQsXG4gIFdvcmtmbG93SW50ZXJjZXB0b3JzLFxufSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlZmF1bHRTaWduYWxIYW5kbGVyLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZUZpbGVTbGljZSxcbiAgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbixcbiAgV29ya2Zsb3dJbmZvLFxuICBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCxcbiAgQWN0aXZhdGlvbkNvbXBsZXRpb24sXG4gIERlZmF1bHRVcGRhdGVIYW5kbGVyLFxuICBEZWZhdWx0UXVlcnlIYW5kbGVyLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb250aW51ZUFzTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHR5cGUgU2lua0NhbGwgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCBwa2cgZnJvbSAnLi9wa2cnO1xuaW1wb3J0IHR5cGUgeyBTZGtGbGFnIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZEZsYWcgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZywgbG9nIH0gZnJvbSAnLi9sb2dzJztcblxuY29uc3QgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPSB7XG4gIFdPUktGTE9XX0FMUkVBRFlfRVhJU1RTOiAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnLFxufSBhcyBjb25zdDtcbnR5cGUgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPVxuICAodHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKVtrZXlvZiB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdO1xuXG5jb25zdCBbX2VuY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLCBkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZV0gPVxuICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICAnU1RBUlRfQ0hJTERfV09SS0ZMT1dfRVhFQ1VUSU9OX0ZBSUxFRF9DQVVTRV8nXG4gID4oXG4gICAge1xuICAgICAgW1N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLldPUktGTE9XX0FMUkVBRFlfRVhJU1RTXTogMSxcbiAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIH0gYXMgY29uc3QsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrIHtcbiAgZm9ybWF0dGVkOiBzdHJpbmc7XG4gIHN0cnVjdHVyZWQ6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgc3RvcmUgdG8gdHJhY2sgcHJvbWlzZSBzdGFja3MgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZVN0YWNrU3RvcmUge1xuICBjaGlsZFRvUGFyZW50OiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU2V0PFByb21pc2U8dW5rbm93bj4+PjtcbiAgcHJvbWlzZVRvU3RhY2s6IE1hcDxQcm9taXNlPHVua25vd24+LCBTdGFjaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbjxTdWNjZXNzLCBDb250ZXh0ID0gbmV2ZXI+IHtcbiAgcmVzb2x2ZSh2YWw6IFN1Y2Nlc3MpOiB2b2lkO1xuICByZWplY3QocmVhc29uOiBFcnJvcik6IHZvaWQ7XG4gIGNvbnRleHQ/OiBDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbiB7XG4gIGZuKCk6IGJvb2xlYW47XG5cbiAgcmVzb2x2ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPEsgZXh0ZW5kcyBrZXlvZiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYj4gPSAoXG4gIGFjdGl2YXRpb246IE5vbk51bGxhYmxlPGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iW0tdPlxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIFZlcmlmaWVzIGFsbCBhY3RpdmF0aW9uIGpvYiBoYW5kbGluZyBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZFxuICovXG5leHBvcnQgdHlwZSBBY3RpdmF0aW9uSGFuZGxlciA9IHtcbiAgW1AgaW4ga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2JdOiBBY3RpdmF0aW9uSGFuZGxlckZ1bmN0aW9uPFA+O1xufTtcblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9uLlxuICovXG5pbnRlcmZhY2UgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBpZD86IHN0cmluZztcbn1cblxudHlwZSBJbmZlck1hcFZhbHVlPFQ+ID0gVCBleHRlbmRzIE1hcDxudW1iZXIsIGluZmVyIFY+ID8gViA6IG5ldmVyO1xuXG5pbnRlcmZhY2UgU2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2Uge1xuICByYW5kb20oKTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEtlZXBzIGFsbCBvZiB0aGUgV29ya2Zsb3cgcnVudGltZSBzdGF0ZSBsaWtlIHBlbmRpbmcgY29tcGxldGlvbnMgZm9yIGFjdGl2aXRpZXMgYW5kIHRpbWVycy5cbiAqXG4gKiBJbXBsZW1lbnRzIGhhbmRsZXJzIGZvciBhbGwgd29ya2Zsb3cgYWN0aXZhdGlvbiBqb2JzLlxuICpcbiAqIE5vdGUgdGhhdCBtb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gdGhlIFZNLlxuICpcbiAqIEhvd2V2ZXIsIGEgZmV3IG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgdGhlIFZNIChlc3NlbnRpYWxseSBmcm9tIGB2bS1zaGFyZWQudHNgKS5cbiAqIFRoZXNlIG1ldGhvZHMgYXJlIHNwZWNpZmljYWxseSBtYXJrZWQgd2l0aCBhIGNvbW1lbnQgYW5kIHJlcXVpcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLCBhcyB0aGVcbiAqIGV4ZWN1dGlvbiBjb250ZXh0IG1heSBub3QgcHJvcGVybHkgcmVmbGVjdCB0aGF0IG9mIHRoZSB0YXJnZXQgd29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuOiB3aXRoIFJldXNhYmxlXG4gKiBWTXMsIHRoZSBgZ2xvYmFsYCBtYXkgbm90IGhhdmUgYmVlbiBzd2FwcGVkIHRvIHRob3NlIG9mIHRoYXQgd29ya2Zsb3cgZXhlY3V0aW9uOyB0aGUgYWN0aXZlIG1pY3JvdGFza1xuICogcXVldWUgbWF5IGJlIHRoYXQgb2YgdGhlIHRocmVhZC9wcm9jZXNzLCByYXRoZXIgdGhhbiB0aGUgcXVldWUgb2YgdGhhdCBWTSBjb250ZXh0OyBldGMpLiBDb25zZXF1ZW50bHksXG4gKiBtZXRob2RzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFZNIG11c3Qgbm90IGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqIC0gQWNjZXNzIGFueSBnbG9iYWwgdmFyaWFibGU7XG4gKiAtIENyZWF0ZSBQcm9taXNlIG9iamVjdHMsIHVzZSBhc3luYy9hd2FpdCwgb3Igb3RoZXJ3aXNlIHNjaGVkdWxlIG1pY3JvdGFza3M7XG4gKiAtIENhbGwgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGFueSBmb3JtIG9mIGludGVyY2VwdG9yLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQWN0aXZhdGlvbkhhbmRsZXIge1xuICAvKipcbiAgICogQ2FjaGUgZm9yIG1vZHVsZXMgLSByZWZlcmVuY2VkIGluIHJldXNhYmxlLXZtLnRzXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdGFzayBzZXF1ZW5jZSB0byBhIENvbXBsZXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBsZXRpb25zID0ge1xuICAgIHRpbWVyOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgICBhY3Rpdml0eTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93biwgQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25TdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4+KCksXG4gICAgbmV4dXNPcGVyYXRpb25Db21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93bj4+KCksXG4gICAgY2hpbGRXb3JrZmxvd1N0YXJ0OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjxzdHJpbmcsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICAgIGNoaWxkV29ya2Zsb3dDb21wbGV0ZTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dW5rbm93biwgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgc2lnbmFsV29ya2Zsb3c6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHZvaWQsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICAgIGNhbmNlbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkLCBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0Pj4oKSxcbiAgfTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgVXBkYXRlIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFVwZGF0ZXMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlPigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyBidWZmZXJlZCBzaWduYWwgY2FsbHMgdW50aWwgYSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1ZmZlcmVkU2lnbmFscyA9IEFycmF5PGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JU2lnbmFsV29ya2Zsb3c+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgdXBkYXRlIG5hbWUgdG8gaGFuZGxlciBhbmQgdmFsaWRhdG9yXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2Ygc2lnbmFsIG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGluLXByb2dyZXNzIHVwZGF0ZXMgdG8gaGFuZGxlciBleGVjdXRpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpblByb2dyZXNzVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbj4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyBzaWduYWxzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1NpZ25hbHMgPSBuZXcgTWFwPG51bWJlciwgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIEEgc2VxdWVuY2UgbnVtYmVyIHByb3ZpZGluZyB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2lnbmFsSGFuZGxlckV4ZWN1dGlvblNlcSA9IDA7XG5cbiAgLyoqXG4gICAqIEEgc2lnbmFsIGhhbmRsZXIgdGhhdCBjYXRjaGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0U2lnbmFsSGFuZGxlcj86IERlZmF1bHRTaWduYWxIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBBIHVwZGF0ZSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFVwZGF0ZUhhbmRsZXI/OiBEZWZhdWx0VXBkYXRlSGFuZGxlcjtcblxuICAvKipcbiAgICogQSBxdWVyeSBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0UXVlcnlIYW5kbGVyPzogRGVmYXVsdFF1ZXJ5SGFuZGxlcjtcblxuICAvKipcbiAgICogU291cmNlIG1hcCBmaWxlIGZvciBsb29raW5nIHVwIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVzcG9uc2UgdG8gX19lbmhhbmNlZF9zdGFja190cmFjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzZW5kIHRoZSBzb3VyY2VzIGluIGVuaGFuY2VkIHN0YWNrIHRyYWNlIHF1ZXJ5IHJlc3BvbnNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTdGFja1RyYWNlU291cmNlcztcblxuICByZWFkb25seSBwcm9taXNlU3RhY2tTdG9yZTogUHJvbWlzZVN0YWNrU3RvcmUgPSB7XG4gICAgcHJvbWlzZVRvU3RhY2s6IG5ldyBNYXAoKSxcbiAgICBjaGlsZFRvUGFyZW50OiBuZXcgTWFwKCksXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrIHRvIGZhaWwuIFNldHMgaWYgYSBub24tYFRlbXBvcmFsRmFpbHVyZWBcbiAgICogZXJyb3IgYnViYmxlcyB1cCBvdXQgb2YgdGhlIFdvcmtmbG93IGZ1bmN0aW9uLCBvciBvdXQgb2YgYSBTaWduYWwgb3IgVXBkYXRlIGhhbmRsZXIuIFdlXG4gICAqIGNhcHR1cmUgZXJyb3JzIHRoaXMgd2F5IGJlY2F1c2UgdGhvc2UgZnVuY3Rpb25zIGFyZSBub3QgdGVjaG5pY2FsbHkgYXdhaXRlZCB3aGVuIHN0YXJ0ZWQsXG4gICAqIGJ1dCBsZWZ0IHRvIHJ1biBhc3luY2hyb25vdXNseS4gVGhlcmUgaXMgdGhlcmVmb3JlIG5vIHJlYWwgXCJwYXJlbnRcIiBmdW5jdGlvbiB0aGF0IGNhblxuICAgKiBkaXJlY3RseSBoYW5kbGUgdGhvc2UgZXJyb3JzLCBhbmQgbm90IGNhcHR1cmluZyBpdCB3b3VsZCByZXN1bHQgaW4gYW4gVW5oYW5kbGVkIFByb21pc2VcbiAgICogUmVqZWN0aW9uLiBTbyBpbnN0ZWFkLCB3ZSBidWZmZXIgdGhlIGVycm9yIGhlcmUsIHRvIHRoZW4gYmUgcHJvY2Vzc2VkIGluIHRoZSBjb250ZXh0XG4gICAqIG9mIG91ciBvd24gc3luY2hyb25vdXMgQWN0aXZhdGlvbiBoYW5kbGluZyBldmVudCBsb29wLlxuICAgKlxuICAgKiBPdXIgY29kZSBkb2VzIGEgYmVzdCBlZmZvcnQgdG8gc3RvcCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGFjdGl2YXRpb24gYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgKiBhZnRlciB0aGlzIGZpZWxkIGlzIHNldDpcbiAgICogIC0gSWYgYW4gZXJyb3IgaXMgdGhyb3duIHdoaWxlIGV4ZWN1dGluZyBjb2RlIHN5bmNocm9ub3VzbHkgKGUuZy4gYW55dGhpbmcgYmVmb3JlIHRoZVxuICAgKiAgICBmaXJzdCBgYXdhaXRgIHN0YXRlbWVudCBpbiBhIFdvcmtmbG93IGZ1bmN0aW9uIG9yIGEgc2lnbmFsL3VwZGF0ZSBoYW5kbGVyKSwgdGhlIGVycm9yXG4gICAqICAgIHdpbGwgYmUgX2ltbWVkaWF0ZWx5XyByZXRocm93biwgd2hpY2ggd2lsbCBwcmV2ZW50IGV4ZWN1dGlvbiBvZiBmdXJ0aGVyIGpvYnMgaW4gdGhlXG4gICAqICAgIGN1cnJlbnQgYWN0aXZhdGlvbi4gV2Uga25vdyB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBjb2RlIHN5bmNocm9ub3VzbHkgdGhhbmtzIHRvIHRoZVxuICAgKiAgICBgcmV0aHJvd1N5bmNocm9ub3VzbHlgIGZsYWcgYmVsb3cuXG4gICAqICAtIEl0IGFuIGVycm9yIGlzIHRocm93biB3aGlsZSBleGVjdXRpbmcgbWljcm90YXNrcywgdGhlbiB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBvblxuICAgKiAgICB0aGUgbmV4dCBjYWxsIHRvIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYC5cbiAgICpcbiAgICogVW5mb3J0dW5hdGVseSwgdGhlcmUncyBubyB3YXkgZm9yIHVzIHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb24gb2YgbWljcm90YXNrcyB0aGF0IGhhdmVcbiAgICogYWxyZWFkeSBiZWVuIHNjaGVkdWxlZCwgbm9yIHRob3NlIHRoYXQgd2lsbCBiZSByZWN1cnNpdmVseSBzY2hlZHVsZWQgZnJvbSB0aG9zZSBtaWNyb3Rhc2tzLlxuICAgKiBTaG91bGQgbW9yZSBlcnJvcnMgZ2V0IHRocm93biB3aGlsZSBzZXR0bGluZyBtaWNyb3Rhc2tzLCB0aG9zZSB3aWxsIGJlIGlnbm9yZWQgKGkuZS4gb25seVxuICAgKiB0aGUgZmlyc3QgY2FwdHVyZWQgZXJyb3IgaXMgcHJlc2VydmVkKS5cbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvd1Rhc2tFcnJvcjogdW5rbm93bjtcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSBfbmFtZXNfIChmcm9tIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9KSB0aGF0XG4gICAqIHNob3VsZCBjYXVzZSBXb3JrZmxvdyBFeGVjdXRpb24gZmFpbHVyZSByYXRoZXIgdGhhbiBXRlQgZmFpbHVyZS5cbiAgICpcbiAgICogU2V0IGF0IHdvcmtmbG93IGNyZWF0aW9uIHRpbWUgZnJvbSB0aGUgd29ya2VyIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogRXJyb3IgX3R5cGVzXyAoZnJvbSB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy5mYWlsdXJlRXhjZXB0aW9uVHlwZXN9KVxuICAgKiB0aGF0IHNob3VsZCBjYXVzZSBXb3JrZmxvdyBFeGVjdXRpb24gZmFpbHVyZSByYXRoZXIgdGhhbiBXRlQgZmFpbHVyZS5cbiAgICpcbiAgICogU2V0IGluIGB3b3JrZXItaW50ZXJmYWNlLnRzYCBhZnRlciB0aGUgd29ya2Zsb3cgZGVmaW5pdGlvbiBvcHRpb25zIGFyZSByZWFkLlxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlczogQXJyYXk8bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gRXJyb3I+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB3aGVuIHJ1bm5pbmcgc3luY2hyb25vdXMgY29kZSAoZS5nLiB3aGlsZSBwcm9jZXNzaW5nIGFjdGl2YXRpb24gam9icyBhbmQgd2hlbiBjYWxsaW5nXG4gICAqIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCkuIFdoaWxlIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGlzIHNhZmUgdG8gbGV0IGVycm9ycyBidWJibGUgdXAuXG4gICAqL1xuICBwdWJsaWMgcmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcm9vdFNjb3BlID0gbmV3IFJvb3RDYW5jZWxsYXRpb25TY29wZSgpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHF1ZXJ5IG5hbWUgdG8gaGFuZGxlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHF1ZXJ5SGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGU+KFtcbiAgICBbXG4gICAgICBTVEFDS19UUkFDRV9RVUVSWV9OQU1FLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTxzdHJpbmc+KFxuICAgICAgICAgICAgdGhpcy5nZXRTdGFja1RyYWNlcygpXG4gICAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZm9ybWF0dGVkKVxuICAgICAgICAgICAgICAuam9pbignXFxuXFxuJylcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzZW5zaWJsZSBzdGFjayB0cmFjZS4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgIEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpOiBSYXdWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzb3VyY2VNYXAgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgc2RrOiBTdGFja1RyYWNlU0RLSW5mbyA9IHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2ZXJzaW9uOiBwa2cudmVyc2lvbiB9O1xuICAgICAgICAgIGNvbnN0IHN0YWNrcyA9IHRoaXMuZ2V0U3RhY2tUcmFjZXMoKS5tYXAoKHsgc3RydWN0dXJlZDogbG9jYXRpb25zIH0pID0+ICh7IGxvY2F0aW9ucyB9KSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgU3RhY2tUcmFjZUZpbGVTbGljZVtdPiA9IHt9O1xuICAgICAgICAgIGlmICh0aGlzLnNob3dTdGFja1RyYWNlU291cmNlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IGxvY2F0aW9ucyB9IG9mIHN0YWNrcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZV9wYXRoIH0gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlX3BhdGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzb3VyY2VNYXA/LnNvdXJjZXNDb250ZW50Py5bc291cmNlTWFwPy5zb3VyY2VzLmluZGV4T2YoZmlsZV9wYXRoKV07XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzW2ZpbGVfcGF0aF0gPSBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUmF3VmFsdWU8RW5oYW5jZWRTdGFja1RyYWNlPih7IHNkaywgc3RhY2tzLCBzb3VyY2VzIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzdGFjayB0cmFjZSBhbm5vdGF0ZWQgd2l0aCBzb3VyY2UgaW5mb3JtYXRpb24uJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBbXG4gICAgICAnX190ZW1wb3JhbF93b3JrZmxvd19tZXRhZGF0YScsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpOiBSYXdWYWx1ZSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dUeXBlID0gdGhpcy5pbmZvLndvcmtmbG93VHlwZTtcbiAgICAgICAgICBjb25zdCBxdWVyeURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5SGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBzaWduYWxEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy5zaWduYWxIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnVwZGF0ZUhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTx0ZW1wb3JhbC5hcGkuc2RrLnYxLklXb3JrZmxvd01ldGFkYXRhPih7XG4gICAgICAgICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgIHR5cGU6IHdvcmtmbG93VHlwZSxcbiAgICAgICAgICAgICAgcXVlcnlEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgc2lnbmFsRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgIHVwZGF0ZURlZmluaXRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGN1cnJlbnREZXRhaWxzOiB0aGlzLmN1cnJlbnREZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd29ya2Zsb3cuJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIExvYWRlZCBpbiB7QGxpbmsgaW5pdFJ1bnRpbWV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJjZXB0b3JzOiBSZXF1aXJlZDxXb3JrZmxvd0ludGVyY2VwdG9ycz4gPSB7XG4gICAgaW5ib3VuZDogW10sXG4gICAgb3V0Ym91bmQ6IFtdLFxuICAgIGludGVybmFsczogW10sXG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciB0aGF0IHN0b3JlcyBhbGwgZ2VuZXJhdGVkIGNvbW1hbmRzLCByZXNldCBhZnRlciBlYWNoIGFjdGl2YXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW10gPSBbXTtcblxuICAvKipcbiAgICogU3RvcmVzIGFsbCB7QGxpbmsgY29uZGl0aW9ufXMgdGhhdCBoYXZlbid0IGJlZW4gdW5ibG9ja2VkIHlldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrZWRDb25kaXRpb25zID0gbmV3IE1hcDxudW1iZXIsIENvbmRpdGlvbj4oKTtcblxuICAvKipcbiAgICogSXMgdGhpcyBXb3JrZmxvdyBjb21wbGV0ZWQ/XG4gICAqXG4gICAqIEEgV29ya2Zsb3cgd2lsbCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlZCBpZiBpdCBnZW5lcmF0ZXMgYSBjb21tYW5kIHRoYXQgdGhlXG4gICAqIHN5c3RlbSBjb25zaWRlcnMgYXMgYSBmaW5hbCBXb3JrZmxvdyBjb21tYW5kIChlLmcuXG4gICAqIGNvbXBsZXRlV29ya2Zsb3dFeGVjdXRpb24gb3IgZmFpbFdvcmtmbG93RXhlY3V0aW9uKS5cbiAgICovXG4gIHB1YmxpYyBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2FzIHRoaXMgV29ya2Zsb3cgY2FuY2VsbGVkP1xuICAgKi9cbiAgcHJvdGVjdGVkIGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV4dCAoaW5jcmVtZW50YWwpIHNlcXVlbmNlIHRvIGFzc2lnbiB3aGVuIGdlbmVyYXRpbmcgY29tcGxldGFibGUgY29tbWFuZHNcbiAgICovXG4gIHB1YmxpYyBuZXh0U2VxcyA9IHtcbiAgICB0aW1lcjogMSxcbiAgICBhY3Rpdml0eTogMSxcbiAgICBjaGlsZFdvcmtmbG93OiAxLFxuICAgIHNpZ25hbFdvcmtmbG93OiAxLFxuICAgIGNhbmNlbFdvcmtmbG93OiAxLFxuICAgIGNvbmRpdGlvbjogMSxcbiAgICBuZXh1c09wZXJhdGlvbjogMSxcbiAgICAvLyBVc2VkIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhY3RpdmUgc3RhY2sgdHJhY2VzXG4gICAgc3RhY2s6IDEsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2V0IGV2ZXJ5IHRpbWUgdGhlIHdvcmtmbG93IGV4ZWN1dGVzIGFuIGFjdGl2YXRpb25cbiAgICogTWF5IGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgbm93OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBXb3JrZmxvdywgaW5pdGlhbGl6ZWQgd2hlbiBhIFdvcmtmbG93IGlzIHN0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvdz86IFdvcmtmbG93IHwgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPGFueVtdLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvd1xuICAgKiBNYXkgYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBpbmZvOiBXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIGRldGVybWluaXN0aWMgUk5HIGZvciB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogU2NvcGVkIG92ZXJyaWRlcyB1c2VkIGJ5IGBXb3JrZmxvd1JhbmRvbVN0cmVhbS53aXRoKC4uLilgIGFyZSBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIFJORy5cbiAgICovXG4gIHB1YmxpYyByYW5kb206IFJORztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2VlZCBtYXRlcmlhbCBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24ncyBkZXRlcm1pbmlzdGljIFJOR3MuXG4gICAqL1xuICBwdWJsaWMgcmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGRldGVybWluaXN0aWMgUk5HIHN0cmVhbXMga2V5ZWQgYnkgc3RhYmxlIHN0cmVhbSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWVkUmFuZG9tU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBSTkc+KCk7XG5cbiAgcHJvdGVjdGVkIGN1cnJlbnRSYW5kb21TdG9yYWdlPzogQUxTPFNjb3BlZFdvcmtmbG93UmFuZG9tU291cmNlIHwgdW5kZWZpbmVkPjtcblxuICBwdWJsaWMgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciA9IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyO1xuICBwdWJsaWMgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIGtub3cgdGhlIHN0YXR1cyBvZiBmb3IgdGhpcyB3b3JrZmxvdywgYXMgaW4ge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duUHJlc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBzZW50IHRvIGNvcmUge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93bkZsYWdzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgc2RrVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQnVmZmVyZWQgc2luayBjYWxscyBwZXIgYWN0aXZhdGlvblxuICAgKi9cbiAgc2lua0NhbGxzID0gQXJyYXk8U2lua0NhbGw+KCk7XG5cbiAgLyoqXG4gICAqIEEgbmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWUgZnVuY3Rpb24sIGV4dGVybmFsbHkgaW5qZWN0ZWQuIFRoaXMgaXMgdXNlZCB0b1xuICAgKiBwcmVjaXNlbHkgc29ydCBsb2dzIGVudHJpZXMgZW1pdHRlZCBmcm9tIHRoZSBXb3JrZmxvdyBDb250ZXh0IHZzIHRob3NlIGVtaXR0ZWRcbiAgICogZnJvbSBvdGhlciBzb3VyY2VzIChlLmcuIG1haW4gdGhyZWFkLCBDb3JlLCBldGMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdldFRpbWVPZkRheTogKCkgPT4gYmlnaW50O1xuXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG5cbiAgcHVibGljIGN1cnJlbnREZXRhaWxzOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuICBwdWJsaWMgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcj86ICgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93U2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFja1RyYWNlc0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZm8sXG4gICAgbm93LFxuICAgIHNob3dTdGFja1RyYWNlU291cmNlcyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZ2V0VGltZU9mRGF5LFxuICAgIHJhbmRvbW5lc3NTZWVkLFxuICAgIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLFxuICAgIHN0YWNrVHJhY2VzRW5hYmxlZCxcbiAgICBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzLFxuICB9OiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCkge1xuICAgIHRoaXMuZ2V0VGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gICAgdGhpcy5zaG93U3RhY2tUcmFjZVNvdXJjZXMgPSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG4gICAgdGhpcy5zb3VyY2VNYXAgPSBzb3VyY2VNYXA7XG4gICAgdGhpcy5yYW5kb21uZXNzU2VlZCA9IFsuLi5yYW5kb21uZXNzU2VlZF07XG4gICAgdGhpcy5yYW5kb20gPSBhbGVhKHRoaXMucmFuZG9tbmVzc1NlZWQpO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMgPSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lcztcbiAgICB0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCA9IHN0YWNrVHJhY2VzRW5hYmxlZDtcbiAgICB0aGlzLmZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMgPSBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzID8/IFtdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFJhbmRvbW5lc3NTZWVkKHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmFuZG9tbmVzc1NlZWQgPSBbLi4ucmFuZG9tbmVzc1NlZWRdO1xuICAgIHRoaXMucmFuZG9tID0gYWxlYSh0aGlzLnJhbmRvbW5lc3NTZWVkKTtcbiAgICB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGdldE5hbWVkUmFuZG9tKG5hbWU6IHN0cmluZyk6IFJORyB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5uYW1lZFJhbmRvbVN0cmVhbXMuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5kb20gPSBhbGVhKGRlcml2ZUFsZWFTZWVkKHRoaXMucmFuZG9tbmVzc1NlZWQsIG5hbWUpKTtcbiAgICB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5zZXQobmFtZSwgcmFuZG9tKTtcbiAgICByZXR1cm4gcmFuZG9tO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdpdGhSYW5kb21Tb3VyY2U8VD4ocmFuZG9tU291cmNlOiBTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB8IHVuZGVmaW5lZCwgZm46ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFJhbmRvbVN0b3JhZ2UgPz89IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB8IHVuZGVmaW5lZD4oKSkucnVuKFxuICAgICAgcmFuZG9tU291cmNlLFxuICAgICAgZm5cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHdpdGhDdXJyZW50UmFuZG9tPFQ+KHJhbmRvbVNvdXJjZTogU2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2UsIGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJhbmRvbVNvdXJjZShyYW5kb21Tb3VyY2UsIGZuKTtcbiAgfVxuXG4gIHB1YmxpYyBiaW5kQ3VycmVudFJhbmRvbTxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZuOiBUKTogVCB7XG4gICAgY29uc3QgcmFuZG9tU291cmNlID0gdGhpcy5jdXJyZW50UmFuZG9tU3RvcmFnZT8uZ2V0U3RvcmUoKTtcbiAgICByZXR1cm4gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiB0aGlzLndpdGhSYW5kb21Tb3VyY2UocmFuZG9tU291cmNlLCAoKSA9PiBmbiguLi5hcmdzKSkpIGFzIFQ7XG4gIH1cblxuICBwdWJsaWMgY3VycmVudFJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRSYW5kb21TdG9yYWdlPy5nZXRTdG9yZSgpPy5yYW5kb20oKSA/PyB0aGlzLnJhbmRvbSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBtdXRhdGVXb3JrZmxvd0luZm8oZm46IChpbmZvOiBXb3JrZmxvd0luZm8pID0+IFdvcmtmbG93SW5mbyk6IHZvaWQge1xuICAgIHRoaXMuaW5mbyA9IGZuKHRoaXMuaW5mbyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RhY2tUcmFjZXMoKTogU3RhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBzdGFjayB0cmFjZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgd29ya2VyJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY2hpbGRUb1BhcmVudCwgcHJvbWlzZVRvU3RhY2sgfSA9IHRoaXMucHJvbWlzZVN0YWNrU3RvcmU7XG4gICAgY29uc3QgaW50ZXJuYWxOb2RlcyA9IFsuLi5jaGlsZFRvUGFyZW50LnZhbHVlcygpXS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGN1cnIpIHtcbiAgICAgICAgYWNjLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IFNldCgpKTtcbiAgICBjb25zdCBzdGFja3MgPSBuZXcgTWFwPHN0cmluZywgU3RhY2s+KCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFRvUGFyZW50LmtleXMoKSkge1xuICAgICAgaWYgKCFpbnRlcm5hbE5vZGVzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwcm9taXNlVG9TdGFjay5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5mb3JtYXR0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBzdGFja3Muc2V0KHN0YWNrLmZvcm1hdHRlZCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3QgMTAwJSBzdXJlIHdoZXJlIHRoaXMgY29tZXMgZnJvbSwganVzdCBmaWx0ZXIgaXQgb3V0XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pJyk7XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pXFxuJyk7XG4gICAgcmV0dXJuIFsuLi5zdGFja3NdLm1hcCgoW18sIHN0YWNrXSkgPT4gc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBnZXRBbmRSZXNldFNpbmtDYWxscygpOiBTaW5rQ2FsbFtdIHtcbiAgICBjb25zdCB7IHNpbmtDYWxscyB9ID0gdGhpcztcbiAgICB0aGlzLnNpbmtDYWxscyA9IFtdO1xuICAgIHJldHVybiBzaW5rQ2FsbHM7XG4gIH1cblxuICAvKipcbiAgICogQnVmZmVyIGEgV29ya2Zsb3cgY29tbWFuZCB0byBiZSBjb2xsZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBQcmV2ZW50cyBjb21tYW5kcyBmcm9tIGJlaW5nIGFkZGVkIGFmdGVyIFdvcmtmbG93IGNvbXBsZXRpb24uXG4gICAqL1xuICBwdXNoQ29tbWFuZChjbWQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZCwgY29tcGxldGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChjbWQpO1xuICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKSxcbiAgICAgIHVzZWRJbnRlcm5hbEZsYWdzOiBbLi4udGhpcy5rbm93bkZsYWdzXSxcbiAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFdvcmtmbG93TmV4dEhhbmRsZXIoeyBhcmdzIH06IFdvcmtmbG93RXhlY3V0ZUlucHV0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHdvcmtmbG93IH0gPSB0aGlzO1xuICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93KC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyh0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLCAnZXhlY3V0ZScsIHRoaXMuc3RhcnRXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcblxuICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nKCgpID0+XG4gICAgICAgIGV4ZWN1dGUoe1xuICAgICAgICAgIGhlYWRlcnM6IGFjdGl2YXRpb24uaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uYXJndW1lbnRzLCBjb250ZXh0KSxcbiAgICAgICAgfSlcbiAgICAgICkudGhlbih0aGlzLmNvbXBsZXRlV29ya2Zsb3cuYmluZCh0aGlzKSwgdGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGludWVkRmFpbHVyZSwgbGFzdENvbXBsZXRpb25SZXN1bHQsIG1lbW8sIHNlYXJjaEF0dHJpYnV0ZXMgfSA9IGFjdGl2YXRpb247XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gICAgLy8gTW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpbml0aWFsaXphdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgLi4uaW5mbyxcblxuICAgICAgc2VhcmNoQXR0cmlidXRlczogZGVjb2RlU2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzPy5pbmRleGVkRmllbGRzKSxcbiAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlczogZGVjb2RlVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM/LmluZGV4ZWRGaWVsZHMpLFxuXG4gICAgICBtZW1vOiBtYXBGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBtZW1vPy5maWVsZHMsIGNvbnRleHQpLFxuICAgICAgbGFzdFJlc3VsdDogZnJvbVBheWxvYWRzQXRJbmRleCh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIDAsIGxhc3RDb21wbGV0aW9uUmVzdWx0Py5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICBsYXN0RmFpbHVyZTpcbiAgICAgICAgY29udGludWVkRmFpbHVyZSAhPSBudWxsXG4gICAgICAgICAgPyB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoY29udGludWVkRmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgICBjb25zdCB3b3JrZmxvd0RlZmluaXRpb25PcHRzID0gdGhpcy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyPy4oKTtcbiAgICBpZiAod29ya2Zsb3dEZWZpbml0aW9uT3B0cykge1xuICAgICAgdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IgPSB3b3JrZmxvd0RlZmluaXRpb25PcHRzLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICAgIHRoaXMud29ya2Zsb3dEZWZpbml0aW9uRmFpbHVyZUV4Y2VwdGlvblR5cGVzID0gd29ya2Zsb3dEZWZpbml0aW9uT3B0cy5mYWlsdXJlRXhjZXB0aW9uVHlwZXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbFdvcmtmbG93KF9hY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUNhbmNlbFdvcmtmbG93KTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMucm9vdFNjb3BlLmNhbmNlbCgpO1xuICB9XG5cbiAgcHVibGljIGZpcmVUaW1lcihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUZpcmVUaW1lcik6IHZvaWQge1xuICAgIC8vIFRpbWVycyBhcmUgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlaXIgY29tcGxldGlvbiBtaWdodCBub3QgYmUgaW4gV29ya2Zsb3cgc3RhdGUsXG4gICAgLy8gdGhpcyBpcyBkdWUgdG8gaW1tZWRpYXRlIHRpbWVyIGNhbmNlbGxhdGlvbiB0aGF0IGRvZXNuJ3QgZ28gd2FpdCBmb3IgQ29yZS5cbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCd0aW1lcicsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgY29tcGxldGlvbj8ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVBY3Rpdml0eShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVBY3Rpdml0eSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQWN0aXZpdHkgYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignYWN0aXZpdHknLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGNhbmNlbGxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmJhY2tvZmYpIHtcbiAgICAgIHJlamVjdChuZXcgTG9jYWxBY3Rpdml0eURvQmFja29mZihhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQoXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93U3RhcnQnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnN1Y2NlZWRlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydCB3aXRoIG5vIHJ1bklkJyk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGFjdGl2YXRpb24uc3VjY2VlZGVkLnJ1bklkKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uZmFpbGVkKSB7XG4gICAgICBpZiAoZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UoYWN0aXZhdGlvbi5mYWlsZWQuY2F1c2UpICE9PSAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignR290IHVua25vd24gU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UnKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGFjdGl2YXRpb24uc2VxICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQgJiYgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGF0dHJpYnV0ZXMgaW4gYWN0aXZhdGlvbiBqb2InKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChcbiAgICAgICAgbmV3IFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcihcbiAgICAgICAgICAnV29ya2Zsb3cgZXhlY3V0aW9uIGFscmVhZHkgc3RhcnRlZCcsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dJZCxcbiAgICAgICAgICBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd1R5cGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24uY2FuY2VsbGVkKSB7XG4gICAgICBpZiAoIWFjdGl2YXRpb24uY2FuY2VsbGVkLmZhaWx1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IG5vIGZhaWx1cmUgaW4gY2FuY2VsbGVkIHZhcmlhbnQnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5jYW5jZWxsZWQuZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gc3RhdHVzJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24gYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd0NvbXBsZXRlJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGZhaWxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBjYW5jZWxsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZXEgPSBnZXRTZXEoYWN0aXZhdGlvbik7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuXG4gICAgaWYgKCFhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdW50cmFja1Byb21pc2UoY29tcGxldGVQcm9taXNlKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgcmVzb2x2ZSh7IHRva2VuOiBhY3RpdmF0aW9uLm9wZXJhdGlvblRva2VuISwgcmVzdWx0OiBjb21wbGV0ZVByb21pc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbGVkKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVOZXh1c09wZXJhdGlvbihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVOZXh1c09wZXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHNlcSA9IGdldFNlcShhY3RpdmF0aW9uKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCwgY29udGV4dCk7XG5cbiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBSZXNvbHZlTmV4dXNPcGVyYXRpb24gdG8gYmUgcmVjZWl2ZWQgd2l0aG91dCBhIHByaW9yIFJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0LFxuICAgICAgLy8gZS5nLiBiZWNhdXNlIHRoZSBoYW5kbGVyIGNvbXBsZXRlZCB0aGUgT3BlcmF0aW9uIHN5bmNocm9ub3VzbHkuXG4gICAgICBjb25zdCBzdGFydENvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuICAgICAgaWYgKHN0YXJ0Q29tcGxldGlvbikge1xuICAgICAgICBzdGFydENvbXBsZXRpb24ucmVzb2x2ZSh7IHJlc3VsdDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnI6IEVycm9yO1xuICAgICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5mYWlsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY2FuY2VsbGVkKSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LnRpbWVkT3V0KSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQudGltZWRPdXQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wbGV0aW9uID1cbiAgICAgICAgdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKSA/P1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKTtcbiAgICAgIGNvbXBsZXRpb24ucmVqZWN0KGVyciEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgbm9uLWFzeW5jIGZ1bmN0aW9uIHNvIHRoaXMgaGFuZGxlciBkb2Vzbid0IHNob3cgdXAgaW4gdGhlIHN0YWNrIHRyYWNlXG4gIHByb3RlY3RlZCBxdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIoeyBxdWVyeU5hbWUsIGFyZ3MgfTogUXVlcnlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGxldCBmbiA9IHRoaXMucXVlcnlIYW5kbGVycy5nZXQocXVlcnlOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm4gPSB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIHF1ZXJ5TmFtZSk7XG4gICAgfVxuICAgIC8vIE5vIGhhbmRsZXIgb3IgZGVmYXVsdCByZWdpc3RlcmVkLCBmYWlsLlxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrbm93blF1ZXJ5VHlwZXMgPSBbLi4udGhpcy5xdWVyeUhhbmRsZXJzLmtleXMoKV0uam9pbignICcpO1xuICAgICAgLy8gRmFpbCB0aGUgcXVlcnlcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgIGBXb3JrZmxvdyBkaWQgbm90IHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgJHtxdWVyeU5hbWV9LiBSZWdpc3RlcmVkIHF1ZXJpZXM6IFske2tub3duUXVlcnlUeXBlc31dYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBFeGVjdXRlIGhhbmRsZXIuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdRdWVyeSBoYW5kbGVycyBzaG91bGQgbm90IHJldHVybiBhIFByb21pc2UnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVlcnlXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVF1ZXJ5V29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgcXVlcnlJZCwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIShxdWVyeVR5cGUgJiYgcXVlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcXVlcnkgYWN0aXZhdGlvbiBhdHRyaWJ1dGVzJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHF1ZXJpZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLlxuICAgIGlmIChcbiAgICAgIHF1ZXJ5VHlwZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiZcbiAgICAgICF0aGlzLnF1ZXJ5SGFuZGxlcnMuaGFzKHF1ZXJ5VHlwZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlIHF1ZXJ5IG5hbWU6ICcke3F1ZXJ5VHlwZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHF1ZXJ5LlxuICAgIGNvbnN0IGlzSW50ZXJuYWxRdWVyeSA9XG4gICAgICBxdWVyeVR5cGUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBxdWVyeVR5cGUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIHF1ZXJ5VHlwZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsUXVlcnkgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlUXVlcnknLCB0aGlzLnF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgZXhlY3V0ZSh7XG4gICAgICBxdWVyeU5hbWU6IHF1ZXJ5VHlwZSxcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMsIGNvbnRleHQpLFxuICAgICAgcXVlcnlJZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSkudGhlbihcbiAgICAgIChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVRdWVyeShxdWVyeUlkLCByZXN1bHQpLFxuICAgICAgKHJlYXNvbikgPT4gdGhpcy5mYWlsUXVlcnkocXVlcnlJZCwgcmVhc29uKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZG9VcGRhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgaWQ6IHVwZGF0ZUlkLCBwcm90b2NvbEluc3RhbmNlSWQsIG5hbWUsIGhlYWRlcnMsIHJ1blZhbGlkYXRvciB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXVwZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIGlkJyk7XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBuYW1lJyk7XG4gICAgfVxuICAgIGlmICghcHJvdG9jb2xJbnN0YW5jZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIHByb3RvY29sSW5zdGFuY2VJZCcpO1xuICAgIH1cblxuICAgIC8vIFJlamVjdCBfX3RlbXBvcmFsXy1wcmVmaXhlZCB1cGRhdGVzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHJvdXRlZCB0byB0aGVcbiAgICAvLyB1c2VyJ3MgZGVmYXVsdCBoYW5kbGVyLiBBIHNwZWNpZmljIHJlZ2lzdGVyZWQgaGFuZGxlciAoZS5nLiBmcm9tIGFcbiAgICAvLyBjb250cmliIHBhY2thZ2UpIGlzIGFsbG93ZWQgdGhyb3VnaCwgYW5kIHVucmVnaXN0ZXJlZCBuYW1lcyB3aXRob3V0IGFcbiAgICAvLyBkZWZhdWx0IGhhbmRsZXIgZmFsbCB0aHJvdWdoIHRvIHRoZSBidWZmZXItdGhlbi1yZWplY3QgcGF0aCBiZWxvdy5cbiAgICBpZiAoXG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSAmJlxuICAgICAgIXRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKG5hbWUpICYmXG4gICAgICB0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgdXBkYXRlIG5hbWU6ICcke25hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbnRlcmNlcHRvcnMgaWYgaXQncyBhbiBpbnRlcm5hbCB1cGRhdGUuXG4gICAgY29uc3QgaXNJbnRlcm5hbFVwZGF0ZSA9XG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSB8fFxuICAgICAgbmFtZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fFxuICAgICAgbmFtZSA9PT0gRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRTtcbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpc0ludGVybmFsVXBkYXRlID8gW10gOiB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kO1xuXG4gICAgY29uc3QgZW50cnkgPVxuICAgICAgdGhpcy51cGRhdGVIYW5kbGVycy5nZXQobmFtZSkgPz9cbiAgICAgICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlci5iaW5kKHVuZGVmaW5lZCwgbmFtZSksXG4gICAgICAgICAgICB2YWxpZGF0b3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gYSB3YXJuaW5nIHBvbGljeS5cbiAgICAgICAgICAgIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET04sXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwpO1xuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmcm9tIGVpdGhlciBzb3VyY2UsIGJ1ZmZlciBhbmQgcmV0dXJuXG4gICAgaWYgKGVudHJ5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRVcGRhdGVzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFrZUlucHV0ID0gKCk6IFVwZGF0ZUlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZUlkLFxuICAgICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQsIGNvbnRleHQpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciB1cGhvbGRpbmcsIGFuZCBjb25zdHJhaW5lZFxuICAgIC8vIGJ5LCB0aGUgZm9sbG93aW5nIGNvbnRyYWN0OlxuICAgIC8vXG4gICAgLy8gMS4gSWYgbm8gdmFsaWRhdG9yIGlzIHByZXNlbnQgdGhlbiB2YWxpZGF0aW9uIGludGVyY2VwdG9ycyB3aWxsIG5vdCBiZSBydW4uXG4gICAgLy9cbiAgICAvLyAyLiBEdXJpbmcgdmFsaWRhdGlvbiwgYW55IGVycm9yIG11c3QgZmFpbCB0aGUgVXBkYXRlOyBkdXJpbmcgdGhlIFVwZGF0ZVxuICAgIC8vICAgIGl0c2VsZiwgVGVtcG9yYWwgZXJyb3JzIGZhaWwgdGhlIFVwZGF0ZSB3aGVyZWFzIG90aGVyIGVycm9ycyBmYWlsIHRoZVxuICAgIC8vICAgIGFjdGl2YXRpb24uXG4gICAgLy9cbiAgICAvLyAzLiBUaGUgaGFuZGxlciBtdXN0IG5vdCBzZWUgYW55IG11dGF0aW9ucyBvZiB0aGUgYXJndW1lbnRzIG1hZGUgYnkgdGhlXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNC4gQW55IGVycm9yIHdoZW4gZGVjb2RpbmcvZGVzZXJpYWxpemluZyBpbnB1dCBtdXN0IGJlIGNhdWdodCBhbmQgcmVzdWx0XG4gICAgLy8gICAgaW4gcmVqZWN0aW9uIG9mIHRoZSBVcGRhdGUgYmVmb3JlIGl0IGlzIGFjY2VwdGVkLCBldmVuIGlmIHRoZXJlIGlzIG5vXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNS4gVGhlIGluaXRpYWwgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgKGFzeW5jKSBVcGRhdGUgaGFuZGxlciBzaG91bGRcbiAgICAvLyAgICBiZSBleGVjdXRlZCBhZnRlciB0aGUgKHN5bmMpIHZhbGlkYXRvciBjb21wbGV0ZXMgc3VjaCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gICAgbWluaW1hbCBvcHBvcnR1bml0eSBmb3IgYSBkaWZmZXJlbnQgY29uY3VycmVudCB0YXNrIHRvIGJlIHNjaGVkdWxlZFxuICAgIC8vICAgIGJldHdlZW4gdGhlbS5cbiAgICAvL1xuICAgIC8vIDYuIFRoZSBzdGFjayB0cmFjZSB2aWV3IHByb3ZpZGVkIGluIHRoZSBUZW1wb3JhbCBVSSBtdXN0IG5vdCBiZSBwb2xsdXRlZFxuICAgIC8vICAgIGJ5IHByb21pc2VzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIHVzZXIgY29kZS4gVGhpcyBpbXBsaWVzIHRoYXRcbiAgICAvLyAgICBhc3luYy9hd2FpdCBzeW50YXggbWF5IG5vdCBiZSB1c2VkLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGVsaWJlcmF0ZWx5IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBiZWxvdy5cbiAgICAvLyBUaGVzZSBhcmUgY2F1Z2h0IGVsc2V3aGVyZSBhbmQgZmFpbCB0aGUgY29ycmVzcG9uZGluZyBhY3RpdmF0aW9uLlxuICAgIGNvbnN0IGRvVXBkYXRlSW1wbCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpbnB1dDogVXBkYXRlSW5wdXQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocnVuVmFsaWRhdG9yICYmIGVudHJ5LnZhbGlkYXRvcikge1xuICAgICAgICAgIC8vIFRlbXBvcmFyaWx5IG1hcmsgYXMgbm90IHJlcGxheWluZyBoaXN0b3J5IGV2ZW50cyBkdXJpbmcgdmFsaWRhdG9yIGV4ZWN1dGlvblxuICAgICAgICAgIC8vIHNvIHRoYXQgbG9nZ2luZyBpcyBwZXJtaXR0ZWQuIFZhbGlkYXRvcnMgYXJlIGxpdmUgcmVhZC1vbmx5IG9wZXJhdGlvbnMuXG4gICAgICAgICAgY29uc3Qgd2FzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cyA9IHRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzO1xuICAgICAgICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgICAgIHVuc2FmZTogeyAuLi5pbmZvLnVuc2FmZSwgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiBmYWxzZSB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICAgICAgICBpbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVVcGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LnZhbGlkYXRvcilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YWxpZGF0ZShtYWtlSW5wdXQoKSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgICB1bnNhZmU6IHsgLi4uaW5mby51bnNhZmUsIGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogd2FzUmVwbGF5aW5nSGlzdG9yeUV2ZW50cyB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IG1ha2VJbnB1dCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCBlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWNjZXB0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCk7XG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgaW50ZXJjZXB0b3JzLFxuICAgICAgICAnaGFuZGxlVXBkYXRlJyxcbiAgICAgICAgdGhpcy51cGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LmhhbmRsZXIpXG4gICAgICApO1xuICAgICAgY29uc3QgeyB1bmZpbmlzaGVkUG9saWN5IH0gPSBlbnRyeTtcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuc2V0KHVwZGF0ZUlkLCB7IG5hbWUsIHVuZmluaXNoZWRQb2xpY3ksIGlkOiB1cGRhdGVJZCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGV4ZWN1dGUoaW5wdXQpXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCByZXN1bHQpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5pblByb2dyZXNzVXBkYXRlcy5kZWxldGUodXBkYXRlSWQpKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHJlcyk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgdW50cmFja1Byb21pc2UoVXBkYXRlU2NvcGUudXBkYXRlV2l0aEluZm8odXBkYXRlSWQsIG5hbWUsIGRvVXBkYXRlSW1wbCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZU5leHRIYW5kbGVyKGhhbmRsZXI6IFdvcmtmbG93VXBkYXRlVHlwZSwgeyBhcmdzIH06IFVwZGF0ZUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIoLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVVcGRhdGVOZXh0SGFuZGxlcih2YWxpZGF0b3I6IFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSB8IHVuZGVmaW5lZCwgeyBhcmdzIH06IFVwZGF0ZUlucHV0KTogdm9pZCB7XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgdmFsaWRhdG9yKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFVwZGF0ZXMgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcztcbiAgICB3aGlsZSAoYnVmZmVyZWRVcGRhdGVzLmxlbmd0aCkge1xuICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgdXBkYXRlIGhhbmRsZXIsIHNvIGFsbCB1cGRhdGVzIGFyZSBkaXNwYXRjaGFibGUuXG4gICAgICBpZiAodGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlcikge1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBidWZmZXJlZFVwZGF0ZXMuc2hpZnQoKTtcbiAgICAgICAgLy8gTG9naWNhbGx5LCB0aGlzIG11c3QgYmUgZGVmaW5lZCBhcyB3ZSdyZSBpbiB0aGUgbG9vcC5cbiAgICAgICAgLy8gQnV0IFR5cGVzY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgc28gd2UgdXNlIGEgbm9uLW51bGwgYXNzZXJ0aW9uICghKS5cbiAgICAgICAgdGhpcy5kb1VwZGF0ZSh1cGRhdGUhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFVwZGF0ZXMuZmluZEluZGV4KCh1cGRhdGUpID0+IHRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKHVwZGF0ZS5uYW1lIGFzIHN0cmluZykpO1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAvLyBObyBidWZmZXJlZCBVcGRhdGVzIGhhdmUgYSBoYW5kbGVyIHlldC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbdXBkYXRlXSA9IGJ1ZmZlcmVkVXBkYXRlcy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuZG9VcGRhdGUodXBkYXRlISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlamVjdEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShcbiAgICAgICAgICB1cGRhdGUucHJvdG9jb2xJbnN0YW5jZUlkISxcbiAgICAgICAgICBBcHBsaWNhdGlvbkZhaWx1cmUubm9uUmV0cnlhYmxlKGBObyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIHVwZGF0ZTogJHt1cGRhdGUubmFtZX1gKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduYWxXb3JrZmxvd05leHRIYW5kbGVyKHsgc2lnbmFsTmFtZSwgYXJncyB9OiBTaWduYWxJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5zaWduYWxIYW5kbGVycy5nZXQoc2lnbmFsTmFtZSk/LmhhbmRsZXI7XG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcihzaWduYWxOYW1lLCAuLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyByZWdpc3RlcmVkIHNpZ25hbCBoYW5kbGVyIGZvciBzaWduYWw6ICR7c2lnbmFsTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2lnbmFsV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklTaWduYWxXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2lnbmFsTmFtZSwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXNpZ25hbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiBzaWduYWxOYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHNpZ25hbHMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLCBhbmQgdW5yZWdpc3RlcmVkIG5hbWVzIHdpdGhvdXQgYVxuICAgIC8vIGRlZmF1bHQgaGFuZGxlciBmYWxsIHRocm91Z2ggdG8gdGhlIGJ1ZmZlci10aGVuLXJlamVjdCBwYXRoIGJlbG93LlxuICAgIGlmIChcbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmXG4gICAgICAhdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsTmFtZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYENhbm5vdCB1c2Ugc2lnbmFsIG5hbWU6ICcke3NpZ25hbE5hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHNpZ25hbC5cbiAgICBjb25zdCBpc0ludGVybmFsU2lnbmFsID1cbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxTaWduYWwgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbE5hbWUpICYmICF0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkU2lnbmFscy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciB0aGVuIHRoZSB1bmZpbmlzaGVkXG4gICAgLy8gcG9saWN5IGlzIFdBUk5fQU5EX0FCQU5ET047IHVzZXJzIGN1cnJlbnRseSBoYXZlIG5vIHdheSB0byBzaWxlbmNlIGFueVxuICAgIC8vIGVuc3Vpbmcgd2FybmluZ3MuXG4gICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9XG4gICAgICB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuXG4gICAgY29uc3Qgc2lnbmFsRXhlY3V0aW9uTnVtID0gdGhpcy5zaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxKys7XG4gICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5zZXQoc2lnbmFsRXhlY3V0aW9uTnVtLCB7IG5hbWU6IHNpZ25hbE5hbWUsIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlU2lnbmFsJywgdGhpcy5zaWduYWxXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5pbnB1dCwgY29udGV4dCksXG4gICAgICBzaWduYWxOYW1lLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KVxuICAgICAgLmNhdGNoKHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlLmJpbmQodGhpcykpXG4gICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLmRlbGV0ZShzaWduYWxFeGVjdXRpb25OdW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkU2lnbmFscygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFNpZ25hbHMgPSB0aGlzLmJ1ZmZlcmVkU2lnbmFscztcbiAgICB3aGlsZSAoYnVmZmVyZWRTaWduYWxzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIsIHNvIGFsbCBzaWduYWxzIGFyZSBkaXNwYXRjaGFibGVcblxuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KGJ1ZmZlcmVkU2lnbmFscy5zaGlmdCgpISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gYnVmZmVyZWRTaWduYWxzLmZpbmRJbmRleCgoc2lnbmFsKSA9PiB0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWwuc2lnbmFsTmFtZSBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBicmVhaztcbiAgICAgICAgY29uc3QgW3NpZ25hbF0gPSBidWZmZXJlZFNpZ25hbHMuc3BsaWNlKGZvdW5kSW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KHNpZ25hbCEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlU2lnbmFsRXh0ZXJuYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGNvbnRleHQgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ3NpZ25hbFdvcmtmbG93JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5mYWlsdXJlKSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjYW5jZWxXb3JrZmxvdycsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24uZmFpbHVyZSkge1xuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0V2FybmFibGUgPSAoaGFuZGxlckV4ZWN1dGlvbnM6IEl0ZXJhYmxlPE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPik6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10gPT4ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oaGFuZGxlckV4ZWN1dGlvbnMpLmZpbHRlcihcbiAgICAgICAgKGV4KSA9PiBleC51bmZpbmlzaGVkUG9saWN5ID09PSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCB3YXJuYWJsZVVwZGF0ZXMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2Uod2FybmFibGVVcGRhdGVzKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmFibGVTaWduYWxzID0gZ2V0V2FybmFibGUodGhpcy5pblByb2dyZXNzU2lnbmFscy52YWx1ZXMoKSk7XG4gICAgaWYgKHdhcm5hYmxlU2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKHdhcm5hYmxlU2lnbmFscykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSYW5kb21TZWVkKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JVXBkYXRlUmFuZG9tU2VlZCk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWN0aXZhdGlvbiB3aXRoIHJhbmRvbW5lc3NTZWVkIGF0dHJpYnV0ZScpO1xuICAgIH1cbiAgICB0aGlzLnNldFJhbmRvbW5lc3NTZWVkKGFjdGl2YXRpb24ucmFuZG9tbmVzc1NlZWQudG9CeXRlcygpKTtcbiAgfVxuXG4gIHB1YmxpYyBub3RpZnlIYXNQYXRjaChhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSU5vdGlmeUhhc1BhdGNoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nKVxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdVbmV4cGVjdGVkIG5vdGlmeUhhc1BhdGNoIGpvYiBvbiBub24tcmVwbGF5IGFjdGl2YXRpb24nKTtcbiAgICBpZiAoIWFjdGl2YXRpb24ucGF0Y2hJZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignbm90aWZ5SGFzUGF0Y2ggbWlzc2luZyBwYXRjaCBpZCcpO1xuICAgIHRoaXMua25vd25QcmVzZW50UGF0Y2hlcy5hZGQoYWN0aXZhdGlvbi5wYXRjaElkKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXRjaEludGVybmFsKHBhdGNoSWQ6IHN0cmluZywgZGVwcmVjYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndvcmtmbG93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignUGF0Y2hlcyBjYW5ub3QgYmUgdXNlZCBiZWZvcmUgV29ya2Zsb3cgc3RhcnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZVBhdGNoID0gIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgfHwgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmhhcyhwYXRjaElkKTtcbiAgICAvLyBBdm9pZCBzZW5kaW5nIGNvbW1hbmRzIGZvciBwYXRjaGVzIGNvcmUgYWxyZWFkeSBrbm93cyBhYm91dC5cbiAgICAvLyBUaGlzIG9wdGltaXphdGlvbiBlbmFibGVzIGRldmVsb3BtZW50IG9mIGF1dG9tYXRpYyBwYXRjaGluZyB0b29scy5cbiAgICBpZiAodXNlUGF0Y2ggJiYgIXRoaXMuc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpKSB7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgICAgc2V0UGF0Y2hNYXJrZXI6IHsgcGF0Y2hJZCwgZGVwcmVjYXRlZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbnRQYXRjaGVzLmFkZChwYXRjaElkKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVBhdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBlYXJseSB3aGlsZSBoYW5kbGluZyBhbiBhY3RpdmF0aW9uIHRvIHJlZ2lzdGVyIGtub3duIGZsYWdzLlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGFkZEtub3duRmxhZ3MoZmxhZ3M6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIGZsYWdzKSB7XG4gICAgICBhc3NlcnRWYWxpZEZsYWcoZmxhZyk7XG4gICAgICB0aGlzLmtub3duRmxhZ3MuYWRkKGZsYWcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBTREsgRmxhZyBtYXkgYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBTREsgZmxhZ3MgcGxheSBhIHJvbGUgc2ltaWxhciB0byB0aGUgYHBhdGNoZWQoKWAgQVBJLCBidXQgYXJlIG1lYW50IGZvciBpbnRlcm5hbCB1c2FnZSBieSB0aGVcbiAgICogU0RLIGl0c2VsZi4gVGhleSBtYWtlIGl0IHBvc3NpYmxlIGZvciB0aGUgU0RLIHRvIGV2b2x2ZSBpdHMgYmVoYXZpb3JzIG92ZXIgdGltZSwgd2hpbGUgc3RpbGxcbiAgICogbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIFdvcmtmbG93IGhpc3RvcmllcyBwcm9kdWNlZCBieSBvbGRlciBTREtzLCB3aXRob3V0IGNhdXNpbmdcbiAgICogZGV0ZXJtaW5pc20gdmlvbGF0aW9ucy5cbiAgICpcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBoYXNGbGFnKGZsYWc6IFNka0ZsYWcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5rbm93bkZsYWdzLmhhcyhmbGFnLmlkKSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBJZiBub3QgcmVwbGF5aW5nLCBlbmFibGUgdGhlIGZsYWcgaWYgaXQgaXMgY29uZmlndXJlZCB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFNldHRpbmcgYVxuICAgIC8vIGZsYWcncyBkZWZhdWx0IHRvIGZhbHNlIGFsbG93cyBwcm9ncmVzc2l2ZSByb2xsb3V0IG9mIG5ldyBmZWF0dXJlIGZsYWdzLCB3aXRoIHRoZSBwb3NzaWJpbGl0eVxuICAgIC8vIG9mIHJldmVydGluZyBiYWNrIHRvIGEgdmVyc2lvbiBvZiB0aGUgU0RLIHdoZXJlIHRoZSBmbGFnIGlzIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAvLyBJdCBpcyBhbHNvIHVzZWZ1bCBmb3IgdGVzdGluZyBwdXJwb3NlLlxuICAgIGlmICghdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiBmbGFnLmRlZmF1bHQpIHtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZy5pZCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHJlcGxheWluZywgYSBmbGFnIGlzIGNvbnNpZGVyZWQgZW5hYmxlZCBpZiBpdCB3YXMgZW5hYmxlZCBkdXJpbmcgdGhlIG9yaWdpbmFsIGV4ZWN1dGlvbiBvZlxuICAgIC8vIHRoYXQgV29ya2Zsb3cgVGFzazsgdGhpcyBpcyBub3JtYWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgZmxhZyBJRCBpbiB0aGUgY29ycmVzcG9uZGluZ1xuICAgIC8vIFdGVCBDb21wbGV0ZWQncyBgc2RrTWV0YWRhdGEubGFuZ1VzZWRGbGFnc2AuXG4gICAgLy9cbiAgICAvLyBTREsgRmxhZyBBbHRlcm5hdGUgQ29uZGl0aW9uIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgZmxhZyBzaG91bGRcbiAgICAvLyBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREsgdGhhdFxuICAgIC8vIGVtaXR0ZWQgYSBXRlQuIFRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHJldHJvYWN0aXZlbHkgdHVybiBvbiBzb21lIGZsYWdzIGZvciBXRlQgZW1pdHRlZFxuICAgIC8vIGJ5IHByZXZpb3VzIFNES3MgdGhhdCBjb250YWluZWQgYSBidWcuIEFsdCBDb25kaXRpb25zIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvL1xuICAgIC8vIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcuIEFsc28sIGFsdGVybmF0ZSBjb25kaXRpb25zIHdpbGwgbm90XG4gICAgLy8gY2F1c2UgdGhlIGZsYWcgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrc1xuICAgIC8vIG1heSBub3QgcmVmbGVjdCB0aGlzIGZsYWcgaWYgdGhlIGNvbmRpdGlvbiBubyBsb25nZXIgaG9sZHMuIFRoaXMgaXMgc28gdG8gYXZvaWQgaW5jb3JyZWN0XG4gICAgLy8gYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvdyBFeGVjdXRpb24gaGFzIGdvbmUgdGhyb3VnaCBhIG5ld2VyIFNESyB2ZXJzaW9uIHRoZW4gYWdhaW5cbiAgICAvLyB0aHJvdWdoIGFuIG9sZGVyIG9uZS5cbiAgICBpZiAodGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiBmbGFnLmFsdGVybmF0aXZlQ29uZGl0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBjb25kIG9mIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICAgIGlmIChjb25kKHsgaW5mbzogdGhpcy5pbmZvLCBzZGtWZXJzaW9uOiB0aGlzLnNka1ZlcnNpb24gfSkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGcm9tQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdyZW1vdmVGcm9tQ2FjaGUgYWN0aXZhdGlvbiBqb2Igc2hvdWxkIG5vdCByZWFjaCB3b3JrZmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgZmFpbHVyZXMgaW50byBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBVc2VkIHRvIGhhbmRsZSBhbnkgZmFpbHVyZSBlbWl0dGVkIGJ5IHRoZSBXb3JrZmxvdy5cbiAgICovXG4gIGhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCAmJiBpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjYW5jZWxXb3JrZmxvd0V4ZWN1dGlvbjoge30gfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjb250aW51ZUFzTmV3V29ya2Zsb3dFeGVjdXRpb246IGVycm9yLmNvbW1hbmQgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSB8fCB0aGlzLmlzQ29uZmlndXJlZEZhaWx1cmVFeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdy4gV2UgZG8gbm90IHdhbnQgdG8gaXNzdWUgdW5maW5pc2hlZEhhbmRsZXJzIHdhcm5pbmdzLiBUbyBhY2hpZXZlIHRoYXQsIHdlXG4gICAgICAvLyBtYXJrIGFsbCBoYW5kbGVycyBhcyBjb21wbGV0ZWQgbm93LlxuICAgICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5jbGVhcigpO1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5jbGVhcigpO1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlY29yZFdvcmtmbG93VGFza0Vycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlcnJvciBtYXRjaGVzIGFueSBvZiB0aGUgY29uZmlndXJlZCBmYWlsdXJlIGV4Y2VwdGlvbiB0eXBlc1xuICAgKiAoZnJvbSB7QGxpbmsgV29ya2VyT3B0aW9ucy53b3JrZmxvd0ZhaWx1cmVFcnJvclR5cGVzfSBvclxuICAgKiB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy5mYWlsdXJlRXhjZXB0aW9uVHlwZXN9KS5cbiAgICovXG4gIHByaXZhdGUgaXNDb25maWd1cmVkRmFpbHVyZUV4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGNsYXNzIHJlZmVyZW5jZXMgZnJvbSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIChpbnN0YW5jZW9mLWJhc2VkLCBzdXBwb3J0cyBzdWJjbGFzc2VzKVxuICAgIGlmICh0aGlzLndvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlcykge1xuICAgICAgLy8gV2UgZ3VhcmFudGVlIHRoYXQgaW5jbHVkaW5nIEVycm9yIGluIHRoZSBsaXN0IHdpbGwgY2F0Y2ggX2FueV8gZXJyb3IuXG4gICAgICBpZiAodGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMuaW5jbHVkZXMoRXJyb3IpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBlcnJvclR5cGUgb2YgdGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgZXJyb3JUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBjbGFzcyBuYW1lIHN0cmluZ3MgZnJvbSBXb3JrZXJPcHRpb25zIChwcm90b3R5cGUtY2hhaW4tYmFzZWQpXG4gICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZSBndWFyYW50ZWUgdGhhdCBpbmNsdWRpbmcgJ0Vycm9yJyBpbiB0aGUgbGlzdCB3aWxsIGNhdGNoIF9hbnlfIGVycm9yLlxuICAgICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5pbmNsdWRlcygnRXJyb3InKSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgIGxldCBjdG9yID0gKGVycm9yIGFzIGFueSkuY29uc3RydWN0b3I7XG4gICAgICAgIHdoaWxlIChjdG9yICE9IG51bGwgJiYgY3RvciAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IChjdG9yIGFzIGFueSkubmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMuaW5jbHVkZXMobmFtZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVjb3JkV29ya2Zsb3dUYXNrRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGtlZXAgdGhlIGZpcnN0IGVycm9yIHRoYXQgYnViYmxlcyB1cDsgc3Vic2VxdWVudCBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkLlxuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yID09PSB1bmRlZmluZWQpIHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPSBlcnJvcjtcblxuICAgIC8vIEltbWVkaWF0ZWx5IHJldGhyb3cgdGhlIGVycm9yIGlmIHdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBzbyAoaS5lLiB3ZSBhcmUgbm90IHJ1bm5pbmcgYXN5bmNcbiAgICAvLyBtaWNyb3Rhc2tzKS4gT3RoZXJ3aXNlLCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biB3aGVuZXZlciB3ZSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gc28sXG4gICAgLy8gZS5nLiB0aGUgbmV4dCB0aW1lIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCBpcyBjYWxsZWQuXG4gICAgaWYgKHRoaXMucmV0aHJvd1N5bmNocm9ub3VzbHkpIHRoaXMubWF5YmVSZXRocm93V29ya2Zsb3dUYXNrRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIFdvcmtmbG93IFRhc2sgZXJyb3Igd2FzIGNhcHR1cmVkLCBhbmQgd2UgYXJlIHJ1bm5pbmcgaW4gc3luY2hyb25vdXMgbW9kZSxcbiAgICogdGhlbiBidWJibGUgaXQgdXAgbm93LiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBldmVuIGlmIHRoZXJlIGlzIG5vIGVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICBtYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgdGhyb3cgdGhpcy53b3JrZmxvd1Rhc2tFcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7IHF1ZXJ5SWQsIHN1Y2NlZWRlZDogeyByZXNwb25zZTogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpIH0gfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbFF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7XG4gICAgICAgIHF1ZXJ5SWQsXG4gICAgICAgIGZhaWxlZDogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFjY2VwdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoeyB1cGRhdGVSZXNwb25zZTogeyBwcm90b2NvbEluc3RhbmNlSWQsIGFjY2VwdGVkOiB7fSB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBjb21wbGV0ZWQ6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0LCBjb250ZXh0KSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZToge1xuICAgICAgICBwcm90b2NvbEluc3RhbmNlSWQsXG4gICAgICAgIHJlamVjdGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUgKi9cbiAgcHJpdmF0ZSBtYXliZUNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZ2V0KHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZGVsZXRlKHRhc2tTZXEpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbiBhcyBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQ29uc3VtZSBhIGNvbXBsZXRpb24gaWYgaXQgZXhpc3RzIGluIFdvcmtmbG93IHN0YXRlLCB0aHJvd3MgaWYgaXQgZG9lc24ndCAqL1xuICBwcml2YXRlIGNvbnN1bWVDb21wbGV0aW9uPEsgZXh0ZW5kcyBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10+KFxuICAgIHR5cGU6IEssXG4gICAgdGFza1NlcTogbnVtYmVyXG4gICk6IEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbih0eXBlLCB0YXNrU2VxKTtcbiAgICBpZiAoY29tcGxldGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIGNvbXBsZXRpb24gZm9yIHRhc2tTZXEgJHt0YXNrU2VxfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVXb3JrZmxvdyhyZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgIHJlc3VsdDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duKTogUHJvdG9GYWlsdXJlIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNvbnZlcnRlci5lcnJvclRvRmFpbHVyZShlcnIsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCk7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUpOiBFcnJvciB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpOiBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5pbmZvLm5hbWVzcGFjZSxcbiAgICAgIHdvcmtmbG93SWQ6IHRoaXMuaW5mby53b3JrZmxvd0lkLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VxPFQgZXh0ZW5kcyB7IHNlcT86IG51bWJlciB8IG51bGwgfT4oYWN0aXZhdGlvbjogVCk6IG51bWJlciB7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRpb24uc2VxO1xuICBpZiAoc2VxID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBHb3QgYWN0aXZhdGlvbiB3aXRoIG5vIHNlcSBhdHRyaWJ1dGVgKTtcbiAgfVxuICByZXR1cm4gc2VxO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5maW5pc2hlZFVwZGF0ZUhhbmRsZXJNZXNzYWdlKGhhbmRsZXJFeGVjdXRpb25zOiBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbltdKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBcbltUTVBSTDExMDJdIFdvcmtmbG93IGZpbmlzaGVkIHdoaWxlIGFuIHVwZGF0ZSBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnVwZGF0ZSBoYW5kbGVyIHdhcyBkb2luZywgYW5kIHRoZSBjbGllbnQgdGhhdCBzZW50IHRoZSB1cGRhdGUgd2lsbCByZWNlaXZlIGEgJ3dvcmtmbG93IGV4ZWN1dGlvblxuYWxyZWFkeSBjb21wbGV0ZWQnIFJQQ0Vycm9yIGluc3RlYWQgb2YgdGhlIHVwZGF0ZSByZXN1bHQuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsXG5oYW5kbGVycyB0byBjb21wbGV0ZSBieSB1c2luZyBcXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuXG5BbHRlcm5hdGl2ZWx5LCBpZiBib3RoIHlvdSBhbmQgdGhlIGNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnNcbndoZW4gdGhlIHdvcmtmbG93IGZpbmlzaGVzLCBhbmQgY2F1c2luZyBjbGllbnRzIHRvIHJlY2VpdmUgZXJyb3JzLCB0aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnlcbnBhc3NpbmcgYW4gb3B0aW9uIHdoZW4gc2V0dGluZyB0aGUgaGFuZGxlcjpcblxcYHdvcmtmbG93LnNldEhhbmRsZXIobXlVcGRhdGUsIG15VXBkYXRlSGFuZGxlciwge3VuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LkFCQU5ET059KTtcXGAuYFxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGAke21lc3NhZ2V9IFRoZSBmb2xsb3dpbmcgdXBkYXRlcyB3ZXJlIHVuZmluaXNoZWQgKGFuZCB3YXJuaW5ncyB3ZXJlIG5vdCBkaXNhYmxlZCBmb3IgdGhlaXIgaGFuZGxlcik6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgaGFuZGxlckV4ZWN1dGlvbnMubWFwKChleCkgPT4gKHsgbmFtZTogZXgubmFtZSwgaWQ6IGV4LmlkIH0pKVxuICApfWA7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYSBzaWduYWwgaGFuZGxlciB3YXMgc3RpbGwgcnVubmluZy4gVGhpcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB3b3JrIHRoYXQgdGhlXG5zaWduYWwgaGFuZGxlciB3YXMgZG9pbmcuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nXG5cXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuIEFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGVcbmNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnMgd2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsXG50aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnkgcGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVNpZ25hbCwgbXlTaWduYWxIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG5cbiAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IG5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBleCBvZiBoYW5kbGVyRXhlY3V0aW9ucykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZXMuZ2V0KGV4Lm5hbWUpIHx8IDA7XG4gICAgbmFtZXMuc2V0KGV4Lm5hbWUsIGNvdW50ICsgMSk7XG4gIH1cblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyBzaWduYWxzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBBcnJheS5mcm9tKG5hbWVzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgY291bnRdKSA9PiAoeyBuYW1lLCBjb3VudCB9KSlcbiAgKX1gO1xufVxuIiwiaW1wb3J0IHsgU2RrQ29tcG9uZW50IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IHR5cGUgU2luaywgdHlwZSBTaW5rcywgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb250aW51ZUFzTmV3IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjdXJyZW50VXBkYXRlSW5mbywgaW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL3dvcmtmbG93JztcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0xvZ2dlciBleHRlbmRzIFNpbmsge1xuICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICpcbiAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGV4dGVuZHMgU2lua3Mge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAgICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICAgKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gICAqL1xuICBkZWZhdWx0V29ya2VyTG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNpbmtzSW50ZXJuYWwgZXh0ZW5kcyBTaW5rcyB7XG4gIF9fdGVtcG9yYWxfbG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuY29uc3QgbG9nZ2VyU2luayA9IHByb3h5U2lua3M8TG9nZ2VyU2lua3NJbnRlcm5hbD4oKS5fX3RlbXBvcmFsX2xvZ2dlcjtcblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBieSB0aGUgU0RLIGxvZ2dlciB0byBleHRyYWN0IGEgdGltZXN0YW1wIGZyb20gbG9nIGF0dHJpYnV0ZXMuXG4gKiBBbHNvIGRlZmluZWQgaW4gYHdvcmtlci9sb2dnZXIudHNgIC0gaW50ZW50aW9uYWxseSBub3Qgc2hhcmVkLlxuICovXG5jb25zdCBMb2dUaW1lc3RhbXAgPSBTeW1ib2wuZm9yKCdsb2dfdGltZXN0YW1wJyk7XG5cbi8qKlxuICogRGVmYXVsdCB3b3JrZmxvdyBsb2dnZXIuXG4gKlxuICogVGhpcyBsb2dnZXIgaXMgcmVwbGF5LWF3YXJlIGFuZCB3aWxsIG9taXQgbG9nIG1lc3NhZ2VzIG9uIHdvcmtmbG93IHJlcGxheS4gTWVzc2FnZXMgZW1pdHRlZCBieSB0aGlzIGxvZ2dlciBhcmVcbiAqIGZ1bm5lbGxlZCB0aHJvdWdoIGEgc2luayB0aGF0IGZvcndhcmRzIHRoZW0gdG8gdGhlIGxvZ2dlciByZWdpc3RlcmVkIG9uIHtAbGluayBSdW50aW1lLmxvZ2dlcn0uXG4gKlxuICogQXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbiBjb250ZXh0IGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGFzIG1ldGFkYXRhIG9uIGV2ZXJ5IGxvZ1xuICogZW50cmllcy4gQW4gZXh0cmEgYHNka0NvbXBvbmVudGAgbWV0YWRhdGEgYXR0cmlidXRlIGlzIGFsc28gYWRkZWQsIHdpdGggdmFsdWUgYHdvcmtmbG93YDsgdGhpcyBjYW4gYmUgdXNlZCBmb3JcbiAqIGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIGVudHJpZXMgZnVydGhlciBkb3duc3RyZWFtLlxuICpcbiAqIFRvIGN1c3RvbWl6ZSBsb2cgYXR0cmlidXRlcywgcmVnaXN0ZXIgYSB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3J9IHRoYXQgaW50ZXJjZXB0cyB0aGVcbiAqIGBnZXRMb2dBdHRyaWJ1dGVzKClgIG1ldGhvZC5cbiAqXG4gKiBOb3RpY2UgdGhhdCBzaW5jZSBzaW5rcyBhcmUgdXNlZCB0byBwb3dlciB0aGlzIGxvZ2dlciwgYW55IGxvZyBhdHRyaWJ1dGVzIG11c3QgYmUgdHJhbnNmZXJhYmxlIHZpYSB0aGVcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX1cbiAqIEFQSS5cbiAqXG4gKiBOT1RFOiBTcGVjaWZ5aW5nIGEgY3VzdG9tIGxvZ2dlciB0aHJvdWdoIHtAbGluayBkZWZhdWx0U2lua30gb3IgYnkgbWFudWFsbHkgcmVnaXN0ZXJpbmcgYSBzaW5rIG5hbWVkXG4gKiBgZGVmYXVsdFdvcmtlckxvZ2dlcmAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2c6IFdvcmtmbG93TG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAoWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSBhcyBBcnJheTxrZXlvZiBXb3JrZmxvd0xvZ2dlcj4pLm1hcCgobGV2ZWwpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgbGV2ZWwsXG4gICAgICAobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5sb2coLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICAgICAgY29uc3QgZ2V0TG9nQXR0cmlidXRlcyA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2dldExvZ0F0dHJpYnV0ZXMnLCAoYSkgPT4gYSk7XG4gICAgICAgIHJldHVybiBsb2dnZXJTaW5rW2xldmVsXSEobWVzc2FnZSwge1xuICAgICAgICAgIC8vIEluamVjdCB0aGUgY2FsbCB0aW1lIGluIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBhcyBleHBlY3RlZCBieSB0aGUgd29ya2VyIGxvZ2dlci5cbiAgICAgICAgICBbTG9nVGltZXN0YW1wXTogYWN0aXZhdG9yLmdldFRpbWVPZkRheSgpLFxuICAgICAgICAgIHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtmbG93LFxuICAgICAgICAgIC4uLmdldExvZ0F0dHJpYnV0ZXMod29ya2Zsb3dMb2dBdHRyaWJ1dGVzKGFjdGl2YXRvci5pbmZvKSksXG4gICAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICBdO1xuICB9KVxuKSBhcyBhbnk7XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoZm46ICgpID0+IFByb21pc2U8dW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgbG9nLmRlYnVnKCdXb3JrZmxvdyBzdGFydGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gIGNvbnN0IHAgPSBmbigpLnRoZW4oXG4gICAgKHJlcykgPT4ge1xuICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb21wbGV0ZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIC8vIEF2b2lkIHVzaW5nIGluc3RhbmNlb2YgY2hlY2tzIGluIGNhc2UgdGhlIG1vZHVsZXMgdGhleSdyZSBkZWZpbmVkIGluIGxvYWRlZCBtb3JlIHRoYW4gb25jZSxcbiAgICAgIC8vIGUuZy4gYnkgamVzdCBvciB3aGVuIG11bHRpcGxlIHZlcnNpb25zIGFyZSBpbnN0YWxsZWQuXG4gICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbXBsZXRlZCBhcyBjYW5jZWxsZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbnRpbnVlZCBhcyBuZXcnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nLndhcm4oJ1dvcmtmbG93IGZhaWxlZCcsIHsgZXJyb3IsIHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgKTtcbiAgLy8gQXZvaWQgc2hvd2luZyB0aGlzIGludGVyY2VwdG9yIGluIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gIHVudHJhY2tQcm9taXNlKHApO1xuICByZXR1cm4gcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWFwIG9mIGF0dHJpYnV0ZXMgdG8gYmUgc2V0IF9ieSBkZWZhdWx0XyBvbiBsb2cgbWVzc2FnZXMgZm9yIGEgZ2l2ZW4gV29ya2Zsb3cuXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgV29ya2Zsb3cgY29udGV4dCAoZWcuIGJ5IHRoZSB3b3JrZXIgaXRzZWxmKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93TG9nQXR0cmlidXRlcyhpbmZvOiBXb3JrZmxvd0luZm8pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgbmFtZXNwYWNlOiBpbmZvLm5hbWVzcGFjZSxcbiAgICB0YXNrUXVldWU6IGluZm8udGFza1F1ZXVlLFxuICAgIHdvcmtmbG93SWQ6IGluZm8ud29ya2Zsb3dJZCxcbiAgICBydW5JZDogaW5mby5ydW5JZCxcbiAgICB3b3JrZmxvd1R5cGU6IGluZm8ud29ya2Zsb3dUeXBlLFxuICB9O1xuICBpZiAoaW5Xb3JrZmxvd0NvbnRleHQoKSkge1xuICAgIGNvbnN0IHVwZGF0ZUluZm8gPSBjdXJyZW50VXBkYXRlSW5mbygpO1xuICAgIGlmICh1cGRhdGVJbmZvKSB7XG4gICAgICAvLyBBZGQgdXBkYXRlIGluZm8gaWYgaXQgZXhpc3RzXG4gICAgICBhdHRyaWJ1dGVzWyd1cGRhdGVJZCddID0gdXBkYXRlSW5mby5pZDtcbiAgICAgIGF0dHJpYnV0ZXNbJ3VwZGF0ZU5hbWUnXSA9IHVwZGF0ZUluZm8ubmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF0dHJpYnV0ZXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIE1ldHJpY0NvdW50ZXIsXG4gIE1ldHJpY0dhdWdlLFxuICBNZXRyaWNIaXN0b2dyYW0sXG4gIE1ldHJpY01ldGVyLFxuICBNZXRyaWNUYWdzLFxuICBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB0eXBlIHsgU2luaywgU2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHByb3h5U2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHdvcmtmbG93SW5mbyB9IGZyb20gJy4vd29ya2Zsb3cnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuY2xhc3MgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0NvdW50ZXIobmFtZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgY3JlYXRlSGlzdG9ncmFtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW0obmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVHYXVnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNHYXVnZSB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIHJldHVybiBuZXcgV29ya2Zsb3dNZXRyaWNHYXVnZShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljTWV0ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0NvdW50ZXIgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljQ291bnRlciB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5hZGRNZXRyaWNDb3VudGVyVmFsdWUodGhpcy5uYW1lLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCBleHRyYVRhZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljQ291bnRlciB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0NvdW50ZXJgKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbSBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHJlY29yZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M6IE1ldHJpY1RhZ3MgPSB7fSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljSGlzdG9ncmFtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLnJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNIaXN0b2dyYW1gKTtcbiAgfVxufVxuXG5jbGFzcyBXb3JrZmxvd01ldHJpY0dhdWdlIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7fVxuXG4gIHNldCh2YWx1ZTogbnVtYmVyLCB0YWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWV0cmljR2F1Z2UgdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1Npbmsuc2V0TWV0cmljR2F1Z2VWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudmFsdWVUeXBlLCB0aGlzLnVuaXQsIHRoaXMuZGVzY3JpcHRpb24sIHZhbHVlLCB0YWdzID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljR2F1Z2VgKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vIE5vdGU6IGdpdmVuIHRoYXQgZm9yd2FyZGluZyBtZXRyaWNzIG91dHNpZGUgb2YgdGhlIHNhbmJveCBjYW4gYmUgcXVpdGUgY2hhdHR5IGFuZCBhZGQgbm9uXG4vLyBuZWdsaWdlYWJsZSBvdmVyaGVhZCwgd2UgZWFnZXJseSBjaGVjayBmb3IgYGlzUmVwbGF5aW5nYCBhbmQgY29tcGxldGVseSBza2lwIGRvaW5nIHNpbmtcbi8vIGNhbGxzIGlmIHdlIGFyZSByZXBsYXlpbmcuXG5jb25zdCBtZXRyaWNTaW5rID0gcHJveHlTaW5rczxNZXRyaWNTaW5rcz4oKS5fX3RlbXBvcmFsX21ldHJpY3M7XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbWV0cmljcyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXIuXG4gKlxuICogVGhlc2Ugc2luayBmdW5jdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB3b3JrZmxvdyBjb2RlOyBpbnN0ZWFkLFxuICogZGV2ZWxvcGVycyBzaG91bGQgdXNlIHRoZSBgbWV0cmljTWV0ZXJgIG9iamVjdCBleHBvc2VkIHRvIHdvcmtmbG93IGNvZGUgYnkgdGhlIFNESywgd2hpY2hcbiAqIHByb3ZpZGVzIGFuIEFQSSB0aGF0IGlzIGVhc2llciB0byB3b3JrIHdpdGguXG4gKlxuICogVGhpcyBzaW5rIGludGVyZmFjZSBpcyBhbHNvIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB1c2VyLlxuICpcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9tZXRyaWNzOiBXb3JrZmxvd01ldHJpY01ldGVyO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBpbnRlcm5hbCBVc2VycyBzaG91bGQgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgbm9yIHVzZSBpdCBkaXJlY3RseS4gVXNlIGBtZXRyaWNNZXRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd01ldHJpY01ldGVyIGV4dGVuZHMgU2luayB7XG4gIGFkZE1ldHJpY0NvdW50ZXJWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHJlY29yZE1ldHJpY0hpc3RvZ3JhbVZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgdW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBhdHRyczogTWV0cmljVGFnc1xuICApOiB2b2lkO1xuXG4gIHNldE1ldHJpY0dhdWdlVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBNZXRyaWNNZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGVtaXQgbWV0cmljcyBmcm9tIHdpdGhpbiBhIFdvcmtmbG93LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1ldHJpY01ldGVyOiBNZXRyaWNNZXRlciA9IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncy5jb21wb3NlKFxuICBuZXcgV29ya2Zsb3dNZXRyaWNNZXRlckltcGwoKSxcbiAgKCkgPT4ge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5tZXRyaWNNZXRlciBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICBjb25zdCBnZXRNZXRyaWNUYWdzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TWV0cmljVGFncycsIChhKSA9PiBhKTtcblxuICAgIGNvbnN0IGluZm8gPSBhY3RpdmF0b3IuaW5mbztcbiAgICByZXR1cm4gZ2V0TWV0cmljVGFncyh7XG4gICAgICAvLyBuYW1lc3BhY2UgYW5kIHRhc2tRdWV1ZSB3aWxsIGJlIGFkZGVkIGJ5IHRoZSBXb3JrZXJcbiAgICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gICAgfSk7XG4gIH0sXG4gIHRydWVcbik7XG4iLCJpbXBvcnQgdHlwZSAqIGFzIG5leHVzIGZyb20gJ25leHVzLXJwYyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyB1c2VyTWV0YWRhdGFUb1BheWxvYWQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3VzZXItbWV0YWRhdGEnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgU3RhcnROZXh1c09wZXJhdGlvbklucHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuLyoqXG4gKiBBIE5leHVzIGNsaWVudCBmb3IgaW52b2tpbmcgTmV4dXMgT3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnQ8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBleGVjdXRlT3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj47XG5cbiAgLy8gVE9ETyhuZXh1cy9wb3N0LWluaXRpYWwtcmVsZWFzZSk6IFJldmlzaXQgdGhlIFwiT3BlcmF0aW9uIFByb3BlcnR5IE5hbWVcIiB0ZXJtaW5vbG9neSxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWZsZWN0IGluIHRoZSBOZXh1cyBSUEMgU0RLLlxuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQW4gT3BlcmF0aW9uJ3MgX3Byb3BlcnR5IG5hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGRlZmluZSB0aGF0IE9wZXJhdGlvbiBpblxuICAgKiB0aGUge0BsaW5rIG5leHVzLlNlcnZpY2VEZWZpbml0aW9ufSBvYmplY3Q7IGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgKiBpZiBvbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSB7QGxpbmsgbmV4dXMuT3BlcmF0aW9uRGVmaW5pdGlvbn0gb2JqZWN0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj47XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIHRha2luZyBhIHtAbGluayBuZXh1cy5vcGVyYXRpb259LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIE9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgIG9wOiBPLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxPPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnRPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj4+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzT3BlcmF0aW9uSGFuZGxlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBPcGVyYXRpb24ncyBzZXJ2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW9uIHRva2VuIGFzIHNldCBieSB0aGUgT3BlcmF0aW9uJ3MgaGFuZGxlci4gTWF5IGJlIGVtcHR5IGlmIHRoZSBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2FpdCBmb3IgT3BlcmF0aW9uIGNvbXBsZXRpb24gYW5kIGdldCBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9uczxUPiB7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2U6IFQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+KFxuICBvcHRpb25zOiBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+XG4pOiBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICBjbGFzcyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4gaW1wbGVtZW50cyBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICAgIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nIHwgVFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XSxcbiAgICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dPixcbiAgICAgIG9wZXJhdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICAgICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0aGlzLnN0YXJ0T3BlcmF0aW9uKG9wZXJhdGlvbiwgaW5wdXQsIG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBvcE5hbWUgPVxuICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gLy8gQ2FzdGluZyBhcyBzdHJpbmcgdG8gY292ZXIgdXAgdGhlIGZhY3QgdGhhdCBgb3BOYW1lYCBtaWdodCBiZSB1bmRlZmluZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYGV4ZWN1dGVgIHdpbGwgcHJvZHVjZSBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmUuTk9UX0ZPVU5EYC5cbiAgICAgICAgICAgIChvcHRpb25zLnNlcnZpY2Uub3BlcmF0aW9uc1tvcGVyYXRpb25dPy5uYW1lIGFzIHN0cmluZylcbiAgICAgICAgICA6IG9wZXJhdGlvbi5uYW1lO1xuXG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5uZXh1c09wZXJhdGlvbisrO1xuXG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nLFxuICAgICAgICBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBpbnRlcmNlcHRvciByZXR1cm5zIGEgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Piwgd2l0aCB0aGUgcmVzdWx0IHByb21pc2UgY29udGFpbmVkXG4gICAgICAvLyBpbiB0aGF0IE91dHB1dCBvYmplY3QuIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIHJlc3VsdCBwcm9taXNlL2NvbXBsZXRpb24gZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHVudGlsIHRoZSBTdGFydE5leHVzT3BlcmF0aW9uIGV2ZW50IGlzIHJlY2VpdmVkLiBUaGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBkaWQgaW5cbiAgICAgIC8vIENoaWxkV29ya2Zsb3csIGJ1dCBpcyBtdWNoIGNsZWFuZXIgZnJvbSB0aGUgaW50ZXJjZXB0b3JzIHBvaW50IG9mIHZpZXcuXG4gICAgICBjb25zdCB7IHRva2VuLCByZXN1bHQ6IHJlc3VsdFByb21pc2UgfSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgc2VydmljZTogb3B0aW9ucy5zZXJ2aWNlLm5hbWUsXG4gICAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBvcGVyYXRpb25PcHRpb25zPy5jYW5jZWxsYXRpb25UeXBlID8/ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc2VxLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBhc3luYyByZXN1bHQoKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZSBhcyBuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz47XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTmV4dXNTZXJ2aWNlQ2xpZW50SW1wbDxUPigpO1xufVxuXG5mdW5jdGlvbiBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXIoe1xuICBpbnB1dCxcbiAgZW5kcG9pbnQsXG4gIHNlcnZpY2UsXG4gIG9wdGlvbnMsXG4gIG9wZXJhdGlvbixcbiAgc2VxLFxuICBoZWFkZXJzLFxufTogU3RhcnROZXh1c09wZXJhdGlvbklucHV0KTogUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIHR5cGU6ICd3b3JrZmxvdycgYXMgY29uc3QsXG4gICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgd29ya2Zsb3dJZDogYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dJZCxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGVkID1cbiAgICAgICAgICAgICFhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5oYXMoc2VxKSAmJlxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvbkNvbXBsZXRlLmhhcyhzZXEpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxOZXh1c09wZXJhdGlvbjogeyBzZXEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY2FuY2VsIG90aGVyd2lzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2NoZWR1bGVOZXh1c09wZXJhdGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIG5leHVzSGVhZGVyOiBoZWFkZXJzLFxuICAgICAgICBpbnB1dDogYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKGlucHV0LCBjb250ZXh0KSxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlKG9wdGlvbnM/LmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uU3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lczpcbiAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE5leHVzIE9wZXJhdGlvblxuICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgT3BlcmF0aW9uJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFdvcmtmbG93XG4gKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIG9wZXJhdGlvbidzIHJlc3VsdCBwcm9taXNlIGZhaWwgd2l0aCBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmVgLFxuICogICB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAqIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gKiBPcGVyYXRpb24gY2FsbCB3YXMgbWFkZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGZpZWxkXG5leHBvcnQgY29uc3QgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIE5leHVzIE9wZXJhdGlvbiwgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydFxuICAgKiBjYW5jZWxsYXRpb24gdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogSW5pdGlhdGUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmb3IgdGhlIE5leHVzIG9wZXJhdGlvbiBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvbiB0b1xuICAgKiB0aGUgY2FsbGVyLiBOb3RlIHRoYXQgaXQgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBjYW5jZWxsYXRpb24gaXMgZGVsaXZlcmVkIHRvIHRoZSBvcGVyYXRpb24gaWZcbiAgICogY2FsbGluZyB3b3JrZmxvdyBleGl0cyBiZWZvcmUgdGhlIGRlbGl2ZXJ5IGlzIGRvbmUuIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGNhbmNlbGxhdGlvbiBpc1xuICAgKiBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiwgdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBXb3JrZmxvdy1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgT3BlcmF0aW9uIEhhbmRsZXIuIEluIHBhcnRpY3VsYXIsIGVpdGhlciB0aGVcbiAgICogT3BlcmF0aW9uIG9yIHRoZSBXb3JrZmxvdyBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3QgaXMgZGVsaXZlcmVkLCByZXN1bHRpbmcgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlIE9wZXJhdGlvbiBjb21wbGV0ZWRcbiAgICogc3VjY2Vzc2Z1bGx5LCBidXQgdGhlIFdvcmtmbG93IHRoaW5rcyBpdCB3YXMgY2FuY2VsbGVkLlxuICAgKlxuICAgKiBUbyBndWFyYW50ZWUgdGhhdCB0aGUgT3BlcmF0aW9uIHdpbGwgZXZlbnR1YWxseSBiZSBub3RpZmllZCBvZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgdGhlIHNlcnZlclxuICAgKiB0byBjb25maXJtIHRoYXQgdGhlIE9wZXJhdGlvbiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3YXMgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB0aGVuIHdhaXQgZm9yIGNvbXBsZXRpb25cbiAgICogb2YgdGhlIE9wZXJhdGlvbi5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlID1cbiAgKHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGVdO1xuXG5jb25zdCBbZW5jb2RlTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAwLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDEsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMixcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuIiwiLy8gLi4vcGFja2FnZS5qc29uIGlzIG91dHNpZGUgb2YgdGhlIFRTIHByb2plY3Qgcm9vdERpciB3aGljaCBjYXVzZXMgVFMgdG8gY29tcGxhaW4gYWJvdXQgdGhpcyBpbXBvcnQuXG4vLyBXZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UgdGhlIHJvb3REaXIgYmVjYXVzZSBpdCBtZXNzZXMgdXAgdGhlIG91dHB1dCBzdHJ1Y3R1cmUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBkZWZhdWx0IHBrZyBhcyB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH07XG4iLCJleHBvcnQgZnVuY3Rpb24gZmlsbFdpdGhSYW5kb20ocmFuZG9tOiAoKSA9PiBudW1iZXIsIGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlc1tpXSA9IE1hdGguZmxvb3IocmFuZG9tKCkgKiAweDEwMCk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXVpZDRGcm9tUmFuZG9tKHJhbmRvbTogKCkgPT4gbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaG8gPSAobjogbnVtYmVyLCBwOiBudW1iZXIpID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KHAsICcwJyk7XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7XG4gIHZpZXcuc2V0VWludDMyKDAsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDQsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDgsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDEyLCAocmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQ4KDYsICh2aWV3LmdldFVpbnQ4KDYpICYgMHhmKSB8IDB4NDApO1xuICB2aWV3LnNldFVpbnQ4KDgsICh2aWV3LmdldFVpbnQ4KDgpICYgMHgzZikgfCAweDgwKTtcbiAgcmV0dXJuIGAke2hvKHZpZXcuZ2V0VWludDMyKDApLCA4KX0tJHtobyh2aWV3LmdldFVpbnQxNig0KSwgNCl9LSR7aG8odmlldy5nZXRVaW50MTYoNiksIDQpfS0ke2hvKFxuICAgIHZpZXcuZ2V0VWludDE2KDgpLFxuICAgIDRcbiAgKX0tJHtobyh2aWV3LmdldFVpbnQzMigxMCksIDgpfSR7aG8odmlldy5nZXRVaW50MTYoMTQpLCA0KX1gO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9lbmNvZGluZyc7XG5cbmNvbnN0IFJBTkRPTV9TVFJFQU1fU0VFRF9QUkVGSVggPSBBcnJheS5mcm9tKGVuY29kZSgndGVtcG9yYWwtd29ya2Zsb3ctcmFuZG9tLXN0cmVhbS12MScpKTtcblxuZnVuY3Rpb24gZW5jb2RlVTMyKHZhbHVlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBbKHZhbHVlID4+PiAyNCkgJiAweGZmLCAodmFsdWUgPj4+IDE2KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gOCkgJiAweGZmLCB2YWx1ZSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlQWxlYVNlZWQoc2VlZDogbnVtYmVyW10sIG5hbWVzcGFjZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBuYW1lc3BhY2VCeXRlcyA9IEFycmF5LmZyb20oZW5jb2RlKG5hbWVzcGFjZSkpO1xuICByZXR1cm4gW1xuICAgIC4uLlJBTkRPTV9TVFJFQU1fU0VFRF9QUkVGSVgsXG4gICAgLi4uZW5jb2RlVTMyKHNlZWQubGVuZ3RoKSxcbiAgICAuLi5zZWVkLFxuICAgIC4uLmVuY29kZVUzMihuYW1lc3BhY2VCeXRlcy5sZW5ndGgpLFxuICAgIC4uLm5hbWVzcGFjZUJ5dGVzLFxuICBdO1xufVxuIiwiaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdG9yIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgZmlsbFdpdGhSYW5kb20sIHV1aWQ0RnJvbVJhbmRvbSB9IGZyb20gJy4vcmFuZG9tLWhlbHBlcnMnO1xuXG4vKipcbiAqIEEgZGV0ZXJtaW5pc3RpYyBQUk5HIHN0cmVhbSBzY29wZWQgdG8gdGhlIGN1cnJlbnQgV29ya2Zsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFdvcmtmbG93IGNvZGUgYWxyZWFkeSBnZXRzIGEgZGV0ZXJtaW5pc3RpYyBkZWZhdWx0IHN0cmVhbSB0aHJvdWdoIGBNYXRoLnJhbmRvbSgpYC5cbiAqIFRoaXMgaW50ZXJmYWNlIGV4cG9zZXMgYWRkaXRpb25hbCBuYW1lZCBzdHJlYW1zIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSB0aGUgd29ya2Zsb3dcbiAqIHNlZWQgd2l0aG91dCBjb25zdW1pbmcgdGhhdCBkZWZhdWx0IHN0cmVhbS4gUmVwZWF0ZWQgY2FsbHMgdG9cbiAqIHtAbGluayBnZXRSYW5kb21TdHJlYW19IHdpdGggdGhlIHNhbWUgbmFtZSByZWZlciB0byB0aGUgc2FtZSBsb2dpY2FsIHN0cmVhbSBzdGF0ZVxuICogZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbiwgYW5kIHRoYXQgc3RhdGUgaXMgcHJlc2VydmVkIGFjcm9zcyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgY2FzZSBpcyB3b3JrZmxvdyBwbHVnaW5zIGFuZCBpbnRlcmNlcHRvcnMgdGhhdCBuZWVkIHByaXZhdGUsXG4gKiByZXBsYXktc3RhYmxlIGVudHJvcHkgd2l0aG91dCBwZXJ0dXJiaW5nIHVzZXIgd29ya2Zsb3cgcmFuZG9tbmVzcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIG1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIC8qKlxuICAgKiBEcmF3IHRoZSBuZXh0IGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBudW1iZXIgZnJvbSB0aGlzIHN0cmVhbS5cbiAgICpcbiAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBNYXRoLnJhbmRvbSgpYCwgYnV0IGlzb2xhdGVkIGZyb20gdGhlIHdvcmtmbG93J3MgbWFpblxuICAgKiByYW5kb20gc3RyZWFtIGFuZCBmcm9tIG90aGVyIG5hbWVkIHN0cmVhbXMuXG4gICAqL1xuICByYW5kb20oKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGRldGVybWluaXN0aWMgVVVJRHY0IGJhY2tlZCBieSB0aGlzIHN0cmVhbS5cbiAgICovXG4gIHV1aWQ0KCk6IHN0cmluZztcblxuICAvKipcbiAgICogRmlsbCBhIGJ5dGUgYXJyYXkgZGV0ZXJtaW5pc3RpY2FsbHkgZnJvbSB0aGlzIHN0cmVhbS5cbiAgICovXG4gIGZpbGwoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBSdW4gYGZuYCB3aXRoIHNjb3BlZCB3b3JrZmxvdy1yYW5kb20gaGVscGVycyBzdWNoIGFzIGBNYXRoLnJhbmRvbSgpYCBhbmQgYHV1aWQ0KClgXG4gICAqIHJvdXRlZCB0aHJvdWdoIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzY29wZWQgb3ZlcnJpZGUgQVBJIGZvciB3b3JrZmxvdyByYW5kb20gc3RyZWFtcy4gSXQgaXMgaW50ZW5kZWQgZm9yXG4gICAqIGJvdW5kZWQgcGx1Z2luL2ludGVyY2VwdG9yIGNvZGUgdGhhdCBuZWVkcyBleGlzdGluZyBjYWxscyB0byBgTWF0aC5yYW5kb20oKWAgb3JcbiAgICogYHV1aWQ0KClgIHRvIHVzZSB0aGlzIHN0cmVhbSB3aXRob3V0IHBlcnR1cmJpbmcgdGhlIHdvcmtmbG93J3MgZGVmYXVsdCByYW5kb21cbiAgICogc2VxdWVuY2Ugb3IgYW55IG90aGVyIG5hbWVkIHN0cmVhbS5cbiAgICpcbiAgICogVGhlIG92ZXJyaWRlIGZvbGxvd3MgYXN5bmMgY29udGludWF0aW9ucyBzdGFydGVkIGJ5IGBmbmAuIFdvcmtmbG93IGludGVyY2VwdG9yXG4gICAqIGBuZXh0KC4uLilgIGNvbnRpbnVhdGlvbnMgcmVzdG9yZSB0aGUgZG93bnN0cmVhbSB3b3JrZmxvdyByYW5kb20gc2NvcGUgYmVmb3JlXG4gICAqIGVudGVyaW5nIHRoZSByZXN0IG9mIHRoZSBpbnRlcmNlcHRvciBjaGFpbiBvciB3b3JrZmxvdyBjb2RlLCBzbyBhIHRlbXBvcmFyeVxuICAgKiBwbHVnaW4gc2NvcGUgZG9lcyBub3QgbGVhayBkb3duc3RyZWFtIHVubGVzcyB0aGF0IGRvd25zdHJlYW0gY29kZSBleHBsaWNpdGx5XG4gICAqIGVzdGFibGlzaGVzIGl0cyBvd24gc2NvcGUuXG4gICAqXG4gICAqIFByZWZlciBleHBsaWNpdCBgc3RyZWFtLnJhbmRvbSgpYCAvIGBzdHJlYW0udXVpZDQoKWAgY2FsbHMgd2hlbiB0aGF0IGlzIHByYWN0aWNhbC5cbiAgICogVXNlIGBzdHJlYW0ud2l0aCguLi4pYCB3aGVuIGEgdGVtcG9yYXJ5IHNjb3BlZCBvdmVycmlkZSBpcyB0aGUgYmV0dGVyIGZpdCwgb3JcbiAgICogd2hlbiB5b3Ugd2FudCB0byBrZWVwIHRoZSBzdHJlYW0gaW5zdGFuY2UgaW4gbW9kdWxlIHNjb3BlIGFuZCByZXVzZSBpdCBkaXJlY3RseS5cbiAgICovXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUO1xufVxuXG5jbGFzcyBBY3RpdmF0b3JSYW5kb21TdHJlYW0gaW1wbGVtZW50cyBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmF0b3I6IEFjdGl2YXRvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICkge31cblxuICByYW5kb20oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmF0b3IuZ2V0TmFtZWRSYW5kb20odGhpcy5uYW1lKSgpO1xuICB9XG5cbiAgdXVpZDQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXVpZDRGcm9tUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCkpO1xuICB9XG5cbiAgZmlsbChieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBmaWxsV2l0aFJhbmRvbSgoKSA9PiB0aGlzLnJhbmRvbSgpLCBieXRlcyk7XG4gIH1cblxuICB3aXRoPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdG9yLndpdGhDdXJyZW50UmFuZG9tKHRoaXMsIGZuKTtcbiAgfVxufVxuXG5jbGFzcyBEZWZhdWx0V29ya2Zsb3dSYW5kb21TdHJlYW0gaW1wbGVtZW50cyBXb3JrZmxvd1JhbmRvbVN0cmVhbSB7XG4gIHJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dSYW5kb20gbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJykucmFuZG9tKCk7XG4gIH1cblxuICB1dWlkNCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkNEZyb21SYW5kb20oKCkgPT4gdGhpcy5yYW5kb20oKSk7XG4gIH1cblxuICBmaWxsKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGZpbGxXaXRoUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCksIGJ5dGVzKTtcbiAgfVxuXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dSYW5kb20gbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJyk7XG4gICAgcmV0dXJuIGFjdGl2YXRvci53aXRoQ3VycmVudFJhbmRvbSh0aGlzLCBmbik7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBkZXRlcm1pbmlzdGljIHJhbmRvbSBzdHJlYW0gZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGlzIGV4cG9zZXMgdGhlIHNhbWUgdW5kZXJseWluZyBzZXF1ZW5jZSB1c2VkIGJ5IHdvcmtmbG93LWxldmVsIGBNYXRoLnJhbmRvbSgpYFxuICogd2hlbiBubyBuYW1lZCBvdmVycmlkZSBpcyBhY3RpdmUuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIHBsdWdpbi9pbnRlcmNlcHRvciBjb2RlXG4gKiB0aGF0IHdhbnRzIGFuIGV4cGxpY2l0IGhhbmRsZSB0byB0aGUgbWFpbiB3b3JrZmxvdyByYW5kb20gc3RyZWFtLCBpbmNsdWRpbmcgZnJvbVxuICogaW5zaWRlIGEgdGVtcG9yYXJ5IG5hbWVkIHNjb3BlIGVzdGFibGlzaGVkIGJ5IGFub3RoZXIgYFdvcmtmbG93UmFuZG9tU3RyZWFtYC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgQVBJIG1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93UmFuZG9tOiBXb3JrZmxvd1JhbmRvbVN0cmVhbSA9IG5ldyBEZWZhdWx0V29ya2Zsb3dSYW5kb21TdHJlYW0oKTtcblxuLyoqXG4gKiBHZXQgYSBuYW1lZCBkZXRlcm1pbmlzdGljIHJhbmRvbSBzdHJlYW0gZm9yIHRoZSBjdXJyZW50IHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBOYW1lZCBzdHJlYW1zIGFyZSBkZXJpdmVkIGZyb20gdGhlIHdvcmtmbG93IHNlZWQgYW5kIGEgc3RhYmxlIHN0cmVhbSBuYW1lLFxuICogd2l0aG91dCBjb25zdW1pbmcgdGhlIHdvcmtmbG93J3MgZGVmYXVsdCBgTWF0aC5yYW5kb20oKWAgc3RyZWFtLiBSZXBlYXRlZFxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgd2l0aGluIGEgd29ya2Zsb3cgZXhlY3V0aW9uIHJlZmVyIHRvIHRoZSBzYW1lXG4gKiBsb2dpY2FsIHN0cmVhbSBzdGF0ZSwgaW5jbHVkaW5nIGFjcm9zcyBhY3RpdmF0aW9ucy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgZW50cnkgcG9pbnQgZm9yIHdvcmtmbG93IHBsdWdpbnMgYW5kIGludGVyY2VwdG9ycyB0aGF0XG4gKiBuZWVkIHRoZWlyIG93biBkZXRlcm1pbmlzdGljIGVudHJvcHkuIFVzZSBzdGFibGUgcGFja2FnZS0gb3IgbW9kdWxlLXN0eWxlXG4gKiBuYW1lcyBzbyB0aGUgc3RyZWFtIGlkZW50aXR5IHJlbWFpbnMgcmVwbGF5LXNhZmUsIHRoZW4ga2VlcCB0aGUgcmV0dXJuZWRcbiAqIGBXb3JrZmxvd1JhbmRvbVN0cmVhbWAgYXJvdW5kIGFuZCBjYWxsIGl0cyBtZXRob2RzIGRpcmVjdGx5LlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgbWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tU3RyZWFtKG5hbWU6IHN0cmluZyk6IFdvcmtmbG93UmFuZG9tU3RyZWFtIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmdldFJhbmRvbVN0cmVhbSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICByZXR1cm4gbmV3IEFjdGl2YXRvclJhbmRvbVN0cmVhbShhY3RpdmF0b3IsIG5hbWUpO1xufVxuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgV29ya2Zsb3cgZW5kIG9mIHRoZSBzaW5rcyBtZWNoYW5pc20uXG4gKlxuICogU2lua3MgYXJlIGEgbWVjaGFuaXNtIGZvciBleHBvcnRpbmcgZGF0YSBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZVxuICogTm9kZS5qcyBlbnZpcm9ubWVudCwgdGhleSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFdvcmtmbG93IGhhcyBubyB3YXkgdG9cbiAqIGNvbW11bmljYXRlIHdpdGggdGhlIG91dHNpZGUgV29ybGQuXG4gKlxuICogU2lua3MgYXJlIHR5cGljYWxseSB1c2VkIGZvciBleHBvcnRpbmcgbG9ncywgbWV0cmljcyBhbmQgdHJhY2VzIG91dCBmcm9tIHRoZVxuICogV29ya2Zsb3cuXG4gKlxuICogU2luayBmdW5jdGlvbnMgbWF5IG5vdCByZXR1cm4gdmFsdWVzIHRvIHRoZSBXb3JrZmxvdyBpbiBvcmRlciB0byBwcmV2ZW50XG4gKiBicmVha2luZyBkZXRlcm1pbmlzbS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBBbnkgZnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBiZSB1c2VkIGZvciBTaW5rIGZ1bmN0aW9ucyBhcyBsb25nIGFzIHRoZSByZXR1cm4gdHlwZSBpcyBgdm9pZGAuXG4gKlxuICogV2hlbiBjYWxsaW5nIGEgU2luayBmdW5jdGlvbiwgYXJndW1lbnRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCB1c2luZ1xuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbCN3b3JrZXJfdGhyZWFkc19wb3J0X3Bvc3RtZXNzYWdlX3ZhbHVlX3RyYW5zZmVybGlzdCB8IHBvc3RNZXNzYWdlfS5cblxuICogVGhpcyBjb25zdHJhaW5zIHRoZSBhcmd1bWVudCB0eXBlcyB0byBwcmltaXRpdmVzIChleGNsdWRpbmcgU3ltYm9scykuXG4gKi9cbmV4cG9ydCB0eXBlIFNpbmtGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcblxuLyoqIEEgbWFwcGluZyBvZiBuYW1lIHRvIGZ1bmN0aW9uLCBkZWZpbmVzIGEgc2luZ2xlIHNpbmsgKGUuZy4gbG9nZ2VyKSAqL1xuZXhwb3J0IHR5cGUgU2luayA9IFJlY29yZDxzdHJpbmcsIFNpbmtGdW5jdGlvbj47XG4vKipcbiAqIFdvcmtmbG93IFNpbmsgYXJlIGEgbWFwcGluZyBvZiBuYW1lIHRvIHtAbGluayBTaW5rfVxuICovXG5leHBvcnQgdHlwZSBTaW5rcyA9IFJlY29yZDxzdHJpbmcsIFNpbms+O1xuXG4vKipcbiAqIENhbGwgaW5mb3JtYXRpb24gZm9yIGEgU2lua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmtDYWxsIHtcbiAgaWZhY2VOYW1lOiBzdHJpbmc7XG4gIGZuTmFtZTogc3RyaW5nO1xuICBhcmdzOiBhbnlbXTtcbiAgd29ya2Zsb3dJbmZvOiBXb3JrZmxvd0luZm87XG59XG5cbi8qKlxuICogR2V0IGEgcmVmZXJlbmNlIHRvIFNpbmtzIGZvciBleHBvcnRpbmcgZGF0YSBvdXQgb2YgdGhlIFdvcmtmbG93LlxuICpcbiAqIFRoZXNlIFNpbmtzICoqbXVzdCoqIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgV29ya2VyIGluIG9yZGVyIGZvciB0aGlzXG4gKiBtZWNoYW5pc20gdG8gd29yay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5U2lua3MsIFNpbmtzIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGludGVyZmFjZSBNeVNpbmtzIGV4dGVuZHMgU2lua3Mge1xuICogICBsb2dnZXI6IHtcbiAqICAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gKiAgICAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAqICAgfTtcbiAqIH1cbiAqXG4gKiBjb25zdCB7IGxvZ2dlciB9ID0gcHJveHlTaW5rczxNeURlcGVuZGVuY2llcz4oKTtcbiAqIGxvZ2dlci5pbmZvKCdzZXR0aW5nIHVwJyk7XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAqICAgICAgIGxvZ2dlci5pbmZvKFwiaGV5IGhvXCIpO1xuICogICAgICAgbG9nZ2VyLmVycm9yKFwibGV0cyBnb1wiKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5U2lua3M8VCBleHRlbmRzIFNpbmtzPigpOiBUIHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICB7fSxcbiAgICB7XG4gICAgICBnZXQoXywgaWZhY2VOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgICAge30sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZ2V0KF8sIGZuTmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgICAgICAgICAgICAgICAnUHJveGllZCBzaW5rcyBmdW5jdGlvbnMgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFjdGl2YXRvci5zaW5rQ2FsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBpZmFjZU5hbWU6IGlmYWNlTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICBmbk5hbWU6IGZuTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAvLyBTaW5rIGZ1bmN0aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBpbW1lZGlhdGVseS4gTWFrZSBhIGNsb25lIG9mIHRoZSBzaW5rJ3MgYXJncywgc28gdGhhdCBmdXJ0aGVyIG11dGF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlc2Ugb2JqZWN0cyBkb24ndCBjb3JydXB0IHRoZSBhcmdzIHRoYXQgdGhlIHNpbmsgZnVuY3Rpb24gd2lsbCByZWNlaXZlLiBPbmx5IGF2YWlsYWJsZSBmcm9tIG5vZGUgMTcuXG4gICAgICAgICAgICAgICAgICBhcmdzOiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZSA/IChnbG9iYWxUaGlzIGFzIGFueSkuc3RydWN0dXJlZENsb25lKGFyZ3MpIDogYXJncyxcbiAgICAgICAgICAgICAgICAgIC8vIGFjdGl2YXRvci5pbmZvIGlzIGludGVybmFsbHkgY29weS1vbi13cml0ZS4gVGhpcyBlbnN1cmUgdGhhdCBhbnkgZnVydGhlciBtdXRhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSB3b3JrZmxvdyBzdGF0ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJlc2VudCBhY3RpdmF0aW9uIHdpbGwgbm90IGNvcnJ1cHQgdGhlXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvd0luZm8gc3RhdGUgdGhhdCBnZXRzIHBhc3NlZCB3aGVuIHRoZSBzaW5rIGZ1bmN0aW9uIGFjdHVhbGx5IGdldHMgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dJbmZvOiBhY3RpdmF0b3IuaW5mbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9XG4gICkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgcHJvbWlzZSBmcm9tIGJlaW5nIHRyYWNrZWQgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5IHB1cnBvc2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnRyYWNrUHJvbWlzZShwcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gbWF5YmVHZXRBY3RpdmF0b3IoKT8ucHJvbWlzZVN0YWNrU3RvcmU7XG4gIGlmICghc3RvcmUpIHJldHVybjtcbiAgc3RvcmUuY2hpbGRUb1BhcmVudC5kZWxldGUocHJvbWlzZSk7XG4gIHN0b3JlLnByb21pc2VUb1N0YWNrLmRlbGV0ZShwcm9taXNlKTtcbn1cbiIsImltcG9ydCB7IENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuXG4vKipcbiAqIEEgYFByb21pc2VMaWtlYCBoZWxwZXIgd2hpY2ggZXhwb3NlcyBpdHMgYHJlc29sdmVgIGFuZCBgcmVqZWN0YCBtZXRob2RzLlxuICpcbiAqIFRyaWdnZXIgaXMgQ2FuY2VsbGF0aW9uU2NvcGUtYXdhcmU6IGl0IGlzIGxpbmtlZCB0byB0aGUgY3VycmVudCBzY29wZSBvblxuICogY29uc3RydWN0aW9uIGFuZCB0aHJvd3Mgd2hlbiB0aGF0IHNjb3BlIGlzIGNhbmNlbGxlZC5cbiAqXG4gKiBVc2VmdWwgZm9yIGUuZy4gd2FpdGluZyBmb3IgdW5ibG9ja2luZyBhIFdvcmtmbG93IGZyb20gYSBTaWduYWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBkZWZpbmVTaWduYWwsIHNldEhhbmRsZXIsIHNsZWVwLCBUcmlnZ2VyIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGNvbnN0IGNvbXBsZXRlVXNlckludGVyYWN0aW9uID0gZGVmaW5lU2lnbmFsKCdjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbicpO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0T25Vc2VyKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGNvbnN0IHVzZXJJbnRlcmFjdGlvbiA9IG5ldyBUcmlnZ2VyPGJvb2xlYW4+KCk7XG4gKlxuICogICAvLyBwcm9ncmFtbWF0aWNhbGx5IHJlc29sdmUgVHJpZ2dlclxuICogICBzZXRIYW5kbGVyKGNvbXBsZXRlVXNlckludGVyYWN0aW9uLCAoKSA9PiB1c2VySW50ZXJhY3Rpb24ucmVzb2x2ZSh0cnVlKSk7XG4gKlxuICogICBjb25zdCB1c2VySW50ZXJhY3RlZCA9IGF3YWl0IFByb21pc2UucmFjZShbdXNlckludGVyYWN0aW9uLCBzbGVlcCgnMzAgZGF5cycpXSk7XG4gKiAgIGlmICghdXNlckludGVyYWN0ZWQpIHtcbiAqICAgICBhd2FpdCBzZW5kUmVtaW5kZXJFbWFpbCh1c2VySWQpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXI8VD4gaW1wbGVtZW50cyBQcm9taXNlTGlrZTxUPiB7XG4gIC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgcmVhbGl6ZSB0aGF0IHRoZSBwcm9taXNlIGV4ZWN1dG9yIGlzIHJ1biBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlc29sdmU6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8VD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApOiBQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3luY0xvY2FsU3RvcmFnZSBhcyBBTFMgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIFVwZGF0ZVNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVTY29wZSB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBVcGRhdGVTY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHNjb3BlIGFzIGN1cnJlbnQgYW5kIHJ1biB0aGUgdXBkYXRlIGhhbmRsZXIgYGZuYC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCBmbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgdXBkYXRlIHNjb3BlLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKTogVXBkYXRlU2NvcGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCk7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBVcGRhdGVTY29wZSh7IGlkLCBuYW1lIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB1cGRhdGVXaXRoSW5mbzxUPihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgaWQsIG5hbWUgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlOiBBTFM8VXBkYXRlU2NvcGU+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG4iLCIvKipcbiAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgdGhlIFdvcmtlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBXb3JrZmxvdyBpc29sYXRlXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IsIElsbGVnYWxTdGF0ZUVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnLi9pbnRlcmNlcHRvci1jb21wb3NpdGlvbic7XG5pbXBvcnQgeyBzZXRBY3RpdmF0b3IsIGdldEFjdGl2YXRvciwgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLy8gRXhwb3J0IHRoZSB0eXBlIGZvciB1c2Ugb24gdGhlIFwid29ya2VyXCIgc2lkZVxuZXhwb3J0IHsgUHJvbWlzZVN0YWNrU3RvcmUgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBpc29sYXRlIHJ1bnRpbWUuXG4gKlxuICogU2V0cyByZXF1aXJlZCBpbnRlcm5hbCBzdGF0ZSBhbmQgaW5zdGFudGlhdGVzIHRoZSB3b3JrZmxvdyBhbmQgaW50ZXJjZXB0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFJ1bnRpbWUob3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbmV3IEFjdGl2YXRvcih7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpbmZvOiBmaXhQcm90b3R5cGVzKHtcbiAgICAgIC4uLm9wdGlvbnMuaW5mbyxcbiAgICAgIHVuc2FmZTogeyAuLi5vcHRpb25zLmluZm8udW5zYWZlLCBub3c6IE9yaWdpbmFsRGF0ZS5ub3cgfSxcbiAgICB9KSxcbiAgfSk7XG4gIC8vIFRoZXJlJ3Mgb25lIGFjdGl2YXRvciBwZXIgd29ya2Zsb3cgaW5zdGFuY2UsIHNldCBpdCBnbG9iYWxseSBvbiB0aGUgY29udGV4dC5cbiAgLy8gV2UgZG8gdGhpcyBiZWZvcmUgaW1wb3J0aW5nIGFueSB1c2VyIGNvZGUgc28gdXNlciBjb2RlIGNhbiBzdGF0aWNhbGx5IHJlZmVyZW5jZSBAdGVtcG9yYWxpby93b3JrZmxvdyBmdW5jdGlvbnNcbiAgLy8gYXMgd2VsbCBhcyBEYXRlIGFuZCBNYXRoLnJhbmRvbS5cbiAgc2V0QWN0aXZhdG9yKGFjdGl2YXRvcik7XG5cbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIHBheWxvYWRDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21QYXlsb2FkQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXInKS5wYXlsb2FkQ29udmVydGVyO1xuICAgIC8vIFRoZSBgcGF5bG9hZENvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIgPSBjdXN0b21QYXlsb2FkQ29udmVydGVyO1xuICAgIH1cbiAgICAvLyB3ZWJwYWNrIGFsaWFzIHRvIGZhaWx1cmVDb252ZXJ0ZXJQYXRoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjdXN0b21GYWlsdXJlQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fZmFpbHVyZV9jb252ZXJ0ZXInKS5mYWlsdXJlQ29udmVydGVyO1xuICAgIC8vIFRoZSBgZmFpbHVyZUNvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gICAgaWYgKGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLmZhaWx1cmVDb252ZXJ0ZXIgPSBjdXN0b21GYWlsdXJlQ29udmVydGVyO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW1wb3J0V29ya2Zsb3dzLCBpbXBvcnRJbnRlcmNlcHRvcnMgfSA9IGdsb2JhbFRoaXMuX19URU1QT1JBTF9fO1xuICAgIGlmIChpbXBvcnRXb3JrZmxvd3MgPT09IHVuZGVmaW5lZCB8fCBpbXBvcnRJbnRlcmNlcHRvcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBidW5kbGUgZGlkIG5vdCByZWdpc3RlciBpbXBvcnQgaG9va3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpbXBvcnRJbnRlcmNlcHRvcnMoKTtcbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBpbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGZhY3Rvcnk6IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9IG1vZC5pbnRlcmNlcHRvcnM7XG4gICAgICBpZiAoZmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3dzIGludGVyY2VwdG9yczogZXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IGdvdDogJyR7ZmFjdG9yeX0nYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gZmFjdG9yeSgpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmluYm91bmQucHVzaCguLi4oaW50ZXJjZXB0b3JzLmluYm91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMub3V0Ym91bmQgPz8gW10pKTtcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMucHVzaCguLi4oaW50ZXJjZXB0b3JzLmludGVybmFscyA/PyBbXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9IGltcG9ydFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHdvcmtmbG93Rm4gPSBtb2RbYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlXTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2Zsb3dGbiA9IG1vZFsnZGVmYXVsdCddO1xuXG4gICAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSB3b3JrZmxvd0ZuO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRXb3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSBkZWZhdWx0V29ya2Zsb3dGbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGV0YWlscyA9XG4gICAgICAgIHdvcmtmbG93Rm4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gJ25vIHN1Y2ggZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnkgdGhlIHdvcmtmbG93IGJ1bmRsZSdcbiAgICAgICAgICA6IGBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHt0eXBlb2Ygd29ya2Zsb3dGbn0nYDtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtmbG93IG9mIHR5cGUgJyR7YWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlfSc6ICR7ZGV0YWlsc31gKTtcbiAgICB9XG4gICAgaWYgKGlzV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zKGFjdGl2YXRvci53b3JrZmxvdykpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFjdGl2YXRvci52ZXJzaW9uaW5nQmVoYXZpb3IgPSBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucy52ZXJzaW9uaW5nQmVoYXZpb3I7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMgPVxuICAgICAgICAgIGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zLmZhaWx1cmVFeGNlcHRpb25UeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyID0gYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENvcmUgd29uJ3Qgc2VuZCBhbiBldmljdGlvbiBqb2IgYWZ0ZXIgYW4gZWFybHkgZXJyb3IsIHNvIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZ1xuICAgICAgLy8gZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0LiBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHJlc291cmNlIGxlYWtzLlxuICAgICAgZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKF9pbm5lckVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3IgZGlzcG9zaW5nIG9mIGFjdGl2YXRvciwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIE9iamVjdHMgdHJhbnNmZXJlZCB0byB0aGUgVk0gZnJvbSBvdXRzaWRlIGhhdmUgcHJvdG90eXBlcyBiZWxvbmdpbmcgdG8gdGhlXG4gKiBvdXRlciBjb250ZXh0LCB3aGljaCBtZWFucyB0aGF0IGluc3RhbmNlb2Ygd29uJ3Qgd29yayBpbnNpZGUgdGhlIFZNLiBUaGlzXG4gKiBmdW5jdGlvbiByZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdCwgYW5kIHJlY3JlYXRlIHNvbWVcbiAqIG9mIHRoZXNlIG9iamVjdHMgKG5vdGFibHkgQXJyYXksIERhdGUgYW5kIE9iamVjdHMpLlxuICovXG5mdW5jdGlvbiBmaXhQcm90b3R5cGVzPFg+KG9iajogWCk6IFgge1xuICBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopPy5jb25zdHJ1Y3Rvcj8ubmFtZSkge1xuICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSgob2JqIGFzIEFycmF5PHVua25vd24+KS5tYXAoZml4UHJvdG90eXBlcykpIGFzIFg7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iaiBhcyB1bmtub3duIGFzIERhdGUpIGFzIFg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pOiBbc3RyaW5nLCBhbnldID0+IFtrLCBmaXhQcm90b3R5cGVzKHYpXSkpIGFzIFg7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSB3b3JrZmxvdy4gT3IgdG8gYmUgZXhhY3QsIF9jb21wbGV0ZV8gaW5pdGlhbGl6YXRpb24sIGFzIG1vc3QgcGFydCBoYXMgYmVlbiBkb25lIGluIGNvbnN0cnVjdG9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoaW5pdGlhbGl6ZVdvcmtmbG93Sm9iOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IuaW5pdGlhbGl6ZVdvcmtmbG93KGluaXRpYWxpemVXb3JrZmxvd0pvYik7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gYSBjaHVuayBvZiBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90aWNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgYXN5bmMgYW5kIHJ1bnMgX2luc2lkZV8gdGhlIFZNIGNvbnRleHQuIFRoZXJlZm9yZSwgbm8gbWljcm90YXNrXG4gKiB3aWxsIGdldCBleGVjdXRlZCBfd2hpbGVfIHRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlOyB0aGV5IHdpbGwgaG93ZXZlciBnZXQgZXhlY3V0ZWQgX2FmdGVyXyB0aGlzXG4gKiBmdW5jdGlvbiByZXR1cm5zIChpLmUuIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzIGluIHRoZSBWTSB3aWxsIGdldCBleGVjdXRlZCBiZWZvcmUgZXhlY3V0aW9uXG4gKiByZXN1bWVzIG91dCBvZiB0aGUgVk0sIGluIGB2bS1zaGFyZWQudHM6YWN0aXZhdGUoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb24sIGJhdGNoSW5kZXggPSAwKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGludGVyY2VwdCA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdhY3RpdmF0ZScsICh7IGFjdGl2YXRpb24gfSkgPT4ge1xuICAgICAgLy8gQ2FzdCBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIHdoaWNoIGhhcyB0aGUgYHZhcmlhbnRgIGF0dHJpYnV0ZS5cbiAgICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBhY3RpdmF0aW9uIGlzIGEgcHJvdG8gY2xhc3MuXG4gICAgICBjb25zdCBqb2JzID0gYWN0aXZhdGlvbi5qb2JzIGFzIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbXTtcblxuICAgICAgLy8gSW5pdGlhbGl6YXRpb24gd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LCBidXQgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBzdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dKb2IgPSBqb2JzWzBdPy52YXJpYW50ID09PSAnaW5pdGlhbGl6ZVdvcmtmbG93JyA/IGpvYnMuc2hpZnQoKT8uaW5pdGlhbGl6ZVdvcmtmbG93IDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgIGlmIChqb2IudmFyaWFudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBqb2IudmFyaWFudCB0byBiZSBkZWZpbmVkJyk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGpvYltqb2IudmFyaWFudF07XG4gICAgICAgIGlmICghdmFyaWFudCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgam9iLiR7am9iLnZhcmlhbnR9IHRvIGJlIHNldGApO1xuXG4gICAgICAgIGFjdGl2YXRvcltqb2IudmFyaWFudF0odmFyaWFudCBhcyBhbnkgLyogVFMgY2FuJ3QgaW5mZXIgdGhpcyB0eXBlICovKTtcblxuICAgICAgICBpZiAoam9iLnZhcmlhbnQgIT09ICdxdWVyeVdvcmtmbG93JykgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0V29ya2Zsb3dKb2IpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYlR5cGVzOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iWyd2YXJpYW50J11bXSA9IFtcbiAgICAgICAgICAnaW5pdGlhbGl6ZVdvcmtmbG93JyxcbiAgICAgICAgICAnc2lnbmFsV29ya2Zsb3cnLFxuICAgICAgICAgICdkb1VwZGF0ZScsXG4gICAgICAgICAgJ2NhbmNlbFdvcmtmbG93JyxcbiAgICAgICAgICAndXBkYXRlUmFuZG9tU2VlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChqb2JzLnNvbWUoKGpvYikgPT4gIXNhZmVKb2JUeXBlcy5pbmNsdWRlcyhqb2IudmFyaWFudCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdSZWNlaXZlZCBib3RoIGluaXRpYWxpemVXb3JrZmxvdyBhbmQgbm9uLXNpZ25hbC9ub24tdXBkYXRlIGpvYnMgaW4gdGhlIHNhbWUgYWN0aXZhdGlvbjogJyArXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGpvYnMubWFwKChqb2IpID0+IGpvYi52YXJpYW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aXZhdG9yLnN0YXJ0V29ya2Zsb3coc3RhcnRXb3JrZmxvd0pvYik7XG5cbiAgICAgICAgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcmNlcHQoeyBhY3RpdmF0aW9uLCBiYXRjaEluZGV4IH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29uY2x1ZGUgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYWN0aXZhdGlvbiBqb2JzIGFuZCBxdWV1ZWQgbWljcm90YXNrcy5cbiAqXG4gKiBBY3RpdmF0aW9uIGZhaWx1cmVzIGFyZSBoYW5kbGVkIGluIHRoZSBtYWluIE5vZGUuanMgaXNvbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBjb3Jlc2RrLndvcmtmbG93X2NvbXBsZXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IucmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk7XG4gICAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2NvbmNsdWRlQWN0aXZhdGlvbicsIChpbnB1dCkgPT4gaW5wdXQpO1xuICAgIGNvbnN0IGFjdGl2YXRpb25Db21wbGV0aW9uID0gYWN0aXZhdG9yLmNvbmNsdWRlQWN0aXZhdGlvbigpO1xuICAgIGNvbnN0IHsgY29tbWFuZHMgfSA9IGludGVyY2VwdCh7IGNvbW1hbmRzOiBhY3RpdmF0aW9uQ29tcGxldGlvbi5jb21tYW5kcyB9KTtcbiAgICBpZiAoYWN0aXZhdG9yLmNvbXBsZXRlZCkge1xuICAgICAgYWN0aXZhdG9yLndhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcnVuSWQ6IGFjdGl2YXRvci5pbmZvLnJ1bklkLFxuICAgICAgc3VjY2Vzc2Z1bDoge1xuICAgICAgICAuLi5hY3RpdmF0aW9uQ29tcGxldGlvbixcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yKGFjdGl2YXRpb25Db21wbGV0aW9uLnZlcnNpb25pbmdCZWhhdmlvciksXG4gICAgICB9LFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29wIHRocm91Z2ggYWxsIGJsb2NrZWQgY29uZGl0aW9ucywgZXZhbHVhdGUgYW5kIHVuYmxvY2sgaWYgcG9zc2libGUuXG4gKlxuICogQHJldHVybnMgbnVtYmVyIG9mIHVuYmxvY2tlZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTogbnVtYmVyIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgbGV0IG51bVVuYmxvY2tlZCA9IDA7XG4gICAgZm9yICg7Oykge1xuICAgICAgYWN0aXZhdG9yLm1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk7XG4gICAgICBjb25zdCBwcmV2VW5ibG9ja2VkID0gbnVtVW5ibG9ja2VkO1xuICAgICAgZm9yIChjb25zdCBbc2VxLCBjb25kXSBvZiBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChjb25kLmZuKCkpIHtcbiAgICAgICAgICBjb25kLnJlc29sdmUoKTtcbiAgICAgICAgICBudW1VbmJsb2NrZWQrKztcbiAgICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIGRlbGV0ZSBlbGVtZW50cyBkdXJpbmcgbWFwIGl0ZXJhdGlvblxuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZXZVbmJsb2NrZWQgPT09IG51bVVuYmxvY2tlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bVVuYmxvY2tlZDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBIYW5kbGUgZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkZXN0cm95aW5nXG4vLyB0aGUgc2FuZGJveCB2bSwgd2hpY2ggbWF5IHBvc3NpYmx5IGJlIHJldXNlZCBpZiBgcmV1c2VWOENvbnRleHRgIGlzIHRydWUpLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcG9zZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdkaXNwb3NlJywgYXN5bmMgKCkgPT4ge30pO1xuICAgICAgZGlzcG9zZSh7fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgIH1cblxuICAgIC8vIERlc3RydWN0b3JzIGFyZSBydW4gb3V0c2lkZSBvZiBpbnRlcmNlcHRvcnMsIGJlY2F1c2UgaW50ZXJjZXB0b3JzIHRoZW1zZWx2ZXMgb2Z0ZW4gcmVseVxuICAgIC8vIG9uIG9iamVjdHMgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZCAobm90YWJseSBBc3luY0xvY2FsU3RvcmFnZSBpbnN0YW5jZXMpLCBhbmQgYmVjYXVzZSB3ZVxuICAgIC8vIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVzb3VyY2VzIGdldCBjbGVhbmVkIHVwIGV2ZW4gaWYgYW4gaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLlxuICAgIC8vIE9ubHkgdGhlIGZpcnN0IGVycm9yIChpZiBhbnkpIGlzIHJldGhyb3duLlxuICAgIGZvciAoY29uc3QgZGVzdHJ1Y3RvciBvZiBhY3RpdmF0b3Iud29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnMuc3BsaWNlKDApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGFjdGl2YXRvciBpcyBubyBsb25nZXIgdmFsaWQgcGFzdCB0aGlzIHBvaW50LlxuICAgIHNldEFjdGl2YXRvcih1bmRlZmluZWQpO1xuICB9XG59XG5cbi8vIERlc3Ryb3kgdGhlIHNhbmRib3ggVk0gKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRpc3Bvc2luZyBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQpLlxuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGhhdmUgYmVlbiBkaXNwb3NlZCBmaXJzdCcpO1xuXG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkZXN0cnVjdG9yIG9mIGdsb2JhbFRoaXMuX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM/LnNwbGljZSgwKSA/PyBbXSkge1xuICAgIHRyeSB7XG4gICAgICBkZXN0cnVjdG9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyhvYmo6IGFueSk6IG9iaiBpcyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT4ge1xuICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24ob2JqLCAnd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucycpO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0LFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgV2l0aFdvcmtmbG93QXJncyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXBpbGVSZXRyeVBvbGljeSxcbiAgY29tcGlsZVByaW9yaXR5LFxuICBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgZXh0cmFjdFdvcmtmbG93VHlwZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIG1hcFRvUGF5bG9hZHMsXG4gIGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHRvUGF5bG9hZHNXaXRoQ29udGV4dCxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgdXNlck1ldGFkYXRhVG9QYXlsb2FkIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi91c2VyLW1ldGFkYXRhJztcbmltcG9ydCB7XG4gIGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2NvbnZlcnRlci9wYXlsb2FkLXNlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi92ZXJzaW9uaW5nLWludGVudC1lbnVtJztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9UcywgcmVxdWlyZWRUc1RvTXMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgdGhyb3dJZlJlc2VydmVkTmFtZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvcmVzZXJ2ZWQnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUsIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUlucHV0LFxuICBMb2NhbEFjdGl2aXR5SW5wdXQsXG4gIFNpZ25hbFdvcmtmbG93SW5wdXQsXG4gIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0LFxuICBUaW1lcklucHV0LFxuICBUaW1lck9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmltcG9ydCB0eXBlIHtcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnMsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRGVmYXVsdFNpZ25hbEhhbmRsZXIsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbiAgSGFuZGxlcixcbiAgUXVlcnlIYW5kbGVyT3B0aW9ucyxcbiAgU2lnbmFsSGFuZGxlck9wdGlvbnMsXG4gIFVwZGF0ZUhhbmRsZXJPcHRpb25zLFxuICBXb3JrZmxvd0luZm8sXG4gIFVwZGF0ZUluZm8sXG4gIERlZmF1bHRVcGRhdGVIYW5kbGVyLFxuICBEZWZhdWx0UXVlcnlIYW5kbGVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENvbnRpbnVlQXNOZXcsXG4gIGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExvY2FsQWN0aXZpdHlEb0JhY2tvZmYgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCwgZ2V0QWN0aXZhdG9yLCBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgdXVpZDRGcm9tUmFuZG9tIH0gZnJvbSAnLi9yYW5kb20taGVscGVycyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuZnVuY3Rpb24gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHdvcmtmbG93SWQ6IGluZm8ud29ya2Zsb3dJZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGFyZ2V0V29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dChpbmZvOiBXb3JrZmxvd0luZm8sIHdvcmtmbG93SWQ6IHN0cmluZyk6IFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd3b3JrZmxvdycsXG4gICAgbmFtZXNwYWNlOiBpbmZvLm5hbWVzcGFjZSxcbiAgICB3b3JrZmxvd0lkLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0KFxuICBpbmZvOiBXb3JrZmxvd0luZm8sXG4gIGFjdGl2aXR5SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgaXNMb2NhbDogYm9vbGVhblxuKTogQWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2FjdGl2aXR5JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIGFjdGl2aXR5SWQsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICAgIGlzTG9jYWwsXG4gIH07XG59XG5cbi8qKlxuICogQWRkcyBkZWZhdWx0IHZhbHVlcyBvZiBgd29ya2Zsb3dJZGAgYW5kIGBjYW5jZWxsYXRpb25UeXBlYCB0byBnaXZlbiB3b3JrZmxvdyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9uczxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICBvcHRzOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMge1xuICBjb25zdCB7IGFyZ3MsIHdvcmtmbG93SWQsIC4uLnJlc3QgfSA9IG9wdHM7XG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogd29ya2Zsb3dJZCA/PyB1dWlkNCgpLFxuICAgIGFyZ3M6IChhcmdzID8/IFtdKSBhcyB1bmtub3duW10sXG4gICAgY2FuY2VsbGF0aW9uVHlwZTogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVELFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogUHVzaCBhIHN0YXJ0VGltZXIgY29tbWFuZCBpbnRvIHN0YXRlIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHRpbWVyTmV4dEhhbmRsZXIoeyBzZXEsIGR1cmF0aW9uTXMsIG9wdGlvbnMgfTogVGltZXJJbnB1dCkge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgY29uc3QgY29udGV4dCA9IGN1cnJlbnRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLmRlbGV0ZShzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICBjYW5jZWxUaW1lcjoge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBzdGFydFRvRmlyZVRpbWVvdXQ6IG1zVG9UcyhkdXJhdGlvbk1zKSxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucz8uc3VtbWFyeSwgdW5kZWZpbmVkLCBjb250ZXh0KSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzIHNsZWVwLlxuICpcbiAqIFNjaGVkdWxlcyBhIHRpbWVyIG9uIHRoZSBUZW1wb3JhbCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciBvciAwLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICogQHBhcmFtIG9wdGlvbnMgb3B0aW9uYWwgdGltZXIgb3B0aW9ucyBmb3IgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogRHVyYXRpb24sIG9wdGlvbnM/OiBUaW1lck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNsZWVwKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJyk7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuXG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBNYXRoLm1heCgxLCBtc1RvTnVtYmVyKG1zKSk7XG5cbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ3N0YXJ0VGltZXInLCB0aW1lck5leHRIYW5kbGVyKTtcblxuICByZXR1cm4gZXhlY3V0ZSh7XG4gICAgZHVyYXRpb25NcyxcbiAgICBzZXEsXG4gICAgb3B0aW9ucyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0ID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1aXJlZCBlaXRoZXIgc2NoZWR1bGVUb0Nsb3NlVGltZW91dCBvciBzdGFydFRvQ2xvc2VUaW1lb3V0Jyk7XG4gIH1cbn1cblxuLy8gVXNlIHNhbWUgdmFsaWRhdGlvbiB3ZSB1c2UgZm9yIG5vcm1hbCBhY3Rpdml0aWVzXG5jb25zdCB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zID0gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnM7XG5cbi8qKlxuICogUHVzaCBhIHNjaGVkdWxlQWN0aXZpdHkgY29tbWFuZCBpbnRvIGFjdGl2YXRvciBhY2N1bXVsYXRvciBhbmQgcmVnaXN0ZXIgY29tcGxldGlvblxuICovXG5mdW5jdGlvbiBzY2hlZHVsZUFjdGl2aXR5TmV4dEhhbmRsZXIoeyBvcHRpb25zLCBhcmdzLCBoZWFkZXJzLCBzZXEsIGFjdGl2aXR5VHlwZSB9OiBBY3Rpdml0eUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgYWN0aXZpdHlJZCA9IG9wdGlvbnMuYWN0aXZpdHlJZCA/PyBgJHtzZXF9YDtcbiAgY29uc3QgY29udGV4dCA9IGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIGFjdGl2aXR5SWQsIGZhbHNlKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUFjdGl2aXR5OiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgYWN0aXZpdHlJZCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgaGVhcnRiZWF0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIGRvTm90RWFnZXJseUV4ZWN1dGU6ICEob3B0aW9ucy5hbGxvd0VhZ2VyRGlzcGF0Y2ggPz8gdHJ1ZSksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8gY29tcGlsZVByaW9yaXR5KG9wdGlvbnMucHJpb3JpdHkpIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLnN1bW1hcnksIHVuZGVmaW5lZCwgY29udGV4dCksXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBhcmdzLFxuICBoZWFkZXJzLFxuICBzZXEsXG4gIGFjdGl2aXR5VHlwZSxcbiAgYXR0ZW1wdCxcbiAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG59OiBMb2NhbEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGNvbnN0IGFjdGl2aXR5SWQgPSBgJHtzZXF9YDtcbiAgY29uc3QgY29udGV4dCA9IGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIGFjdGl2aXR5SWQsIHRydWUpO1xuICAvLyBFYWdlcmx5IGZhaWwgdGhlIGxvY2FsIGFjdGl2aXR5ICh3aGljaCB3aWxsIGluIHR1cm4gZmFpbCB0aGUgd29ya2Zsb3cgdGFzay5cbiAgLy8gRG8gbm90IGZhaWwgb24gcmVwbGF5IHdoZXJlIHRoZSBsb2NhbCBhY3Rpdml0aWVzIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBvbiB0aGUgcmVwbGF5IHdvcmtlci5cbiAgaWYgKCFhY3RpdmF0b3IuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgIWFjdGl2YXRvci5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcy5oYXMoYWN0aXZpdHlUeXBlKSkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgTG9jYWwgYWN0aXZpdHkgb2YgdHlwZSAnJHthY3Rpdml0eVR5cGV9JyBub3QgcmVnaXN0ZXJlZCBvbiB3b3JrZXJgKTtcbiAgfVxuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5oYXMoc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IHJlc29sdmVkIG9yIG5ldmVyIHNjaGVkdWxlZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgcmVxdWVzdENhbmNlbExvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbiAgICAgICAgYWN0aXZpdHlJZCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBsb2NhbFJldHJ5VGhyZXNob2xkOiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmxvY2FsUmV0cnlUaHJlc2hvbGQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgY29udGV4dCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IGNvbnRleHQgPSB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB3b3JrZmxvd0lkKTtcbiAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZSA9ICFhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLmhhcyhzZXEpO1xuXG4gICAgICAgICAgaWYgKCFjb21wbGV0ZSkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgY2FuY2VsQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbjogeyBjaGlsZFdvcmtmbG93U2VxOiBzZXEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBOb3RoaW5nIHRvIGNhbmNlbCBvdGhlcndpc2VcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICB3b3JrZmxvd1R5cGUsXG4gICAgICAgIGlucHV0OiB0b1BheWxvYWRzV2l0aENvbnRleHQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIG9wdGlvbnMuYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93UnVuVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXQpLFxuICAgICAgICB3b3JrZmxvd1Rhc2tUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93VGFza1RpbWVvdXQpLFxuICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSwgLy8gTm90IGNvbmZpZ3VyYWJsZVxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6IGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeShvcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeSksXG4gICAgICAgIHBhcmVudENsb3NlUG9saWN5OiBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeShvcHRpb25zLnBhcmVudENsb3NlUG9saWN5KSxcbiAgICAgICAgY3JvblNjaGVkdWxlOiBvcHRpb25zLmNyb25TY2hlZHVsZSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczpcbiAgICAgICAgICBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMgfHwgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICAgID8geyBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMsIG9wdGlvbnMudHlwZWRTZWFyY2hBdHRyaWJ1dGVzKSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbywgY29udGV4dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5ID8gY29tcGlsZVByaW9yaXR5KG9wdGlvbnMucHJpb3JpdHkpIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKFxuICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgb3B0aW9ucz8uc3RhdGljU3VtbWFyeSxcbiAgICAgICAgb3B0aW9ucz8uc3RhdGljRGV0YWlscyxcbiAgICAgICAgY29udGV4dFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd1N0YXJ0LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBXZSBjb25zdHJ1Y3QgYSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2hpbGQgV29ya2Zsb3cgYmVmb3JlIHdlIGtub3dcbiAgLy8gaWYgdGhlIFdvcmtmbG93IGNvZGUgd2lsbCBhd2FpdCBpdCB0byBjYXB0dXJlIHRoZSByZXN1bHQgaW4gY2FzZSBpdCBkb2VzLlxuICBjb25zdCBjb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQ2hhaW4gc3RhcnQgUHJvbWlzZSByZWplY3Rpb24gdG8gdGhlIGNvbXBsZXRlIFByb21pc2UuXG4gICAgdW50cmFja1Byb21pc2Uoc3RhcnRQcm9taXNlLmNhdGNoKHJlamVjdCkpO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93Q29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIGNvbnRleHQsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB0YXJnZXRXb3JrZmxvd0lkID0gdGFyZ2V0LnR5cGUgPT09ICdleHRlcm5hbCcgPyB0YXJnZXQud29ya2Zsb3dFeGVjdXRpb24ud29ya2Zsb3dJZCA6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQ7XG4gIGNvbnN0IGNvbnRleHQgPSB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB0YXJnZXRXb3JrZmxvd0lkISk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHsgY2FuY2VsU2lnbmFsV29ya2Zsb3c6IHsgc2VxIH0gfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2lnbmFsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGFyZ3M6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHNpZ25hbE5hbWUsXG4gICAgICAgIC4uLih0YXJnZXQudHlwZSA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIC4uLnRhcmdldC53b3JrZmxvd0V4ZWN1dGlvbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiB0YXJnZXQuY2hpbGRXb3JrZmxvd0lkLFxuICAgICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LnNldChzZXEsIHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBpbiB0aGUgcmV0dXJuIHR5cGUgb2YgcHJveHkgbWV0aG9kcyB0byBtYXJrIHRoYXQgYW4gYXR0cmlidXRlIG9uIHRoZSBzb3VyY2UgdHlwZSBpcyBub3QgYSBtZXRob2QuXG4gKlxuICogQHNlZSB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKiBAc2VlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9XG4gKiBAc2VlIHtAbGluayBwcm94eUxvY2FsQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IGNvbnN0IE5vdEFuQWN0aXZpdHlNZXRob2QgPSBTeW1ib2wuZm9yKCdfX1RFTVBPUkFMX05PVF9BTl9BQ1RJVklUWV9NRVRIT0QnKTtcblxuLyoqXG4gKiBUeXBlIGhlbHBlciB0aGF0IHRha2VzIGEgdHlwZSBgVGAgYW5kIHRyYW5zZm9ybXMgYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qge0BsaW5rIEFjdGl2aXR5RnVuY3Rpb259IHRvXG4gKiB7QGxpbmsgTm90QW5BY3Rpdml0eU1ldGhvZH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBwcm94eUFjdGl2aXRpZXN9IHRvIGdldCB0aGlzIGNvbXBpbGUtdGltZSBlcnJvcjpcbiAqXG4gKiBgYGB0c1xuICogaW50ZXJmYWNlIE15QWN0aXZpdGllcyB7XG4gKiAgIHZhbGlkKGlucHV0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG4gKiAgIGludmFsaWQoaW5wdXQ6IG51bWJlcik6IG51bWJlcjtcbiAqIH1cbiAqXG4gKiBjb25zdCBhY3QgPSBwcm94eUFjdGl2aXRpZXM8TXlBY3Rpdml0aWVzPih7IHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc1bScgfSk7XG4gKlxuICogYXdhaXQgYWN0LnZhbGlkKHRydWUpO1xuICogYXdhaXQgYWN0LmludmFsaWQoKTtcbiAqIC8vIF4gVFMgY29tcGxhaW5zIHdpdGg6XG4gKiAvLyAocHJvcGVydHkpIGludmFsaWREZWZpbml0aW9uOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZFxuICogLy8gVGhpcyBleHByZXNzaW9uIGlzIG5vdCBjYWxsYWJsZS5cbiAqIC8vIFR5cGUgJ1N5bWJvbCcgaGFzIG5vIGNhbGwgc2lnbmF0dXJlcy4oMjM0OSlcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eUludGVyZmFjZUZvcjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBBY3Rpdml0eUZ1bmN0aW9uID8gQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VCBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24+ID0gVCAmIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGl2aXR5LCBvdmVycmlkaW5nIGl0cyBleGlzdGluZyBvcHRpb25zIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJncyBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIFRoZSBsb2NhbCBhY3Rpdml0eSBjb3VudGVycGFydCB0byB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogUnVuIHRoZSBsb2NhbCBhY3Rpdml0eSwgb3ZlcnJpZGluZyBpdHMgZXhpc3Rpbmcgb3B0aW9ucyB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJncyBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zLCBhcmdzOiBQYXJhbWV0ZXJzPFQ+KTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pjtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBBY3Rpdml0eU9wdGlvbnN9LlxuICpcbiAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gc2V0dXAgQWN0aXZpdGllcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkgfCBQcm94eX0gZm9yXG4gKiAgICAgICAgIHdoaWNoIGVhY2ggYXR0cmlidXRlIGlzIGEgY2FsbGFibGUgQWN0aXZpdHkgZnVuY3Rpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSAnLi4vYWN0aXZpdGllcyc7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIG1vZHVsZSBleHBvcnRzXG4gKiBjb25zdCB7IGh0dHBHZXQsIG90aGVyQWN0aXZpdHkgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMzAgbWludXRlcycsXG4gKiB9KTtcbiAqXG4gKiAvLyBVc2UgYWN0aXZpdGllcyB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICogY29uc3QgcmVzdWx0MSA9IGF3YWl0IGh0dHBHZXQoJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICpcbiAqIC8vIE92ZXJyaWRlIG9wdGlvbnMgZm9yIHNwZWNpZmljIGFjdGl2aXR5IGNhbGxzXG4gKiBjb25zdCByZXN1bHQyID0gYXdhaXQgaHR0cEdldC5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICBzdGF0aWNTdW1tYXJ5OiAnRmV0Y2hlcyBkYXRhIGZyb20gZXh0ZXJuYWwgQVBJJyxcbiAqICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogJzVtJ1xuICogfSwgWydodHRwOi8vYXBpLmV4YW1wbGUuY29tJ10pO1xuICpcbiAqIGNvbnN0IHJlc3VsdDMgPSBhd2FpdCBvdGhlckFjdGl2aXR5LmV4ZWN1dGVXaXRoT3B0aW9ucyh7XG4gKiAgIHN0YXRpY1N1bW1hcnk6ICdQcm9jZXNzZXMgdGhlIGZldGNoZWQgZGF0YScsXG4gKiAgIHRhc2tRdWV1ZTogJ3NwZWNpYWwtdGFzay1xdWV1ZSdcbiAqIH0sIFtkYXRhXSk7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIGFuIGV4cGxpY2l0IGludGVyZmFjZSAoZS5nLiB3aGVuIGRlZmluZWQgYnkgYW5vdGhlciBTREspXG4gKiBpbnRlcmZhY2UgSmF2YUFjdGl2aXRpZXMge1xuICogICBodHRwR2V0RnJvbUphdmEodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogfVxuICpcbiAqIGNvbnN0IHtcbiAqICAgaHR0cEdldEZyb21KYXZhLFxuICogICBzb21lT3RoZXJKYXZhQWN0aXZpdHlcbiAqIH0gPSBwcm94eUFjdGl2aXRpZXM8SmF2YUFjdGl2aXRpZXM+KHtcbiAqICAgdGFza1F1ZXVlOiAnamF2YS13b3JrZXItdGFza1F1ZXVlJyxcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyxcbiAqIH0pO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICogICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh0dHBHZXQoXCJodHRwOi8vZXhhbXBsZS5jb21cIik7XG4gKiAgIC8vIE9yIHdpdGggY3VzdG9tIG9wdGlvbnM6XG4gKiAgIGNvbnN0IHJlc3BvbnNlMiA9IGF3YWl0IGh0dHBHZXRGcm9tSmF2YS5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICAgIHN0YXRpY1N1bW1hcnk6ICdKYXZhIEhUVFAgY2FsbCB3aXRoIHRpbWVvdXQgb3ZlcnJpZGUnLFxuICogICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICcybSdcbiAqICAgfSwgW1wiaHR0cDovL2Zhc3QtYXBpLmV4YW1wbGUuY29tXCJdKTtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5QWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgQWN0aXZpdHlJbnRlcmZhY2VGb3I8QT4sIHtcbiAgICBnZXQoXywgYWN0aXZpdHlUeXBlKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGl2aXR5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIEFjdGl2aXR5IHR5cGVzLCBnb3Q6ICR7U3RyaW5nKGFjdGl2aXR5VHlwZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQWN0aXZpdHkoYWN0aXZpdHlUeXBlIGFzIHN0cmluZywgYXJncywgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5UHJveHlGdW5jdGlvbi5leGVjdXRlV2l0aE9wdGlvbnMgPSBmdW5jdGlvbiAoXG4gICAgICAgIG92ZXJyaWRlT3B0aW9uczogQWN0aXZpdHlPcHRpb25zLFxuICAgICAgICBhcmdzOiBhbnlbXVxuICAgICAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUFjdGl2aXR5KGFjdGl2aXR5VHlwZSwgYXJncywgZGVlcE1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFjdGl2aXR5UHJveHlGdW5jdGlvbjtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgTG9jYWwgQWN0aXZpdHkgZnVuY3Rpb25zIHdpdGggZ2l2ZW4ge0BsaW5rIExvY2FsQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9XG4gKiAgICAgICAgIGZvciB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQHNlZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSBmb3IgZXhhbXBsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5TG9jYWxBY3Rpdml0aWVzPEEgPSBVbnR5cGVkQWN0aXZpdGllcz4oXG4gIG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zXG4pOiBMb2NhbEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBMb2NhbEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+LCB7XG4gICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2NhbEFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlTG9jYWxBY3Rpdml0eShhY3Rpdml0eVR5cGUgYXMgc3RyaW5nLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24uZXhlY3V0ZVdpdGhPcHRpb25zID0gZnVuY3Rpb24gKFxuICAgICAgICBvdmVycmlkZU9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICAgICAgICBhcmdzOiBhbnlbXVxuICAgICAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlLCBhcmdzLCBkZWVwTWVyZ2Uob3B0aW9ucywgb3ZlcnJpZGVPcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb247XG4gICAgfSxcbiAgfSk7XG59XG5cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIHBhdGNoIGFmdGVyIFwiZW5vdWdoXCIgdGltZSBoYXMgcGFzc2VkXG5jb25zdCBFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0ggPSAnX190ZW1wb3JhbF9pbnRlcm5hbF9jb25uZWN0X2V4dGVybmFsX2hhbmRsZV9jYW5jZWxfdG9fc2NvcGUnO1xuLy8gVGhlIG5hbWUgb2YgdGhpcyBwYXRjaCBjb21lcyBmcm9tIGFuIGF0dGVtcHQgdG8gYnVpbGQgYSBnZW5lcmljIGludGVybmFsIHBhdGNoaW5nIG1lY2hhbmlzbS5cbi8vIFRoYXQgZWZmb3J0IGhhcyBiZWVuIGFiYW5kb25lZCBpbiBmYXZvciBvZiBhIG5ld2VyIFdvcmtmbG93VGFza0NvbXBsZXRlZE1ldGFkYXRhIGJhc2VkIG1lY2hhbmlzbS5cbmNvbnN0IENPTkRJVElPTl8wX1BBVENIID0gJ19fc2RrX2ludGVybmFsX3BhdGNoX251bWJlcjoxJztcblxuLyoqXG4gKiBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIGFuZCBjYW5jZWwgYW4gZXhpc3RpbmcgV29ya2Zsb3cgZXhlY3V0aW9uLlxuICogSXQgdGFrZXMgYSBXb3JrZmxvdyBJRCBhbmQgb3B0aW9uYWwgcnVuIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSh3b3JrZmxvd0lkOiBzdHJpbmcsIHJ1bklkPzogc3RyaW5nKTogRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5nZXRFeHRlcm5hbFdvcmtmbG93SGFuZGxlKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZ2V0SGFuZGxlKC4uLikgaW5zdGVhZC4pJ1xuICApO1xuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQsXG4gICAgcnVuSWQsXG4gICAgY2FuY2VsKCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQ29ubmVjdCB0aGlzIGNhbmNlbCBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnQgY2FuY2VsbGF0aW9uIHNjb3BlLlxuICAgICAgICAvLyBUaGlzIGlzIGJlaGF2aW9yIHdhcyBpbnRyb2R1Y2VkIGFmdGVyIHYwLjIyLjAgYW5kIGlzIGluY29tcGF0aWJsZVxuICAgICAgICAvLyB3aXRoIGhpc3RvcmllcyBnZW5lcmF0ZWQgd2l0aCBwcmV2aW91cyBTREsgdmVyc2lvbnMgYW5kIHRodXMgcmVxdWlyZXNcbiAgICAgICAgLy8gcGF0Y2hpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHRyeSB0byBkZWxheSBwYXRjaGluZyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGF2b2lkIHBvbGx1dGluZ1xuICAgICAgICAvLyBoaXN0b3JpZXMgdW5sZXNzIHN0cmljdGx5IHJlcXVpcmVkLlxuICAgICAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgICAgIGlmIChwYXRjaGVkKEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuY2FuY2VsV29ya2Zsb3crKztcbiAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICByZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHdvcmtmbG93SWQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNhbmNlbFdvcmtmbG93LnNldChzZXEsIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBjb250ZXh0OiB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGFjdGl2YXRvci5pbmZvLCB3b3JrZmxvd0lkKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnZXh0ZXJuYWwnLFxuICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7IHdvcmtmbG93SWQsIHJ1bklkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIEJ5IGRlZmF1bHQsIGEgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzICgpID0+IFByb21pc2U8YW55Pj4od29ya2Zsb3dUeXBlOiBzdHJpbmcpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQsXG4gIG9wdGlvbnM/OiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zdGFydENoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuc3RhcnQoLi4uKSBpbnN0ZWFkLiknXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgW3N0YXJ0ZWQsIGNvbXBsZXRlZF0gPSBhd2FpdCBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICBjb25zdCBmaXJzdEV4ZWN1dGlvblJ1bklkID0gYXdhaXQgc3RhcnRlZDtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQ6IG9wdGlvbnNXaXRoRGVmYXVsdHMud29ya2Zsb3dJZCxcbiAgICBmaXJzdEV4ZWN1dGlvblJ1bklkLFxuICAgIGFzeW5jIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCBjb21wbGV0ZWQpIGFzIGFueTtcbiAgICB9LFxuICAgIGFzeW5jIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnY2hpbGQnLFxuICAgICAgICAgIGNoaWxkV29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzICgpID0+IFdvcmtmbG93UmV0dXJuVHlwZT4od29ya2Zsb3dGdW5jOiBUKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZXhlY3V0ZUNoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZXhlY3V0ZSguLi4pIGluc3RlYWQuJ1xuICApO1xuICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9ucyhvcHRpb25zID8/ICh7fSBhcyBhbnkpKTtcbiAgY29uc3Qgd29ya2Zsb3dUeXBlID0gZXh0cmFjdFdvcmtmbG93VHlwZSh3b3JrZmxvd1R5cGVPckZ1bmMpO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLFxuICAgICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nLFxuICAgIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbk5leHRIYW5kbGVyXG4gICk7XG4gIGNvbnN0IGV4ZWNQcm9taXNlID0gZXhlY3V0ZSh7XG4gICAgc2VxOiBhY3RpdmF0b3IubmV4dFNlcXMuY2hpbGRXb3JrZmxvdysrLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgaGVhZGVyczoge30sXG4gICAgd29ya2Zsb3dUeXBlLFxuICB9KTtcbiAgdW50cmFja1Byb21pc2UoZXhlY1Byb21pc2UpO1xuICBjb25zdCBjb21wbGV0ZWRQcm9taXNlID0gZXhlY1Byb21pc2UudGhlbigoW19zdGFydGVkLCBjb21wbGV0ZWRdKSA9PiBjb21wbGV0ZWQpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZWRQcm9taXNlKTtcbiAgcmV0dXJuIGNvbXBsZXRlZFByb21pc2UgYXMgUHJvbWlzZTxhbnk+O1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmcm96ZW4gY29weSBvZiBXb3JrZmxvd0luZm8sIGF0IHRoZSBwb2ludCB3aGVyZSB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gKiBDaGFuZ2VzIGhhcHBlbmluZyBhdCBsYXRlciBwb2ludCBpbiB3b3JrZmxvdyBleGVjdXRpb24gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogRm9yIHRoaXMgcmVhc29uLCB3ZSByZWNvbW1lbmQgY2FsbGluZyBgd29ya2Zsb3dJbmZvKClgIG9uIGV2ZXJ5IGFjY2VzcyB0byB7QGxpbmsgV29ya2Zsb3dJbmZvfSdzIGZpZWxkcyxcbiAqIHJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIGBXb3JrZmxvd0luZm9gIG9iamVjdCAob3IgcGFydCBvZiBpdCkgaW4gYSBsb2NhbCB2YXJpYWJsZS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIC8vIEdPT0RcbiAqIGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIGRvU29tZXRoaW5nKHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXMpXG4gKiAgIC4uLlxuICogICBkb1NvbWV0aGluZ0Vsc2Uod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHZzXG4gKlxuICogYGBgdHNcbiAqIC8vIEJBRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgY29uc3QgYXR0cmlidXRlcyA9IHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXNcbiAqICAgZG9Tb21ldGhpbmcoYXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZShhdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0luZm8oKTogV29ya2Zsb3dJbmZvIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LndvcmtmbG93SW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5pbmZvO1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB1cGRhdGUgaWYgYW55LlxuICpcbiAqIEByZXR1cm4gSW5mbyBmb3IgdGhlIGN1cnJlbnQgdXBkYXRlIGhhbmRsZXIgdGhlIGNvZGUgY2FsbGluZyB0aGlzIGlzIGV4ZWN1dGluZ1xuICogd2l0aGluIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRVcGRhdGVJbmZvKCk6IFVwZGF0ZUluZm8gfCB1bmRlZmluZWQge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY3VycmVudFVwZGF0ZUluZm8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBVcGRhdGVTY29wZS5jdXJyZW50KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBjb2RlIGlzIGV4ZWN1dGluZyBpbiB3b3JrZmxvdyBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbldvcmtmbG93Q29udGV4dCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heWJlR2V0QWN0aXZhdG9yKCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gYGZgIHRoYXQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byBDb250aW51ZUFzTmV3IHdoZW4gY2FsbGVkLlxuICpcbiAqIGBmYCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIFdvcmtmbG93IGZ1bmN0aW9uIHN1cHBsaWVkIHRvIHR5cGVwYXJhbSBgRmAuXG4gKlxuICogT25jZSBgZmAgaXMgY2FsbGVkLCBXb3JrZmxvdyBFeGVjdXRpb24gaW1tZWRpYXRlbHkgY29tcGxldGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEYgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdGlvbnM/OiBDb250aW51ZUFzTmV3T3B0aW9uc1xuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pID0+IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LmNvbnRpbnVlQXNOZXcoLi4uKSBhbmQgV29ya2Zsb3cubWFrZUNvbnRpbnVlQXNOZXdGdW5jKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICBjb25zdCB7IHdvcmtmbG93VHlwZSwgdGFza1F1ZXVlLCAuLi5yZXN0IH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCByZXF1aXJlZE9wdGlvbnMgPSB7XG4gICAgd29ya2Zsb3dUeXBlOiB3b3JrZmxvd1R5cGUgPz8gaW5mby53b3JrZmxvd1R5cGUsXG4gICAgdGFza1F1ZXVlOiB0YXNrUXVldWUgPz8gaW5mby50YXNrUXVldWUsXG4gICAgLi4ucmVzdCxcbiAgfTtcblxuICByZXR1cm4gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pOiBQcm9taXNlPG5ldmVyPiA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGN1cnJlbnRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGluZm8pO1xuICAgIGNvbnN0IGZuID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnY29udGludWVBc05ldycsIGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWFkZXJzLCBhcmdzLCBvcHRpb25zIH0gPSBpbnB1dDtcbiAgICAgIHRocm93IG5ldyBDb250aW51ZUFzTmV3KHtcbiAgICAgICAgd29ya2Zsb3dUeXBlOiBvcHRpb25zLndvcmtmbG93VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIGFyZ3MpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlLFxuICAgICAgICBtZW1vOiBvcHRpb25zLm1lbW8gJiYgbWFwVG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5tZW1vLCBjb250ZXh0KSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczpcbiAgICAgICAgICBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMgfHwgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICAgID8geyBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXMsIG9wdGlvbnMudHlwZWRTZWFyY2hBdHRyaWJ1dGVzKSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICAgIGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6IGVuY29kZUluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3Iob3B0aW9ucy5pbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmbih7XG4gICAgICBhcmdzLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICBvcHRpb25zOiByZXF1aXJlZE9wdGlvbnMsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvdy1leGVjdXRpb24vY29udGludWUtYXMtbmV3I2NvbnRpbnVlLWFzLW5ldyB8IENvbnRpbnVlcy1Bcy1OZXd9IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvblxuICogd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogU2hvcnRoYW5kIGZvciBgbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEY+KCkoLi4uYXJncylgLiAoU2VlOiB7QGxpbmsgbWFrZUNvbnRpbnVlQXNOZXdGdW5jfS4pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogICAvLyAuLi4gV29ya2Zsb3cgbG9naWNcbiAqICAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZUFzTmV3PEYgZXh0ZW5kcyBXb3JrZmxvdz4oLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIG1ha2VDb250aW51ZUFzTmV3RnVuYygpKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIFJGQyBjb21wbGlhbnQgVjQgdXVpZC5cbiAqIFVzZXMgdGhlIHdvcmtmbG93J3MgZGV0ZXJtaW5pc3RpYyBQUk5HIG1ha2luZyBpdCBzYWZlIGZvciB1c2Ugd2l0aGluIGEgd29ya2Zsb3cuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGluc2VjdXJlLlxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQgfCBzdGFja292ZXJmbG93IGRpc2N1c3Npb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIHV1aWQ0RnJvbVJhbmRvbShhY3RpdmF0b3IgPyAoKSA9PiBhY3RpdmF0b3IuY3VycmVudFJhbmRvbSgpIDogTWF0aC5yYW5kb20pO1xufVxuXG4vKipcbiAqIFBhdGNoIG9yIHVwZ3JhZGUgd29ya2Zsb3cgY29kZSBieSBjaGVja2luZyBvciBzdGF0aW5nIHRoYXQgdGhpcyB3b3JrZmxvdyBoYXMgYSBjZXJ0YWluIHBhdGNoLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIHJlcGxheWluZyBhbiBleGlzdGluZyBoaXN0b3J5LCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoYXRcbiAqIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyIHdoaWNoIGFsc28gaGFkIGEgYHBhdGNoZWRgIGNhbGwgd2l0aCB0aGUgc2FtZSBgcGF0Y2hJZGAuXG4gKiBJZiB0aGUgaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgKndpdGhvdXQqIHN1Y2ggYSBjYWxsLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyBub3QgY3VycmVudGx5IHJlcGxheWluZywgdGhlbiB0aGlzIGNhbGwgKmFsd2F5cyogcmV0dXJucyB0cnVlLlxuICpcbiAqIFlvdXIgd29ya2Zsb3cgY29kZSBzaG91bGQgcnVuIHRoZSBcIm5ld1wiIGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUsIGlmIGl0IHJldHVybnMgZmFsc2UsIHlvdVxuICogc2hvdWxkIHJ1biB0aGUgXCJvbGRcIiBjb2RlLiBCeSBkb2luZyB0aGlzLCB5b3UgY2FuIG1haW50YWluIGRldGVybWluaXNtLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hlZChwYXRjaElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIHJldHVybiBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCBmYWxzZSk7XG59XG5cbi8qKlxuICogSW5kaWNhdGUgdGhhdCBhIHBhdGNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBXb3JrZmxvd3Mgd2l0aCB0aGlzIGNhbGwgbWF5IGJlIGRlcGxveWVkIGFsb25nc2lkZSB3b3JrZmxvd3Mgd2l0aCBhIHtAbGluayBwYXRjaGVkfSBjYWxsLCBidXRcbiAqIHRoZXkgbXVzdCAqbm90KiBiZSBkZXBsb3llZCB3aGlsZSBhbnkgd29ya2VycyBzdGlsbCBleGlzdCBydW5uaW5nIG9sZCBjb2RlIHdpdGhvdXQgYVxuICoge0BsaW5rIHBhdGNoZWR9IGNhbGwsIG9yIGFueSBydW5zIHdpdGggaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IHN1Y2ggd29ya2VycyBleGlzdC4gSWYgZWl0aGVyIGtpbmRcbiAqIG9mIHdvcmtlciBlbmNvdW50ZXJzIGEgaGlzdG9yeSBwcm9kdWNlZCBieSB0aGUgb3RoZXIsIHRoZWlyIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBPbmNlIGFsbCBsaXZlIHdvcmtmbG93IHJ1bnMgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5IHdvcmtlcnMgd2l0aCB0aGlzIGNhbGwsIHlvdSBjYW4gZGVwbG95IHdvcmtlcnNcbiAqIHdoaWNoIGFyZSBmcmVlIG9mIGVpdGhlciBraW5kIG9mIHBhdGNoIGNhbGwgZm9yIHRoaXMgSUQuIFdvcmtlcnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGNhbGxcbiAqIG1heSBjb2V4aXN0LCBhcyBsb25nIGFzIHRoZXkgYXJlIGJvdGggcnVubmluZyB0aGUgXCJuZXdcIiBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlUGF0Y2gocGF0Y2hJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLCBwcm92aWRpbmdcbiAqIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0aW1lciAoaS5lLiBwcm92aWRlIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRpbWVyT3B0aW9ucyBpcyBhIG5ldyBhZGRpdGlvbiBhbmQgc3ViamVjdCB0byBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24sIG9wdGlvbnM6IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uLCBvcHRzPzogVGltZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0LCBvcHRzKS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIENhbm5vdCByZWdpc3RlciBoYW5kbGVyIGZvciByZXNlcnZlZCBuYW1lc1xuICB0aHJvd0lmUmVzZXJ2ZWROYW1lKGRlZi50eXBlLCBkZWYubmFtZSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgdXBkYXRlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKlxuICogVXBkYXRlcyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdXBkYXRlcyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRVcGRhdGVIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRVcGRhdGVIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0VXBkYXRlSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0VXBkYXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgcXVlcnkgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqXG4gKiBRdWVyaWVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5IGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcmllcyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFF1ZXJ5SGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0UXVlcnlIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0UXVlcnlIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nIHx8IGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0UXVlcnlIYW5kbGVyID0gaGFuZGxlcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlcyBjYW4gYmUgdXBzZXJ0ZWQgdXNpbmcgZWl0aGVyIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpIG9yIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSAocHJlZmVycmVkKVxuICpcbiAqIFVwc2VydGluZyBhIHdvcmtmbG93J3Mgc2VhcmNoIGF0dHJpYnV0ZXMgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBpbnRLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUludEZpZWxkJywgJ0lOVCcpO1xuICogY29uc3QgYm9vbEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tQm9vbEZpZWxkJywgJ0JPT0wnKTtcbiAqIGNvbnN0IGtleXdvcmRMaXN0S2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21LZXl3b3JkRmllbGQnLCAnS0VZV09SRF9MSVNUJyk7XG4gKlxuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgMSksXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGJvb2xLZXksIHRydWUpXG4gKiBdKTtcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoW1xuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShpbnRLZXksIDQyKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoa2V5d29yZExpc3RLZXksIFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J10pXG4gKiBdKTtcbiAqIGBgYFxuICpcbiAqIFdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIFNlYXJjaCBBdHRyaWJ1dGVzOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXSxcbiAqICAgQ3VzdG9tS2V5d29yZEZpZWxkOiBbJ2R1cmFibGUgY29kZScsICdpcyBncmVhdCddXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VhcmNoQXR0cmlidXRlcyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpLCBzZXQgYSB2YWx1ZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqIElmIHVzaW5nIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpLCBzZXQgYSB2YWx1ZSB0byB1bmRlZmluZWQgb3IgYW4gZW1wdHkgbGlzdCB0byByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXMgfCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuXG4gIGlmIChzZWFyY2hBdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlYXJjaEF0dHJpYnV0ZXMgbXVzdCBiZSBhIG5vbi1udWxsIFNlYXJjaEF0dHJpYnV0ZXMnKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgLy8gVHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXNcbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgdXBzZXJ0V29ya2Zsb3dTZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBpbmRleGVkRmllbGRzOiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyh1bmRlZmluZWQsIHNlYXJjaEF0dHJpYnV0ZXMpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGFjdGl2YXRvci5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm86IFdvcmtmbG93SW5mbyk6IFdvcmtmbG93SW5mbyA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07XG4gICAgICBmb3IgKGNvbnN0IHBhaXIgb2Ygc2VhcmNoQXR0cmlidXRlcykge1xuICAgICAgICBpZiAocGFpci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG51bGwsIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBtdXRhdGUgdGhlIGV4aXN0aW5nIHN0YXRlIChqdXN0IHRoZSBuZXcgbWFwKSBzbyB0aGlzIGlzIHNhZmUuXG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXSA9IEFycmF5LmlzQXJyYXkocGFpci52YWx1ZSlcbiAgICAgICAgICAgID8gcGFpci52YWx1ZVxuICAgICAgICAgICAgOiAoW3BhaXIudmFsdWVdIGFzIFNlYXJjaEF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogbmV3U2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvcHkgYW5kIGFwcGx5IGV4aXN0aW5nIGFuZCBuZXcgdXBkYXRlcy4gS2VlcCBpbiBtaW5kIHRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgKGV4aXN0aW5nIGZpcnN0LCBuZXcgc2Vjb25kIC0gdG8gcG9zc2libHkgb3ZlcndyaXRlIGV4aXN0aW5nKS5cbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBpbmZvLnR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFsuLi5zZWFyY2hBdHRyaWJ1dGVzXSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgbGV0IHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW10pO1xuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07XG5cbiAgICAgIC8vIFVwc2VydCBsZWdhY3kgc2VhcmNoIGF0dHJpYnV0ZXMgaW50byB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuXG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWFyY2ggYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb3IgdW5kZWZpbmVkLCBnb3QgJHt2fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHVuZGVmaW5lZCBvciBhbiBlbXB0eSBsaXN0LCB0aGlzIHNpZ25pZmllcyBkZWxldGlvbi5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gYm90aCB1bnR5cGVkICYgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXMuXG4gICAgICAgIGlmICh2ID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgLy8gV2UgY2Fubm90IGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZyb20gdGhlc2UgdmFsdWVzLlxuICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGRvIGEgXCJiZXN0IGVmZm9ydFwiIGRlbGV0aW9uIGZyb20gdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZXM6XG4gICAgICAgICAgLy8gLSBjaGVjayBpZiBhIG1hdGNoaW5nIGtleSBuYW1lIGV4aXN0cywgaWYgc28sIHJlbW92ZSBpdC5cbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1BhaXIgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkuZmluZCgocGFpcikgPT4gcGFpci5rZXkubmFtZSA9PT0gayk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nUGFpcikge1xuICAgICAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzID0gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW1xuICAgICAgICAgICAgICB7IGtleTogbWF0Y2hpbmdQYWlyLmtleSwgdmFsdWU6IG51bGwgfSBhcyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXR0ZW1wdCB0byBkaXNjZXJuIGEgdmFsaWQga2V5IHR5cGluZyBmb3IgdGhlIHVwZGF0ZS5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0S2V5RnJvbVVudHlwZWQoaywgdik7XG5cbiAgICAgICAgLy8gVW5hYmxlIHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIChubyB2YWxpZCB0eXBlIGZvciBkZWZpbmVkIHZhbHVlKS5cbiAgICAgICAgLy8gU2tpcCBhcHBseWluZyB0aGlzIHVwZGF0ZSAobm8tb3ApLlxuICAgICAgICBpZiAodHlwZWRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVEVYVCB0eXBlIGlzIGluZmVycmVkIGZyb20gYSBzdHJpbmcgdmFsdWUsIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIEtFWVdPUkQuXG4gICAgICAgIC8vIElmIGEgbWF0Y2hpbmcgcGFpciBleGlzdHMgd2l0aCBLRVlXT1JEIHR5cGUsIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgIGlmICh0eXBlZEtleS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1BhaXIgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkuZmluZCgocGFpcikgPT4gcGFpci5rZXkubmFtZSA9PT0gdHlwZWRLZXkubmFtZSk7XG4gICAgICAgICAgaWYgKG1hdGNoaW5nUGFpcikge1xuICAgICAgICAgICAgdHlwZWRLZXkudHlwZSA9IG1hdGNoaW5nUGFpci5rZXkudHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3VmFsdWU6IHVua25vd24gPSB2O1xuICAgICAgICAvLyBVbnBhY2sgdmFsdWUgaWYgaXQgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheS5cbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSB2WzBdO1xuICAgICAgICAgIC8vIENvbnZlcnQgdmFsdWUgYmFjayB0byBEYXRlLlxuICAgICAgICAgIGlmICh0eXBlZEtleS50eXBlID09PSAnREFURVRJTUUnKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG5ldyBEYXRlKG5ld1ZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmluZWQgdmFsdWUgd2l0aCB2YWxpZCB0eXBlLiBBcHBseSB0aGUgdXBkYXRlLlxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgeyBrZXk6IHR5cGVkS2V5LCB2YWx1ZTogbmV3VmFsdWUgfSBhcyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICAgICAgICBdKTtcbiAgICAgICAgbmV3U2VhcmNoQXR0cmlidXRlc1trXSA9IHY7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbmZvLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBuZXdTZWFyY2hBdHRyaWJ1dGVzLFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGlzIFdvcmtmbG93J3MgTWVtb3MgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgYG1lbW9gIHdpdGggZXhpc3RpbmdcbiAqIE1lbW9zIChhcyByZXR1cm5lZCBieSBgd29ya2Zsb3dJbmZvKCkubWVtb2ApLlxuICpcbiAqIE5ldyBtZW1vIGlzIG1lcmdlZCBieSByZXBsYWNpbmcgcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIF9hdCB0aGUgZmlyc3RcbiAqIGxldmVsIG9ubHlfLiBTZXR0aW5nIGEgcHJvcGVydHkgdG8gdmFsdWUgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGNsZWFycyB0aGF0XG4gKiBrZXkgZnJvbSB0aGUgTWVtby5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTE6IHZhbHVlIH1cbiAqICAga2V5NDogdmFsdWUsXG4gKiB9KTtcbiAqIHVwc2VydE1lbW8oe1xuICogICBrZXkyOiB2YWx1ZVxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH1cbiAqICAga2V5NDogdW5kZWZpbmVkLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiB3b3VsZCByZXN1bHQgaW4gdGhlIFdvcmtmbG93IGhhdmluZyB0aGVzZSBNZW1vOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkyOiB2YWx1ZSxcbiAqICAga2V5MzogeyBzdWJrZXkyOiB2YWx1ZSB9ICAvLyBOb3RlIHRoaXMgb2JqZWN0IHdhcyBjb21wbGV0ZWx5IHJlcGxhY2VkXG4gKiAgIC8vIE5vdGUgdGhhdCBrZXk0IHdhcyBjb21wbGV0ZWx5IHJlbW92ZWRcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtZW1vIFRoZSBSZWNvcmQgdG8gbWVyZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRNZW1vKG1lbW86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy51cHNlcnRNZW1vKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBjb25zdCBjb250ZXh0ID0gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8pO1xuXG4gIGlmIChtZW1vID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lbW8gbXVzdCBiZSBhIG5vbi1udWxsIFJlY29yZCcpO1xuICB9XG5cbiAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICBtb2RpZnlXb3JrZmxvd1Byb3BlcnRpZXM6IHtcbiAgICAgIHVwc2VydGVkTWVtbzoge1xuICAgICAgICBmaWVsZHM6IG1hcFRvUGF5bG9hZHMoXG4gICAgICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZFxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZW1vKS5tYXAoKFtrLCB2XSkgPT4gW2ssIHYgPz8gdW5kZWZpbmVkXSkpLFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIG1lbW86IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgIC4uLmluZm8ubWVtbyxcbiAgICAgICAgICAuLi5tZW1vLFxuICAgICAgICB9KS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPSBudWxsKVxuICAgICAgKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLlxuICpcbiAqIENvbnNpZGVyIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gYmVmb3JlIHdvcmtmbG93IHJldHVybiBvciBjb250aW51ZS1hcy1uZXcsIHRvIHByZXZlbnRcbiAqIGludGVycnVwdGlvbiBvZiBpbi1wcm9ncmVzcyBoYW5kbGVycyBieSB3b3JrZmxvdyBleGl0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluLXByb2dyZXNzIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsSGFuZGxlcnNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2FsbEhhbmRsZXJzRmluaXNoZWQoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1NpZ25hbHMuc2l6ZSA9PT0gMCAmJiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1VwZGF0ZXMuc2l6ZSA9PT0gMDtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBhbHRlciB3b3JrZmxvdyBmdW5jdGlvbnMgd2l0aCBjZXJ0YWluIG9wdGlvbnMgc3BlY2lmaWVkIGF0IGRlZmluaXRpb24gdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGU6XG4gKiBgYGB0c1xuICogc2V0V29ya2Zsb3dPcHRpb25zKHtcbiAqICAgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyxcbiAqICAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBbQ3VzdG9tV29ya2Zsb3dFcnJvcl1cbiAqIH0sIG15V29ya2Zsb3cpO1xuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAqICAgLy8gV29ya2Zsb3cgY29kZSBoZXJlXG4gKiAgIHJldHVybiBcImhpXCI7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogVG8gYW5ub3RhdGUgYSBkZWZhdWx0IG9yIGR5bmFtaWMgd29ya2Zsb3c6XG4gKiBgYGB0c1xuICogZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gKiAgIC8vIFdvcmtmbG93IGNvZGUgaGVyZVxuICogICByZXR1cm4gXCJoaVwiO1xuICogfVxuICogc2V0V29ya2Zsb3dPcHRpb25zKHtcbiAqICAgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyxcbiAqICAgZmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBbQ3VzdG9tV29ya2Zsb3dFcnJvcl1cbiAqIH0sIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IGRlZmludGlvbiwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgb3B0aW9ucy4gSWYgYVxuICogZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgY2FsbGVkIG9uY2UganVzdCBiZWZvcmUgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdGhlXG4gKiBmaXJzdCB0aW1lLiBJdCBpcyBzYWZlIHRvIGNhbGwge0BsaW5rIHdvcmtmbG93SW5mb30gaW5zaWRlIHN1Y2ggYSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBUaGUgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRXb3JrZmxvd09wdGlvbnM8QSBleHRlbmRzIGFueVtdLCBSVD4oXG4gIG9wdGlvbnM6IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbiAgZm46ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFJUPlxuKTogdm9pZCB7XG4gIE9iamVjdC5hc3NpZ24oZm4sIHtcbiAgICB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zOiBvcHRpb25zLFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0YWNrVHJhY2VRdWVyeSA9IGRlZmluZVF1ZXJ5PHN0cmluZz4oJ19fc3RhY2tfdHJhY2UnKTtcbmV4cG9ydCBjb25zdCBlbmhhbmNlZFN0YWNrVHJhY2VRdWVyeSA9IGRlZmluZVF1ZXJ5PEVuaGFuY2VkU3RhY2tUcmFjZT4oJ19fZW5oYW5jZWRfc3RhY2tfdHJhY2UnKTtcbmV4cG9ydCBjb25zdCB3b3JrZmxvd01ldGFkYXRhUXVlcnkgPSBkZWZpbmVRdWVyeTx0ZW1wb3JhbC5hcGkuc2RrLnYxLklXb3JrZmxvd01ldGFkYXRhPignX190ZW1wb3JhbF93b3JrZmxvd19tZXRhZGF0YScpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudERldGFpbHMoKTogc3RyaW5nIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmN1cnJlbnREZXRhaWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q3VycmVudERldGFpbHMoZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdnZXRDdXJyZW50RGV0YWlscygpIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgYWN0aXZhdG9yLmN1cnJlbnREZXRhaWxzID0gZGV0YWlscztcbn1cbiIsImltcG9ydCB7IGluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZiB9IGZyb20gXCIuLi9pbnRlcm5hbC9zeW1ib2wtaW5zdGFuY2VvZlwiO1xuaW1wb3J0IHR5cGUgeyBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuXG4vKipcbiAqIEEgTmV4dXMgaGFuZGxlciBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGhhbmRsaW5nIG9mIGFcbiAqIE5leHVzIG9wZXJhdGlvbiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGEgaGFuZGxlciBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIm5leHVzLXJwY1wiO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIkJBRF9SRVFVRVNUXCIsIFwiSW52YWxpZCBpbnB1dCBwcm92aWRlZFwiKTtcbiAqXG4gKiAgICAgLy8gVGhyb3cgYSBiYWQgcmVxdWVzdCBlcnJvciwgd2l0aCBhIGNhdXNlXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIkJBRF9SRVFVRVNUXCIsIFwiSW52YWxpZCBpbnB1dCBwcm92aWRlZFwiLCB7IGNhdXNlIH0pO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIHJldHJ5YWJsZSBpbnRlcm5hbCBlcnJvclxuICogICAgIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJJTlRFUk5BTFwiLCBcIkRhdGFiYXNlIHVuYXZhaWxhYmxlXCIsIHsgcmV0cnlhYmxlT3ZlcnJpZGU6IHRydWUgfSk7XG4gKlxuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgSGFuZGxlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogT25lIG9mIHRoZSBwcmVkZWZpbmVkIGVycm9yIHR5cGVzLlxuICAgKlxuICAgKiBJZiB0aGUgY29uc3RydWN0b3IgcmVjZWl2ZWQgYW4gdW5rbm93biBzdHJpbmcsIHRoaXMgd2lsbCBiZSBgXCJVTktOT1dOXCJgLlxuICAgKiBVc2Uge0BsaW5rIHJhd0Vycm9yVHlwZX0gdG8gYWNjZXNzIHRoZSBvcmlnaW5hbCBzdHJpbmcuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIEhhbmRsZXJFcnJvclR5cGV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogSGFuZGxlckVycm9yVHlwZTtcblxuICAvKipcbiAgICogVGhlIHJhdyBlcnJvciB0eXBlIHN0cmluZy5cbiAgICpcbiAgICogRm9yIGtub3duIHR5cGVzLCB0aGlzIGVxdWFscyB7QGxpbmsgdHlwZX0uIEZvciB1bmtub3duIHR5cGVzLCB0aGlzIHByZXNlcnZlc1xuICAgKiB0aGUgb3JpZ2luYWwgd2lyZSBzdHJpbmcgd2hpbGUge0BsaW5rIHR5cGV9IGlzIHNldCB0byBgXCJVTktOT1dOXCJgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJhd0Vycm9yVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqXG4gICAqIElmIHNwZWNpZmllZCwgYHJldHJ5YWJsZU92ZXJyaWRlYCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmV0cnkgYmVoYXZpb3IgZGV0ZXJtaW5lZCBiYXNlZCBvblxuICAgKiB0aGUgZXJyb3IgdHlwZS4gVXNlIHtAbGluayByZXRyeWFibGV9IHRvIGRldGVybWluZSB0aGUgZWZmZWN0aXZlIHJldHJ5IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayByZXRyeWFibGV9LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldHJ5YWJsZU92ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0IGlmIHRoaXMgZXJyb3Igd2FzIGNvbnN0cnVjdGVkIGZyb20gYSB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0LlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGZhaWx1cmUgZm9yIHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEhhbmRsZXJFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGVycm9yLiBNdXN0IGJlIGEga25vd24ge0BsaW5rIEhhbmRsZXJFcnJvclR5cGV9LlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIG9mIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFeHRyYSBvcHRpb25zIGZvciB0aGUgZXJyb3IsIGluY2x1ZGluZyB0aGUgY2F1c2UgYW5kIHJldHJ5YWJsZSBvdmVycmlkZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZTogSGFuZGxlckVycm9yVHlwZSwgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IEhhbmRsZXJFcnJvck9wdGlvbnMpIHtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBgSGFuZGxlciBlcnJvcjogJHt0eXBlfWA7XG5cbiAgICBzdXBlcihhY3R1YWxNZXNzYWdlLCB7IGNhdXNlOiBvcHRpb25zPy5jYXVzZSB9KTtcblxuICAgIGlmICghT2JqZWN0Lmhhc093bihIYW5kbGVyRXJyb3JUeXBlLCB0eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBIYW5kbGVyRXJyb3JUeXBlOiAke3R5cGV9YCk7XG4gICAgfVxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5yYXdFcnJvclR5cGUgPSB0eXBlID09PSBcIlVOS05PV05cIiA/IChvcHRpb25zPy5yYXdFcnJvclR5cGUgPz8gdHlwZSkgOiB0eXBlO1xuICAgIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGUgPSBvcHRpb25zPy5yZXRyeWFibGVPdmVycmlkZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUge0BsaW5rIHJldHJ5YWJsZU92ZXJyaWRlfSBwcm9wZXJ0eSBpbiB0aGF0IGByZXRyeWFibGVgIHRha2VzIGludG9cbiAgICogYWNjb3VudCB0aGUgZGVmYXVsdCBiZWhhdmlvciByZXN1bHRpbmcgZnJvbSB0aGUgZXJyb3IgdHlwZSwgaWYgbm8gb3ZlcnJpZGUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZU92ZXJyaWRlfS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmV0cnlhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJCQURfUkVRVUVTVFwiOlxuICAgICAgY2FzZSBcIlVOQVVUSEVOVElDQVRFRFwiOlxuICAgICAgY2FzZSBcIlVOQVVUSE9SSVpFRFwiOlxuICAgICAgY2FzZSBcIk5PVF9GT1VORFwiOlxuICAgICAgY2FzZSBcIk5PVF9JTVBMRU1FTlRFRFwiOlxuICAgICAgY2FzZSBcIkNPTkZMSUNUXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgY2FzZSBcIlVOQVZBSUxBQkxFXCI6XG4gICAgICBjYXNlIFwiVVBTVFJFQU1fVElNRU9VVFwiOlxuICAgICAgY2FzZSBcIlJFU09VUkNFX0VYSEFVU1RFRFwiOlxuICAgICAgY2FzZSBcIklOVEVSTkFMXCI6XG4gICAgICBjYXNlIFwiUkVRVUVTVF9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiVU5LTk9XTlwiOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBGb3JjZSBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiBtaXNzaW5nIGEgY2FzZVxuICAgICAgICBjb25zdCBfbm9NaXNzaW5nQ2FzZTogbmV2ZXIgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoSGFuZGxlckVycm9yLCBcIkhhbmRsZXJFcnJvclwiKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAaW5saW5lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlckVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogdW5rbm93bjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGVycm9yIHNob3VsZCBiZSBjb25zaWRlcmVkIHJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgbm90IHNldCwgdGhlIHJldHJ5IGJlaGF2aW9yIGlzIGRldGVybWluZWQgZnJvbSB0aGUgZXJyb3IgdHlwZS5cbiAgICogRm9yIGV4YW1wbGUsIGJ5IGRlZmF1bHQsIGBJTlRFUk5BTGAgaXMgcmV0cnlhYmxlLCBidXQgYFVOQVZBSUxBQkxFYCBpcyBub24tcmV0cnlhYmxlLlxuICAgKi9cbiAgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBzdGFjayB0cmFjZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgYHN0YWNrYCBwcm9wZXJ0eSBvbiB0aGUgZXJyb3IuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlbW90ZSBzdGFjayB0cmFjZXMgcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZSxcbiAgICogd2hpY2ggbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IGxhbmd1YWdlIHJ1bnRpbWUuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBvcmlnaW5hbEZhaWx1cmU/OiBGYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgZXJyb3IgdHlwZSBzdHJpbmcsIHByZXNlcnZpbmcgdGhlIHJhdyB3aXJlIHZhbHVlLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAqIFdoZW4gdGhlIGVycm9yJ3MgdHlwZSBpcyBzZXQgdG8gYFwiVU5LTk9XTlwiYCwgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgd2lyZSBzdHJpbmcuXG4gICAqL1xuICByYXdFcnJvclR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgSGFuZGxlckVycm9yfSwgZGVmaW5lZCBhY2NvcmRpbmcgdG8gdGhlIE5leHVzIHNwZWNpZmljYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyRXJyb3JUeXBlID0gKHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlKVtrZXlvZiB0eXBlb2YgSGFuZGxlckVycm9yVHlwZV07XG5leHBvcnQgY29uc3QgSGFuZGxlckVycm9yVHlwZSA9IHtcbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0eXBlIGlzIHVua25vd24uXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBVTktOT1dOOiBcIlVOS05PV05cIixcblxuICAvKipcbiAgICogVGhlIGhhbmRsZXIgY2Fubm90IG9yIHdpbGwgbm90IHByb2Nlc3MgdGhlIHJlcXVlc3QgZHVlIHRvIGFuIGFwcGFyZW50IGNsaWVudCBlcnJvci5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBCQURfUkVRVUVTVDogXCJCQURfUkVRVUVTVFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50IGRpZCBub3Qgc3VwcGx5IHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIRU5USUNBVEVEOiBcIlVOQVVUSEVOVElDQVRFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBleGVjdXRlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIFVOQVVUSE9SSVpFRDogXCJVTkFVVEhPUklaRURcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQgYnV0IG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIE5PVF9GT1VORDogXCJOT1RfRk9VTkRcIixcblxuICAvKipcbiAgICogUmV0dXJuZWQgYnkgdGhlIHNlcnZlciB3aGVuIGl0IGhhcyBnaXZlbiB1cCBoYW5kbGluZyBhIHJlcXVlc3QuIFRoaXMgbWF5IG9jY3VyIGJ5IGVuZm9yY2luZ1xuICAgKiBhIGNsaWVudCBwcm92aWRlZCBgUmVxdWVzdC1UaW1lb3V0YCBvciBmb3IgYW55IGFyYml0cmFyeSByZWFzb24gc3VjaCBhcyBlbmZvcmNpbmcgc29tZVxuICAgKiBjb25maWd1cmFibGUgbGltaXQuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVFVRVNUX1RJTUVPVVQ6IFwiUkVRVUVTVF9USU1FT1VUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBtYWRlIGR1ZSB0byBhIGNvbmZsaWN0LiBUaGlzIG1heSBoYXBwZW4gd2hlbiB0cnlpbmcgdG8gY3JlYXRlIGFuXG4gICAqIG9wZXJhdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBDT05GTElDVDogXCJDT05GTElDVFwiLFxuXG4gIC8qKlxuICAgKiBTb21lIHJlc291cmNlIGhhcyBiZWVuIGV4aGF1c3RlZCwgcGVyaGFwcyBhIHBlci11c2VyIHF1b3RhLCBvciBwZXJoYXBzIHRoZSBlbnRpcmUgZmlsZSBzeXN0ZW1cbiAgICogaXMgb3V0IG9mIHNwYWNlLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgUkVTT1VSQ0VfRVhIQVVTVEVEOiBcIlJFU09VUkNFX0VYSEFVU1RFRFwiLFxuXG4gIC8qKlxuICAgKiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIElOVEVSTkFMOiBcIklOVEVSTkFMXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZWl0aGVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcmVxdWVzdCBtZXRob2QsIG9yIGl0IGxhY2tzIHRoZSBhYmlsaXR5IHRvIGZ1bGZpbGwgdGhlXG4gICAqIHJlcXVlc3QuIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgTk9UX0lNUExFTUVOVEVEOiBcIk5PVF9JTVBMRU1FTlRFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBVTkFWQUlMQUJMRTogXCJVTkFWQUlMQUJMRVwiLFxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGdhdGV3YXlzIHRvIHJlcG9ydCB0aGF0IGEgcmVxdWVzdCB0byBhbiB1cHN0cmVhbSBzZXJ2ZXIgaGFzIHRpbWVkIG91dC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVQU1RSRUFNX1RJTUVPVVQ6IFwiVVBTVFJFQU1fVElNRU9VVFwiLFxufSBhcyBjb25zdDtcbiIsImV4cG9ydCB7IHR5cGUgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcbmV4cG9ydCB7IEhhbmRsZXJFcnJvciwgSGFuZGxlckVycm9yVHlwZSwgdHlwZSBIYW5kbGVyRXJyb3JPcHRpb25zIH0gZnJvbSBcIi4vaGFuZGxlci1lcnJvclwiO1xuZXhwb3J0IHsgdHlwZSBMaW5rIH0gZnJvbSBcIi4vbGlua1wiO1xuZXhwb3J0IHtcbiAgT3BlcmF0aW9uRXJyb3IsXG4gIHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSxcbiAgdHlwZSBPcGVyYXRpb25FcnJvck9wdGlvbnMsXG59IGZyb20gXCIuL29wZXJhdGlvbi1lcnJvclwiO1xuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBvcGVyYXRpb24gZXJyb3IuXG4gKlxuICogVGhpcyBlcnJvciBjbGFzcyByZXByZXNlbnRzIHRoZSBhYm5vcm1hbCBjb21wbGV0aW9uIG9mIGEgTmV4dXMgb3BlcmF0aW9uLFxuICogdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBhcyBhbiBvcGVyYXRpb24gZXJyb3IuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogICAgIGltcG9ydCB7IE9wZXJhdGlvbkVycm9yIH0gZnJvbSBcIm5leHVzLXJwY1wiO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJmYWlsZWRcIiwgXCJOb3QgZW5vdWdoIGludmVudG9yeVwiKTtcbiAqXG4gKiAgICAgLy8gVGhyb3cgYSBmYWlsZWQgb3BlcmF0aW9uIGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uRXJyb3IoXCJmYWlsZWRcIiwgXCJOb3QgZW5vdWdoIGludmVudG9yeVwiLCB7IGNhdXNlIH0pO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGNhbmNlbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImNhbmNlbGVkXCIsIFwiVXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uXCIpO1xuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBTdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlOiBPcGVyYXRpb25FcnJvclN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgdGhhdCByZXN1bHRlZCBpbiB0aGlzIG9wZXJhdGlvbiBlcnJvci5cbiAgICovXG4gIGRlY2xhcmUgcHVibGljIHJlYWRvbmx5IGNhdXNlOiBFcnJvcjtcblxuICAvKipcbiAgICogU2V0IGlmIHRoaXMgZXJyb3Igd2FzIGNvbnN0cnVjdGVkIGZyb20gYSB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0LlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGZhaWx1cmUgZm9yIHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE9wZXJhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlIC0gVGhlIHN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgZS5nLiB0aGUgY2F1c2UuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXRlOiBPcGVyYXRpb25FcnJvclN0YXRlLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBzdGF0ZSA9PT0gXCJjYW5jZWxlZFwiID8gYE9wZXJhdGlvbiBjYW5jZWxlZGAgOiBgT3BlcmF0aW9uIGZhaWxlZGA7XG4gICAgY29uc3QgYWN0dWFsTWVzc2FnZSA9IG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2U7XG5cbiAgICBzdXBlcihhY3R1YWxNZXNzYWdlLCB7IGNhdXNlOiBvcHRpb25zPy5jYXVzZSB9KTtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vcmlnaW5hbEZhaWx1cmUgPSBvcHRpb25zPy5vcmlnaW5hbEZhaWx1cmU7XG4gICAgaWYgKG9wdGlvbnM/LnN0YWNrVHJhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFjayA9IG9wdGlvbnMuc3RhY2tUcmFjZTtcbiAgICB9XG4gIH1cbn1cblxuaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mKE9wZXJhdGlvbkVycm9yLCBcIk9wZXJhdGlvbkVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25FcnJvck9wdGlvbnMge1xuICAvKipcbiAgICogVW5kZXJseWluZyBjYXVzZSBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICBjYXVzZT86IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBzdGFjayB0cmFjZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgYHN0YWNrYCBwcm9wZXJ0eSBvbiB0aGUgZXJyb3IuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlbW90ZSBzdGFjayB0cmFjZXMgcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZSxcbiAgICogd2hpY2ggbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IGxhbmd1YWdlIHJ1bnRpbWUuXG4gICAqL1xuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZX0gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBvcmlnaW5hbEZhaWx1cmU/OiBGYWlsdXJlO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBzdGF0ZSBvZiBhbiBvcGVyYXRpb24gdGhhdCBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAaW5saW5lXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkVycm9yU3RhdGUgPSBcImZhaWxlZFwiIHwgXCJjYW5jZWxlZFwiO1xuIiwiZXhwb3J0IHtcbiAgdHlwZSBPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIFN0YXJ0T3BlcmF0aW9uQ29udGV4dCxcbiAgdHlwZSBDYW5jZWxPcGVyYXRpb25Db250ZXh0LFxufSBmcm9tIFwiLi9vcGVyYXRpb24tY29udGV4dFwiO1xuXG5leHBvcnQge1xuICBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQsXG4gIHR5cGUgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYyxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYyxcbn0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuXG5leHBvcnQge1xuICAvL1xuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXIsXG4gIHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbmV4cG9ydCB7XG4gIFNlcnZpY2VIYW5kbGVyLFxuICBzZXJ2aWNlSGFuZGxlcixcbiAgdHlwZSBPcGVyYXRpb25IYW5kbGVyRm9yLFxuICB0eXBlIFNlcnZpY2VIYW5kbGVyRm9yLFxufSBmcm9tIFwiLi9zZXJ2aWNlLWhhbmRsZXJcIjtcbiIsImltcG9ydCB7IEhhbmRsZXJFcnJvciB9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHRcIjtcbmltcG9ydCB7IENhbmNlbE9wZXJhdGlvbkNvbnRleHQsIFN0YXJ0T3BlcmF0aW9uQ29udGV4dCB9IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBPcGVyYXRpb25EZWZpbml0aW9uLFxuICBPcGVyYXRpb25JbnB1dCxcbiAgT3BlcmF0aW9uS2V5LFxuICBPcGVyYXRpb25NYXAsXG4gIE9wZXJhdGlvbk91dHB1dCxcbn0gZnJvbSBcIi4uL3NlcnZpY2VcIjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIGEgTmV4dXMgb3BlcmF0aW9uLlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IE5leHVzIHNlcnZpY2UgaW1wbGVtZW50b3JzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHtcbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBzdGFydCBhbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIFJldHVybiB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luY30gdG8gcmVzcG9uZCBzdWNjZXNzZnVsbHkgaW5saW5lLCBvclxuICAgKiB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmN9IHRvIGluZGljYXRlIHRoYXQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3YXMgc3RhcnRlZC5cbiAgICogVGhyb3cgYW4ge0BsaW5rIE9wZXJhdGlvbkVycm9yfSB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgYXMgZmFpbGVkIG9yIGNhbmNlbGVkLlxuICAgKi9cbiAgc3RhcnQoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKTogUHJvbWlzZTxIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQ8Tz4+O1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVxdWVzdHMgdG8gY2FuY2VsIGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uXG4gICAqXG4gICAqIENhbmNlbGF0aW9uIG9mIGEgTmV4dXMgb3BlcmF0aW9uIGlzOlxuICAgKiAxLiBfYXN5bmNocm9ub3VzXyAtIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kIG9ubHkgY29uZmlybXMgdGhhdCBjYW5jZWxhdGlvbiB3YXMgbm90aWZpZWQ7XG4gICAqICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgaG93ZXZlciBjaG9vc2UgdG8gcHJvY2VzcyB0aGUgY2FuY2VsbGF0aW9uIGF0IGEgbGF0ZXIgdGltZSwgb3IgdG9cbiAgICogICAgaWdub3JlIGl0IGVudGlyZWx5LlxuICAgKiAyLiBfaWRlbXBvdGVudF8gLSBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpZ25vcmUgZHVwbGljYXRlIGNhbmNlbGF0aW9ucyBmb3IgdGhlIHNhbWUgb3BlcmF0aW9uLlxuICAgKi9cbiAgY2FuY2VsKGN0eDogQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBzaG9ydGN1dCBmb3IgZGVmaW5pbmcgYW4gb3BlcmF0aW9uIGhhbmRsZXIgdGhhdCBvbmx5IGltcGxlbWVudHMgdGhlIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLnN0YXJ0fVxuICogbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJucyBhIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gKGN0eDogU3RhcnRPcGVyYXRpb25Db250ZXh0LCBpbnB1dDogSSkgPT4gUHJvbWlzZTxPPjtcblxuLyoqXG4gKiBDb21waWxlcyBhbiBvcGVyYXRpb24gaGFuZGxlciBpbnRvIGEge0BsaW5rIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcn0uIEEgY29tcGlsZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGlzIGEgc2luZ2xlIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb3BlcmF0aW9uIGRlZmluaXRpb24gYW5kIGEgZnVsbC1mbGVkZ2VkIG9wZXJhdGlvblxuICogaGFuZGxlciBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlT3BlcmF0aW9uSGFuZGxlcjxJLCBPPihcbiAgZGVmaW5pdGlvbjogT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPixcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgdW5kZWZpbmVkLFxuKTogQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+IHtcbiAgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgTm8gaGFuZGxlciByZWdpc3RlcmVkIGZvciBvcGVyYXRpb24gJyR7ZGVmaW5pdGlvbi5uYW1lfScgKGV4cGVjdGVkIHByb3BlcnR5IG5hbWUgJyR7ZGVmaW5pdGlvbi5uYW1lfScpYCxcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBPcGVyYXRpb24gaGFuZGxlciBpcyBkZWNsYXJlZCB1c2luZyB0aGUgc2hvcnRjdXQgc3ludGF4LiBXcmFwIGl0IGludG8gYSBmdWxsLWZsZWRnZWQgaGFuZGxlci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmaW5pdGlvbixcblxuICAgICAgc3RhcnQ6IGFzeW5jIChjdHgsIGlucHV0KSA9PiB7XG4gICAgICAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luYyhhd2FpdCBoYW5kbGVyKGN0eCwgaW5wdXQpKTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWw6IG5vdEltcGxlbWVudGVkLFxuICAgIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIuc3RhcnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEhhbmRsZXIgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyBoYXMgbm8gc3RhcnQgbWV0aG9kYCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmRlZmluaXRpb24sXG5cbiAgICAvLyBEZWZlbnNpdmVseSBlbnN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYWxsIHRoZSByZXF1aXJlZCBtZXRob2RzLFxuICAgIC8vIGRlZmF1bHRpbmcgdG8gdGhyb3dpbmcgYSBub3QgaW1wbGVtZW50ZWQgZXJyb3IgaWYgc29tZSBtZXRob2RzIGFyZSBtaXNzaW5nLlxuICAgIHN0YXJ0OiBoYW5kbGVyLnN0YXJ0LmJpbmQoaGFuZGxlciksXG4gICAgY2FuY2VsOiBoYW5kbGVyLmNhbmNlbD8uYmluZChoYW5kbGVyKSA/PyBub3RJbXBsZW1lbnRlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGNvbXBpbGVkIG9wZXJhdGlvbiBoYW5kbGVyIGlzIGEgc2luZ2xlIG9iamVjdCB0aGF0IGlzIGJvdGggYW4gb3BlcmF0aW9uIGRlZmluaXRpb24gYW5kIGFcbiAqIGZ1bGwtZmxlZGdlZCBvcGVyYXRpb24gaGFuZGxlciBmb3IgdGhhdCBvcGVyYXRpb24uXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiA9IE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz4gJiBPcGVyYXRpb25IYW5kbGVyPEksIE8+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPiA9IENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlcjxcbiAgT3BlcmF0aW9uSW5wdXQ8T3BzW09wZXJhdGlvbktleTxPcHM+XT4sXG4gIE9wZXJhdGlvbk91dHB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPlxuPjtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbm90SW1wbGVtZW50ZWQoKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiTk9UX0lNUExFTUVOVEVEXCIsIFwiTm90IGltcGxlbWVudGVkXCIpO1xufVxuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uRGVmaW5pdGlvbiwgT3BlcmF0aW9uS2V5LCBPcGVyYXRpb25NYXAsIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4uL3NlcnZpY2VcIjtcbmltcG9ydCB7XG4gIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcixcbiAgY29tcGlsZU9wZXJhdGlvbkhhbmRsZXIsXG4gIE9wZXJhdGlvbkhhbmRsZXIsXG4gIFN5bmNPcGVyYXRpb25IYW5kbGVyLFxufSBmcm9tIFwiLi9vcGVyYXRpb24taGFuZGxlclwiO1xuXG4vKipcbiAqIEEgTmV4dXMgU2VydmljZSBpbXBsZW1lbnRhdGlvbiwgdGhhdCBwcm92aWRlcyBoYW5kbGVycyBmb3IgZWFjaCBvZiBpdHMgb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+IHtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgYFNlcnZpY2VIYW5kbGVyYCBmcm9tIGEgc2VydmljZSBkZWZpbml0aW9uIGFuZCBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9uIGhhbmRsZXJzLlxuICAgKlxuICAgKiBUaGVyZSBtdXN0IGJlIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBldmVyeSBvcGVyYXRpb24gaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnNcbiAgICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgaGFuZGxlclxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQGhpZGRlblxuICAgKi9cbiAgc3RhdGljIGJ1aWxkPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcD4oXG4gICAgc2VydmljZTogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgKTogU2VydmljZUhhbmRsZXI8T3BzPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IG5ldyBNYXA8T3BlcmF0aW9uS2V5PE9wcz4sIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHM+PigpO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGRlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2Uub3BlcmF0aW9ucykpIHtcbiAgICAgIGNvbnN0IGNvbXBpbGVkT3BIYW5kbGVyID0gY29tcGlsZU9wZXJhdGlvbkhhbmRsZXIoZGVmaW5pdGlvbiwgaGFuZGxlcnNbcHJvcE5hbWVdKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBjb21waWxlZE9wSGFuZGxlci5uYW1lIGFzIE9wZXJhdGlvbktleTxPcHM+O1xuXG4gICAgICBpZiAob3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgT3BlcmF0aW9uIHdpdGggbmFtZSAnJHtvcGVyYXRpb25OYW1lfScgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBzZXJ2aWNlICcke3NlcnZpY2UubmFtZX0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5zZXQob3BlcmF0aW9uTmFtZSwgY29tcGlsZWRPcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2VydmljZUhhbmRsZXIoc2VydmljZSwgaGFuZGxlcnMsIG9wZXJhdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVmaW5pdGlvbjogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGFuZGxlcnM6IFNlcnZpY2VIYW5kbGVyRm9yPE9wcz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25zTWFwOiBNYXA8T3BlcmF0aW9uS2V5PE9wcz4sIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHM+PixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZpbml0aW9uIGFuZCBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRPcGVyYXRpb25IYW5kbGVyPEsgZXh0ZW5kcyBPcGVyYXRpb25LZXk8T3BzPj4oXG4gICAgb3BlcmF0aW9uTmFtZTogSyxcbiAgKTogQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5vcGVyYXRpb25zTWFwLmdldChvcGVyYXRpb25OYW1lKTtcbiAgICBpZiAoZW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcbiAgICAgICAgXCJOT1RfRk9VTkRcIixcbiAgICAgICAgYE9wZXJhdGlvbiBoYW5kbGVyIG5vdCByZWdpc3RlcmVkIGZvciBvcGVyYXRpb24gJyR7b3BlcmF0aW9uTmFtZX0nIGluIHNlcnZpY2UgJyR7dGhpcy5kZWZpbml0aW9uLm5hbWV9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgc2VydmljZSBoYW5kbGVyIGZvciBhIGdpdmVuIHNlcnZpY2UgY29udHJhY3QuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUhhbmRsZXI8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgc2VydmljZTogU2VydmljZURlZmluaXRpb248T3BzPixcbiAgaGFuZGxlcnM6IFNlcnZpY2VIYW5kbGVyRm9yPE9wcz4sXG4pOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgcmV0dXJuIFNlcnZpY2VIYW5kbGVyLmJ1aWxkKHNlcnZpY2UsIGhhbmRsZXJzKTtcbn1cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgaGFuZGxlciBmb3IgYSBnaXZlbiBvcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25IYW5kbGVyRm9yPFQ+ID1cbiAgVCBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCBTeW5jT3BlcmF0aW9uSGFuZGxlcjxJLCBPPlxuICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaW50ZXJmYWNlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFNlcnZpY2VIYW5kbGVyRm9yPFQgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogT3BlcmF0aW9uSGFuZGxlckZvcjxUW0tdPjtcbn07XG4iLCIvKiogQGltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9vcGVyYXRpb24taGFuZGxlclwiICovXG5cbi8qKlxuICogQW4gaW50ZXJuYWwgc3ltYm9sLCB1c2VkIHRvIHByZXZlbnQgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZXMuXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sID0gU3ltYm9sKFwiX19uZXh1c19pc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFwiKTtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQ8VCA9IHVua25vd24+ID1cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+XG4gIHwgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmM7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIGZyb20gdGhlIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLnN0YXJ0fSBtZXRob2QuXG4gKlxuICogVXNlIGVpdGhlciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IG9yIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmN9XG4gKiB0byBjcmVhdGUgYSByZXN1bHQgb2JqZWN0LiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNvbnN0IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAgICovXG4gIGFzeW5jKHRva2VuOiBzdHJpbmcpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXN5bmM6IHRydWUsXG4gICAgICB0b2tlbixcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzeW5jPFQ+KHZhbHVlOiBUKTogSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYzxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXN5bmM6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgICBbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdOiB0cnVlLFxuICAgIH07XG4gIH0sXG5cbiAgW1N5bWJvbC5oYXNJbnN0YW5jZV06IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgKHZhbHVlIGFzIGFueSlbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdID09PSB0cnVlXG4gICAgKTtcbiAgfSxcbn07XG5cbi8qKlxuICogQSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSB0byBjcmVhdGUgYSBzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luYyg0Mik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3luYzxUID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgdmFsdWU6IFQ7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG5cbi8qKlxuICogQSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gaGFzIGJlZW4gYWNjZXB0ZWQgYW5kIHdpbGwgY29tcGxldGUgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogVXNlIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmN9IHRvIGNyZWF0ZSBhbiBhc3luYyByZXN1bHQgb2JqZWN0LlxuICogRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogICByZXR1cm4gSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jKFwidW5pcXVlIHRva2VuXCIpO1xuICogYGBgXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgLyoqXG4gICAqIEluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseSAoZmFsc2UpIG9yIHdpbGwgY29tcGxldGVcbiAgICogYXN5bmNocm9ub3VzbHkgKHRydWUpLlxuICAgKi9cbiAgaXNBc3luYzogdHJ1ZTtcblxuICAvKipcbiAgICogQSB0b2tlbiB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGluIGZvbGxvd3VwIGhhbmRsZXIgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLmdldFJlc3VsdH1cbiAgICogYW5kIHtAbGluayBPcGVyYXRpb25IYW5kbGVyLmNhbmNlbH0uXG4gICAqL1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBbaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2xdOiB0cnVlO1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9oYW5kbGVyXCI7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IG1hcHBpbmcgYWxsIHN0cmluZyBwcm9wZXJ0aWVzIChrZXlzIGFuZCB2YWx1ZXMpIG9mIGFuIGV4aXN0aW5nIG9iamVjdFxuICogdGhyb3VnaCBhIG1hcHBlciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHNvdXJjZSBvYmplY3QsIHdob3NlIHByb3BlcnRpZXMgd2lsbCBiZSBtYXBwZWQuXG4gKiBAcGFyYW0gZm4gLSBUaGUgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIG1hcHBlZCB0byB0aGUgbmV3IHR5cGUuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBLZXlWYWx1ZXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFU+KFxuICBvYmo6IFQsXG4gIGZuOiAoa2V5OiBrZXlvZiBUICYgc3RyaW5nLCB2YWx1ZTogVFtrZXlvZiBUICYgc3RyaW5nXSkgPT4gVSxcbik6IFJlY29yZDxrZXlvZiBULCBVPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgZm4oa2V5LCB2YWx1ZSldKSxcbiAgKSBhcyBSZWNvcmQ8a2V5b2YgVCwgVT47XG59XG4iLCIvKipcbiAqIEluamVjdCBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBvbiB0aGUgZ2l2ZW4gY2xhc3MsIHRoYXQgd29ya3MgY29ycmVjdGx5IGFjcm9zcyBleGVjdXRpb24gY29udGV4dHMuXG4gKlxuICogIyMjIERldGFpbHMgIyMjXG4gKlxuICogQWNjb3JkaW5nIHRvIHRoZSBFY21hU2NyaXB0J3Mgc3BlYywgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgSmF2YVNjcmlwdCdzIGB4IGluc3RhbmNlb2YgWWAgb3BlcmF0b3IgaXMgdG8gd2FsayB1cCB0aGVcbiAqIHByb3RvdHlwZSBjaGFpbiBvZiBvYmplY3QgJ3gnLCBjaGVja2luZyBpZiBhbnkgY29uc3RydWN0b3IgaW4gdGhhdCBoaWVyYXJjaHkgaXMgX2V4YWN0bHkgdGhlIHNhbWUgb2JqZWN0XyBhcyB0aGVcbiAqIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICdZJy5cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCBpdCBoYXBwZW5zIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGF0IGRpZmZlcmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBvYmplY3RzIGdldCBjcmVhdGVkIGZvciB3aGF0XG4gKiBhcHBlYXJzIHRvIGJlIHRoZSB2ZXJ5IHNhbWUgY2xhc3MuIFRoaXMgbGVhZHMgdG8gc3VycHJpc2luZyBiZWhhdmlvciB3aGVyZSBgaW5zdGFuY2VvZmAgcmV0dXJucyBmYWxzZSB0aG91Z2ggaXQgaXNcbiAqIGtub3duIHRoYXQgdGhlIG9iamVjdCBpcyBpbmRlZWQgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4gT25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgd2hlbiBjb25zdHJ1Y3RvclxuICogJ1knIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGUgY29uc3R1Y3RvciB3aXRoIHdoaWNoICd4JyB3YXMgaW5zdGFudGlhdGVkLiBBbm90aGVyIGNhc2UgaXMgd2hlbiB0d28gY29waWVzXG4gKiBvZiB0aGUgc2FtZSBsaWJyYXJ5IGdldHMgbG9hZGVkIGluIHRoZSBzYW1lIHJlYWxtLlxuICpcbiAqIEluIHByYWN0aWNlLCB0aGlzIHRlbmRzIHRvIGNhdXNlIGlzc3VlcyB3aGVuIGNyb3NzaW5nIHRoZSB3b3JrZmxvdy1zYW5kYm94aW5nIGJvdW5kYXJ5IChzaW5jZSBOb2RlJ3Mgdm0gbW9kdWxlXG4gKiByZWFsbHkgY3JlYXRlcyBuZXcgZXhlY3V0aW9uIHJlYWxtcyksIGFzIHdlbGwgYXMgd2hlbiBydW5uaW5nIHRlc3RzIHVzaW5nIEplc3QgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vamVzdGpzL2plc3QvaXNzdWVzLzI1NDlcbiAqIGZvciBzb21lIGRldGFpbHMgb24gdGhhdCBvbmUpLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaW5qZWN0cyBhIGN1c3RvbSAnaW5zdGFuY2VvZicgaGFuZGxlciBpbnRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6Jywgd2hpY2ggaXMgYm90aCBjcm9zcy1yZWFsbSBzYWZlIGFuZFxuICogY3Jvc3MtY29waWVzLW9mLXRoZS1zYW1lLWxpYiBzYWZlLiBJdCB3b3JrcyBieSBhZGRpbmcgYSBzcGVjaWFsIHN5bWJvbCBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIGFuZCB0aGVuXG4gKiBjaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIHRoYXQgc3ltYm9sLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mPEU+KGNsYXp6OiBDbGFzczxFPiwgbWFya2VyTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIEl0IG1heSBzZWVtIHJlZHVuZGFudCB0byBoYXZlIGFuIGV4cGxpY2l0IG1hcmtlck5hbWUgYXJndW1lbnQgaGVyZS4gQ2FuJ3Qgd2Ugc2ltcGx5IHVzZSB0aGUgY2xhc3NcbiAgLy8gZnVuY3Rpb24gbmFtZSBmb3IgdGhhdD8gVW5mb3J0dW5hdGVseSwgbm8sIGFzIHRoZSBjbGFzcyBuYW1lIG1heSBnZXQgbWFuZ2xlZCBpZiB0aGUgZmlsZSBnZXRzIG1pbmlmaWVkLlxuICBjb25zdCBtYXJrZXIgPSBTeW1ib2wuZm9yKGBfX25leHVzX2lzJHttYXJrZXJOYW1lfWApO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIFwibmFtZVwiLCB7IHZhbHVlOiBtYXJrZXJOYW1lLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCBtYXJrZXIsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCB2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICBpZiAodGhpcyA9PT0gY2xhenopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgYW55KVttYXJrZXJdID09PSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gJ3RoaXMnIG11c3QgYmUgYSBfc3ViY2xhc3NfIG9mIGNsYXp6IHRoYXQgZG9lc24ndCByZWRlZmluZWQgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIHNvIHRoYXQgaXQgaW5oZXJpdGVkXG4gICAgICAgIC8vIGZyb20gY2xhenoncyBbU3ltYm9sLmhhc0luc3RhbmNlXS4gSWYgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgcGFydGljdWxhciBzaXR1YXRpb24sIHRoZW5cbiAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZGVhbGx5LCBpdCdkIGJlIHByZWZlcmFibGUgdG8gYXZvaWQgdGhpcyBjYXNlIGVudGlyZWx5LCBieSBtYWtpbmcgc3VyZSB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mICdjbGF6eidcbiAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgIC8vIGJlaGF2aW9yICh3aGljaCBpcyBOT1QgY3Jvc3MtcmVhbG0gc2FmZSkuXG4gICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHZhbHVlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgY2xhc3MuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3M8RT4ge1xuICBuZXcgKC4uLmFyZ3M6IGFueVtdKTogRTtcbiAgcHJvdG90eXBlOiBFO1xufVxuIiwiaW1wb3J0IHsgbWFwS2V5VmFsdWVzIH0gZnJvbSBcIi4uL2ludGVybmFsL29iamVjdC11dGlsc1wiO1xuaW1wb3J0IHsgU2ltcGxpZnkgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdHlwZXNcIjtcbmltcG9ydCB7IGlucHV0QnJhbmQsIG91dHB1dEJyYW5kLCB2YWxpZGF0ZVNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBTZXJ2aWNlRGVmaW5pdGlvbiB9IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIHNlcnZpY2UgZGVmaW5pdGlvbiBmb3IgYSBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZTxPcHMgZXh0ZW5kcyBQYXJ0aWFsT3BlcmF0aW9uTWFwPihcbiAgbmFtZTogc3RyaW5nLFxuICBvcGVyYXRpb25zOiBPcHMsXG4pOiBTZXJ2aWNlRGVmaW5pdGlvbjxTaW1wbGlmeTxPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxPcHM+Pj4ge1xuICBjb25zdCBzZXJ2aWNlID0ge1xuICAgIG5hbWUsXG4gICAgb3BlcmF0aW9uczogbWFwS2V5VmFsdWVzKG9wZXJhdGlvbnMsIChrZXksIG9wOiBQYXJ0aWFsT3BlcmF0aW9uPGFueSwgYW55PikgPT4gKHtcbiAgICAgIC4uLm9wLFxuICAgICAgbmFtZTogb3AubmFtZSB8fCBrZXksXG4gICAgfSkpLFxuICB9IGFzIFNlcnZpY2VEZWZpbml0aW9uPE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+O1xuXG4gIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZSk7XG4gIHJldHVybiBzZXJ2aWNlO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhcyBwYXJ0IG9mIGEgc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb248SSwgTz4ob3A/OiBPcGVyYXRpb25PcHRpb25zPEksIE8+KTogUGFydGlhbE9wZXJhdGlvbjxJLCBPPiB7XG4gIHJldHVybiB7IC4uLm9wIH0gYXMgUGFydGlhbE9wZXJhdGlvbjxJLCBPPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIG9wZXJhdGlvbn0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbk9wdGlvbnM8X0ksIF9PPiB7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBuYW1lZCBjb2xsZWN0aW9uIG9mIHBhcnRpYWwgb3BlcmF0aW9uIGhhbmRsZXJzLiBJbnB1dCBmb3IgdGhlIHtAbGluayBzZXJ2aWNlfSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnRpYWxPcGVyYXRpb25NYXAgPSBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsT3BlcmF0aW9uPGFueSwgYW55Pj47XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgdHJhbnNmb3JtcyBhIHtAbGluayBQYXJ0aWFsT3BlcmF0aW9uTWFwfSBpbnRvIGFuIHtAbGluayBPcGVyYXRpb25NYXB9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8VCBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb248aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz5cbiAgICA6IG5ldmVyO1xufTtcblxuLyoqXG4gKiBBIHBhcnRpYWwge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgYW4gb3BlcmF0aW9uIGluIGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHtAbGluayBPcGVyYXRpb25EZWZpbml0aW9ufSBpcyB0aGF0IHRoZSBuYW1lIGlzIG9wdGlvbmFsLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgbmFtZT86IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuIiwiZXhwb3J0IHtcbiAgdHlwZSBTZXJ2aWNlRGVmaW5pdGlvbixcbiAgdHlwZSBPcGVyYXRpb25EZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbk1hcCxcbiAgdHlwZSBPcGVyYXRpb25JbnB1dCxcbiAgdHlwZSBPcGVyYXRpb25PdXRwdXQsXG4gIHR5cGUgT3BlcmF0aW9uS2V5LFxufSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcblxuZXhwb3J0IHtcbiAgc2VydmljZSxcbiAgb3BlcmF0aW9uLFxuICB0eXBlIE9wZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCxcbiAgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbCxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uLFxufSBmcm9tIFwiLi9oZWxwZXJzXCI7XG4iLCJleHBvcnQgZGVjbGFyZSBjb25zdCBpbnB1dEJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IGRlY2xhcmUgY29uc3Qgb3V0cHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIE5leHVzIHNlcnZpY2UgY29udHJhY3QsIGluY2x1ZGluZyBpdHMgbmFtZSBhbmQgb3BlcmF0aW9ucy5cbiAqXG4gKiBDYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBieSB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlRGVmaW5pdGlvbjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXAgPSBPcGVyYXRpb25NYXA+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvcGVyYXRpb25zOiBPcHM7XG59XG5cbi8qKlxuICogQW4gb3BlcmF0aW9uIGNvbnRyYWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBuYW1lLCBhbmQgaW5wdXQgYW5kIG91dHB1dCB0eXBlcyBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkRlZmluaXRpb248SSwgTz4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIFtpbnB1dEJyYW5kXTogSTtcbiAgW291dHB1dEJyYW5kXTogTztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucywgYXMgZGVmaW5lZCBieSBhIHtAbGluayBTZXJ2aWNlRGVmaW5pdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXAgPSBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgYW55Pj47XG5cbi8qKlxuICogQSBtYXBwZWQgdHlwZSB0aGF0IGV4dHJhY3RzIHRoZSBpbnB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbklucHV0PFQ+ID0gVCBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248aW5mZXIgSSwgYW55PiA/IEkgOiBhbnk7XG5cbi8qKlxuICogQSBtYXBwZWQgdHlwZSB0aGF0IGV4dHJhY3RzIHRoZSBvdXRwdXQgdHlwZSBmcm9tIGFuIG9wZXJhdGlvbiBpbiBhIHNlcnZpY2UuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25PdXRwdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxhbnksIGluZmVyIE8+ID8gTyA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgYWxsIG9wZXJhdGlvbiBuYW1lcyBmcm9tIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbktleTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IFRbS10gZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgYW55PiA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogQ29uZmlybSB0aGF0IGEgc2VydmljZSBkZWZpbml0aW9uIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIHNlcnZpY2UgZGVmaW5pdGlvbiB0byB2YWxpZGF0ZS5cbiAqXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgaW52YWxpZC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNlcnZpY2VEZWZpbml0aW9uKHNlcnZpY2U6IFNlcnZpY2VEZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2Ygc2VydmljZS5uYW1lICE9PSBcInN0cmluZ1wiIHx8ICFzZXJ2aWNlLm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VydmljZSBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbcHJvcE5hbWUsIG9wZXJhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24ubmFtZTtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbk5hbWUgIT09IFwic3RyaW5nXCIgfHwgIW9wZXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9wZXJhdGlvbiBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLCBmb3IgcHJvcGVydHkgJyR7cHJvcE5hbWV9J2ApO1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9uTmFtZXMuaGFzKG9wZXJhdGlvbk5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBEdXBsaWNhdGUgb3BlcmF0aW9uIGRlZmluaXRpb24gZm9yIG5hbWU6ICcke29wZXJhdGlvbk5hbWV9J2ApO1xuICAgIH1cbiAgICBvcGVyYXRpb25OYW1lcy5hZGQob3BlcmF0aW9uTmFtZSk7XG4gIH1cbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIi8vIEhlbHBlcnMuXG5jb25zdCBzID0gMTAwMDtcbmNvbnN0IG0gPSBzICogNjA7XG5jb25zdCBoID0gbSAqIDYwO1xuY29uc3QgZCA9IGggKiAyNDtcbmNvbnN0IHcgPSBkICogNztcbmNvbnN0IHkgPSBkICogMzY1LjI1O1xuZnVuY3Rpb24gbXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucz8ubG9uZyA/IGZtdExvbmcodmFsdWUpIDogZm10U2hvcnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG51bWJlci4nKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpc0Vycm9yKGVycm9yKVxuICAgICAgICAgICAgPyBgJHtlcnJvci5tZXNzYWdlfS4gdmFsdWU9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgICAgICAgOiAnQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC4nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gICAgY29uc3QgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB1bml0ICR7dHlwZX0gd2FzIG1hdGNoZWQsIGJ1dCBubyBtYXRjaGluZyBjYXNlIGV4aXN0cy5gKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBtcztcbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gZCl9ZGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gaCl9aGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbSl9bWA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gcyl9c2A7XG4gICAgfVxuICAgIHJldHVybiBgJHttc31tc2A7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBgJHttc30gbXNgO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICAgIGNvbnN0IGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG4pfSAke25hbWV9JHtpc1BsdXJhbCA/ICdzJyA6ICcnfWA7XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgZXJyb3JzLlxuICovXG5mdW5jdGlvbiBpc0Vycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ21lc3NhZ2UnIGluIGVycm9yO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMDkgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzXG4gKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgV2lydHogLyBUaGUgbG9uZy5qcyBBdXRob3JzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8vIFdlYkFzc2VtYmx5IG9wdGltaXphdGlvbnMgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXG52YXIgd2FzbSA9IG51bGw7XG50cnkge1xuICB3YXNtID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKFxuICAgIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoXG4gICAgICBuZXcgVWludDhBcnJheShbXG4gICAgICAgIC8vIFxcMGFzbVxuICAgICAgICAwLCA5NywgMTE1LCAxMDksXG4gICAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgICAxLCAwLCAwLCAwLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJ0eXBlXCJcbiAgICAgICAgMSwgMTMsIDIsXG4gICAgICAgIC8vIDAsICgpID0+IGkzMlxuICAgICAgICA5NiwgMCwgMSwgMTI3LFxuICAgICAgICAvLyAxLCAoaTMyLCBpMzIsIGkzMiwgaTMyKSA9PiBpMzJcbiAgICAgICAgOTYsIDQsIDEyNywgMTI3LCAxMjcsIDEyNywgMSwgMTI3LFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJmdW5jdGlvblwiXG4gICAgICAgIDMsIDcsIDYsXG4gICAgICAgIC8vIDAsIHR5cGUgMFxuICAgICAgICAwLFxuICAgICAgICAvLyAxLCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gMiwgdHlwZSAxXG4gICAgICAgIDEsXG4gICAgICAgIC8vIDMsIHR5cGUgMVxuICAgICAgICAxLFxuICAgICAgICAvLyA0LCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gNSwgdHlwZSAxXG4gICAgICAgIDEsXG5cbiAgICAgICAgLy8gc2VjdGlvbiBcImdsb2JhbFwiXG4gICAgICAgIDYsIDYsIDEsXG4gICAgICAgIC8vIDAsIFwiaGlnaFwiLCBtdXRhYmxlIGkzMlxuICAgICAgICAxMjcsIDEsIDY1LCAwLCAxMSxcblxuICAgICAgICAvLyBzZWN0aW9uIFwiZXhwb3J0XCJcbiAgICAgICAgNywgNTAsIDYsXG4gICAgICAgIC8vIDAsIFwibXVsXCJcbiAgICAgICAgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSxcbiAgICAgICAgLy8gMSwgXCJkaXZfc1wiXG4gICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTUsIDAsIDIsXG4gICAgICAgIC8vIDIsIFwiZGl2X3VcIlxuICAgICAgICA1LCAxMDAsIDEwNSwgMTE4LCA5NSwgMTE3LCAwLCAzLFxuICAgICAgICAvLyAzLCBcInJlbV9zXCJcbiAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCxcbiAgICAgICAgLy8gNCwgXCJyZW1fdVwiXG4gICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTcsIDAsIDUsXG4gICAgICAgIC8vIDUsIFwiZ2V0X2hpZ2hcIlxuICAgICAgICA4LCAxMDMsIDEwMSwgMTE2LCA5NSwgMTA0LCAxMDUsIDEwMywgMTA0LCAwLCAwLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJjb2RlXCJcbiAgICAgICAgMTAsIDE5MSwgMSwgNixcbiAgICAgICAgLy8gMCwgXCJnZXRfaGlnaFwiXG4gICAgICAgIDQsIDAsIDM1LCAwLCAxMSxcbiAgICAgICAgLy8gMSwgXCJtdWxcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDIsIFwiZGl2X3NcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjcsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDMsIFwiZGl2X3VcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjgsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDQsIFwicmVtX3NcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICAgIC8vIDUsIFwicmVtX3VcIlxuICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLCAzMixcbiAgICAgICAgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMzAsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCwgMzIsIDQsXG4gICAgICAgIDE2NywgMTEsXG4gICAgICBdKSxcbiAgICApLFxuICAgIHt9LFxuICApLmV4cG9ydHM7XG59IGNhdGNoIHtcbiAgLy8gbm8gd2FzbSBzdXBwb3J0IDooXG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIsIGdpdmVuIGl0cyBsb3cgYW5kIGhpZ2ggMzIgYml0IHZhbHVlcyBhcyAqc2lnbmVkKiBpbnRlZ2Vycy5cbiAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxuICogQGV4cG9ydHMgTG9uZ1xuICogQGNsYXNzIEEgTG9uZyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaCBUaGUgaGlnaCAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gsIHVuc2lnbmVkKSB7XG4gIC8qKlxuICAgKiBUaGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLmxvdyA9IGxvdyB8IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcblxuICAvKipcbiAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XG59XG5cbi8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXG4vLyBXZSB1c2UgMzItYml0IHBpZWNlcyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyBvbiB3aGljaFxuLy8gSmF2YXNjcmlwdCBwZXJmb3JtcyBiaXQtb3BlcmF0aW9ucy4gIEZvciBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kXG4vLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXG4vLyBtdWx0aXBsaWVkIHdpdGhpbiBKYXZhc2NyaXB0J3MgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBvdmVyZmxvd1xuLy8gb3IgY2hhbmdlIGluIHNpZ24uXG4vL1xuLy8gSW4gdGhlIGFsZ29yaXRobXMgYmVsb3csIHdlIGZyZXF1ZW50bHkgcmVkdWNlIHRoZSBuZWdhdGl2ZSBjYXNlIHRvIHRoZVxuLy8gcG9zaXRpdmUgY2FzZSBieSBuZWdhdGluZyB0aGUgaW5wdXQocykgYW5kIHRoZW4gcG9zdC1wcm9jZXNzaW5nIHRoZSByZXN1bHQuXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcbi8vICgtMl42MykgYmVjYXVzZSAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRSAoc2luY2UgMl42MyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXNcbi8vIGEgcG9zaXRpdmUgbnVtYmVyLCBpdCBvdmVyZmxvd3MgYmFjayBpbnRvIGEgbmVnYXRpdmUpLiAgTm90IGhhbmRsaW5nIHRoaXNcbi8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cbi8vXG4vLyBDb21tb24gY29uc3RhbnQgdmFsdWVzIFpFUk8sIE9ORSwgTkVHX09ORSwgZXRjLiBhcmUgZGVmaW5lZCBiZWxvdyB0aGUgZnJvbSpcbi8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXG5cbi8qKlxuICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxuICogQHR5cGUge2Jvb2xlYW59XG4gKiBAY29uc3RcbiAqIEBwcml2YXRlXG4gKi9cbkxvbmcucHJvdG90eXBlLl9faXNMb25nX187XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb25nLnByb3RvdHlwZSwgXCJfX2lzTG9uZ19fXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcbiAgcmV0dXJuIChvYmogJiYgb2JqW1wiX19pc0xvbmdfX1wiXSkgPT09IHRydWU7XG59XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IHZhbHVlIG51bWJlclxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBjdHozMih2YWx1ZSkge1xuICB2YXIgYyA9IE1hdGguY2x6MzIodmFsdWUgJiAtdmFsdWUpO1xuICByZXR1cm4gdmFsdWUgPyAzMSAtIGMgOiBjO1xufVxuXG4vKipcbiAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgTG9uZy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZy5pc0xvbmcgPSBpc0xvbmc7XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXG4gKiBAdHlwZSB7IU9iamVjdH1cbiAqIEBpbm5lclxuICovXG52YXIgSU5UX0NBQ0hFID0ge307XG5cbi8qKlxuICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuXG4gKiBAdHlwZSB7IU9iamVjdH1cbiAqIEBpbm5lclxuICovXG52YXIgVUlOVF9DQUNIRSA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xuICBpZiAodW5zaWduZWQpIHtcbiAgICB2YWx1ZSA+Pj49IDA7XG4gICAgaWYgKChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpKSB7XG4gICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgfVxuICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAwLCB0cnVlKTtcbiAgICBpZiAoY2FjaGUpIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgfD0gMDtcbiAgICBpZiAoKGNhY2hlID0gLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcbiAgICAgIGNhY2hlZE9iaiA9IElOVF9DQUNIRVt2YWx1ZV07XG4gICAgICBpZiAoY2FjaGVkT2JqKSByZXR1cm4gY2FjaGVkT2JqO1xuICAgIH1cbiAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7XG4gICAgaWYgKGNhY2hlKSBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIDMyIGJpdCBpbnRlZ2VyIHZhbHVlLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tSW50ID0gZnJvbUludDtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICBpZiAodW5zaWduZWQpIHtcbiAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gVVpFUk87XG4gICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKSByZXR1cm4gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1BWF9WQUxVRTtcbiAgfVxuICBpZiAodmFsdWUgPCAwKSByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgIHZhbHVlICUgVFdPX1BXUl8zMl9EQkwgfCAwLFxuICAgICh2YWx1ZSAvIFRXT19QV1JfMzJfREJMKSB8IDAsXG4gICAgdW5zaWduZWQsXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZSwgcHJvdmlkZWQgdGhhdCBpdCBpcyBhIGZpbml0ZSBudW1iZXIuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21OdW1iZXIgPSBmcm9tTnVtYmVyO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgNjQgYml0IGludGVnZXIgdGhhdCBjb21lcyBieSBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsb3cgYW5kIGhpZ2ggYml0cy4gRWFjaCBpc1xuICogIGFzc3VtZWQgdG8gdXNlIDMyIGJpdHMuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzIFRoZSBsb3cgMzIgYml0c1xuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzIFRoZSBoaWdoIDMyIGJpdHNcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQGlubmVyXG4gKi9cbnZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXhcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSB0aHJvdyBFcnJvcihcImVtcHR5IHN0cmluZ1wiKTtcbiAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XG4gICAgcmFkaXggPSB1bnNpZ25lZDtcbiAgICB1bnNpZ25lZCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgfVxuICBpZiAoXG4gICAgc3RyID09PSBcIk5hTlwiIHx8XG4gICAgc3RyID09PSBcIkluZmluaXR5XCIgfHxcbiAgICBzdHIgPT09IFwiK0luZmluaXR5XCIgfHxcbiAgICBzdHIgPT09IFwiLUluZmluaXR5XCJcbiAgKVxuICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG5cbiAgdmFyIHA7XG4gIGlmICgocCA9IHN0ci5pbmRleE9mKFwiLVwiKSkgPiAwKSB0aHJvdyBFcnJvcihcImludGVyaW9yIGh5cGhlblwiKTtcbiAgZWxzZSBpZiAocCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7XG4gIH1cblxuICAvLyBEbyBzZXZlcmFsICg4KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7XG5cbiAgdmFyIHJlc3VsdCA9IFpFUk87XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgdmFyIHNpemUgPSBNYXRoLm1pbig4LCBzdHIubGVuZ3RoIC0gaSksXG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcoaSwgaSArIHNpemUpLCByYWRpeCk7XG4gICAgaWYgKHNpemUgPCA4KSB7XG4gICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xuICAgIH1cbiAgfVxuICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcbiAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggVGhlIHJhZGl4IGluIHdoaWNoIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG5cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tVmFsdWUodmFsLCB1bnNpZ25lZCkge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGZyb21OdW1iZXIodmFsLCB1bnNpZ25lZCk7XG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcbiAgLy8gVGhyb3dzIGZvciBub24tb2JqZWN0cywgY29udmVydHMgbm9uLWluc3RhbmNlb2YgTG9uZzpcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgIHZhbC5sb3csXG4gICAgdmFsLmhpZ2gsXG4gICAgdHlwZW9mIHVuc2lnbmVkID09PSBcImJvb2xlYW5cIiA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkLFxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbCBWYWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nLmZyb21WYWx1ZSA9IGZyb21WYWx1ZTtcblxuLy8gTk9URTogdGhlIGNvbXBpbGVyIHNob3VsZCBpbmxpbmUgdGhlc2UgY29uc3RhbnQgdmFsdWVzIGJlbG93IGFuZCB0aGVuIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMsIHNvIHRoZXJlIHNob3VsZCBiZVxuLy8gbm8gcnVudGltZSBwZW5hbHR5IGZvciB0aGVzZS5cblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMzJfREJMID0gVFdPX1BXUl8xNl9EQkwgKiBUV09fUFdSXzE2X0RCTDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBjb25zdFxuICogQGlubmVyXG4gKi9cbnZhciBUV09fUFdSXzI0ID0gZnJvbUludChUV09fUFdSXzI0X0RCTCk7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBaRVJPID0gZnJvbUludCgwKTtcblxuLyoqXG4gKiBTaWduZWQgemVyby5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5aRVJPID0gWkVSTztcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIFVaRVJPID0gZnJvbUludCgwLCB0cnVlKTtcblxuLyoqXG4gKiBVbnNpZ25lZCB6ZXJvLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlVaRVJPID0gVVpFUk87XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBPTkUgPSBmcm9tSW50KDEpO1xuXG4vKipcbiAqIFNpZ25lZCBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuT05FID0gT05FO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgVU9ORSA9IGZyb21JbnQoMSwgdHJ1ZSk7XG5cbi8qKlxuICogVW5zaWduZWQgb25lLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlVPTkUgPSBVT05FO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgTkVHX09ORSA9IGZyb21JbnQoLTEpO1xuXG4vKipcbiAqIFNpZ25lZCBuZWdhdGl2ZSBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuTkVHX09ORSA9IE5FR19PTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNQVhfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHg3ZmZmZmZmZiB8IDAsIGZhbHNlKTtcblxuLyoqXG4gKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHhmZmZmZmZmZiB8IDAsIHRydWUpO1xuXG4vKipcbiAqIE1heGltdW0gdW5zaWduZWQgdmFsdWUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMHg4MDAwMDAwMCB8IDAsIGZhbHNlKTtcblxuLyoqXG4gKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XG5cbi8qKlxuICogQGFsaWFzIExvbmcucHJvdG90eXBlXG4gKiBAaW5uZXJcbiAqL1xudmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xuICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IHRoaXMubG93ID4+PiAwIDogdGhpcy5sb3c7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xuICBpZiAodGhpcy51bnNpZ25lZClcbiAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG4gIHJldHVybiB0aGlzLmhpZ2ggKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggUmFkaXggKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBvdmVycmlkZVxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYHJhZGl4YCBpcyBvdXQgb2YgcmFuZ2VcbiAqL1xuTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XG4gIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgdGhyb3cgUmFuZ2VFcnJvcihcInJhZGl4XCIpO1xuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIFwiMFwiO1xuICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgTG9uZyB2YWx1ZSBiZWZvcmUgaXQgY2FuIGJlIG5lZ2F0ZWQsIHNvIHdlIHJlbW92ZVxuICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxuICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLFxuICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxuICAgICAgICByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTtcbiAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcbiAgICB9IGVsc2UgcmV0dXJuIFwiLVwiICsgdGhpcy5uZWcoKS50b1N0cmluZyhyYWRpeCk7XG4gIH1cblxuICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA2KSwgdGhpcy51bnNpZ25lZCksXG4gICAgcmVtID0gdGhpcztcbiAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHJlbURpdiA9IHJlbS5kaXYocmFkaXhUb1Bvd2VyKSxcbiAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxuICAgICAgZGlnaXRzID0gaW50dmFsLnRvU3RyaW5nKHJhZGl4KTtcbiAgICByZW0gPSByZW1EaXY7XG4gICAgaWYgKHJlbS5pc1plcm8oKSkgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNikgZGlnaXRzID0gXCIwXCIgKyBkaWdpdHM7XG4gICAgICByZXN1bHQgPSBcIlwiICsgZGlnaXRzICsgcmVzdWx0O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBoaWdoIGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xuICByZXR1cm4gdGhpcy5oaWdoO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGhpZ2ggYml0c1xuICovXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xuICByZXR1cm4gdGhpcy5oaWdoID4+PiAwO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGxvdyBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XG4gIHJldHVybiB0aGlzLmxvdztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGxvdyBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xuICByZXR1cm4gdGhpcy5sb3cgPj4+IDA7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSlcbiAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcbiAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XG4gIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSkgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKSBicmVhaztcbiAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcgY2FuIGJlIHNhZmVseSByZXByZXNlbnRlZCBhcyBhIEphdmFTY3JpcHQgbnVtYmVyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNTYWZlSW50ZWdlciA9IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIoKSB7XG4gIC8vIDJeNTMtMSBpcyB0aGUgbWF4aW11bSBzYWZlIHZhbHVlXG4gIHZhciB0b3AxMUJpdHMgPSB0aGlzLmhpZ2ggPj4gMjE7XG4gIC8vIFswLCAyXjUzLTFdXG4gIGlmICghdG9wMTFCaXRzKSByZXR1cm4gdHJ1ZTtcbiAgLy8gPiAyXjUzLTFcbiAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gWy0yXjUzLCAtMV0gZXhjZXB0IC0yXjUzXG4gIHJldHVybiB0b3AxMUJpdHMgPT09IC0xICYmICEodGhpcy5sb3cgPT09IDAgJiYgdGhpcy5oaWdoID09PSAtMHgyMDAwMDApO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gMCAmJiB0aGlzLmxvdyA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XG4gIHJldHVybiAhdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPCAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZSBvciB6ZXJvLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7XG4gIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBvZGQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkge1xuICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4oKSB7XG4gIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIGlmIChcbiAgICB0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJlxuICAgIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiZcbiAgICBvdGhlci5oaWdoID4+PiAzMSA9PT0gMVxuICApXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcbiAgcmV0dXJuICF0aGlzLmVxKC8qIHZhbGlkYXRlcyAqLyBvdGhlcik7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW59LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPiAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikge1xuICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPj0gMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3RlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ2UgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIDA7XG4gIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksXG4gICAgb3RoZXJOZWcgPSBvdGhlci5pc05lZ2F0aXZlKCk7XG4gIGlmICh0aGlzTmVnICYmICFvdGhlck5lZykgcmV0dXJuIC0xO1xuICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpIHJldHVybiAxO1xuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXG4gIGlmICghdGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XG4gIC8vIEJvdGggYXJlIHBvc2l0aXZlIGlmIGF0IGxlYXN0IG9uZSBpcyB1bnNpZ25lZFxuICByZXR1cm4gb3RoZXIuaGlnaCA+Pj4gMCA+IHRoaXMuaGlnaCA+Pj4gMCB8fFxuICAgIChvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgb3RoZXIubG93ID4+PiAwID4gdGhpcy5sb3cgPj4+IDApXG4gICAgPyAtMVxuICAgIDogMTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gKi9cbkxvbmdQcm90b3R5cGUuY29tcCA9IExvbmdQcm90b3R5cGUuY29tcGFyZTtcblxuLyoqXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XG4gIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBNSU5fVkFMVUU7XG4gIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xufTtcblxuLyoqXG4gKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25lZ2F0ZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUubmVnID0gTG9uZ1Byb3RvdHlwZS5uZWdhdGU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gU3VtXG4gKi9cbkxvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xuICBpZiAoIWlzTG9uZyhhZGRlbmQpKSBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTtcblxuICAvLyBEaXZpZGUgZWFjaCBudW1iZXIgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBzdW0gdGhlIGNodW5rcy5cblxuICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuXG4gIHZhciBiNDggPSBhZGRlbmQuaGlnaCA+Pj4gMTY7XG4gIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGIxNiA9IGFkZGVuZC5sb3cgPj4+IDE2O1xuICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDB4ZmZmZjtcblxuICB2YXIgYzQ4ID0gMCxcbiAgICBjMzIgPSAwLFxuICAgIGMxNiA9IDAsXG4gICAgYzAwID0gMDtcbiAgYzAwICs9IGEwMCArIGIwMDtcbiAgYzE2ICs9IGMwMCA+Pj4gMTY7XG4gIGMwMCAmPSAweGZmZmY7XG4gIGMxNiArPSBhMTYgKyBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTMyICsgYjMyO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzQ4ICs9IGE0OCArIGI0ODtcbiAgYzQ4ICY9IDB4ZmZmZjtcbiAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcbiAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XG4gIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxuICovXG5Mb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICovXG5Mb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXM7XG4gIGlmICghaXNMb25nKG11bHRpcGxpZXIpKSBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xuXG4gIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICBpZiAod2FzbSkge1xuICAgIHZhciBsb3cgPSB3YXNtW1wibXVsXCJdKHRoaXMubG93LCB0aGlzLmhpZ2gsIG11bHRpcGxpZXIubG93LCBtdWx0aXBsaWVyLmhpZ2gpO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuXG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xuICB9IGVsc2UgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XG5cbiAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxuICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSAqIG11bHRpcGxpZXIudG9OdW1iZXIoKSwgdGhpcy51bnNpZ25lZCk7XG5cbiAgLy8gRGl2aWRlIGVhY2ggbG9uZyBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIGFkZCB1cCA0eDQgcHJvZHVjdHMuXG4gIC8vIFdlIGNhbiBza2lwIHByb2R1Y3RzIHRoYXQgd291bGQgb3ZlcmZsb3cuXG5cbiAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4ZmZmZjtcblxuICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcbiAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjtcbiAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhmZmZmO1xuXG4gIHZhciBjNDggPSAwLFxuICAgIGMzMiA9IDAsXG4gICAgYzE2ID0gMCxcbiAgICBjMDAgPSAwO1xuICBjMDAgKz0gYTAwICogYjAwO1xuICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgYzAwICY9IDB4ZmZmZjtcbiAgYzE2ICs9IGExNiAqIGIwMDtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweGZmZmY7XG4gIGMxNiArPSBhMDAgKiBiMTY7XG4gIGMzMiArPSBjMTYgPj4+IDE2O1xuICBjMTYgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTMyICogYjAwO1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzMyICs9IGExNiAqIGIxNjtcbiAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gIGMzMiAmPSAweGZmZmY7XG4gIGMzMiArPSBhMDAgKiBiMzI7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhmZmZmO1xuICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xuICBjNDggJj0gMHhmZmZmO1xuICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICovXG5Mb25nUHJvdG90eXBlLm11bCA9IExvbmdQcm90b3R5cGUubXVsdGlwbHk7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGUgcmVzdWx0IGlzIHNpZ25lZCBpZiB0aGlzIExvbmcgaXMgc2lnbmVkIG9yXG4gKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gKi9cbkxvbmdQcm90b3R5cGUuZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGRpdmlzb3IpIHtcbiAgaWYgKCFpc0xvbmcoZGl2aXNvcikpIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG4gIGlmIChkaXZpc29yLmlzWmVybygpKSB0aHJvdyBFcnJvcihcImRpdmlzaW9uIGJ5IHplcm9cIik7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XG4gICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxuICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgaWYgKFxuICAgICAgIXRoaXMudW5zaWduZWQgJiZcbiAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcbiAgICAgIGRpdmlzb3IubG93ID09PSAtMSAmJlxuICAgICAgZGl2aXNvci5oaWdoID09PSAtMVxuICAgICkge1xuICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJkaXZfdVwiXSA6IHdhc21bXCJkaXZfc1wiXSkoXG4gICAgICB0aGlzLmxvdyxcbiAgICAgIHRoaXMuaGlnaCxcbiAgICAgIGRpdmlzb3IubG93LFxuICAgICAgZGl2aXNvci5oaWdoLFxuICAgICk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICB9XG5cbiAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICB2YXIgYXBwcm94LCByZW0sIHJlcztcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XG4gICAgLy8gVGhpcyBzZWN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHNpZ25lZCBsb25ncyBhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZVxuICAgIC8vIGNsb3N1cmUgbGlicmFyeSBhcyBhIHdob2xlLlxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSlcbiAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcbiAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE9ORTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXG4gICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpO1xuICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpO1xuICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XG4gICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW0gPSB0aGlzLnN1YihkaXZpc29yLm11bChhcHByb3gpKTtcbiAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTtcbiAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcbiAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XG4gICAgcmVzID0gWkVSTztcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgYWxnb3JpdGhtIGJlbG93IGhhcyBub3QgYmVlbiBtYWRlIGZvciB1bnNpZ25lZCBsb25ncy4gSXQncyB0aGVyZWZvcmVcbiAgICAvLyByZXF1aXJlZCB0byB0YWtlIHNwZWNpYWwgY2FyZSBvZiB0aGUgTVNCIHByaW9yIHRvIHJ1bm5pbmcgaXQuXG4gICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKSBkaXZpc29yID0gZGl2aXNvci50b1Vuc2lnbmVkKCk7XG4gICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpIHJldHVybiBVWkVSTztcbiAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKVxuICAgICAgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcbiAgICAgIHJldHVybiBVT05FO1xuICAgIHJlcyA9IFVaRVJPO1xuICB9XG5cbiAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcbiAgLy8gZmxvYXRpbmctcG9pbnQgdGhhdCBhcHByb3hpbWF0ZXMgcmVtYWluZGVyIC8gb3RoZXIgKmZyb20gYmVsb3cqLCBhZGQgdGhpc1xuICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XG4gIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcbiAgLy8gcmVtYWluZGVyIG5ldmVyIGJlY29tZXMgbmVnYXRpdmUuXG4gIHJlbSA9IHRoaXM7XG4gIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XG4gICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxuICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxuICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcblxuICAgIC8vIFdlIHdpbGwgdHdlYWsgdGhlIGFwcHJveGltYXRlIHJlc3VsdCBieSBjaGFuZ2luZyBpdCBpbiB0aGUgNDgtdGggZGlnaXQgb3JcbiAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXG4gICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSxcbiAgICAgIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXG4gICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcbiAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkge1xuICAgICAgYXBwcm94IC09IGRlbHRhO1xuICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xuICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICB9XG5cbiAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcbiAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cbiAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKSBhcHByb3hSZXMgPSBPTkU7XG5cbiAgICByZXMgPSByZXMuYWRkKGFwcHJveFJlcyk7XG4gICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAqL1xuTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5tb2R1bG8gPSBmdW5jdGlvbiBtb2R1bG8oZGl2aXNvcikge1xuICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcblxuICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgaWYgKHdhc20pIHtcbiAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wicmVtX3VcIl0gOiB3YXNtW1wicmVtX3NcIl0pKFxuICAgICAgdGhpcy5sb3csXG4gICAgICB0aGlzLmhpZ2gsXG4gICAgICBkaXZpc29yLmxvdyxcbiAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICApO1xuICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gKi9cbkxvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICovXG5Mb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XG4gIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudExlYWRpbmdaZXJvcygpIHtcbiAgcmV0dXJuIHRoaXMuaGlnaCA/IE1hdGguY2x6MzIodGhpcy5oaWdoKSA6IE1hdGguY2x6MzIodGhpcy5sb3cpICsgMzI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudExlYWRpbmdaZXJvc30uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IW51bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5jbHogPSBMb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zO1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRUcmFpbGluZ1plcm9zKCkge1xuICByZXR1cm4gdGhpcy5sb3cgPyBjdHozMih0aGlzLmxvdykgOiBjdHozMih0aGlzLmhpZ2gpICsgMzI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRUcmFpbGluZ1plcm9zfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ31cbiAqIEByZXR1cm5zIHshbnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLmN0eiA9IExvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgQU5EIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyAmIG90aGVyLmxvdywgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyB8IG90aGVyLmxvdywgdGhpcy5oaWdoIHwgb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqL1xuTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdyBeIG90aGVyLmxvdywgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgIHRoaXMubG93IDw8IG51bUJpdHMsXG4gICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiAoMzIgLSBudW1CaXRzKSksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIGVsc2UgcmV0dXJuIGZyb21CaXRzKDAsIHRoaXMubG93IDw8IChudW1CaXRzIC0gMzIpLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdExlZnR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0KG51bUJpdHMpIHtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksXG4gICAgICB0aGlzLmhpZ2ggPj4gbnVtQml0cyxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgZWxzZVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgIHRoaXMuaGlnaCA+PiAobnVtQml0cyAtIDMyKSxcbiAgICAgIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLFxuICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICApO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0fS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHRVbnNpZ25lZChudW1CaXRzKSB7XG4gIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgIHRoaXMuaGlnaCA+Pj4gbnVtQml0cyxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCAwLCB0aGlzLnVuc2lnbmVkKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+Pj4gKG51bUJpdHMgLSAzMiksIDAsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hydSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaHJfdSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChudW1CaXRzKSB7XG4gIHZhciBiO1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIH1cbiAgbnVtQml0cyAtPSAzMjtcbiAgYiA9IDMyIC0gbnVtQml0cztcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+IGIpLFxuICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgIHRoaXMudW5zaWduZWQsXG4gICk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZUxlZnR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RsID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUucm90YXRlUmlnaHQgPSBmdW5jdGlvbiByb3RhdGVSaWdodChudW1CaXRzKSB7XG4gIHZhciBiO1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG4gIH1cbiAgbnVtQml0cyAtPSAzMjtcbiAgYiA9IDMyIC0gbnVtQml0cztcbiAgcmV0dXJuIGZyb21CaXRzKFxuICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgIHRoaXMudW5zaWduZWQsXG4gICk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVSaWdodH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnJvdHIgPSBMb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBzaWduZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9IFNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9TaWduZWQgPSBmdW5jdGlvbiB0b1NpZ25lZCgpIHtcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCBsb25nXG4gKi9cbkxvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7XG4gIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXG4gKi9cbkxvbmdQcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMobGUpIHtcbiAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKi9cbkxvbmdQcm90b3R5cGUudG9CeXRlc0xFID0gZnVuY3Rpb24gdG9CeXRlc0xFKCkge1xuICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgbG8gPSB0aGlzLmxvdztcbiAgcmV0dXJuIFtcbiAgICBsbyAmIDB4ZmYsXG4gICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgKGxvID4+PiAxNikgJiAweGZmLFxuICAgIGxvID4+PiAyNCxcbiAgICBoaSAmIDB4ZmYsXG4gICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgIGhpID4+PiAyNCxcbiAgXTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7XG4gIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICBsbyA9IHRoaXMubG93O1xuICByZXR1cm4gW1xuICAgIGhpID4+PiAyNCxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgaGkgJiAweGZmLFxuICAgIGxvID4+PiAyNCxcbiAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgbG8gJiAweGZmLFxuICBdO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbUJ5dGVzID0gZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzLCB1bnNpZ25lZCwgbGUpIHtcbiAgcmV0dXJuIGxlXG4gICAgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZClcbiAgICA6IExvbmcuZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tQnl0ZXNMRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkge1xuICByZXR1cm4gbmV3IExvbmcoXG4gICAgYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkgfCAoYnl0ZXNbMl0gPDwgMTYpIHwgKGJ5dGVzWzNdIDw8IDI0KSxcbiAgICBieXRlc1s0XSB8IChieXRlc1s1XSA8PCA4KSB8IChieXRlc1s2XSA8PCAxNikgfCAoYnl0ZXNbN10gPDwgMjQpLFxuICAgIHVuc2lnbmVkLFxuICApO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhcbiAgICAoYnl0ZXNbNF0gPDwgMjQpIHwgKGJ5dGVzWzVdIDw8IDE2KSB8IChieXRlc1s2XSA8PCA4KSB8IGJ5dGVzWzddLFxuICAgIChieXRlc1swXSA8PCAyNCkgfCAoYnl0ZXNbMV0gPDwgMTYpIHwgKGJ5dGVzWzJdIDw8IDgpIHwgYnl0ZXNbM10sXG4gICAgdW5zaWduZWQsXG4gICk7XG59O1xuXG4vLyBTdXBwb3J0IGNvbnZlcnNpb24gdG8vZnJvbSBCaWdJbnQgd2hlcmUgYXZhaWxhYmxlXG5pZiAodHlwZW9mIEJpZ0ludCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJpZyBpbnRlZ2VyLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBiaWcgaW50ZWdlciB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgKi9cbiAgTG9uZy5mcm9tQmlnSW50ID0gZnVuY3Rpb24gZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICB2YXIgbG93Qml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSkpO1xuICAgIHZhciBoaWdoQml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSA+PiBCaWdJbnQoMzIpKSk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGVcbiAgTG9uZy5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWVXaXRoQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBMb25nLmZyb21CaWdJbnQodmFsdWUsIHVuc2lnbmVkKTtcbiAgICByZXR1cm4gZnJvbVZhbHVlKHZhbHVlLCB1bnNpZ25lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGl0cyBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAgICogQHRoaXMgeyFMb25nfVxuICAgKiBAcmV0dXJucyB7YmlnaW50fVxuICAgKi9cbiAgTG9uZ1Byb3RvdHlwZS50b0JpZ0ludCA9IGZ1bmN0aW9uIHRvQmlnSW50KCkge1xuICAgIHZhciBsb3dCaWdJbnQgPSBCaWdJbnQodGhpcy5sb3cgPj4+IDApO1xuICAgIHZhciBoaWdoQmlnSW50ID0gQmlnSW50KHRoaXMudW5zaWduZWQgPyB0aGlzLmhpZ2ggPj4+IDAgOiB0aGlzLmhpZ2gpO1xuICAgIHJldHVybiAoaGlnaEJpZ0ludCA8PCBCaWdJbnQoMzIpKSB8IGxvd0JpZ0ludDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9uZztcbiIsImV4cG9ydCB7cHJ1bmVVbmNsYWltZWRTZW50cnlJbnN0YWxsYXRpb25zQ3Jvbn0gZnJvbSAnLi9wcnVuZS11bmNsYWltZWQtaW5zdGFsbGF0aW9ucy1jcm9uLmpzJztcbiIsImltcG9ydCB7bG9nLCBwcm94eUFjdGl2aXRpZXN9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbmltcG9ydCB0eXBlIHtjcmVhdGVTZW50cnlNYWludGVuYW5jZUFjdGl2aXRpZXN9IGZyb20gJy4uL2FjdGl2aXRpZXMvaW5kZXguanMnO1xuXG5jb25zdCB7cHJ1bmVVbmNsYWltZWRTZW50cnlJbnN0YWxsYXRpb25zQWN0aXZpdHl9ID0gcHJveHlBY3Rpdml0aWVzPFxuICBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVTZW50cnlNYWludGVuYW5jZUFjdGl2aXRpZXM+XG4+KHtcbiAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzUgbWludXRlcycsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBydW5lVW5jbGFpbWVkU2VudHJ5SW5zdGFsbGF0aW9uc0Nyb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHt0b21ic3RvbmVkfSA9IGF3YWl0IHBydW5lVW5jbGFpbWVkU2VudHJ5SW5zdGFsbGF0aW9uc0FjdGl2aXR5KCk7XG4gIGlmICh0b21ic3RvbmVkID4gMCkge1xuICAgIGxvZy5pbmZvKCdUb21ic3RvbmVkIHN0YWxlIHVuY2xhaW1lZCBTZW50cnkgaW5zdGFsbGF0aW9ucycsIHt0b21ic3RvbmVkfSk7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJcbmNvbnN0IGFwaSA9IHJlcXVpcmUoJ0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYi93b3JrZXItaW50ZXJmYWNlLmpzJyk7XG5leHBvcnRzLmFwaSA9IGFwaTtcblxuY29uc3QgeyBvdmVycmlkZUdsb2JhbHMgfSA9IHJlcXVpcmUoJ0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYi9nbG9iYWwtb3ZlcnJpZGVzLmpzJyk7XG5vdmVycmlkZUdsb2JhbHMoKTtcblxuZXhwb3J0cy5wcmVsb2FkTW9kdWxlcyA9IGZ1bmN0aW9uIHByZWxvYWRNb2R1bGVzKCkge1xuXG59XG5cbmV4cG9ydHMuaW1wb3J0V29ya2Zsb3dzID0gZnVuY3Rpb24gaW1wb3J0V29ya2Zsb3dzKCkge1xuICByZXR1cm4gcmVxdWlyZSgvKiB3ZWJwYWNrTW9kZTogXCJlYWdlclwiICovIFwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL2ludGVncmF0aW9uL3NlbnRyeS9kaXN0L3RlbXBvcmFsL3dvcmtmbG93cy9pbmRleC5qc1wiKTtcbn1cblxuZXhwb3J0cy5pbXBvcnRJbnRlcmNlcHRvcnMgPSBmdW5jdGlvbiBpbXBvcnRJbnRlcmNlcHRvcnMoKSB7XG4gIHJldHVybiBbXG4gICAgXG4gIF07XG59XG4iXSwibmFtZXMiOlsicHJ1bmVVbmNsYWltZWRTZW50cnlJbnN0YWxsYXRpb25zQ3JvbiIsImxvZyIsInByb3h5QWN0aXZpdGllcyIsInBydW5lVW5jbGFpbWVkU2VudHJ5SW5zdGFsbGF0aW9uc0FjdGl2aXR5Iiwic3RhcnRUb0Nsb3NlVGltZW91dCIsInRvbWJzdG9uZWQiLCJpbmZvIl0sInNvdXJjZVJvb3QiOiIifQ==
|
|
11366
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctYnVuZGxlLTNlNTEzM2E0NjlhZWJiMGY4OTA4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBOztHQUVHO0FBQ0gsTUFBYSwyQkFBMkI7SUFDN0IsUUFBUSxDQUFVO0lBQ2xCLGVBQWUsQ0FBVTtJQUN6QixNQUFNLENBQVU7SUFDaEIsUUFBUSxDQUFVO0lBQ2xCLGNBQWMsQ0FBVTtJQUN4QixLQUFLLENBQVU7SUFFeEIsWUFBbUIsVUFBOEMsRUFBRTtRQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUM7UUFDdEQsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FDZCxLQUE0RTtRQUU1RSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksMkJBQTJCLEVBQUUsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLDJCQUEyQixDQUFDO1lBQ3JDLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUs7WUFDbkMsZUFBZSxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSztZQUMzQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLO1lBQy9CLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUs7WUFDbkMsY0FBYyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLO1lBQy9DLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUs7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBaENELGtFQWdDQzs7Ozs7Ozs7Ozs7Ozs7OztBQy9DRCxzTUFBOEQ7QUFHOUQsa0dBQWtHO0FBQ2xHLDhGQUE4RjtBQUM5RixrR0FBa0c7QUFDbEcsMkNBQTJDO0FBRTNDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCx5RkFBeUY7QUFDekYsa0ZBQWtGO0FBQ3JFLGdDQUF3QixHQUFHO0lBQ3RDOzs7T0FHRztJQUNILE9BQU8sRUFBRSxTQUFTO0lBRWxCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxVQUFVLEVBQUUsWUFBWTtJQUV4Qjs7Ozs7OztPQU9HO0lBQ0gsMkJBQTJCLEVBQUUsNkJBQTZCO0NBQ2xELENBQUM7QUFHRSxLQUFtRSwrQ0FBdUIsRUFPckc7SUFDRSxDQUFDLGdDQUF3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDeEMsQ0FBQyxnQ0FBd0IsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7SUFDekQsQ0FBQyxnQ0FBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0NBQzdCLEVBQ1YsRUFBRSxDQUNILEVBYmEsc0NBQThCLFVBQUUsc0NBQThCLFNBYTFFOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0NGLG9GQWtCQztBQWxERCxzTUFBOEQ7QUFFOUQ7Ozs7R0FJRztBQUNVLGtDQUEwQixHQUFHO0lBQ3hDLHNCQUFzQixFQUFFLHdCQUF3QjtJQUNoRCx1QkFBdUIsRUFBRSx5QkFBeUI7SUFDbEQsZ0JBQWdCLEVBQUUsa0JBQWtCO0NBQzVCLENBQUM7QUFHWCx1QkFBdUI7QUFDVixLQUF1RSwrQ0FBdUIsRUFPekc7SUFDRSxDQUFDLGtDQUEwQixDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztJQUN0RCxDQUFDLGtDQUEwQixDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztJQUN2RCxDQUFDLGtDQUEwQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztJQUNoRCxXQUFXLEVBQUUsQ0FBQztDQUNOLEVBQ1YsaUNBQWlDLENBQ2xDLEVBZGEsd0NBQWdDLFVBQUUsd0NBQWdDLFNBYzlFO0FBRUYsdUJBQXVCO0FBQ3ZCLFNBQWdCLG9DQUFvQyxDQUNsRCxPQUE4RTtJQUU5RSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNwQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQWlDLEVBQUUsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLDRDQUFnQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDbERELDBNQUE4RDtBQUc5RCwwTUFBOEQ7QUE0RDlEOzs7O0dBSUc7QUFDVSwrQkFBdUIsR0FBcUIsSUFBSSwyQ0FBdUIsRUFBRSxDQUFDO0FBRXZGOztHQUVHO0FBQ1UsNEJBQW9CLEdBQXdCO0lBQ3ZELGdCQUFnQixFQUFFLDJDQUF1QjtJQUN6QyxnQkFBZ0IsRUFBRSwrQkFBdUI7SUFDekMsYUFBYSxFQUFFLEVBQUU7Q0FDbEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNPRiw0Q0FRQztBQTdGRCx1SkFBbUM7QUFDbkMsd0lBQXdCO0FBR3hCLG1LQWlCb0I7QUFDcEIsdU1BQStEO0FBQy9ELGtMQUEwQztBQUMxQywwSkFBeUM7QUFDekMsc0tBQXFDO0FBRXJDLDBNQUFvRztBQUdwRyx1R0FBdUc7QUFDdkcsTUFBTSw4QkFBOEIsR0FBRztJQUNyQyxTQUFTLEVBQUUsV0FBVztJQUN0QixhQUFhLEVBQUUsZUFBZTtDQUN0QixDQUFDO0FBSVgsTUFBTSxDQUFDLG9DQUFvQyxFQUFFLG9DQUFvQyxDQUFDLEdBQUcsK0NBQXVCLEVBTzFHO0lBQ0UsV0FBVyxFQUFFLENBQUM7SUFDZCxDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7SUFDN0MsQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO0NBQ3pDLEVBQ1YscUNBQXFDLENBQ3RDLENBQUM7QUFFRixTQUFTLGFBQWEsQ0FBQyxHQUFHLE9BQWlCO0lBQ3pDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLGFBQWE7QUFDekMseUJBQXlCO0FBQ3pCLDBGQUEwRjtBQUMxRixzQkFBc0I7QUFDdEIscUhBQXFIO0FBQ3JILGtEQUFrRDtBQUNsRCxrSUFBa0k7QUFDbEksdUNBQXVDO0FBQ3ZDLGlGQUFpRixDQUNsRixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSw2QkFBNkIsR0FBRyxhQUFhO0FBQ2pELGdFQUFnRTtBQUNoRSx1RkFBdUY7QUFDdkYsZ0VBQWdFO0FBQ2hFLGlHQUFpRyxDQUNsRyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU07UUFDNUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQXlDRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSx1QkFBdUI7SUFDbEIsT0FBTyxDQUFpQztJQUV4RCxZQUFZLE9BQWlEO1FBQzNELE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLHNCQUFzQixFQUFFLHNCQUFzQixJQUFJLEtBQUs7U0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQ2pCLE9BQXFCLEVBQ3JCLGdCQUFrQyxFQUNsQyxPQUE4QjtRQUU5QixJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ25DLE9BQU8sSUFBSSw0QkFBa0IsQ0FDM0IsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQzVCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQ25DLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLEVBQ3BELHlDQUFpQixFQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUM5RixJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsRUFDN0UsU0FBUyxFQUNULDhDQUFnQyxFQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FDMUUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSx1QkFBYSxDQUN0QixPQUFPLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFDNUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsRUFDL0MsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQzlFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksd0JBQWMsQ0FDdkIsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQzVCLDJDQUFtQixFQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUM1RywrQkFBaUIsRUFBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNsQyxPQUFPLElBQUksMkJBQWlCLENBQzFCLE9BQU8sQ0FBQyxPQUFPLElBQUksU0FBUyxFQUM1QixJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSwwQkFBZ0IsQ0FDekIsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQzVCLHlDQUFpQixFQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUMzRixJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSw0QkFBa0IsQ0FDM0IsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQzVCLGVBQWUsRUFDZixLQUFLLEVBQ0wseUNBQWlCLEVBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFDN0csSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQzlFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUM5QyxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsaUNBQWlDLENBQUM7WUFDN0csSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sSUFBSSxTQUFTLENBQUMseURBQXlELENBQUMsQ0FBQztZQUNqRixDQUFDO1lBQ0QsT0FBTyxJQUFJLDhCQUFvQixDQUM3QixTQUFTLElBQUksU0FBUyxFQUN0QixpQkFBaUIsRUFDakIsWUFBWSxDQUFDLElBQUksRUFDakIsOEJBQWdCLEVBQUMsVUFBVSxDQUFDLEVBQzVCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUM5RSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxTQUFTLENBQUMsbURBQW1ELENBQUMsQ0FBQztZQUMzRSxDQUFDO1lBQ0QsT0FBTyxJQUFJLHlCQUFlLENBQ3hCLE9BQU8sQ0FBQyxPQUFPLElBQUksU0FBUyxFQUM1QixPQUFPLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksRUFDN0MsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsSUFBSSxTQUFTLEVBQ25ELDhCQUFnQixFQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFDeEQsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsSUFBSSxTQUFTLEVBQ2pELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUM5RSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDcEMsSUFBSSxpQkFBaUIsR0FBd0IsU0FBUyxDQUFDO1lBQ3ZELE1BQU0sYUFBYSxHQUFHLG9DQUFvQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRyxRQUFRLGFBQWEsRUFBRSxDQUFDO2dCQUN0QixLQUFLLFdBQVc7b0JBQ2QsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO29CQUN6QixNQUFNO2dCQUNSLEtBQUssZUFBZTtvQkFDbEIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO29CQUMxQixNQUFNO1lBQ1YsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hFLE1BQU0sWUFBWSxHQUEyQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUM7Z0JBQzlGLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsWUFBbUQsQ0FBQztnQkFDN0UsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVkLE9BQU8sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLHFCQUFxQixFQUFFO2dCQUNwRixLQUFLLEVBQUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDO2dCQUNwRixpQkFBaUI7Z0JBQ2pCLFlBQVk7Z0JBQ1osZUFBZSxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUM7YUFDN0QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLGtDQUFrQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLCtCQUFxQjtZQUM5Qiw2RkFBNkY7WUFDN0YsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQzVCLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUU7WUFDdkUseUVBQXlFO1lBQ3pFLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxRQUFRLElBQUksRUFBRSxFQUN6RCxPQUFPLENBQUMsa0NBQWtDLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDeEQsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQzFELE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxjQUFjLElBQUksU0FBUyxFQUN0RSxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUkseUJBQWUsQ0FDeEIsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQzVCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFxQixFQUFFLGdCQUFrQyxFQUFFLE9BQThCO1FBQ3RHLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFrQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEgsMEVBQTBFO1lBQzFFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLDhCQUE4QjtnQkFDOUIsT0FBTyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQzVCLENBQUM7Z0JBQ0QsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekUsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLEdBQUcsWUFBWSx5QkFBZSxFQUFFLENBQUM7WUFDbkMsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFZLEVBQUUsZ0JBQWtDLEVBQUUsT0FBOEI7UUFDN0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQztZQUN4QyxPQUFPLENBQUMsT0FBTyxHQUFHLGlCQUFpQixDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hHLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsR0FBWSxFQUFFLGdCQUFrQyxFQUFFLE9BQThCO1FBQ2xHLElBQUksR0FBRyxZQUFZLHlCQUFlLElBQUksR0FBRyxZQUFZLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4RSxJQUFJLEdBQUcsWUFBWSx5QkFBZSxJQUFJLEdBQUcsQ0FBQyxPQUFPO2dCQUFFLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUN0RSxNQUFNLElBQUksR0FBRztnQkFDWCxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87Z0JBQ3BCLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxLQUFLLEVBQUUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDO2dCQUNoRixNQUFNLEVBQUUsd0JBQWM7YUFDdkIsQ0FBQztZQUVGLElBQUksR0FBRyxZQUFZLHlCQUFlLEVBQUUsQ0FBQztnQkFDbkMsT0FBTztvQkFDTCxHQUFHLElBQUk7b0JBQ1AsbUJBQW1CLEVBQUU7d0JBQ25CLEdBQUcsR0FBRzt3QkFDTixVQUFVLEVBQUUsOEJBQWdCLEVBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQzt3QkFDNUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUU7cUJBQ3pDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxHQUFHLFlBQVksOEJBQW9CLEVBQUUsQ0FBQztnQkFDeEMsT0FBTztvQkFDTCxHQUFHLElBQUk7b0JBQ1AsaUNBQWlDLEVBQUU7d0JBQ2pDLEdBQUcsR0FBRzt3QkFDTixVQUFVLEVBQUUsOEJBQWdCLEVBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQzt3QkFDNUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLFNBQVM7d0JBQ2hDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFO3FCQUN6QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksR0FBRyxZQUFZLDRCQUFrQixFQUFFLENBQUM7Z0JBQ3RDLE9BQU87b0JBQ0wsR0FBRyxJQUFJO29CQUNQLHNCQUFzQixFQUFFO3dCQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7d0JBQ2QsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO3dCQUM5QixPQUFPLEVBQ0wsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07NEJBQy9CLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSw2Q0FBcUIsRUFBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUM3RSxDQUFDLENBQUMsU0FBUzt3QkFDZixjQUFjLEVBQUUseUJBQWMsRUFBQyxHQUFHLENBQUMsY0FBYyxDQUFDO3dCQUNsRCxRQUFRLEVBQUUsOENBQWdDLEVBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztxQkFDekQ7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLEdBQUcsWUFBWSwwQkFBZ0IsRUFBRSxDQUFDO2dCQUNwQyxPQUFPO29CQUNMLEdBQUcsSUFBSTtvQkFDUCxtQkFBbUIsRUFBRTt3QkFDbkIsT0FBTyxFQUNMLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNOzRCQUMvQixDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsNkNBQXFCLEVBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTs0QkFDN0UsQ0FBQyxDQUFDLFNBQVM7cUJBQ2hCO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxHQUFHLFlBQVksd0JBQWMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPO29CQUNMLEdBQUcsSUFBSTtvQkFDUCxrQkFBa0IsRUFBRTt3QkFDbEIsV0FBVyxFQUFFLCtCQUFpQixFQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7d0JBQy9DLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxvQkFBb0I7NEJBQzVDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSw2Q0FBcUIsRUFBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFOzRCQUM1RixDQUFDLENBQUMsU0FBUztxQkFDZDtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksR0FBRyxZQUFZLHVCQUFhLEVBQUUsQ0FBQztnQkFDakMsT0FBTztvQkFDTCxHQUFHLElBQUk7b0JBQ1AsaUJBQWlCLEVBQUUsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRTtpQkFDdEQsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLEdBQUcsWUFBWSwyQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxPQUFPO29CQUNMLEdBQUcsSUFBSTtvQkFDUCxxQkFBcUIsRUFBRSxFQUFFO2lCQUMxQixDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksR0FBRyxZQUFZLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxhQUFhLEdBQXFFLFNBQVMsQ0FBQztvQkFDaEcsUUFBUSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDOUIsS0FBSyxJQUFJOzRCQUNQLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDbEUsTUFBTTt3QkFDUixLQUFLLEtBQUs7NEJBQ1IsYUFBYSxHQUFHLG9DQUFvQyxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUN0RSxNQUFNO29CQUNWLENBQUM7b0JBRUQsT0FBTzt3QkFDTCxHQUFHLElBQUk7d0JBQ1AsdUJBQXVCLEVBQUU7NEJBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTs0QkFDZCxhQUFhO3lCQUNkO3FCQUNGLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLEdBQUcsWUFBWSwrQkFBcUIsRUFBRSxDQUFDO2dCQUN6QyxPQUFPO29CQUNMLEdBQUcsSUFBSTtvQkFDUCxrQ0FBa0MsRUFBRTt3QkFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO3dCQUMxRixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVE7d0JBQ3RCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTzt3QkFDcEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO3dCQUN4QixjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7cUJBQ25DO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QseUJBQXlCO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHO1lBQ1gsTUFBTSxFQUFFLHdCQUFjO1NBQ3ZCLENBQUM7UUFFRixJQUFJLDBCQUFPLEVBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQixPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNsQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsS0FBSyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBRSxHQUFXLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQzthQUMxRixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLDBIQUEwSCxDQUFDO1FBRWxKLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsOEJBQThCLENBQzVCLE9BQXdDLEVBQ3hDLGdCQUFrQyxFQUNsQyxPQUE4QjtRQUU5QixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RixDQUFDO0lBRUQ7O09BRUc7SUFDSCw4QkFBOEIsQ0FDNUIsR0FBWSxFQUNaLGdCQUFrQyxFQUNsQyxPQUE4QjtRQUU5QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMvRSxDQUFDO0lBRU8sNkJBQTZCLENBQUMsT0FBc0IsRUFBRSxTQUFrQjtRQUM5RSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxLQUFLLGlDQUFpQyxFQUFFLENBQUM7WUFDakUsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUksU0FBUyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sZUFBZSxHQUFpQixFQUFFLENBQUM7WUFDekMsZUFBZSxDQUFDLHNCQUFzQixHQUFHO2dCQUN2QyxJQUFJLEVBQUUsY0FBYztnQkFDcEIsWUFBWSxFQUFFLENBQUMsU0FBUztnQkFDeEIsT0FBTyxFQUFFO29CQUNQLFFBQVEsRUFBRTt3QkFDUjs0QkFDRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUscUJBQU0sRUFBQyxZQUFZLENBQUMsRUFBRTs0QkFDNUMsSUFBSSxFQUFFLHFCQUFNLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3lCQUMxRDtxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFDRixlQUFlLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDMUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUN0RCxPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVPLDZCQUE2QixDQUFDLE9BQXFCO1FBQ3pELE9BQU87WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQzlCLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxpQ0FBaUMsRUFBRTtZQUNyRCxzRkFBc0Y7WUFDdEYsdUVBQXVFO1lBQ3ZFLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFO1NBQ3hCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUExWEQsMERBMFhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FFamVELGdDQUVDO0FBT0Qsc0RBVUM7QUFLRCw0REFRQztBQU9ELHNDQVFDO0FBYUQsa0RBZUM7QUFLRCw4Q0FTQztBQUVELDBDQVlDO0FBOUlELHNLQUE2QztBQUM3QyxnS0FBOEQ7QUFHOUQsc0tBQTZFO0FBMEI3RTs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxTQUEyQixFQUFFLEdBQUcsTUFBaUI7SUFDMUUsT0FBTyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLFNBQTJCLEVBQzNCLE9BQXlDLEVBQ3pDLE1BQWlCO0lBRWpCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHdCQUF3QixDQUN0QyxnQkFBa0MsRUFDbEMsS0FBYyxFQUNkLE9BQThCO0lBRTlCLElBQUksS0FBSyxJQUFJLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVoQyxPQUFPLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQzNCLFNBQTJCLEVBQzNCLEdBQWlCLEVBQ2pCLE9BQThCO0lBRTlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDdkUsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxTQUEyQixFQUMzQixLQUFhLEVBQ2IsUUFBMkIsRUFDM0IsT0FBOEI7SUFFOUIseURBQXlEO0lBQ3pELElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUUsT0FBTyxTQUFnQixDQUFDO0lBQzFCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLFNBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLFNBQTJCLEVBQzNCLFFBQTJCLEVBQzNCLE9BQThCO0lBRTlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FDN0IsU0FBMkIsRUFDM0IsR0FBMkMsRUFDM0MsT0FBOEI7SUFFOUIsSUFBSSxHQUFHLElBQUksSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBZ0IsRUFBRTtRQUNyRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsT0FBTyxDQUFDLENBQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FDYSxDQUFDO0FBQ3BCLENBQUM7QUFHRDs7OztHQUlHO0FBQ0gsTUFBYSxRQUFRO0lBQ0YsUUFBUSxDQUFVO0lBQ2xCLENBQUMsMkJBQW1CLENBQUMsR0FBTSxTQUFjLENBQUM7SUFFM0QsWUFBWSxLQUFRLEVBQUUsbUJBQXFDLCtCQUF1QixFQUFFLE9BQThCO1FBQ2hILElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFVO1FBQzNCLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFmRCw0QkFlQztBQW1CRDs7Ozs7R0FLRztBQUNILE1BQWEseUJBQXlCO0lBQzNCLFVBQVUsQ0FBaUM7SUFDM0MsbUJBQW1CLEdBQThDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEYsWUFBWSxHQUFHLFVBQTBDO1FBQ3ZELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksOEJBQXFCLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RixDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUksS0FBUSxFQUFFLE9BQThCO1FBQzFELElBQUksS0FBSyxZQUFZLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN2QixDQUFDO1FBQ0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLG1CQUFVLENBQUMscUJBQXFCLEtBQUssYUFBYSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFJLE9BQWdCLEVBQUUsT0FBOEI7UUFDcEUsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxtQkFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLHFCQUFNLEVBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyw2QkFBcUIsQ0FBRSxDQUFDLENBQUM7UUFDbEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksbUJBQVUsQ0FBQyxxQkFBcUIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUFoREQsOERBZ0RDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLHlCQUF5QjtJQUM3QixZQUFZLEdBQUcscUJBQWEsQ0FBQyxzQkFBc0IsQ0FBQztJQUVwRCxTQUFTLENBQUMsS0FBYztRQUM3QixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRTtnQkFDUixDQUFDLDZCQUFxQixDQUFDLEVBQUUsb0JBQVksQ0FBQyxzQkFBc0I7YUFDN0Q7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVcsQ0FBSSxRQUFpQjtRQUNyQyxPQUFPLFNBQWdCLENBQUMsQ0FBQyx3QkFBd0I7SUFDbkQsQ0FBQztDQUNGO0FBbEJELDhEQWtCQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDMUIsWUFBWSxHQUFHLHFCQUFhLENBQUMscUJBQXFCLENBQUM7SUFFbkQsU0FBUyxDQUFDLEtBQWM7UUFDN0IsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU87WUFDTCxRQUFRLEVBQUU7Z0JBQ1IsQ0FBQyw2QkFBcUIsQ0FBQyxFQUFFLG9CQUFZLENBQUMscUJBQXFCO2FBQzVEO1lBQ0QsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVcsQ0FBSSxPQUFnQjtRQUNwQyxPQUFPO1FBQ0wsc0VBQXNFO1FBQ3RFLENBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDekcsQ0FDVCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBeEJELHdEQXdCQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFDeEIsWUFBWSxHQUFHLHFCQUFhLENBQUMsc0JBQXNCLENBQUM7SUFFcEQsU0FBUyxDQUFDLEtBQWM7UUFDN0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDO1FBQ1QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDZCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRTtnQkFDUixDQUFDLDZCQUFxQixDQUFDLEVBQUUsb0JBQVksQ0FBQyxzQkFBc0I7YUFDN0Q7WUFDRCxJQUFJLEVBQUUscUJBQU0sRUFBQyxJQUFJLENBQUM7U0FDbkIsQ0FBQztJQUNKLENBQUM7SUFFTSxXQUFXLENBQUksT0FBZ0I7UUFDcEMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hELE1BQU0sSUFBSSxtQkFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBTSxFQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQTdCRCxvREE2QkM7QUFFRCxNQUFhLHVCQUF3QixTQUFRLHlCQUF5QjtJQUNwRSxrR0FBa0c7SUFDbEcsbUhBQW1IO0lBQ25ILGdEQUFnRDtJQUNoRCxFQUFFO0lBQ0YsVUFBVTtJQUNWLDZIQUE2SDtJQUM3SDtRQUNFLEtBQUssQ0FBQyxJQUFJLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxFQUFFLElBQUksb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7Q0FDRjtBQVZELDBEQVVDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDVSwrQkFBdUIsR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7QUFFckU7O0dBRUc7QUFDSCxNQUFNLHdCQUF3QjtJQUM1QixTQUFTLENBQUksS0FBUTtRQUNuQixPQUFPLEtBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVcsQ0FBSSxPQUFnQjtRQUM3QixPQUFPLE9BQVksQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLHdCQUF3QixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDdE1oRSxzRUFtQkM7QUFFRCx3REFPQztBQUVELGtFQXNCQztBQXhORCxzS0FBNkM7QUFDN0MsZ0tBQXVDO0FBR3ZDLGlNQU04QjtBQUU5QiwwTUFBMkY7QUFFM0Y7O0dBRUc7QUFDSCxNQUFhLCtCQUErQjtJQUMxQyxhQUFhLEdBQUcsSUFBSSx3Q0FBb0IsRUFBRSxDQUFDO0lBQzNDLGlCQUFpQixHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU3QyxTQUFTLENBQUMsTUFBZTtRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxtQkFBVSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxVQUFVLENBQUM7WUFDcEMsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQzdCLE1BQU0sSUFBSSxtQkFBVSxDQUNsQix5RkFBeUYsS0FBSyxhQUFhLEdBQUcsZUFBZSxPQUFPLEtBQUssRUFBRSxDQUM1SSxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUNoRCxNQUFNLElBQUksbUJBQVUsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO2dCQUNqRyxDQUFDO2dCQUVELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxJQUFJLG1CQUFVLENBQ2xCLDhFQUE4RSxVQUFVLFlBQVksU0FBUyx3QkFBd0IsS0FBSyxZQUFZLE9BQU8sS0FBSyxhQUFhLEdBQUcsRUFBRSxDQUNyTCxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsK0RBQStEO1FBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxtQkFBVSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFJLE9BQWdCO1FBQ3BDLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksbUJBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQkFBTSxFQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RixJQUFJLG1CQUFtQixLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3ZDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQ0QsT0FBTyxpQkFBaUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUEzREQsMEVBMkRDO0FBRVksdUNBQStCLEdBQUcsSUFBSSwrQkFBK0IsRUFBRSxDQUFDO0FBRXJGLE1BQWEsb0NBQW9DO0lBQy9DLGFBQWEsR0FBRyxJQUFJLHdDQUFvQixFQUFFLENBQUM7SUFFcEMsU0FBUyxDQUFJLElBQU87UUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLDZDQUF5QixJQUFJLElBQUksWUFBWSxtREFBK0IsQ0FBQyxFQUFFLENBQUM7WUFDcEcsTUFBTSxJQUFJLG1CQUFVLENBQ2xCLHFHQUFxRyxJQUFJLENBQUMsU0FBUyxDQUNqSCxJQUFJLENBQ0wsRUFBRSxDQUNKLENBQUM7UUFDSixDQUFDO1FBRUQsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQywyQ0FBbUIsRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxtQkFBVSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsS0FBSyxtQkFBbUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkcsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSx3QkFBd0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLG1CQUFVLENBQUMscURBQXFELENBQUMsQ0FBQztZQUM5RSxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLG1CQUFVLENBQUMscURBQXFELENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsa0ZBQWtGO1FBQ2xGLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksbUJBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxvREFBb0Q7UUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxxQkFBTSxFQUFDLHlDQUFxQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsOERBQThEO0lBQzlELG1HQUFtRztJQUM1RixXQUFXLENBQUksT0FBZ0I7UUFDcEMsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxtQkFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xDLE9BQU8sU0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyx5Q0FBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBTSxFQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4Riw2Q0FBNkM7UUFDN0MsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkIsT0FBTyxTQUFjLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBELGtEQUFrRDtRQUNsRCxJQUFJLElBQUksS0FBSyx1Q0FBbUIsQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RFLHVFQUF1RTtZQUN2RSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sU0FBYyxDQUFDO1lBQ3hCLENBQUM7WUFDRCw2QkFBNkI7WUFDN0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssdUNBQW1CLENBQUMsUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ25ELEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFlLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0Qsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQywyQ0FBbUIsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLFNBQWMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxJQUFJLDZDQUF5QixDQUFDLElBQUksRUFBRSxLQUFLLENBQU0sQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUEvRUQsb0ZBK0VDO0FBRVksNENBQW9DLEdBQUcsSUFBSSxvQ0FBb0MsRUFBRSxDQUFDO0FBRS9GLDhGQUE4RjtBQUM5RixTQUFnQiw2QkFBNkIsQ0FDM0MsZ0JBQW1DLEVBQ25DLHFCQUEyRTtJQUUzRSxPQUFPO1FBQ0wsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxxQ0FBYSxFQUFDLHVDQUErQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixHQUFHLENBQUMscUJBQXFCO1lBQ3ZCLENBQUMsQ0FBQyxxQ0FBYSxFQUNYLDRDQUFvQyxFQUNwQyxNQUFNLENBQUMsV0FBVyxDQUNoQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUNqRyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLG1EQUErQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLENBQUMsQ0FDRixDQUNGLENBQ0Y7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ1IsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxhQUF5RDtJQUM5RixJQUFJLENBQUMsYUFBYTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1Q0FBZSxFQUFDLHVDQUErQixFQUFFLGFBQWEsQ0FBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FDeEcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUM5QixDQUFDLHVEQUF1RDtLQUMxRCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLDJCQUEyQixDQUN6QyxhQUF5RDtJQUV6RCxPQUFPLElBQUkseUNBQXFCLENBQzlCLE1BQU0sQ0FBQyxPQUFPLENBQ1osdUNBQWUsRUFDYiw0Q0FBb0MsRUFDcEMsYUFBYSxDQUNkLElBQUksRUFBRSxDQUNSLENBQUMsTUFBTSxDQUF3QixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2pELDhDQUE4QztRQUM5QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6Qyx3QkFBd0I7UUFDeEIsSUFBSSwyQ0FBbUIsRUFBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQXlCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ1AsQ0FBQztBQUNKLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ3hORCxzS0FBcUM7QUFFeEIsNkJBQXFCLEdBQUcsVUFBVSxDQUFDO0FBQ25DLHFCQUFhLEdBQUc7SUFDM0Isc0JBQXNCLEVBQUUsYUFBYTtJQUNyQyxxQkFBcUIsRUFBRSxjQUFjO0lBQ3JDLHNCQUFzQixFQUFFLFlBQVk7SUFDcEMsK0JBQStCLEVBQUUsZUFBZTtJQUNoRCwwQkFBMEIsRUFBRSxpQkFBaUI7Q0FDckMsQ0FBQztBQUdFLG9CQUFZLEdBQUc7SUFDMUIsc0JBQXNCLEVBQUUscUJBQU0sRUFBQyxxQkFBYSxDQUFDLHNCQUFzQixDQUFDO0lBQ3BFLHFCQUFxQixFQUFFLHFCQUFNLEVBQUMscUJBQWEsQ0FBQyxxQkFBcUIsQ0FBQztJQUNsRSxzQkFBc0IsRUFBRSxxQkFBTSxFQUFDLHFCQUFhLENBQUMsc0JBQXNCLENBQUM7SUFDcEUsK0JBQStCLEVBQUUscUJBQU0sRUFBQyxxQkFBYSxDQUFDLCtCQUErQixDQUFDO0lBQ3RGLDBCQUEwQixFQUFFLHFCQUFNLEVBQUMscUJBQWEsQ0FBQywwQkFBMEIsQ0FBQztDQUNwRSxDQUFDO0FBRUUsaUNBQXlCLEdBQUcsYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVHZELHdDQUVDO0FBU0Qsd0JBRUM7QUFNRCxvQ0FFQztBQU1ELHdCQUVDO0FBTUQsd0NBRUM7QUFNRCxnREFFQztBQU1ELGdDQUVDO0FBTUQsNEJBRUM7QUFNRCw0Q0FFQztBQWhGRCxxS0FBK0I7QUFJL0I7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEVBQWdDO0lBQzdELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLEVBQWdDO0lBQ3JELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLE1BQWM7SUFDekMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixNQUFNLENBQUMsR0FBYTtJQUNsQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxHQUF5QjtJQUN0RCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEdBQXlCO0lBQzFELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixVQUFVLENBQUMsR0FBYTtJQUN0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFFBQVEsQ0FBQyxFQUFhO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsRUFBZ0M7SUFDL0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2hGRCxtSkFBbUo7QUFDbkosOEJBQThCOzs7QUFnVTlCLHdCQUVDO0FBS0Qsd0JBRUM7QUF2VUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUN6QyxNQUFNLGFBQWEsR0FBRyw2REFBNkQsQ0FBQztBQUNwRixNQUFNLFlBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUV6QyxNQUFhLFdBQVc7SUFDdEIsTUFBTSxDQUFDLGtCQUFnRTtRQUNyRSxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXBILElBQUksZUFBZSxHQUFHLEVBQUUsRUFDdEIsTUFBTSxHQUFHLEVBQUUsRUFDWCxLQUFLLEdBQUcsQ0FBQyxFQUNULE9BQU8sR0FBRyxDQUFDLEVBQ1gsR0FBRyxHQUFHLENBQUMsRUFDUCxTQUFTLEdBQUcsQ0FBQyxFQUNiLE9BQU8sR0FBRyxDQUFDLEVBQ1gsR0FBRyxHQUFHLENBQUMsRUFDUCxHQUFHLEdBQUcsQ0FBQyxFQUNQLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNYLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQywyR0FBMkc7UUFDM0csT0FBTyxLQUFLLEdBQUcsR0FBRyxHQUFJLENBQUM7WUFDckIsT0FBTyxHQUFHLEtBQUssSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sR0FBRyxHQUFHLE9BQU8sRUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsNENBQTRDO2dCQUM1QyxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDN0IsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2pCLEtBQUssRUFBRTt3QkFDTCw0Q0FBNEM7d0JBQzVDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ2pELElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDOzRCQUMxQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN4QixNQUFNO3dCQUNSLENBQUM7d0JBQ0QsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUM7d0JBQ3RELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyx5REFBeUQ7d0JBQ3RFLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyw2QkFBNkI7b0JBQzVDLEtBQUssRUFBRTt3QkFDTCw0Q0FBNEM7d0JBQzVDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ2pELFNBQVMsS0FBSyxDQUFDLENBQUM7d0JBQ2hCLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDO3dCQUN4RCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMseURBQXlEO3dCQUMvRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsNEJBQTRCO29CQUMzRCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsNENBQTRDO3dCQUM1QyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUNqRCxTQUFTLEtBQUssQ0FBQyxDQUFDO3dCQUNoQixTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQzt3QkFDekQsT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFFNUIsOEJBQThCO3dCQUM5QixJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksU0FBUyxJQUFJLE9BQU8sSUFBSSxTQUFTLEdBQUcsUUFBUSxFQUFFLENBQUM7NEJBQ3JGLEdBQUcsR0FBRyxTQUFTLENBQUM7NEJBQ2hCLFNBQVMsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dDQUMxQyxpQkFBaUI7Z0NBQ2pCLDBCQUEwQjtnQ0FFMUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO2dDQUN4RCxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnRUFBZ0U7Z0NBRTFHLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDO29DQUNiLDBCQUEwQjtvQ0FDMUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztvQ0FDeEIsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQ0FDcEIsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dDQUNYLENBQUM7cUNBQU0sQ0FBQztvQ0FDTiw2RUFBNkU7b0NBQzdFLHVGQUF1RjtvQ0FDdkYsR0FBRyxHQUFHLEdBQUcsQ0FBQztvQ0FDVixHQUFHLEdBQUcsR0FBRyxDQUFDO29DQUNWLEdBQUcsR0FBRyxHQUFHLENBQUM7Z0NBQ1osQ0FBQzs0QkFDSCxDQUFDOztnQ0FBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbURBQW1EO3dCQUN6RixDQUFDOzZCQUFNLENBQUM7NEJBQ04sc0ZBQXNGOzRCQUN0RixHQUFHLEtBQUssQ0FBQyxDQUFDOzRCQUNWLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQTBDOzRCQUN6RSxHQUFHLEdBQUcsTUFBTSxDQUFDO3dCQUNmLENBQUM7d0JBRUQsc0RBQXNEO3dCQUN0RCxPQUFPLEdBQUcsQ0FBQyxDQUFDO3dCQUNaLFNBQVMsR0FBRyxDQUFDLENBQUM7d0JBQ2QsT0FBTyxHQUFHLEtBQUssSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN6RDs7Ozs7Ozs7Ozs7Ozs7K0JBY1c7b0JBQ1gsU0FBUywwQ0FBMEM7d0JBQ2pELFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7d0JBQ3hCLFNBQVM7b0JBQ1gsS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxDQUFDLENBQUM7b0JBQ1AsS0FBSyxDQUFDLENBQUM7Z0JBQ1QsQ0FBQztnQkFDRCxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsMENBQTBDO1lBQ3hFLENBQUM7WUFDRCxNQUFNLElBQUksWUFBWTtZQUNwQiw0Q0FBNEM7WUFDNUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FDakIsQ0FBQztZQUNGLElBQUksR0FBRyxHQUFHLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUNyRSxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsK0dBQStHO2dCQUMvRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUN0QixHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMscUJBQXFCO2dCQUN4QyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRVQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNO29CQUFFLFNBQVM7WUFDdkQsQ0FBQztpQkFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFFRCxlQUFlLElBQUksTUFBTSxDQUFDO1lBQzFCLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBaktELGtDQWlLQztBQUVELHNGQUFzRjtBQUN0RixTQUFTLGVBQWUsQ0FBQyxhQUFxQjtJQUM1Qyx5REFBeUQ7SUFDekQsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDcEIsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyw2REFBNkQ7WUFFL0csSUFBSSxNQUFNLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDN0MsaUVBQWlFO2dCQUNqRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLEtBQUssR0FBRyxNQUFNO29CQUNoQixPQUFPLFlBQVksQ0FDakIsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUN2QyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQzNELENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFDMUQsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FDcEQsQ0FBQztZQUNOLENBQUM7O2dCQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyx5REFBeUQ7UUFDeEcsQ0FBQzthQUFNLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLEtBQUssR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyx5REFBeUQ7UUFDakcsQ0FBQztJQUNILENBQUM7SUFDRDtXQUNPLENBQUMsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDNUIsT0FBTyxZQUFZLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDOztRQUNDLE9BQU8sWUFBWSxDQUNqQixDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQ3JDLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFDMUQsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FDcEQsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFhLFdBQVc7SUFDZixNQUFNLENBQUMsV0FBbUI7UUFDL0Isa0VBQWtFO1FBQ2xFLGtFQUFrRTtRQUNsRSxNQUFNLGFBQWEsR0FBRyxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFdBQVcsRUFDbEUsR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxTQUFxQixDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDUCxHQUFHLEdBQUcsQ0FBQyxFQUNQLEtBQUssR0FBRyxDQUFDLEVBQ1QsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxtQ0FBbUM7UUFDMUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUQsS0FBSyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUM7aUJBQU0sSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDOUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsRUFBRSxDQUFDO29CQUNYLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNwQixJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDcEIsUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyw2REFBNkQ7NEJBRXpILElBQUksTUFBTSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7Z0NBQzdDLGlFQUFpRTtnQ0FDakUsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDbkQsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7b0NBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7b0NBQ3RELE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQ0FDNUYsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDO29DQUMzRixNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDO29DQUNwRixTQUFTO2dDQUNYLENBQUM7Z0NBQ0QsTUFBTSxVQUFVLENBQUM7NEJBQ25CLENBQUM7NEJBQ0QsS0FBSyxHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLHlEQUF5RDt3QkFDakcsQ0FBQzs2QkFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLHlEQUF5RDt3QkFDakcsQ0FBQztvQkFDSCxDQUFDO29CQUNELElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDckUsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO3dCQUMzQixTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUN0QixNQUFNLEdBQUcsU0FBUyxDQUFDO29CQUNyQixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUMzRixNQUFNLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDO1lBQ3RGLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sVUFBVSxDQUFDLFdBQW1CLEVBQUUsS0FBaUI7UUFDdEQsTUFBTSxhQUFhLEdBQUcsV0FBVyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDL0csSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hDLENBQUMsR0FBRyxDQUFDLEVBQ0wsSUFBSSxHQUFHLENBQUMsRUFDUixJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxRQUFRLEdBQUcsR0FBRztZQUFFLEdBQUcsR0FBRyxRQUFRLENBQUM7UUFDbkMsUUFBUSxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLFFBQVEsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNsQixLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUM7d0JBQ0osSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsb0JBQW9CO29CQUNwQixLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLENBQUMsQ0FBQztvQkFDUCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsTUFBTTtvQkFDUixLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDOzRCQUM3QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixNQUFNO3dCQUNSLENBQUM7b0JBQ0gsS0FBSyxFQUFFO3dCQUNMLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQzs0QkFDN0IsdUVBQXVFOzRCQUN2RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixNQUFNO3dCQUNSLENBQUM7b0JBQ0gsS0FBSyxFQUFFO3dCQUNMLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQzs0QkFDN0IsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsTUFBTTt3QkFDUixDQUFDO29CQUNIO3dCQUNFLE1BQU0sUUFBUSxDQUFDO2dCQUNuQixDQUFDO2dCQUNELHVDQUF1QztnQkFDdkMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZFLENBQUM7Q0FDRjtBQWhIRCxrQ0FnSEM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFTO0lBQzlCLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLENBQWE7SUFDbEMsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxVUQsaUxBQTREO0FBRTVEOztHQUVHO0FBRUksSUFBTSxVQUFVLEdBQWhCLE1BQU0sVUFBVyxTQUFRLEtBQUs7SUFHakI7SUFGbEIsWUFDRSxPQUEyQixFQUNYLEtBQWU7UUFFL0IsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQztRQUZaLFVBQUssR0FBTCxLQUFLLENBQVU7SUFHakMsQ0FBQztDQUNGO0FBUFksZ0NBQVU7cUJBQVYsVUFBVTtJQUR0Qiw2Q0FBMEIsRUFBQyxZQUFZLENBQUM7R0FDNUIsVUFBVSxDQU90QjtBQUVEOztHQUVHO0FBRUksSUFBTSxxQkFBcUIsR0FBM0IsTUFBTSxxQkFBc0IsU0FBUSxVQUFVO0NBQUc7QUFBM0Msc0RBQXFCO2dDQUFyQixxQkFBcUI7SUFEakMsNkNBQTBCLEVBQUMsdUJBQXVCLENBQUM7R0FDdkMscUJBQXFCLENBQXNCO0FBRXhEOzs7R0FHRztBQUVJLElBQU0saUJBQWlCLEdBQXZCLE1BQU0saUJBQWtCLFNBQVEsS0FBSztDQUFHO0FBQWxDLDhDQUFpQjs0QkFBakIsaUJBQWlCO0lBRDdCLDZDQUEwQixFQUFDLG1CQUFtQixDQUFDO0dBQ25DLGlCQUFpQixDQUFpQjtBQUUvQzs7Ozs7O0dBTUc7QUFFSSxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFzQixTQUFRLEtBQUs7SUFHNUI7SUFDQTtJQUhsQixZQUNFLE9BQWUsRUFDQyxVQUFrQixFQUNsQixLQUF5QjtRQUV6QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIQyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLFVBQUssR0FBTCxLQUFLLENBQW9CO0lBRzNDLENBQUM7Q0FDRjtBQVJZLHNEQUFxQjtnQ0FBckIscUJBQXFCO0lBRGpDLDZDQUEwQixFQUFDLHVCQUF1QixDQUFDO0dBQ3ZDLHFCQUFxQixDQVFqQztBQUVEOztHQUVHO0FBRUksSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxLQUFLO0lBQ25CO0lBQTVCLFlBQTRCLFNBQWlCO1FBQzNDLEtBQUssQ0FBQyx5QkFBeUIsU0FBUyxHQUFHLENBQUMsQ0FBQztRQURuQixjQUFTLEdBQVQsU0FBUyxDQUFRO0lBRTdDLENBQUM7Q0FDRjtBQUpZLHdEQUFzQjtpQ0FBdEIsc0JBQXNCO0lBRGxDLDZDQUEwQixFQUFDLHdCQUF3QixDQUFDO0dBQ3hDLHNCQUFzQixDQUlsQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUksSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBbUIsU0FBUSxLQUFLO0NBQUc7QUFBbkMsZ0RBQWtCOzZCQUFsQixrQkFBa0I7SUFEOUIsNkNBQTBCLEVBQUMsb0JBQW9CLENBQUM7R0FDcEMsa0JBQWtCLENBQWlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDb1doRCw0REFVQztBQVNELHNEQUtDO0FBUUQsOEJBS0M7QUFsZEQsaUxBQW9GO0FBRXBGLHNNQUE4RDtBQUVqRCxzQkFBYyxHQUFHLGVBQWUsQ0FBQztBQUdqQyxtQkFBVyxHQUFHO0lBQ3pCLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxTQUFTLEVBQUUsV0FBVztJQUV0QixzREFBc0Q7SUFDdEQsMkJBQTJCLEVBQUUsZ0JBQWdCO0lBRTdDLHlEQUF5RDtJQUN6RCw4QkFBOEIsRUFBRSxtQkFBbUI7SUFFbkQseURBQXlEO0lBQ3pELDhCQUE4QixFQUFFLG1CQUFtQjtJQUVuRCxpREFBaUQ7SUFDakQsc0JBQXNCLEVBQUUsV0FBVztJQUVuQywyQ0FBMkM7SUFDM0Msd0JBQXdCLEVBQUUsU0FBUztDQUMzQixDQUFDO0FBR0UsS0FBeUMsK0NBQXVCLEVBTzNFO0lBQ0UsQ0FBQyxtQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7SUFDL0IsQ0FBQyxtQkFBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztJQUNsQyxDQUFDLG1CQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO0lBQ2xDLENBQUMsbUJBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQzFCLFdBQVcsRUFBRSxDQUFDO0NBQ04sRUFDVixlQUFlLENBQ2hCLEVBZmEseUJBQWlCLFVBQUUseUJBQWlCLFNBZWhEO0FBRVcsa0JBQVUsR0FBRztJQUN4QixXQUFXLEVBQUUsYUFBYTtJQUMxQixxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsd0JBQXdCLEVBQUUsMEJBQTBCO0lBQ3BELG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsZ0JBQWdCLEVBQUUsa0JBQWtCO0lBRXBDLG1EQUFtRDtJQUNuRCx1QkFBdUIsRUFBRSxhQUFhO0lBRXRDLDZEQUE2RDtJQUM3RCxpQ0FBaUMsRUFBRSx1QkFBdUI7SUFFMUQsK0NBQStDO0lBQy9DLG1CQUFtQixFQUFFLFNBQVM7SUFFOUIsZ0VBQWdFO0lBQ2hFLG9DQUFvQyxFQUFFLDBCQUEwQjtJQUVoRSw0REFBNEQ7SUFDNUQsZ0NBQWdDLEVBQUUsc0JBQXNCO0lBRXhELDZEQUE2RDtJQUM3RCxpQ0FBaUMsRUFBRSx1QkFBdUI7SUFFMUQsd0RBQXdEO0lBQ3hELDRCQUE0QixFQUFFLGtCQUFrQjtJQUVoRCwyQ0FBMkM7SUFDM0MsdUJBQXVCLEVBQUUsU0FBUztDQUMxQixDQUFDO0FBR0UsS0FBdUMsK0NBQXVCLEVBT3pFO0lBQ0UsQ0FBQyxrQkFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7SUFDM0IsQ0FBQyxrQkFBVSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztJQUNyQyxDQUFDLGtCQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN2QixDQUFDLGtCQUFVLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDO0lBQ3hDLENBQUMsa0JBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7SUFDcEMsQ0FBQyxrQkFBVSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztJQUNyQyxDQUFDLGtCQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0lBQ2hDLFdBQVcsRUFBRSxDQUFDO0NBQ04sRUFDVixjQUFjLENBQ2YsRUFsQmEsd0JBQWdCLFVBQUUsd0JBQWdCLFNBa0I5QztBQUVGOzs7Ozs7O0dBT0c7QUFDVSxrQ0FBMEIsR0FBRztJQUN4QyxNQUFNLEVBQUUsUUFBUTtDQUNSLENBQUM7QUFHRSxLQUF1RSwrQ0FBdUIsRUFPekc7SUFDRSxDQUFDLGtDQUEwQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDdEMsV0FBVyxFQUFFLENBQUM7Q0FDTixFQUNWLDZCQUE2QixDQUM5QixFQVphLHdDQUFnQyxVQUFFLHdDQUFnQyxTQVk5RTtBQUlGOzs7Ozs7R0FNRztBQUVJLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWdCLFNBQVEsS0FBSztJQVV0QjtJQVRsQjs7OztPQUlHO0lBQ0ksT0FBTyxDQUFnQjtJQUU5QixZQUNFLE9BQW1DLEVBQ25CLEtBQWE7UUFFN0IsS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQztRQUZaLFVBQUssR0FBTCxLQUFLLENBQVE7SUFHL0IsQ0FBQztDQUNGO0FBZFksMENBQWU7MEJBQWYsZUFBZTtJQUQzQiw2Q0FBMEIsRUFBQyxpQkFBaUIsQ0FBQztHQUNqQyxlQUFlLENBYzNCO0FBRUQscURBQXFEO0FBRTlDLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxlQUFlO0lBRzlCO0lBRmxCLFlBQ0UsT0FBMkIsRUFDWCxZQUFxQixFQUNyQyxLQUFhO1FBRWIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUhOLGlCQUFZLEdBQVosWUFBWSxDQUFTO0lBSXZDLENBQUM7Q0FDRjtBQVJZLHNDQUFhO3dCQUFiLGFBQWE7SUFEekIsNkNBQTBCLEVBQUMsZUFBZSxDQUFDO0dBQy9CLGFBQWEsQ0FRekI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUksSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBbUIsU0FBUSxlQUFlO0lBTW5DO0lBQ0E7SUFDQTtJQUVBO0lBQ0E7SUFWbEI7O09BRUc7SUFDSCxZQUNFLE9BQW1DLEVBQ25CLElBQWdDLEVBQ2hDLFlBQXlDLEVBQ3pDLE9BQXNDLEVBQ3RELEtBQWEsRUFDRyxjQUE0QyxFQUM1QyxRQUF3RDtRQUV4RSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBUE4sU0FBSSxHQUFKLElBQUksQ0FBNEI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQTZCO1FBQ3pDLFlBQU8sR0FBUCxPQUFPLENBQStCO1FBRXRDLG1CQUFjLEdBQWQsY0FBYyxDQUE4QjtRQUM1QyxhQUFRLEdBQVIsUUFBUSxDQUFnRDtJQUcxRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQXNCLEVBQUUsU0FBcUM7UUFDbkYsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQWtDO1FBQ3JELE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ2xHLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQXVCLEVBQUUsSUFBb0IsRUFBRSxHQUFHLE9BQWtCO1FBQzFGLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQXVCLEVBQUUsSUFBb0IsRUFBRSxHQUFHLE9BQWtCO1FBQzdGLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRjtBQS9EWSxnREFBa0I7NkJBQWxCLGtCQUFrQjtJQUQ5Qiw2Q0FBMEIsRUFBQyxvQkFBb0IsQ0FBQztHQUNwQyxrQkFBa0IsQ0ErRDlCO0FBNkNEOzs7Ozs7R0FNRztBQUVJLElBQU0sZ0JBQWdCLEdBQXRCLE1BQU0sZ0JBQWlCLFNBQVEsZUFBZTtJQUdqQztJQUZsQixZQUNFLE9BQTJCLEVBQ1gsVUFBcUIsRUFBRSxFQUN2QyxLQUFhO1FBRWIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUhOLFlBQU8sR0FBUCxPQUFPLENBQWdCO0lBSXpDLENBQUM7Q0FDRjtBQVJZLDRDQUFnQjsyQkFBaEIsZ0JBQWdCO0lBRDVCLDZDQUEwQixFQUFDLGtCQUFrQixDQUFDO0dBQ2xDLGdCQUFnQixDQVE1QjtBQUVEOztHQUVHO0FBRUksSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBa0IsU0FBUSxlQUFlO0lBQ3BELFlBQVksT0FBMkIsRUFBRSxLQUFhO1FBQ3BELEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUNGO0FBSlksOENBQWlCOzRCQUFqQixpQkFBaUI7SUFEN0IsNkNBQTBCLEVBQUMsbUJBQW1CLENBQUM7R0FDbkMsaUJBQWlCLENBSTdCO0FBRUQ7O0dBRUc7QUFFSSxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFlLFNBQVEsZUFBZTtJQUcvQjtJQUNBO0lBSGxCLFlBQ0UsT0FBMkIsRUFDWCxvQkFBNkIsRUFDN0IsV0FBd0I7UUFFeEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFTO1FBQzdCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBRzFDLENBQUM7Q0FDRjtBQVJZLHdDQUFjO3lCQUFkLGNBQWM7SUFEMUIsNkNBQTBCLEVBQUMsZ0JBQWdCLENBQUM7R0FDaEMsY0FBYyxDQVExQjtBQUVEOzs7OztHQUtHO0FBRUksSUFBTSxlQUFlLEdBQXJCLE1BQU0sZUFBZ0IsU0FBUSxlQUFlO0lBR2hDO0lBQ0E7SUFDQTtJQUNBO0lBTGxCLFlBQ0UsT0FBMkIsRUFDWCxZQUFvQixFQUNwQixVQUE4QixFQUM5QixVQUFzQixFQUN0QixRQUE0QixFQUM1QyxLQUFhO1FBRWIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQU5OLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLGVBQVUsR0FBVixVQUFVLENBQW9CO1FBQzlCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBb0I7SUFJOUMsQ0FBQztDQUNGO0FBWFksMENBQWU7MEJBQWYsZUFBZTtJQUQzQiw2Q0FBMEIsRUFBQyxpQkFBaUIsQ0FBQztHQUNqQyxlQUFlLENBVzNCO0FBRUQ7Ozs7O0dBS0c7QUFFSSxJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFxQixTQUFRLGVBQWU7SUFFckM7SUFDQTtJQUNBO0lBQ0E7SUFKbEIsWUFDa0IsU0FBNkIsRUFDN0IsU0FBNEIsRUFDNUIsWUFBb0IsRUFDcEIsVUFBc0IsRUFDdEMsS0FBYTtRQUViLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQU5oQyxjQUFTLEdBQVQsU0FBUyxDQUFvQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFtQjtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBSXhDLENBQUM7Q0FDRjtBQVZZLG9EQUFvQjsrQkFBcEIsb0JBQW9CO0lBRGhDLDZDQUEwQixFQUFDLHNCQUFzQixDQUFDO0dBQ3RDLG9CQUFvQixDQVVoQztBQUVEOzs7O0dBSUc7QUFFSSxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFzQixTQUFRLGVBQWU7SUFHdEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQU5sQixZQUNFLE9BQTJCLEVBQ1gsZ0JBQW9DLEVBQ3BDLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixTQUFpQixFQUNqQixjQUFrQyxFQUNsRCxLQUFhO1FBRWIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQVBOLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDcEMsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixtQkFBYyxHQUFkLGNBQWMsQ0FBb0I7SUFJcEQsQ0FBQztDQUNGO0FBWlksc0RBQXFCO2dDQUFyQixxQkFBcUI7SUFEakMsNkNBQTBCLEVBQUMsdUJBQXVCLENBQUM7R0FDdkMscUJBQXFCLENBWWpDO0FBRUQsdUdBQXVHO0FBRXZHOzs7Ozs7O0dBT0c7QUFFSSxJQUFNLG9DQUFvQyxHQUExQyxNQUFNLG9DQUFxQyxTQUFRLGVBQWU7SUFHckQ7SUFDQTtJQUhsQixZQUNFLE9BQWUsRUFDQyxVQUFrQixFQUNsQixZQUFvQjtRQUVwQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIQyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLGlCQUFZLEdBQVosWUFBWSxDQUFRO0lBR3RDLENBQUM7Q0FDRjtBQVJZLG9GQUFvQzsrQ0FBcEMsb0NBQW9DO0lBRGhELDZDQUEwQixFQUFDLHNDQUFzQyxDQUFDO0dBQ3RELG9DQUFvQyxDQVFoRDtBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBYztJQUNyRCxJQUFJLEtBQUssWUFBWSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsMkJBQVEsRUFBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVFLE1BQU0sSUFBSSxHQUFHLENBQUMsMkJBQVEsRUFBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUN2RixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQywyQkFBUSxFQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLEdBQVk7SUFDaEQsSUFBSSxHQUFHLFlBQVksZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYztJQUN0QyxJQUFJLEtBQUssWUFBWSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sK0JBQVksRUFBQyxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDOzs7Ozs7Ozs7Ozs7O0FDbmREOzs7O0dBSUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaURILGdCQUVDO0FBUUQsa0JBRUM7QUFRRCxvQ0FFQztBQVFELDhCQUVDO0FBL0VELGlMQUF1QztBQUN2Qyx3TEFBMEM7QUFFMUMseUxBQW1DO0FBQ25DLGtPQUFrSDtBQUFyRSx3S0FBMkI7QUFDeEUsd0xBQStEO0FBQXRELHdKQUEwQjtBQUNuQyx5TUFBMkM7QUFDM0MsK01BQThDO0FBQzlDLHVNQUEwQztBQUMxQywrTUFBOEM7QUFNOUMsdUxBQWtDO0FBQ2xDLHVMQUFrQztBQUNsQyxxS0FBeUI7QUFDekIsdUtBQTBCO0FBRTFCLDZLQUE2QjtBQUM3QixxS0FBeUI7QUFDekIseUtBQTJCO0FBQzNCLHVLQUEwQjtBQUMxQixpTEFBK0I7QUFFL0IsNkxBQXFDO0FBQ3JDLCtNQUE4QztBQUM5Qyx1TEFBa0M7QUFDbEMseUxBQW1DO0FBQ25DLDJMQUFvQztBQUNwQyw4TEFRNkI7QUFMM0IsNElBQW1CO0FBR25CLGdKQUFxQjtBQUNyQixzSkFBd0I7QUFHMUI7Ozs7O0dBS0c7QUFDSCxTQUFnQixFQUFFLENBQUMsQ0FBUztJQUMxQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsR0FBRyxDQUFDLEdBQWU7SUFDakMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYztJQUN0QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUN4REQsMERBaUJDO0FBYUQsa0RBRUM7QUE5Q0Q7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLHVCQUF1QixDQUNyQyxZQUFpQixFQUNqQixNQUFTLEVBQ1QsSUFBZ0IsRUFDaEIsUUFBa0I7SUFFbEIsSUFBSSxZQUFZLEdBQVEsSUFBSSxDQUFDO0lBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwQywrR0FBK0c7WUFDL0csOEJBQThCO1lBQzlCLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBRSxXQUFXLENBQUMsTUFBTSxDQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFRLENBQUM7UUFDcEYsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsdURBQXVEO0FBQ3ZELFNBQWdCLG1CQUFtQixDQUF1QixZQUFpQixFQUFFLE1BQVMsRUFBRSxJQUFnQjtJQUN0RyxPQUFPLHVCQUF1QixDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBYSxDQUFDLENBQUM7QUFDekcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDeUREOzs7R0FHRztBQUNVLCtCQUF1QixHQUFHO0lBQ3JDOztPQUVHO0lBQ0gsZ0JBQWdCLEVBQUUsa0JBQWtCO0lBRXBDOzs7OztPQUtHO0lBQ0gsT0FBTyxFQUFFLFNBQVM7Q0FDVixDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3JCWCwwREEwR0M7QUE1TkQsZ0tBQXVDO0FBR3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThHRztBQUNILFNBQWdCLHVCQUF1QixDQW9DckMsUUFBa0IsRUFDbEIsTUFBYztJQU9kLE1BQU0sWUFBWSxHQUErQyxNQUFNLENBQUMsV0FBVyxDQUNqRixNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUksUUFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUssUUFBZ0IsQ0FBQyxHQUFHLE1BQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpILFNBQVMscUJBQXFCLENBQUMsQ0FBVTtRQUN2QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDO0lBQ2hELENBQUM7SUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQVU7UUFDcEMsT0FBTyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQztJQUNwRCxDQUFDO0lBRUQsU0FBUyxNQUFNLENBQ2IsS0FBZ0c7UUFFaEcsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxPQUFPLEdBQVcsS0FBSyxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUNELElBQUkscUJBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUNELE1BQU0sSUFBSSxtQkFBVSxDQUFDLHdCQUF3QixLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksbUJBQVUsQ0FBQyx3QkFBd0IsS0FBSyxhQUFhLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsTUFBTSxDQUFDLEtBQXdDO1FBQ3RELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksY0FBYyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUVELDhGQUE4RjtZQUM5Riw0RkFBNEY7WUFDNUYsMkZBQTJGO1lBQzNGLDRGQUE0RjtZQUM1Rix3RkFBd0Y7WUFDeEYsOEVBQThFO1lBQzlFLEVBQUU7WUFDRixnR0FBZ0c7WUFDaEcsZ0ZBQWdGO1lBQ2hGLE9BQU8sV0FBVyxLQUFLLEVBQXdCLENBQUM7UUFDbEQsQ0FBQztRQUVELE1BQU0sSUFBSSxtQkFBVSxDQUFDLDhCQUE4QixLQUFLLGFBQWEsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBVSxDQUFDO0FBQ25DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNU5ELHFNQUFnQztBQUNoQywwTUFLMkI7QUFKekIsZ0pBQXNCO0FBQ3RCLDRIQUFZO0FBQ1osdUJBQXVCO0FBQ3ZCLHNIQUFTOzs7Ozs7Ozs7Ozs7OztBQ0ZYLHdEQUVDO0FBYUQsb0NBa0JDO0FBZUQsOEJBZUM7QUFsRUQ7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBZ0MsR0FBTTtJQUMxRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFRLENBQUM7QUFDdkYsQ0FBQztBQWFELFNBQWdCLFlBQVksQ0FDMUIsUUFBdUIsRUFDdkIsS0FBb0I7SUFFcEIsSUFBSSxRQUFRLElBQUksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ25DLElBQUksS0FBSyxJQUFJLElBQUk7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUVuQyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0lBQ3BELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUUsTUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQVM7SUFDekIsT0FBTyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixTQUFTLENBQWdDLE1BQVMsRUFBRSxNQUFrQjtJQUNwRixNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFFN0IsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sQ0FBQyxHQUFjLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQy9ELENBQUM7aUJBQU0sQ0FBQztnQkFDTCxNQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ2xFRCxzTUFBMkU7QUFrQjNFOzs7Ozs7OztHQVFHO0FBQ0gsSUFBWSxZQW1DWDtBQW5DRCxXQUFZLFlBQVk7SUFDdEI7OztPQUdHO0lBQ0gscUNBQXFCO0lBRXJCOzs7T0FHRztJQUNILHFDQUFxQjtJQUVyQjs7O09BR0c7SUFDSCwrQkFBZTtJQUVmOzs7Ozs7Ozs7T0FTRztJQUNILGlDQUFpQjtJQUVqQjs7T0FFRztJQUNILDZCQUFhO0FBQ2YsQ0FBQyxFQW5DVyxZQUFZLDRCQUFaLFlBQVksUUFtQ3ZCO0FBVUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLDBCQUEwQjtJQXlCbEI7SUFDQTtJQXpCbkI7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWMsRUFBRSxVQUF5QjtRQUM3RCx5REFBeUQ7UUFDekQsSUFBSSxNQUFNLFlBQVksMEJBQTBCLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRSxtR0FBbUc7WUFDbkcsSUFBSSxZQUFZLEtBQUssU0FBUztnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUM5QyxPQUFPLElBQUksMEJBQTBCLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUQsSUFBSSxZQUFZLEtBQUssU0FBUztnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUM5QyxPQUFPLElBQUksMEJBQTBCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQsWUFDbUIsWUFBb0IsRUFDcEIsWUFBNkI7UUFEN0IsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsaUJBQVksR0FBWixZQUFZLENBQWlCO0lBQzdDLENBQUM7SUFFSixHQUFHLENBQUMsS0FBZSxFQUFFLE9BQWUsRUFBRSxTQUF1QjtRQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsU0FBdUI7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsU0FBdUI7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFlLEVBQUUsU0FBdUI7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFlLEVBQUUsU0FBdUI7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsU0FBdUI7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQztDQUNGO0FBcERELGdFQW9EQztBQUVELFNBQVMsZUFBZSxDQUFDLFlBQTZCLEVBQUUsU0FBdUI7SUFDN0UsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sOENBQXNCLEVBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxhQUFhLENBQ3BCLG9CQUFpRCxFQUNqRCxjQUE2QjtJQUU3Qiw4RkFBOEY7SUFDOUYsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkYsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksb0JBQW9CLElBQUksSUFBSSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGlHQUFpRztJQUNqRyxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcsb0NBQVksRUFBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbEQsSUFBSSxNQUFNLEtBQUssSUFBSTtZQUFFLE9BQU8sb0JBQW9CLENBQUM7UUFDakQsT0FBTyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsT0FBTyxDQUFDLEdBQUcsb0JBQW9CLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDeEtELHNNQUEyRTtBQXlOM0Usb0dBQW9HO0FBRXBHOztHQUVHO0FBQ0gsTUFBTSxlQUFlO0lBQ25CLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLFdBQW9CO1FBQzdELE9BQU87WUFDTCxJQUFJO1lBQ0osSUFBSTtZQUNKLFdBQVc7WUFFWCxJQUFJLEVBQUUsU0FBUztZQUNmLFNBQVMsRUFBRSxLQUFLO1lBRWhCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFHLENBQUM7WUFFMUIsUUFBUSxDQUFDLFVBQVU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZSxDQUNiLElBQVksRUFDWixZQUFvQyxLQUFLLEVBQ3pDLElBQWEsRUFDYixXQUFvQjtRQUVwQixPQUFPO1lBQ0wsSUFBSTtZQUNKLElBQUk7WUFDSixXQUFXO1lBRVgsSUFBSSxFQUFFLFdBQVc7WUFDakIsU0FBUztZQUVULE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFHLENBQUM7WUFFN0IsUUFBUSxDQUFDLFVBQVU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUNULElBQVksRUFDWixZQUFvQyxLQUFLLEVBQ3pDLElBQWEsRUFDYixXQUFvQjtRQUVwQixPQUFPO1lBQ0wsSUFBSTtZQUNKLElBQUk7WUFDSixXQUFXO1lBRVgsSUFBSSxFQUFFLE9BQU87WUFDYixTQUFTO1lBRVQsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUcsQ0FBQztZQUUxQixRQUFRLENBQUMsVUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLFdBQW9CO1FBQ25FLE9BQU87WUFDTCxJQUFJO1lBQ0osSUFBSTtZQUNKLFdBQVc7WUFFWCxJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLFNBQVMsRUFBRSxLQUFLO1lBRWhCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFHLENBQUM7WUFFMUIsUUFBUSxDQUFDLFVBQVU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUSxDQUFDLFVBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRVksdUJBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0FBTXJEOzs7Ozs7R0FNRztBQUNILE1BQWEsMkJBQTJCO0lBK0JuQjtJQUNBO0lBL0JuQjs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWtCLEVBQUUsVUFBNEIsRUFBRSxRQUFpQixLQUFLO1FBQzVGLElBQUksS0FBSyxZQUFZLDJCQUEyQixFQUFFLENBQUM7WUFDakQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbkUsa0dBQWtHO1lBQ2xHLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDdkQsT0FBTyxJQUFJLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMxRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3ZELE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFDbUIsV0FBd0IsRUFDeEIsWUFBZ0M7UUFEaEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQW9CO0lBQ2hELENBQUM7SUFFSixhQUFhLENBQUMsSUFBWSxFQUFFLElBQWEsRUFBRSxXQUFvQjtRQUM3RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxlQUFlLENBQ2IsSUFBWSxFQUNaLFlBQW9DLEtBQUssRUFDekMsSUFBYSxFQUNiLFdBQW9CO1FBRXBCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdGLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxXQUFXLENBQ1QsSUFBWSxFQUNaLFlBQW9DLEtBQUssRUFDekMsSUFBYSxFQUNiLFdBQW9CO1FBRXBCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLFdBQW9CO1FBQ25FLHVGQUF1RjtRQUN2RixrRkFBa0Y7UUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRixPQUFPLElBQUksbUNBQW1DLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQWdCO1FBQ3ZCLE9BQU8sMkJBQTJCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUF6RUQsa0VBeUVDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLDZCQUE2QjtJQUt2QjtJQUNBO0lBTE0sSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxDLFlBQ1UsYUFBNEIsRUFDNUIsWUFBZ0M7UUFEaEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQW9CO0lBQ3ZDLENBQUM7SUFFSixHQUFHLENBQUMsS0FBYSxFQUFFLFNBQWtDO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBcUI7UUFDNUIsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxZQUFZLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSwrQkFBK0I7SUFJekI7SUFDQTtJQUpNLElBQUksR0FBRyxXQUFXLENBQUM7SUFFbkMsWUFDVSxlQUFnQyxFQUNoQyxZQUFnQztRQURoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQW9CO0lBQ3ZDLENBQUM7SUFFSixNQUFNLENBQUMsS0FBYSxFQUFFLFNBQXNCO1FBQzFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBcUI7UUFDNUIsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxZQUFZLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sMkJBQTJCO0lBSXJCO0lBQ0E7SUFKTSxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBRS9CLFlBQ1UsV0FBd0IsRUFDeEIsWUFBZ0M7UUFEaEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQW9CO0lBQ3ZDLENBQUM7SUFFSixHQUFHLENBQUMsS0FBYSxFQUFFLFNBQXNCO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBcUI7UUFDNUIsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxZQUFZLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sbUNBQW1DO0lBSzdCO0lBQ0E7SUFMTSxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDekIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUVsQyxZQUNVLGFBQWtDLEVBQ2xDLFlBQWdDO1FBRGhDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBb0I7SUFDdkMsQ0FBQztJQUVKLEdBQUcsQ0FBQyxLQUFhLEVBQUUsU0FBa0M7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELFFBQVEsQ0FBQyxTQUFxQjtRQUM1QixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRSxJQUFJLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUMsT0FBTyxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBRUQsU0FBUyxXQUFXLENBQUMsWUFBZ0MsRUFBRSxTQUFzQjtJQUMzRSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDcEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkMsT0FBTyw4Q0FBc0IsRUFBQyxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsb0JBQW9ELEVBQ3BELGNBQWdDO0lBRWhDLDhGQUE4RjtJQUM5RixJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsSUFBSSxvQkFBb0IsSUFBSSxJQUFJLElBQUksb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUdBQWlHO0lBQ2pHLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxvQ0FBWSxFQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sS0FBSyxJQUFJO1lBQUUsT0FBTyxvQkFBb0IsQ0FBQztRQUNqRCxPQUFPLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxPQUFPLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNuRCxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3pnQkQsd0NBTUM7QUFLRCwwQ0FlQztBQTdCRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxRQUFrRDtJQUMvRSxPQUFPO1FBQ0wsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLElBQUksU0FBUztRQUMvQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsSUFBSSxTQUFTO1FBQy9DLGNBQWMsRUFBRSxRQUFRLEVBQUUsY0FBYyxJQUFJLFNBQVM7S0FDdEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxRQUFrQjtJQUNoRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLENBQUM7UUFDdEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRTtRQUN2QyxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsSUFBSSxDQUFDO0tBQzdDLENBQUM7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUN4REQsa0RBUUM7QUF0Q1ksZ0NBQXdCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLDhCQUFzQixHQUFHLGVBQWUsQ0FBQztBQUN6Qyx1Q0FBK0IsR0FBRyx3QkFBd0IsQ0FBQztBQU94RTs7Ozs7R0FLRztBQUNILE1BQU0sK0JBQStCLEdBQWdELElBQUksR0FBRyxDQUFDO0lBQzNGLCtCQUErQjtJQUMvQixDQUFDLG9DQUFvQyxFQUFFLFFBQVEsQ0FBQztJQUNoRCxDQUFDLGlDQUFpQyxFQUFFLFFBQVEsQ0FBQztJQUM3QyxDQUFDLG1DQUFtQyxFQUFFLE9BQU8sQ0FBQztDQUMvQyxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsSUFBNEIsRUFBRSxJQUFZO0lBQzVFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQ0FBd0IsQ0FBQyxJQUFJLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwRyxNQUFNLElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxXQUFXLElBQUksNkJBQTZCLGdDQUF3QixHQUFHLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBRUQsSUFBSSxJQUFJLEtBQUssOEJBQXNCLElBQUksSUFBSSxLQUFLLHVDQUErQixFQUFFLENBQUM7UUFDaEYsTUFBTSxJQUFJLFNBQVMsQ0FBQyxjQUFjLElBQUksV0FBVyxJQUFJLDZCQUE2QixDQUFDLENBQUM7SUFDdEYsQ0FBQztBQUNILENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDV0QsZ0RBaUNDO0FBS0Qsb0RBY0M7QUFwR0QsK0pBQXNDO0FBRXRDLHlKQUFnRztBQTJDaEc7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxXQUF3QjtJQUN6RCxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLGtCQUFrQixJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxtQkFBVSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxJQUFJLFdBQVcsQ0FBQyxlQUFlLEtBQUssTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0QsdUNBQXVDO1lBQ3ZDLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDO1lBQ3ZELFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDeEIsQ0FBQzthQUFNLElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksbUJBQVUsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7YUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksbUJBQVUsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxlQUFlLEdBQUcsNkJBQWtCLEVBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sZUFBZSxHQUFHLHFCQUFVLEVBQUMsV0FBVyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN4RSxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksbUJBQVUsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksbUJBQVUsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksZUFBZSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxtQkFBVSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUNELE9BQU87UUFDTCxlQUFlLEVBQUUsV0FBVyxDQUFDLGVBQWU7UUFDNUMsZUFBZSxFQUFFLGlCQUFNLEVBQUMsZUFBZSxDQUFDO1FBQ3hDLGVBQWUsRUFBRSx5QkFBYyxFQUFDLGVBQWUsQ0FBQztRQUNoRCxrQkFBa0IsRUFBRSxXQUFXLENBQUMsa0JBQWtCO1FBQ2xELHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxzQkFBc0I7S0FDM0QsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxXQUF3RDtJQUV4RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxrQkFBa0IsRUFBRSxXQUFXLENBQUMsa0JBQWtCLElBQUksU0FBUztRQUMvRCxlQUFlLEVBQUUsV0FBVyxDQUFDLGVBQWUsSUFBSSxTQUFTO1FBQ3pELGVBQWUsRUFBRSx5QkFBYyxFQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDNUQsZUFBZSxFQUFFLHlCQUFjLEVBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQztRQUM1RCxzQkFBc0IsRUFBRSxXQUFXLENBQUMsc0JBQXNCLElBQUksU0FBUztLQUN4RSxDQUFDO0FBQ0osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ2hERCxrREFxQkM7QUFPRCw0REFFQztBQWxGRCxzTUFBOEQ7QUFTakQsMkJBQW1CLEdBQUc7SUFDakMsSUFBSSxFQUFFLE1BQU07SUFDWixPQUFPLEVBQUUsU0FBUztJQUNsQixHQUFHLEVBQUUsS0FBSztJQUNWLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLElBQUksRUFBRSxNQUFNO0lBQ1osUUFBUSxFQUFFLFVBQVU7SUFDcEIsWUFBWSxFQUFFLGNBQWM7Q0FDcEIsQ0FBQztBQUdYLHNHQUFzRztBQUN0Ryx1QkFBdUI7QUFDVixLQUE2QywrQ0FBdUIsRUFPL0U7SUFDRSxDQUFDLDJCQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDN0IsQ0FBQywyQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ2hDLENBQUMsMkJBQW1CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUM1QixDQUFDLDJCQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDL0IsQ0FBQywyQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzdCLENBQUMsMkJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUNqQyxDQUFDLDJCQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7SUFDckMsV0FBVyxFQUFFLENBQUM7Q0FDTixFQUNWLHFCQUFxQixDQUN0QixFQWxCYSw2Q0FBcUMsVUFBRSxTQUFDLFNBa0JwRDtBQVlGLFNBQWdCLG1CQUFtQixDQUNqQyxJQUFPLEVBQ1AsS0FBYztJQUVkLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLDJCQUFtQixDQUFDLElBQUksQ0FBQztRQUM5QixLQUFLLDJCQUFtQixDQUFDLE9BQU87WUFDOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7UUFDbkMsS0FBSywyQkFBbUIsQ0FBQyxHQUFHO1lBQzFCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxLQUFLLDJCQUFtQixDQUFDLE1BQU07WUFDN0IsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7UUFDbkMsS0FBSywyQkFBbUIsQ0FBQyxJQUFJO1lBQzNCLE9BQU8sT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO1FBQ3BDLEtBQUssMkJBQW1CLENBQUMsUUFBUTtZQUMvQixPQUFPLEtBQUssWUFBWSxJQUFJLENBQUM7UUFDL0IsS0FBSywyQkFBbUIsQ0FBQyxZQUFZO1lBQ25DLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNqRjtZQUNFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBT0QsU0FBZ0Isd0JBQXdCLENBQWdDLElBQVksRUFBRSxJQUFPO0lBQzNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sd0JBQXdCO0lBQ1gsS0FBSyxDQUFJO0lBQ1QsTUFBTSxDQUFJO0lBRTNCLFlBQVksSUFBTyxFQUFFLEtBQVE7UUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELHdDQUF3QztBQUN4QywwQ0FBMEM7QUFDMUMsTUFBYSx5QkFBeUQsU0FBUSx3QkFBMkI7Q0FBRztBQUE1Ryw4REFBNEc7QUFDNUcsdUJBQXVCO0FBQ3ZCLE1BQWEsK0JBQStELFNBQVEsd0JBR25GO0NBQUc7QUFISiwwRUFHSTtBQVVKLE1BQWEscUJBQXFCO0lBQ3hCLGdCQUFnQixHQUFtRSxFQUFFLENBQUM7SUFFOUYsWUFBWSxpQkFBeUM7UUFDbkQsSUFBSSxpQkFBaUIsS0FBSyxTQUFTO1lBQUUsT0FBTztRQUM1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDckMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRyxDQUFDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBZ0MsR0FBMEI7UUFDM0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxrQ0FBa0M7UUFDbEMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFtRSxFQUFFLENBQUM7UUFFakYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNoRSxpREFBaUQ7WUFDakQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN2Qiw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUMvQixLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN4QyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzdCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGdHQUFnRztJQUNoRyxVQUFVLENBQUMsT0FBb0M7UUFDN0MsOENBQThDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixpQkFBaUI7UUFDakIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxvREFBb0Q7SUFDNUMsTUFBTSxDQUFDLE9BQW9DO1FBQ2pELGlCQUFpQjtRQUNqQixLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzNCLG9CQUFvQjtZQUNwQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLG9EQUFvRDtnQkFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDOUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztnQkFDRCxTQUFTO1lBQ1gsQ0FBQztZQUNELDJCQUEyQjtZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLEdBQUcsR0FBMEIsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDaEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0Msd0NBQXdDO1lBQ3hDLElBQUksbUJBQW1CLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQXlCLENBQUMsQ0FBQztZQUN2RSxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FDdEIsR0FBVyxFQUNYLEtBQXFDO1FBRXJDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNsRCxRQUFRLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbkIsS0FBSyxRQUFRO2dCQUNYLCtEQUErRDtnQkFDL0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO29CQUMzRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsMkJBQW1CLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzNELENBQUM7Z0JBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLDJCQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELEtBQUssUUFBUTtnQkFDWCxPQUFPO29CQUNMLElBQUksRUFBRSxHQUFHO29CQUNULElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLDJCQUFtQixDQUFDLE1BQU07aUJBQ25GLENBQUM7WUFDSixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLDJCQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELEtBQUssUUFBUTtnQkFDWCxJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLDJCQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMzRCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsMkJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQy9ELENBQUM7Z0JBQ0QsT0FBTztZQUNUO2dCQUNFLE9BQU87UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBeUI7UUFDN0MsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssMkJBQW1CLENBQUMsSUFBSTtnQkFDM0IsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSywyQkFBbUIsQ0FBQyxPQUFPO2dCQUM5QixPQUFPLFNBQVMsQ0FBQztZQUNuQixLQUFLLDJCQUFtQixDQUFDLEdBQUc7Z0JBQzFCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSywyQkFBbUIsQ0FBQyxNQUFNO2dCQUM3QixPQUFPLFFBQVEsQ0FBQztZQUNsQixLQUFLLDJCQUFtQixDQUFDLElBQUk7Z0JBQzNCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLEtBQUssMkJBQW1CLENBQUMsUUFBUTtnQkFDL0IsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSywyQkFBbUIsQ0FBQyxZQUFZO2dCQUNuQyxPQUFPLGFBQWEsQ0FBQztZQUN2QjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQVk7UUFDdkMseUVBQXlFO1FBQ3pFLHNGQUFzRjtRQUN0RixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLHlCQUF5QjtnQkFDNUIsT0FBTywyQkFBbUIsQ0FBQyxJQUFJLENBQUM7WUFDbEMsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLDRCQUE0QjtnQkFDL0IsT0FBTywyQkFBbUIsQ0FBQyxPQUFPLENBQUM7WUFDckMsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLHdCQUF3QjtnQkFDM0IsT0FBTywyQkFBbUIsQ0FBQyxHQUFHLENBQUM7WUFDakMsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLDJCQUEyQjtnQkFDOUIsT0FBTywyQkFBbUIsQ0FBQyxNQUFNLENBQUM7WUFDcEMsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLHlCQUF5QjtnQkFDNUIsT0FBTywyQkFBbUIsQ0FBQyxJQUFJLENBQUM7WUFDbEMsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyw2QkFBNkI7Z0JBQ2hDLE9BQU8sMkJBQW1CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLEtBQUssYUFBYSxDQUFDO1lBQ25CLEtBQUssaUNBQWlDO2dCQUNwQyxPQUFPLDJCQUFtQixDQUFDLFlBQVksQ0FBQztZQUMxQztnQkFDRSxPQUFPO1FBQ1gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQW5MRCxzREFtTEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDblJELHdDQUtDO0FBTUQsd0NBS0M7QUFLRCx3QkFTQztBQUVELG9DQU9DO0FBRUQsd0JBRUM7QUFFRCx3Q0FFQztBQUVELGdEQUdDO0FBRUQsZ0NBS0M7QUFVRCw0QkFFQztBQUdELDRDQUVDO0FBRUQsNENBS0M7QUFHRCw0Q0FLQztBQW5IRCx3SUFBd0I7QUFFeEIsK0lBQW9CO0FBRXBCLCtKQUFzQztBQWdCdEM7OztHQUdHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEVBQWdDO0lBQzdELElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixjQUFjLENBQUMsRUFBZ0MsRUFBRSxTQUFpQjtJQUNoRixJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxTQUFTLDJCQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixNQUFNLENBQUMsRUFBZ0M7SUFDckQsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUM5QixPQUFPLENBQUMsT0FBTyxJQUFJLGNBQUksQ0FBQyxLQUFLLENBQUM7U0FDM0IsR0FBRyxDQUFDLElBQUksQ0FBQztTQUNULEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZDLFFBQVEsRUFBRSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsTUFBYztJQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDeEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksbUJBQVUsQ0FBQyxrQkFBa0IsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFnQixNQUFNLENBQUMsR0FBYTtJQUNsQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEdBQWdDO0lBQzdELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsR0FBeUI7SUFDMUQsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3hDLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxTQUFnQixVQUFVLENBQUMsR0FBYTtJQUN0QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBZ0I7SUFDeEMsTUFBTSxNQUFNLEdBQUcsZ0JBQUUsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw2QkFBNkIsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxFQUFhO0lBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELHVCQUF1QjtBQUN2QixTQUFnQixnQkFBZ0IsQ0FBQyxFQUFnQyxFQUFFLFNBQWlCO0lBQ2xGLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxFQUFnQztJQUMvRCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsU0FBZ0IsZ0JBQWdCLENBQUMsSUFBNkI7SUFDNUQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUMzRkQsb0NBRUM7QUFrRkQsNEJBRUM7QUFFRCx3Q0FLQztBQUVELDRDQUtDO0FBRUQsMEJBT0M7QUFFRCxvQ0FFQztBQUtELG9DQU9DO0FBYUQsOEJBTUM7QUFLRCxrQ0FFQztBQStCRCxnRUF3QkM7QUEvTUQsOENBQThDO0FBQzlDLFNBQWdCLFlBQVk7SUFDMUIsd0JBQXdCO0FBQzFCLENBQUM7QUFrRkQsU0FBZ0IsUUFBUSxDQUFDLEtBQWM7SUFDckMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUM1QixNQUFTLEVBQ1QsSUFBTztJQUVQLE9BQU8sSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUN4QixDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQzlCLE1BQVMsRUFDVCxLQUFVO0lBRVYsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQWdCLE9BQU8sQ0FBQyxLQUFjO0lBQ3BDLE9BQU8sQ0FDTCxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDOUIsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVE7UUFDakMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQ3pELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLEtBQWM7SUFDekMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7QUFDdkQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEtBQWM7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQU1ELFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYztJQUN0QyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEdBQVcsRUFBRSxDQUFRO0lBQy9DLE1BQU0sSUFBSSxTQUFTLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQWtCLFVBQWtCO0lBQzVFLE9BQU8sQ0FBQyxLQUFlLEVBQVEsRUFBRTtRQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDL0MsNENBQTRDO1lBQzVDLEtBQUssRUFBRSxVQUFxQixLQUFhO2dCQUN2QyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUssS0FBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQztnQkFDNUQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHlHQUF5RztvQkFDekcsd0ZBQXdGO29CQUN4RiwwR0FBMEc7b0JBQzFHLEVBQUU7b0JBQ0YseUdBQXlHO29CQUN6Ryw0R0FBNEc7b0JBQzVHLDRDQUE0QztvQkFDNUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDRDQUE0QztnQkFDMUYsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7OztBQ3ZORCxzREFjQztBQTNCRCxvTkFBeUU7QUFhekUsU0FBZ0IscUJBQXFCLENBQ25DLGdCQUFrQyxFQUNsQyxhQUFpQyxFQUNqQyxhQUFpQyxFQUNqQyxPQUE4QjtJQUU5QixJQUFJLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxJQUFJLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVyRSxNQUFNLE9BQU8sR0FBRyxnREFBd0IsRUFBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkYsTUFBTSxPQUFPLEdBQUcsZ0RBQXdCLEVBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRW5GLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXpELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDTkQsMERBV0M7QUFoQ0QsaUxBQTJEO0FBRTNELDBFQUEwRTtBQUMxRSw4Q0FBOEM7QUFDOUM7Ozs7R0FJRztBQUNILElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUMxQixxRUFBZTtJQUNmLG1FQUFjO0lBQ2QsNkRBQVc7QUFDYixDQUFDLEVBSlcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFJM0I7QUFFRCwrQkFBWSxHQUFxRCxDQUFDO0FBQ2xFLCtCQUFZLEdBQXFELENBQUM7QUFFbEU7O0dBRUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUEwQztJQUNoRixRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQ2YsS0FBSyxTQUFTO1lBQ1osT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDbEMsS0FBSyxZQUFZO1lBQ2YsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7UUFDckMsS0FBSyxTQUFTO1lBQ1osT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7UUFDdEM7WUFDRSw4QkFBVyxFQUFDLDZCQUE2QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBRW5CRCw4Q0FFQztBQXVHRCw0REFXQztBQWxJRCxzTUFBOEQ7QUFVOUQ7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBZ0M7SUFDaEUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDVSwwQkFBa0IsR0FBRztJQUNoQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztDQUNwQixDQUFDO0FBR0UsS0FBdUQsK0NBQXVCLEVBT3pGO0lBQ0UsQ0FBQywwQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUMsMEJBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUNwQyxXQUFXLEVBQUUsQ0FBQztDQUNOLEVBQ1Ysc0JBQXNCLENBQ3ZCLEVBYmEsZ0NBQXdCLFVBQUUsZ0NBQXdCLFNBYTlEO0FBc0JGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ1UsaUNBQXlCLEdBQUc7SUFDdkMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsbUJBQW1CLEVBQUUscUJBQXFCO0NBQ2xDLENBQUM7QUFHRSxLQUFxRSwrQ0FBdUIsRUFPdkc7SUFDRSxDQUFDLGlDQUF5QixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7SUFDM0MsQ0FBQyxpQ0FBeUIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7SUFDbEQsV0FBVyxFQUFFLENBQUM7Q0FDTixFQUNWLHNDQUFzQyxDQUN2QyxFQWJhLHVDQUErQixVQUFFLHVDQUErQixTQWE1RTtBQUVGOztHQUVHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQ3RDLENBQTZEO0lBRTdELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87UUFDbEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjLElBQUksRUFBRTtLQUN2QyxDQUFDO0FBQ0osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FHa0lELGtEQVdDO0FBNVFELHNNQUE4RDtBQUs5RDs7Ozs7Ozs7OztHQVVHO0FBQ1UsNkJBQXFCLEdBQUc7SUFDbkM7OztPQUdHO0lBQ0gsZUFBZSxFQUFFLGlCQUFpQjtJQUVsQzs7T0FFRztJQUNILDJCQUEyQixFQUFFLDZCQUE2QjtJQUUxRDs7T0FFRztJQUNILGdCQUFnQixFQUFFLGtCQUFrQjtJQUVwQzs7Ozs7OztPQU9HO0lBQ0gsb0JBQW9CLEVBQUUsc0JBQXNCO0lBRTVDLGdEQUFnRDtJQUVoRDs7OztPQUlHO0lBQ0gsb0NBQW9DLEVBQUUsU0FBUztJQUUvQyx1REFBdUQ7SUFDdkQsd0NBQXdDLEVBQUUsaUJBQWlCO0lBRTNELG1FQUFtRTtJQUNuRSxvREFBb0QsRUFBRSw2QkFBNkI7SUFFbkYsd0RBQXdEO0lBQ3hELHlDQUF5QyxFQUFFLGtCQUFrQjtJQUU3RCw0REFBNEQ7SUFDNUQsNkNBQTZDLEVBQUUsc0JBQXNCO0NBQzdELENBQUM7QUFHRSxLQUE2RCwrQ0FBdUIsRUFPL0Y7SUFDRSxDQUFDLDZCQUFxQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDMUMsQ0FBQyw2QkFBcUIsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7SUFDdEQsQ0FBQyw2QkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7SUFDM0MsQ0FBQyw2QkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsRUFBRSx1REFBdUQ7SUFDeEcsV0FBVyxFQUFFLENBQUM7Q0FDTixFQUNWLDJCQUEyQixDQUM1QixFQWZhLG1DQUEyQixVQUFFLG1DQUEyQixTQWVwRTtBQUVGOzs7Ozs7O0dBT0c7QUFDVSxnQ0FBd0IsR0FBRztJQUN0Qzs7T0FFRztJQUNILElBQUksRUFBRSxNQUFNO0lBRVo7O09BRUc7SUFDSCxZQUFZLEVBQUUsY0FBYztJQUU1Qjs7T0FFRztJQUNILGtCQUFrQixFQUFFLG9CQUFvQjtDQUNoQyxDQUFDO0FBR0UsS0FBbUUsK0NBQXVCLEVBT3JHO0lBQ0UsQ0FBQyxnQ0FBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2xDLENBQUMsZ0NBQXdCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUMxQyxDQUFDLGdDQUF3QixDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztJQUNoRCxXQUFXLEVBQUUsQ0FBQztDQUNOLEVBQ1YsOEJBQThCLENBQy9CLEVBZGEsc0NBQThCLFVBQUUsc0NBQThCLFNBYzFFO0FBc0lGLFNBQWdCLG1CQUFtQixDQUNqQyxrQkFBd0U7SUFFeEUsSUFBSSxPQUFPLGtCQUFrQixLQUFLLFFBQVE7UUFBRSxPQUFPLGtCQUE0QixDQUFDO0lBQ2hGLElBQUksT0FBTyxrQkFBa0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM3QyxJQUFJLGtCQUFrQixFQUFFLElBQUk7WUFBRSxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUM3RCxNQUFNLElBQUksU0FBUyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUNELE1BQU0sSUFBSSxTQUFTLENBQ2pCLHVFQUF1RSxPQUFPLGtCQUFrQixHQUFHLENBQ3BHLENBQUM7QUFDSixDQUFDOzs7Ozs7Ozs7Ozs7O0FDaFJELHNFQUFzRTtBQUN0RSxpREFBaUQ7QUFDakQsMEVBQTBFO0FBQzFFLHVDQUF1Qzs7O0FBNkR2QyxvQkFHQztBQTlERCw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSx3RUFBd0U7QUFDeEUsMkRBQTJEO0FBQzNELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0Usc0RBQXNEO0FBQ3RELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxnQkFBZ0I7QUFFaEIsMkZBQTJGO0FBRTNGLE1BQU0sSUFBSTtJQUNELENBQUMsQ0FBUztJQUNWLEVBQUUsQ0FBUztJQUNYLEVBQUUsQ0FBUztJQUNYLEVBQUUsQ0FBUztJQUVsQixZQUFZLElBQWM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QiwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRU0sSUFBSTtRQUNULE1BQU0sQ0FBQyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxRQUFRO1FBQ3ZFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFJRCxTQUFnQixJQUFJLENBQUMsSUFBYztJQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFhLElBQUk7SUFDUCxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBRWhCLElBQUksQ0FBQyxJQUFjO1FBQ3hCLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ1osQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNQLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDUCxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNaLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDUCxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLE9BQU87UUFDL0IsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVE7SUFDckQsQ0FBQztDQUNGO0FBbEJELG9CQWtCQzs7Ozs7Ozs7Ozs7Ozs7O0FDbUxELGtFQUVDO0FBMVFELHdLQUF5RTtBQUN6RSw4S0FBaUU7QUFDakUsd0xBQWlEO0FBQ2pELG9NQUFtRDtBQUNuRCxnS0FBbUM7QUFFbkMsaUVBQWlFO0FBQ2pFLHFGQUFxRjtBQUN4RSx5QkFBaUIsR0FBeUIsVUFBa0IsQ0FBQyxpQkFBaUIsSUFBSTtDQUFRLENBQUM7QUFFeEcsOEVBQThFO0FBQzlFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQXVCdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFDSCxNQUFhLGlCQUFpQjtJQUM1Qjs7T0FFRztJQUNnQixPQUFPLENBQVU7SUFFcEM7Ozs7Ozs7O09BUUc7SUFDYSxXQUFXLENBQVU7SUFFckM7O09BRUc7SUFDYSxNQUFNLENBQXFCO0lBRTNDOzs7Ozs7O09BT0c7SUFDYSxlQUFlLENBQWlCO0lBRWhELGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUV6QixpR0FBaUc7SUFDakcsNkRBQTZEO0lBQzdELGFBQWE7SUFDTSxNQUFNLENBQXlCO0lBRWxELFlBQVksT0FBa0M7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyw2QkFBa0IsRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9DLHVGQUF1RjtZQUN2RixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsa0NBQWMsRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckMsNkJBQTZCO1FBQzdCLGtDQUFjLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxJQUFJLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdELElBQ0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2dCQUN2QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO29CQUMzQixDQUFDLG9DQUFZLEdBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLEVBQ25GLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3JELGtDQUFjLEVBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sa0NBQWMsRUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDeEMsSUFBSSxDQUFDLG9DQUFZLEdBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxFQUFFLENBQUM7d0JBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEdBQUcsQ0FBSSxFQUFvQjtRQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQXFCLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxZQUFZLENBQUksRUFBb0I7UUFDbEQsSUFBSSxVQUF5QyxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLFVBQVUsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDckMsa0NBQWMsRUFDWixVQUFVO2lCQUNQLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWlCLENBQUMsQ0FBQztpQkFDeEMsSUFBSSxDQUNILEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDbkIsR0FBRyxFQUFFO2dCQUNILHNDQUFzQztZQUN4QyxDQUFDLENBQ0YsQ0FDSixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUNFLFVBQVU7Z0JBQ1YsQ0FBQyxVQUFVLENBQUMsbUJBQW1CO2dCQUMvQixvQ0FBWSxHQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFRLENBQUMsOENBQThDLENBQUMsRUFDL0UsQ0FBQztnQkFDRCxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLHlCQUFnQixDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTztRQUNaLCtFQUErRTtRQUMvRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSyxVQUFrQixDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztJQUNwRixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLE1BQU0sQ0FBQyxXQUFXLENBQUksRUFBb0I7UUFDeEMsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLE1BQU0sQ0FBQyxjQUFjLENBQUksRUFBb0I7UUFDM0MsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsK0VBQStFO0lBQy9FLE1BQU0sQ0FBQyxXQUFXLENBQUksT0FBaUIsRUFBRSxFQUFvQjtRQUMzRCxPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUE5SkQsOENBOEpDO0FBRUQsTUFBTSxPQUFPLEdBQTJCLElBQUkseUJBQWlCLEVBQUUsQ0FBQztBQUVoRSxNQUFhLHFCQUFzQixTQUFRLGlCQUFpQjtJQUMxRDtRQUNFLEtBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUkseUJBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQVJELHNEQVFDO0FBRUQsK0ZBQStGO0FBQy9GLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBVyxFQUFpQixFQUFFO0lBQ3pDLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0FBQzVFLENBQUMsQ0FBQztBQUVGLFNBQWdCLDJCQUEyQixDQUFDLEVBQWdCO0lBQzFELEtBQUssR0FBRyxFQUFFLENBQUM7QUFDYixDQUFDOzs7Ozs7Ozs7Ozs7OztBQzFRRCxzQ0FFQztBQUpELG9NQUE4RDtBQUU5RCxTQUFnQixhQUFhO0lBQzNCLE9BQU8sK0NBQXVCLEVBQUMsOERBQThELENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUNqSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN5QkQsd0NBTUM7QUFuQ0Qsd0tBQW9IO0FBQ3BILHNNQUFpRjtBQUdqRjs7R0FFRztBQUVJLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxLQUFLO0NBQUc7QUFBOUIsc0NBQWE7d0JBQWIsYUFBYTtJQUR6Qiw2Q0FBMEIsRUFBQyxlQUFlLENBQUM7R0FDL0IsYUFBYSxDQUFpQjtBQUUzQzs7R0FFRztBQUVJLElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQTBCLFNBQVEsYUFBYTtDQUFHO0FBQWxELDhEQUF5QjtvQ0FBekIseUJBQXlCO0lBRHJDLDZDQUEwQixFQUFDLDJCQUEyQixDQUFDO0dBQzNDLHlCQUF5QixDQUF5QjtBQUUvRDs7R0FFRztBQUVJLElBQU0sc0JBQXNCLEdBQTVCLE1BQU0sc0JBQXVCLFNBQVEsS0FBSztJQUNuQjtJQUE1QixZQUE0QixPQUEyQztRQUNyRSxLQUFLLEVBQUUsQ0FBQztRQURrQixZQUFPLEdBQVAsT0FBTyxDQUFvQztJQUV2RSxDQUFDO0NBQ0Y7QUFKWSx3REFBc0I7aUNBQXRCLHNCQUFzQjtJQURsQyw2Q0FBMEIsRUFBQyx3QkFBd0IsQ0FBQztHQUN4QyxzQkFBc0IsQ0FJbEM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxHQUFZO0lBQ3pDLE9BQU8sQ0FDTCxHQUFHLFlBQVkseUJBQWdCO1FBQy9CLENBQUMsQ0FBQyxHQUFHLFlBQVksd0JBQWUsSUFBSSxHQUFHLFlBQVksNkJBQW9CLElBQUksR0FBRyxZQUFZLDhCQUFxQixDQUFDO1lBQzlHLEdBQUcsQ0FBQyxLQUFLLFlBQVkseUJBQWdCLENBQUMsQ0FDekMsQ0FBQztBQUNKLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQzZERCwwQ0FFQztBQTFGRCxNQUFNLGFBQWEsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUV6QyxnQkFBUSxHQUFHO0lBQ3RCOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsOENBQThDLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRTlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsMENBQTBDLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRTFHOzs7Ozs7OztPQVFHO0lBQ0gsNkNBQTZDLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVsSDs7Ozs7O09BTUc7SUFDSCw4Q0FBOEMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRW5IOzs7Ozs7Ozs7T0FTRztJQUNILHlDQUF5QyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUc7Ozs7Ozs7T0FPRztJQUNILDhDQUE4QyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0NBQzNELENBQUM7QUFFWCxTQUFTLFVBQVUsQ0FBQyxFQUFVLEVBQUUsR0FBWSxFQUFFLHFCQUF3QztJQUNwRixNQUFNLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDekQsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLEVBQVU7SUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBZ0JELFNBQVMsd0JBQXdCLENBQUMsT0FBZTtJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFRRDs7O0dBR0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxPQUFlLEVBQUUsY0FBd0I7SUFDMUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2IsT0FBTyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JHLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxPQUFlLEVBQUUsVUFBc0IsRUFBRSxpQkFBMEIsS0FBSztJQUMxRixPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1FBQ3hCLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxjQUFjLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxjQUFjLENBQUM7UUFDcEMsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLFVBQVUsQ0FBQztJQUN4RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZTtJQUNsQyxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBRSxDQUFDO1FBQ3ZFLE9BQU87WUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFNLENBQUM7WUFDOUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBTSxDQUFDO1lBQzlCLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQU0sQ0FBQztTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDekMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUs7UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUs7UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUN2SUQsb0NBRUM7QUFFRCw4Q0FFQztBQUVELDBEQUlDO0FBMUNELHdLQUFzRTtBQThCdEUsU0FBZ0IsWUFBWSxDQUFDLFNBQWdDO0lBQzNELFVBQVUsQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQWdCLGlCQUFpQjtJQUMvQixPQUFPLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMseUJBQWlDO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDdEMsSUFBSSxTQUFTLElBQUksSUFBSTtRQUFFLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCwyRkFBMkY7QUFDM0YsNkVBQTZFO0FBQ2hFLG9CQUFZLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQzdCekYsMENBMkZDO0FBNUdEOzs7O0dBSUc7QUFDSCw4S0FBcUQ7QUFDckQsdU1BQXlEO0FBQ3pELDJMQUFpRDtBQUNqRCxtS0FBcUQ7QUFDckQsb01BQW1EO0FBQ25ELGdLQUFtQztBQUNuQyx5S0FBbUM7QUFDbkMsd0xBQWlEO0FBRWpELE1BQU0sTUFBTSxHQUFHLFVBQWlCLENBQUM7QUFDakMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztBQUVyQyxTQUFnQixlQUFlO0lBQzdCLDBHQUEwRztJQUMxRywrRUFBK0U7SUFDL0UsTUFBTSxDQUFDLE9BQU8sR0FBRztRQUNmLE1BQU0sSUFBSSxrQ0FBeUIsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQ2hILENBQUMsQ0FBQztJQUNGLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRztRQUM1QixNQUFNLElBQUksa0NBQXlCLENBQ2pDLHFGQUFxRixDQUN0RixDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLEdBQUcsSUFBZTtRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFLLFlBQW9CLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLFlBQVksQ0FBQyxvQ0FBWSxHQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFDaEIsT0FBTyxvQ0FBWSxHQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVCLENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXRELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7SUFFL0MsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztJQUV2RTs7T0FFRztJQUNILE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxFQUEyQixFQUFFLEVBQVUsRUFBRSxHQUFHLElBQVc7UUFDbkYsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sU0FBUyxHQUFHLG9DQUFZLEdBQUUsQ0FBQztRQUNqQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsdURBQXVEO1lBQ3ZELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksc0NBQWlCLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFLLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRCxZQUFZLENBQUMsSUFBSSxDQUNmLEdBQUcsRUFBRTtnQkFDSCx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxFQUNELEdBQUcsRUFBRTtnQkFDSCx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUNGLENBQUM7WUFDRixrQ0FBYyxFQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdCLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDL0MsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkMsa0dBQWtHO1lBQ2xHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUM5QixTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzFELFNBQVMsQ0FBQyxXQUFXLENBQUM7b0JBQ3BCLFVBQVUsRUFBRTt3QkFDVixHQUFHO3dCQUNILGtCQUFrQixFQUFFLGlCQUFNLEVBQUMsRUFBRSxDQUFDO3FCQUMvQjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FDMUMsQ0FBQztZQUNGLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxZQUFZLEdBQUcsVUFBVSxNQUFjO1FBQzVDLE1BQU0sU0FBUyxHQUFHLG9DQUFZLEdBQUUsQ0FBQztRQUNqQyxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEIsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsZ0VBQWdFO1lBQzVGLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxTQUFTLENBQUMsV0FBVyxDQUFDO2dCQUNwQixXQUFXLEVBQUU7b0JBQ1gsR0FBRyxFQUFFLE1BQU07aUJBQ1o7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsK0ZBQStGO0lBQy9GLElBQUksQ0FBQyxNQUFNLEdBQUcsOEJBQWEsQ0FBQztBQUM5QixDQUFDOzs7Ozs7Ozs7Ozs7O0FDNUdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0ZHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHNLQWlCNEI7QUFoQjFCLDJJQUF3QjtBQUN4Qix5SEFBZTtBQUVmLCtIQUFrQjtBQUNsQiwySEFBZ0I7QUFDaEIsbUlBQW9CO0FBQ3BCLHlJQUF1QjtBQUd2Qiw2R0FBUztBQUdULHFIQUFhO0FBQ2IseUhBQWU7QUFDZiw2SEFBaUI7QUFDakIsdUhBQWM7QUFFaEIsMExBQThDO0FBYzlDLDRNQUF1RDtBQUN2RCw4TUFBd0Q7QUFDeEQscU1BQXNHO0FBQTdGLHlJQUFpQjtBQUFFLHlJQUFpQjtBQUM3Qyx5S0FBeUI7QUFDekIscUxBQStCO0FBQy9CLDZLQWVzQjtBQWRwQix5SkFBNkI7QUFFN0IseUhBQWE7QUFLYixpSUFBaUI7QUFRbkIsOEpBQTBFO0FBQWpFLDhHQUFVO0FBRW5CLHlMQUFtRTtBQUExRCxpSUFBZTtBQUFFLCtIQUFjO0FBQ3hDLDJKQUE2QjtBQUFwQiwrRkFBRztBQUNaLG9LQUFvQztBQUEzQiwwR0FBTztBQUNoQiw2S0FBMkI7QUFFM0Isb0tBQXdDO0FBQS9CLGtIQUFXO0FBQ3BCLDhKQU1pQjtBQUxmLDBJQUF3QjtBQUl4QixzSkFBOEI7Ozs7Ozs7Ozs7Ozs7O0FDOUhoQyxrREFNQztBQTlCRCxzTUFBeUY7QUFDekYsb01BQW1EO0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQWdCLG1CQUFtQixDQUF1QixZQUFpQixFQUFFLE1BQVMsRUFBRSxJQUFnQjtJQUN0RyxNQUFNLFNBQVMsR0FBRyxvQ0FBWSxHQUFFLENBQUM7SUFDakMsT0FBTywwQ0FBdUIsRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FDMUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFdBQWtCLENBQUMsQ0FFM0MsQ0FBMEIsQ0FBQztBQUNuQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDOUJEOzs7O0dBSUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZUgsc01BQWlGO0FBQ2pGLDZPQUFpRztBQXVSakc7O0dBRUc7QUFFSSxJQUFNLGFBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsS0FBSztJQUNWO0lBQTVCLFlBQTRCLE9BQWtFO1FBQzVGLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRFQsWUFBTyxHQUFQLE9BQU8sQ0FBMkQ7SUFFOUYsQ0FBQztDQUNGO0FBSlksc0NBQWE7d0JBQWIsYUFBYTtJQUR6Qiw2Q0FBMEIsRUFBQyxlQUFlLENBQUM7R0FDL0IsYUFBYSxDQUl6QjtBQTZERDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsZ0dBQWdHO0FBQ25GLHFDQUE2QixHQUFHO0lBQzNDOzs7T0FHRztJQUNILE9BQU8sRUFBRSxTQUFTO0lBRWxCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxVQUFVLEVBQUUsWUFBWTtJQUV4Qjs7Ozs7O09BTUc7SUFDSCwyQkFBMkIsRUFBRSw2QkFBNkI7SUFFMUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCwyQkFBMkIsRUFBRSw2QkFBNkI7Q0FDbEQsQ0FBQztBQUlYLHVCQUF1QjtBQUNWLEtBQTZFLDJDQUF1QixFQU8vRztJQUNFLENBQUMscUNBQTZCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMxQyxDQUFDLHFDQUE2QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDN0MsQ0FBQyxxQ0FBNkIsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7SUFDOUQsQ0FBQyxxQ0FBNkIsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7Q0FDdEQsRUFDVixFQUFFLENBQ0gsRUFkYSwyQ0FBbUMsVUFBRSwyQ0FBbUMsU0FjcEY7QUFFRjs7OztHQUlHO0FBQ1UseUJBQWlCLEdBQUc7SUFDL0I7Ozs7T0FJRztJQUNILFNBQVMsRUFBRSxXQUFXO0lBRXRCOztPQUVHO0lBQ0gsT0FBTyxFQUFFLFNBQVM7SUFFbEI7O09BRUc7SUFDSCxjQUFjLEVBQUUsZ0JBQWdCO0lBRWhDLGdEQUFnRDtJQUVoRDs7OztPQUlHO0lBQ0gsK0JBQStCLEVBQUUsU0FBUztJQUUxQzs7OztPQUlHO0lBQ0gsNkJBQTZCLEVBQUUsV0FBVztJQUUxQzs7OztPQUlHO0lBQ0gsMkJBQTJCLEVBQUUsU0FBUztJQUV0Qzs7OztPQUlHO0lBQ0gsa0NBQWtDLEVBQUUsZ0JBQWdCO0NBQzVDLENBQUM7QUFHWCx1QkFBdUI7QUFDVixLQUFxRCwyQ0FBdUIsRUFPdkY7SUFDRSxDQUFDLHlCQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7SUFDaEMsQ0FBQyx5QkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUMseUJBQWlCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztJQUNyQyxXQUFXLEVBQUUsQ0FBQztDQUNOLEVBQ1Ysc0JBQXNCLENBQ3ZCLEVBZGEsK0JBQXVCLFVBQUUsK0JBQXVCLFNBYzVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyZkYsd0tBYTRCO0FBQzVCLGlRQUdvRTtBQUNwRSwyTkFBbUY7QUFFbkYsMExBSXlDO0FBRXpDLDZKQUE4QjtBQUM5Qix1TUFBNkQ7QUFDN0Qsc05BQWdFO0FBQ2hFLHFMQUFnRTtBQUNoRSx1TUFBc0Q7QUFDdEQsbUtBQTZGO0FBcUI3RiwrS0FBNkM7QUFFN0Msd0xBQWlEO0FBQ2pELDJLQUF3QjtBQUV4QixnS0FBMEM7QUFDMUMsNkpBQTBEO0FBRTFELE1BQU0sc0NBQXNDLEdBQUc7SUFDN0MsdUJBQXVCLEVBQUUseUJBQXlCO0NBQzFDLENBQUM7QUFJWCxNQUFNLENBQUMsNkNBQTZDLEVBQUUsNENBQTRDLENBQUMsR0FDakcsK0NBQXVCLEVBT3JCO0lBQ0UsQ0FBQyxzQ0FBc0MsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7SUFDbkUsV0FBVyxFQUFFLENBQUM7Q0FDTixFQUNWLDhDQUE4QyxDQUMvQyxDQUFDO0FBcURKOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsU0FBUztJQUNwQjs7T0FFRztJQUNNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUVsRDs7T0FFRztJQUNNLFdBQVcsR0FBRztRQUNyQixLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQTRCO1FBQzFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBNkQ7UUFDOUUsbUJBQW1CLEVBQUUsSUFBSSxHQUFHLEVBQWlEO1FBQzdFLHNCQUFzQixFQUFFLElBQUksR0FBRyxFQUErQjtRQUM5RCxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsRUFBNEQ7UUFDdkYscUJBQXFCLEVBQUUsSUFBSSxHQUFHLEVBQTZEO1FBQzNGLGNBQWMsRUFBRSxJQUFJLEdBQUcsRUFBMEQ7UUFDakYsY0FBYyxFQUFFLElBQUksR0FBRyxFQUEwRDtLQUNsRixDQUFDO0lBRUY7O09BRUc7SUFDTSxlQUFlLEdBQUcsS0FBSyxFQUF5QyxDQUFDO0lBRTFFOztPQUVHO0lBQ00sZUFBZSxHQUFHLEtBQUssRUFBK0MsQ0FBQztJQUVoRjs7T0FFRztJQUNNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBdUMsQ0FBQztJQUV6RTs7T0FFRztJQUNNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBdUMsQ0FBQztJQUV6RTs7T0FFRztJQUNNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBRXhFOztPQUVHO0lBQ00saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7SUFFeEU7O09BRUc7SUFDTyx5QkFBeUIsR0FBRyxDQUFDLENBQUM7SUFFeEM7O09BRUc7SUFDSCxvQkFBb0IsQ0FBd0I7SUFFNUM7O09BRUc7SUFDSCxvQkFBb0IsQ0FBd0I7SUFFNUM7O09BRUc7SUFDSCxtQkFBbUIsQ0FBdUI7SUFFMUM7O09BRUc7SUFDZ0IsU0FBUyxDQUFlO0lBRTNDOztPQUVHO0lBQ2dCLHFCQUFxQixDQUFDO0lBRWhDLGlCQUFpQixHQUFzQjtRQUM5QyxjQUFjLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDekIsYUFBYSxFQUFFLElBQUksR0FBRyxFQUFFO0tBQ3pCLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSSxpQkFBaUIsQ0FBVTtJQUVsQzs7Ozs7T0FLRztJQUNJLHlCQUF5QixHQUFhLEVBQUUsQ0FBQztJQUVoRDs7Ozs7T0FLRztJQUNJLHVDQUF1QyxHQUFxRCxTQUFTLENBQUM7SUFFN0c7OztPQUdHO0lBQ0ksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXBCLFNBQVMsR0FBRyxJQUFJLDBDQUFxQixFQUFFLENBQUM7SUFFeEQ7O09BRUc7SUFDYSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQXFDO1FBQzFFO1lBQ0UsaUNBQXNCO1lBQ3RCO2dCQUNFLE9BQU8sRUFBRSxHQUFHLEVBQUU7b0JBQ1osT0FBTyxJQUFJLGlCQUFRLENBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUU7eUJBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzt5QkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUNoQixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsV0FBVyxFQUFFLGlDQUFpQzthQUMvQztTQUNGO1FBQ0Q7WUFDRSwwQ0FBK0I7WUFDL0I7Z0JBQ0UsT0FBTyxFQUFFLEdBQWEsRUFBRTtvQkFDdEIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQztvQkFDM0IsTUFBTSxHQUFHLEdBQXNCLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3pGLE1BQU0sT0FBTyxHQUEwQyxFQUFFLENBQUM7b0JBQzFELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQy9CLEtBQUssTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDOzRCQUNuQyxLQUFLLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQ0FDdEMsSUFBSSxDQUFDLFNBQVM7b0NBQUUsU0FBUztnQ0FDekIsTUFBTSxPQUFPLEdBQUcsU0FBUyxFQUFFLGNBQWMsRUFBRSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0NBQ25GLElBQUksQ0FBQyxPQUFPO29DQUFFLFNBQVM7Z0NBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRztvQ0FDbkI7d0NBQ0UsV0FBVyxFQUFFLENBQUM7d0NBQ2QsT0FBTztxQ0FDUjtpQ0FDRixDQUFDOzRCQUNKLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO29CQUNELE9BQU8sSUFBSSxpQkFBUSxDQUFxQixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsQ0FBQztnQkFDRCxXQUFXLEVBQUUsMERBQTBEO2FBQ3hFO1NBQ0Y7UUFDRDtZQUNFLDhCQUE4QjtZQUM5QjtnQkFDRSxPQUFPLEVBQUUsR0FBYSxFQUFFO29CQUN0QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDeEYsSUFBSTt3QkFDSixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7cUJBQy9CLENBQUMsQ0FBQyxDQUFDO29CQUNKLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQzFGLElBQUk7d0JBQ0osV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO3FCQUMvQixDQUFDLENBQUMsQ0FBQztvQkFDSixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUMxRixJQUFJO3dCQUNKLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztxQkFDL0IsQ0FBQyxDQUFDLENBQUM7b0JBQ0osT0FBTyxJQUFJLGlCQUFRLENBQXdDO3dCQUN6RCxVQUFVLEVBQUU7NEJBQ1YsSUFBSSxFQUFFLFlBQVk7NEJBQ2xCLGdCQUFnQjs0QkFDaEIsaUJBQWlCOzRCQUNqQixpQkFBaUI7eUJBQ2xCO3dCQUNELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztxQkFDcEMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsV0FBVyxFQUFFLGlEQUFpRDthQUMvRDtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDYSxZQUFZLEdBQW1DO1FBQzdELE9BQU8sRUFBRSxFQUFFO1FBQ1gsUUFBUSxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUUsRUFBRTtLQUNkLENBQUM7SUFFRjs7T0FFRztJQUNPLFFBQVEsR0FBaUQsRUFBRSxDQUFDO0lBRXRFOztPQUVHO0lBQ2EsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7SUFFakU7Ozs7OztPQU1HO0lBQ0ksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUV6Qjs7T0FFRztJQUNPLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFNUI7O09BRUc7SUFDSSxRQUFRLEdBQUc7UUFDaEIsS0FBSyxFQUFFLENBQUM7UUFDUixRQUFRLEVBQUUsQ0FBQztRQUNYLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLFNBQVMsRUFBRSxDQUFDO1FBQ1osY0FBYyxFQUFFLENBQUM7UUFDakIsdURBQXVEO1FBQ3ZELEtBQUssRUFBRSxDQUFDO0tBQ1QsQ0FBQztJQUVGOzs7T0FHRztJQUNILEdBQUcsQ0FBUztJQUVaOztPQUVHO0lBQ0ksUUFBUSxDQUFzRDtJQUVyRTs7O09BR0c7SUFDSSxJQUFJLENBQWU7SUFFMUI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBTTtJQUVuQjs7T0FFRztJQUNJLGNBQWMsQ0FBVztJQUVoQzs7T0FFRztJQUNhLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7SUFFbEQsb0JBQW9CLENBQStDO0lBRXRFLGdCQUFnQixHQUFxQixnQ0FBdUIsQ0FBQztJQUM3RCxnQkFBZ0IsR0FBcUIsZ0NBQXVCLENBQUM7SUFFcEU7O09BRUc7SUFDYyxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRXpEOztPQUVHO0lBQ2MsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFaEMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFaEQsVUFBVSxDQUFVO0lBRXBCOztPQUVHO0lBQ0gsU0FBUyxHQUFHLEtBQUssRUFBWSxDQUFDO0lBRTlCOzs7O09BSUc7SUFDYSxZQUFZLENBQWU7SUFFM0IsdUJBQXVCLENBQWM7SUFFOUMsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUU1QixrQkFBa0IsQ0FBc0I7SUFDeEMsK0JBQStCLENBQW1DO0lBRXpELDBCQUEwQixHQUFtQixFQUFFLENBQUM7SUFFN0Msa0JBQWtCLENBQVU7SUFFL0MsWUFBWSxFQUNWLElBQUksRUFDSixHQUFHLEVBQ0gscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVCxZQUFZLEVBQ1osY0FBYyxFQUNkLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIseUJBQXlCLEdBQ0s7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixJQUFJLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBRVMsaUJBQWlCLENBQUMsY0FBd0I7UUFDbEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sY0FBYyxDQUFDLElBQVk7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsZUFBSSxFQUFDLHVDQUFjLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBSSxZQUFvRCxFQUFFLEVBQVc7UUFDN0YsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLGdDQUFpQixFQUEwQyxDQUFDLENBQUMsR0FBRyxDQUN4RyxZQUFZLEVBQ1osRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0saUJBQWlCLENBQUksWUFBd0MsRUFBRSxFQUFXO1FBQy9FLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0saUJBQWlCLENBQW9DLEVBQUs7UUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzNELE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFNLENBQUM7SUFDbkcsQ0FBQztJQUVNLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFFLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLEVBQXdDO1FBQ3pELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRVMsY0FBYztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLDBCQUFpQixDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELE1BQU0sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2pFLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDckUsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNiLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztRQUN4QyxLQUFLLE1BQU0sS0FBSyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztvQkFBRSxTQUFTO2dCQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFDRCwwREFBMEQ7UUFDMUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBK0MsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakMsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDdkMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtTQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLElBQUksRUFBd0I7UUFDbEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksMEJBQWlCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxNQUFNLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxhQUFhLENBQUMsVUFBMkQ7UUFDOUUsTUFBTSxPQUFPLEdBQUcsaURBQW1CLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwRCxrQ0FBYyxFQUNaLHNDQUEyQixFQUFDLEdBQUcsRUFBRSxDQUMvQixPQUFPLENBQUM7WUFDTixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQ2pDLElBQUksRUFBRSw4QkFBaUIsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUM7U0FDOUUsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNoRixDQUFDO0lBQ0osQ0FBQztJQUVNLGtCQUFrQixDQUFDLFVBQTJEO1FBQ25GLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDdEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEQscUZBQXFGO1FBQ3JGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxHQUFHLElBQUk7WUFFUCxnQkFBZ0IsRUFBRSxzREFBc0IsRUFBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUM7WUFDekUscUJBQXFCLEVBQUUsMkRBQTJCLEVBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDO1lBRW5GLElBQUksRUFBRSw0QkFBZSxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUNuRSxVQUFVLEVBQUUsZ0NBQW1CLEVBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO1lBQ2xHLFdBQVcsRUFDVCxnQkFBZ0IsSUFBSSxJQUFJO2dCQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDO2dCQUN4RixDQUFDLENBQUMsU0FBUztTQUNoQixDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLCtCQUErQixFQUFFLEVBQUUsQ0FBQztRQUN4RSxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDO1lBQ3BFLElBQUksQ0FBQyx1Q0FBdUMsR0FBRyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQztRQUM5RixDQUFDO0lBQ0gsQ0FBQztJQUVNLGNBQWMsQ0FBQyxXQUF3RDtRQUM1RSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxTQUFTLENBQUMsVUFBa0Q7UUFDakUsbUZBQW1GO1FBQ25GLDZFQUE2RTtRQUM3RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzVFLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxVQUF3RDtRQUM3RSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM1RixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDOUMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0csT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xCLENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksU0FBUyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNoRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSwrQkFBc0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFTSxrQ0FBa0MsQ0FDdkMsVUFBMkU7UUFFM0UsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixJQUFJLDRDQUE0QyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztnQkFDeEcsTUFBTSxJQUFJLDBCQUFpQixDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDcEYsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN4RixNQUFNLElBQUksU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDOUQsQ0FBQztZQUNELE1BQU0sQ0FDSixJQUFJLDZDQUFvQyxDQUN0QyxvQ0FBb0MsRUFDcEMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQzVCLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUMvQixDQUNGLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDN0csQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksU0FBUyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNILENBQUM7SUFFTSw2QkFBNkIsQ0FBQyxVQUFzRTtRQUN6RyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxTQUFTLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNyRixDQUFDO1FBQ0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUM5QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMzRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDN0MsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxTQUFTLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ2hELElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDO0lBQ0gsQ0FBQztJQUVNLDBCQUEwQixDQUFDLFVBQW1FO1FBQ25HLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQy9DLE9BQU87b0JBQ1AsTUFBTTtpQkFDUCxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILGtDQUFjLEVBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEMsa0NBQWMsRUFBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFdkQsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxjQUFlLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLHFCQUFxQixDQUFDLFVBQThEO1FBQ3pGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV2RixzR0FBc0c7WUFDdEcsa0VBQWtFO1lBQ2xFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRixJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBVSxDQUFDO1lBQ2YsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7aUJBQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUN2QyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFFRCxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELHNGQUFzRjtJQUM1RSx3QkFBd0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQWM7UUFDaEUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQ3BELElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0QsRUFBRSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCwwQ0FBMEM7UUFDMUMsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakUsaUJBQWlCO1lBQ2pCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDbkIsSUFBSSxjQUFjLENBQ2hCLDJDQUEyQyxTQUFTLDBCQUEwQixlQUFlLEdBQUcsQ0FDakcsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUNELG1CQUFtQjtRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLEdBQUcsWUFBWSxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksa0NBQXlCLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTSxhQUFhLENBQUMsVUFBc0Q7UUFDekUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQ25ELElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLHFFQUFxRTtRQUNyRSx1Q0FBdUM7UUFDdkMsSUFDRSxTQUFTLENBQUMsVUFBVSxDQUFDLG1DQUF3QixDQUFDO1lBQzlDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEVBQ3RDLENBQUM7WUFDRCxNQUFNLElBQUksU0FBUyxDQUFDLDJCQUEyQixTQUFTLDZCQUE2QixtQ0FBd0IsR0FBRyxDQUFDLENBQUM7UUFDcEgsQ0FBQztRQUVELCtDQUErQztRQUMvQyxNQUFNLGVBQWUsR0FDbkIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxtQ0FBd0IsQ0FBQztZQUM5QyxTQUFTLEtBQUssaUNBQXNCO1lBQ3BDLFNBQVMsS0FBSywwQ0FBK0IsQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsaURBQW1CLEVBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0csTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEQsT0FBTyxDQUFDO1lBQ04sU0FBUyxFQUFFLFNBQVM7WUFDcEIsSUFBSSxFQUFFLDhCQUFpQixFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztZQUM3RSxPQUFPO1lBQ1AsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO1NBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQ0wsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUMvQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQzVDLENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUSxDQUFDLFVBQWlEO1FBQy9ELE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQ3JGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxTQUFTLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLFNBQVMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksU0FBUyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUNyRSxJQUNFLElBQUksQ0FBQyxVQUFVLENBQUMsbUNBQXdCLENBQUM7WUFDekMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFDdkMsQ0FBQztZQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsNEJBQTRCLElBQUksNkJBQTZCLG1DQUF3QixHQUFHLENBQUMsQ0FBQztRQUNoSCxDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELE1BQU0sZ0JBQWdCLEdBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsbUNBQXdCLENBQUM7WUFDekMsSUFBSSxLQUFLLGlDQUFzQjtZQUMvQixJQUFJLEtBQUssMENBQStCLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFFdkUsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQzdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtnQkFDeEIsQ0FBQyxDQUFDO29CQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUM7b0JBQ3hELFNBQVMsRUFBRSxTQUFTO29CQUNwQiwrQkFBK0I7b0JBQy9CLGdCQUFnQixFQUFFLGdDQUF1QixDQUFDLGdCQUFnQjtpQkFDM0Q7Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosa0VBQWtFO1FBQ2xFLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsR0FBZ0IsRUFBRTtZQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUNwRCxPQUFPO2dCQUNMLFFBQVE7Z0JBQ1IsSUFBSSxFQUFFLDhCQUFpQixFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztnQkFDekUsSUFBSTtnQkFDSixPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUU7YUFDdkIsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLHlFQUF5RTtRQUN6RSw4QkFBOEI7UUFDOUIsRUFBRTtRQUNGLDhFQUE4RTtRQUM5RSxFQUFFO1FBQ0YsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSxpQkFBaUI7UUFDakIsRUFBRTtRQUNGLHlFQUF5RTtRQUN6RSxnQkFBZ0I7UUFDaEIsRUFBRTtRQUNGLDJFQUEyRTtRQUMzRSwyRUFBMkU7UUFDM0UsZ0JBQWdCO1FBQ2hCLEVBQUU7UUFDRiwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSxtQkFBbUI7UUFDbkIsRUFBRTtRQUNGLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUseUNBQXlDO1FBQ3pDLEVBQUU7UUFDRix1RUFBdUU7UUFDdkUsb0VBQW9FO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzlCLElBQUksS0FBa0IsQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxZQUFZLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNwQyw4RUFBOEU7b0JBQzlFLDBFQUEwRTtvQkFDMUUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztvQkFDNUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNqQyxHQUFHLElBQUk7d0JBQ1AsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRTtxQkFDNUQsQ0FBQyxDQUFDLENBQUM7b0JBQ0osSUFBSSxDQUFDO3dCQUNILE1BQU0sUUFBUSxHQUFHLGlEQUFtQixFQUNsQyxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDM0QsQ0FBQzt3QkFDRixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDeEIsQ0FBQzs0QkFBUyxDQUFDO3dCQUNULElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDakMsR0FBRyxJQUFJOzRCQUNQLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsRUFBRTt5QkFDaEYsQ0FBQyxDQUFDLENBQUM7b0JBQ04sQ0FBQztnQkFDSCxDQUFDO2dCQUNELEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxpREFBbUIsRUFDakMsWUFBWSxFQUNaLGNBQWMsRUFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQ2pELENBQUM7WUFDRixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDL0UsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztpQkFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUNqRSxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLEtBQUssWUFBWSx3QkFBZSxFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9DLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDLENBQUM7aUJBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxRCxrQ0FBYyxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0Ysa0NBQWMsRUFBQywwQkFBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVTLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFlO1FBQ2xGLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRVMseUJBQXlCLENBQUMsU0FBa0QsRUFBRSxFQUFFLElBQUksRUFBZTtRQUMzRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFTSx1QkFBdUI7UUFDNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM3QyxPQUFPLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixxRUFBcUU7WUFDckUsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN2Qyx3REFBd0Q7Z0JBQ3hELHVFQUF1RTtnQkFDdkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFPLENBQUMsQ0FBQztZQUN6QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pHLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLDBDQUEwQztvQkFDMUMsTUFBTTtnQkFDUixDQUFDO2dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFPLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsWUFBWSxDQUNmLE1BQU0sQ0FBQyxrQkFBbUIsRUFDMUIsMkJBQWtCLENBQUMsWUFBWSxDQUFDLHFDQUFxQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDcEYsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQWU7UUFDdEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQ3hELElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxPQUFPLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDckMsT0FBTyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM5RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyw0Q0FBNEMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO0lBQ0gsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUF1RDtRQUMzRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsSUFDRSxVQUFVLENBQUMsVUFBVSxDQUFDLG1DQUF3QixDQUFDO1lBQy9DLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQ3ZDLENBQUM7WUFDRCxNQUFNLElBQUksU0FBUyxDQUNqQiw0QkFBNEIsVUFBVSw2QkFBNkIsbUNBQXdCLEdBQUcsQ0FDL0YsQ0FBQztRQUNKLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxnQkFBZ0IsR0FDcEIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQ0FBd0IsQ0FBQztZQUMvQyxVQUFVLEtBQUssaUNBQXNCO1lBQ3JDLFVBQVUsS0FBSywwQ0FBK0IsQ0FBQztRQUNqRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUV2RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN2RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QyxPQUFPO1FBQ1QsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSx5RUFBeUU7UUFDekUsb0JBQW9CO1FBQ3BCLE1BQU0sZ0JBQWdCLEdBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixJQUFJLGdDQUF1QixDQUFDLGdCQUFnQixDQUFDO1FBRXBHLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLGlEQUFtQixFQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BELE9BQU8sQ0FBQztZQUNOLElBQUksRUFBRSw4QkFBaUIsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7WUFDekUsVUFBVTtZQUNWLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtTQUN2QixDQUFDO2FBQ0MsS0FBSyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTSx1QkFBdUI7UUFDNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM3QyxPQUFPLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM5QixvRUFBb0U7Z0JBRXBFLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRyxDQUFDLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDL0csSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDO29CQUFFLE1BQU07Z0JBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFPLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSw2QkFBNkIsQ0FBQyxVQUFzRTtRQUN6RyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEcsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVNLG9DQUFvQyxDQUN6QyxVQUE2RTtRQUU3RSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEcsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVNLHdCQUF3QjtRQUM3QixJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBRW5DLE1BQU0sV0FBVyxHQUFHLENBQUMsaUJBQW9ELEVBQTZCLEVBQUU7WUFDdEcsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUN6QyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixLQUFLLGdDQUF1QixDQUFDLGdCQUFnQixDQUN6RSxDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixVQUFHLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsVUFBRyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBeUQ7UUFDL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksU0FBUyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUF1RDtRQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztZQUMvQixNQUFNLElBQUksMEJBQWlCLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVNLGFBQWEsQ0FBQyxPQUFlLEVBQUUsVUFBbUI7UUFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hGLCtEQUErRDtRQUMvRCxxRUFBcUU7UUFDckUsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2YsY0FBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRTthQUN4QyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxLQUFlO1FBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsMkJBQWUsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE9BQU8sQ0FBQyxJQUFhO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTlDLDRGQUE0RjtRQUM1RixnR0FBZ0c7UUFDaEcsaUdBQWlHO1FBQ2pHLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsa0dBQWtHO1FBQ2xHLHNHQUFzRztRQUN0RywrQ0FBK0M7UUFDL0MsRUFBRTtRQUNGLGdHQUFnRztRQUNoRywrRkFBK0Y7UUFDL0YsbUdBQW1HO1FBQ25HLDhGQUE4RjtRQUM5RixFQUFFO1FBQ0YsK0ZBQStGO1FBQy9GLGtHQUFrRztRQUNsRyw0RkFBNEY7UUFDNUYsK0ZBQStGO1FBQy9GLHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxlQUFlO1FBQ3BCLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxxQkFBcUIsQ0FBQyxLQUFjO1FBQ2xDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSwyQkFBYyxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUM7YUFBTSxJQUFJLEtBQUssWUFBWSwwQkFBYSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RSxDQUFDO2FBQU0sSUFBSSxLQUFLLFlBQVksd0JBQWUsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4Riw4RkFBOEY7WUFDOUYsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FDZDtnQkFDRSxxQkFBcUIsRUFBRTtvQkFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsa0NBQXFCLEVBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzNEO2FBQ0YsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDRCQUE0QixDQUFDLEtBQWM7UUFDakQsZ0dBQWdHO1FBQ2hHLElBQUksSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7WUFDakQsd0VBQXdFO1lBQ3hFLElBQUksSUFBSSxDQUFDLHVDQUF1QyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFOUUsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsdUNBQXVDLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxLQUFLLFlBQVksU0FBUztvQkFBRSxPQUFPLElBQUksQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsMEVBQTBFO1lBQzFFLElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFbEUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNoRCxJQUFJLElBQUksR0FBSSxLQUFhLENBQUMsV0FBVyxDQUFDO2dCQUN0QyxPQUFPLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSxJQUFJLEdBQUksSUFBWSxDQUFDLElBQTBCLENBQUM7b0JBQ3RELElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ1QsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs0QkFBRSxPQUFPLElBQUksQ0FBQztvQkFDakUsQ0FBQztvQkFDRCxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsdUJBQXVCLENBQUMsS0FBYztRQUNwQyxnRkFBZ0Y7UUFDaEYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFekUsOEZBQThGO1FBQzlGLDhGQUE4RjtRQUM5Rix5REFBeUQ7UUFDekQsSUFBSSxJQUFJLENBQUMsb0JBQW9CO1lBQUUsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILDZCQUE2QjtRQUMzQixJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWUsRUFBRSxNQUFlO1FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLENBQUM7WUFDZixjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUU7U0FDdkcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFlLEVBQUUsS0FBYztRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2YsY0FBYyxFQUFFO2dCQUNkLE9BQU87Z0JBQ1AsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsa0NBQXFCLEVBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUQ7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLGtCQUEwQjtRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU8sY0FBYyxDQUFDLGtCQUEwQixFQUFFLE1BQWU7UUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNmLGNBQWMsRUFBRSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRTtTQUNwRyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLGtCQUEwQixFQUFFLEtBQWM7UUFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNmLGNBQWMsRUFBRTtnQkFDZCxrQkFBa0I7Z0JBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGtDQUFxQixFQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzVEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBEQUEwRDtJQUNsRCxzQkFBc0IsQ0FDNUIsSUFBTyxFQUNQLE9BQWU7UUFFZixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsT0FBTyxVQUFvRSxDQUFDO0lBQzlFLENBQUM7SUFFRCxnRkFBZ0Y7SUFDeEUsaUJBQWlCLENBQ3ZCLElBQU8sRUFDUCxPQUFlO1FBRWYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksMEJBQWlCLENBQUMsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxNQUFlO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLENBQ2Q7WUFDRSx5QkFBeUIsRUFBRTtnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQzthQUN6RDtTQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVk7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFxQjtRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRU8sNEJBQTRCO1FBQ2xDLE9BQU87WUFDTCxJQUFJLEVBQUUsVUFBVTtZQUNoQixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7U0FDakMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTN2Q0QsOEJBMnZDQztBQUVELFNBQVMsTUFBTSxDQUFvQyxVQUFhO0lBQzlELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLGtDQUFrQyxDQUFDLGlCQUE0QztJQUN0RixNQUFNLE9BQU8sR0FBRzs7Ozs7Ozs7MEdBUXdGO1NBQ3JHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1NBQ25CLElBQUksRUFBRSxDQUFDO0lBRVYsT0FBTyxHQUFHLE9BQU8sOEZBQThGLElBQUksQ0FBQyxTQUFTLENBQzNILGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUM5RCxFQUFFLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxrQ0FBa0MsQ0FBQyxpQkFBNEM7SUFDdEYsTUFBTSxPQUFPLEdBQUc7Ozs7OzswR0FNd0Y7U0FFckcsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7U0FDbkIsSUFBSSxFQUFFLENBQUM7SUFFVixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUN4QyxLQUFLLE1BQU0sRUFBRSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE9BQU8sR0FBRyxPQUFPLDhGQUE4RixJQUFJLENBQUMsU0FBUyxDQUMzSCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FDdEUsRUFBRSxDQUFDO0FBQ04sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDNTNDRCxrRUEwQkM7QUFNRCxzREFpQkM7QUF6SUQsd0tBQWtEO0FBQ2xELHNOQUFnRTtBQUNoRSx3TEFBaUQ7QUFDakQsZ0tBQTREO0FBQzVELG1LQUEwQztBQUUxQywrS0FBNkM7QUFDN0Msb01BQThEO0FBQzlELHlLQUFrRTtBQWlDbEUsTUFBTSxVQUFVLEdBQUcsc0JBQVUsR0FBdUIsQ0FBQyxpQkFBaUIsQ0FBQztBQUV2RTs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ1UsV0FBRyxHQUFtQixNQUFNLENBQUMsV0FBVyxDQUNsRCxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQWlDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDekYsT0FBTztRQUNMLEtBQUs7UUFDTCxDQUFDLE9BQWUsRUFBRSxLQUErQixFQUFFLEVBQUU7WUFDbkQsTUFBTSxTQUFTLEdBQUcsK0NBQXVCLEVBQUMsMkRBQTJELENBQUMsQ0FBQztZQUN2RyxNQUFNLGdCQUFnQixHQUFHLGlEQUFtQixFQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pDLGtGQUFrRjtnQkFDbEYsQ0FBQyxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFO2dCQUN4QyxZQUFZLEVBQUUscUJBQVksQ0FBQyxRQUFRO2dCQUNuQyxHQUFHLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUQsR0FBRyxLQUFLO2FBQ1QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDLENBQUMsQ0FDSSxDQUFDO0FBRVQsU0FBZ0IsMkJBQTJCLENBQUMsRUFBMEI7SUFDcEUsV0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFlBQVksRUFBRSxxQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUNqQixDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ04sV0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFlBQVksRUFBRSxxQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNSLDhGQUE4RjtRQUM5Rix3REFBd0Q7UUFDeEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksMkJBQWMsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxQixXQUFHLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsWUFBWSxFQUFFLHFCQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDcEYsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO2lCQUFNLElBQUksS0FBSyxZQUFZLDBCQUFhLEVBQUUsQ0FBQztnQkFDMUMsV0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFlBQVksRUFBRSxxQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzlFLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxXQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxxQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUUsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDLENBQ0YsQ0FBQztJQUNGLHNEQUFzRDtJQUN0RCxrQ0FBYyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLElBQWtCO0lBQ3RELE1BQU0sVUFBVSxHQUE4QjtRQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtRQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO0tBQ2hDLENBQUM7SUFDRixJQUFJLGdDQUFpQixHQUFFLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxnQ0FBaUIsR0FBRSxDQUFDO1FBQ3ZDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZiwrQkFBK0I7WUFDL0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNqSUQsd0tBQWlFO0FBQ2pFLHNOQUFnRTtBQUVoRSxnS0FBcUM7QUFDckMseUtBQTBDO0FBQzFDLG9NQUE4RDtBQUU5RCxNQUFNLHVCQUF1QjtJQUMzQixnQkFBZSxDQUFDO0lBRWhCLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLFdBQW9CO1FBQzdELCtDQUF1QixFQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDL0YsT0FBTyxJQUFJLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGVBQWUsQ0FDYixJQUFZLEVBQ1osWUFBb0MsS0FBSyxFQUN6QyxJQUFhLEVBQ2IsV0FBb0I7UUFFcEIsK0NBQXVCLEVBQUMscUVBQXFFLENBQUMsQ0FBQztRQUMvRixPQUFPLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFdBQVcsQ0FDVCxJQUFZLEVBQ1osWUFBb0MsS0FBSyxFQUN6QyxJQUFhLEVBQ2IsV0FBb0I7UUFFcEIsK0NBQXVCLEVBQUMscUVBQXFFLENBQUMsQ0FBQztRQUMvRixPQUFPLElBQUksbUJBQW1CLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFpQjtRQUN4QiwrQ0FBdUIsRUFBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQy9GLHFGQUFxRjtRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztDQUNGO0FBRUQsTUFBTSxxQkFBcUI7SUFLUDtJQUNBO0lBQ0E7SUFORixJQUFJLEdBQUcsU0FBUyxDQUFDO0lBQ2pCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFbEMsWUFDa0IsSUFBWSxFQUNaLElBQXdCLEVBQ3hCLFdBQStCO1FBRi9CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFvQjtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFDOUMsQ0FBQztJQUVKLEdBQUcsQ0FBQyxLQUFhLEVBQUUsWUFBd0IsRUFBRTtRQUMzQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELEtBQUssR0FBRyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELElBQUksQ0FBQywyQkFBWSxHQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBaUI7UUFDeEIscUZBQXFGO1FBQ3JGLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0NBQ0Y7QUFFRCxNQUFNLHVCQUF1QjtJQUlUO0lBQ0E7SUFDQTtJQUNBO0lBTkYsSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUVuQyxZQUNrQixJQUFZLEVBQ1osU0FBaUMsRUFDakMsSUFBd0IsRUFDeEIsV0FBK0I7UUFIL0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGNBQVMsR0FBVCxTQUFTLENBQXdCO1FBQ2pDLFNBQUksR0FBSixJQUFJLENBQW9CO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtJQUM5QyxDQUFDO0lBRUosTUFBTSxDQUFDLEtBQWEsRUFBRSxZQUF3QixFQUFFO1FBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLDJCQUFZLEdBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2xILENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWlCO1FBQ3hCLHFGQUFxRjtRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7SUFDbkYsQ0FBQztDQUNGO0FBRUQsTUFBTSxtQkFBbUI7SUFJTDtJQUNBO0lBQ0E7SUFDQTtJQU5GLElBQUksR0FBRyxPQUFPLENBQUM7SUFFL0IsWUFDa0IsSUFBWSxFQUNaLFNBQWlDLEVBQ2pDLElBQXdCLEVBQ3hCLFdBQStCO1FBSC9CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFvQjtRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFDOUMsQ0FBQztJQUVKLEdBQUcsQ0FBQyxLQUFhLEVBQUUsSUFBaUI7UUFDbEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxJQUFJLENBQUMsMkJBQVksR0FBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxVQUFVLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWlCO1FBQ3hCLHFGQUFxRjtRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztDQUNGO0FBRUQsb0dBQW9HO0FBRXBHLDRGQUE0RjtBQUM1RiwwRkFBMEY7QUFDMUYsNkJBQTZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLHNCQUFVLEdBQWUsQ0FBQyxrQkFBa0IsQ0FBQztBQWtEaEU7Ozs7R0FJRztBQUNVLG1CQUFXLEdBQWdCLG9DQUEyQixDQUFDLE9BQU8sQ0FDekUsSUFBSSx1QkFBdUIsRUFBRSxFQUM3QixHQUFHLEVBQUU7SUFDSCxNQUFNLFNBQVMsR0FBRywrQ0FBdUIsRUFBQyw4REFBOEQsQ0FBQyxDQUFDO0lBQzFHLE1BQU0sYUFBYSxHQUFHLGlEQUFtQixFQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEcsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztJQUM1QixPQUFPLGFBQWEsQ0FBQztRQUNuQixzREFBc0Q7UUFDdEQsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO0tBQ2hDLENBQUMsQ0FBQztBQUNMLENBQUMsRUFDRCxJQUFJLENBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDaEZGLDREQStEQztBQXBMRCw4S0FBNkQ7QUFDN0QseU1BQTZFO0FBQzdFLDZPQUFpRztBQUVqRyx1TUFBeUQ7QUFDekQsb01BQW1EO0FBQ25ELHNOQUFnRTtBQUNoRSx3TEFBaUQ7QUF5R2pEOzs7O0dBSUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsT0FBcUM7SUFFckMsTUFBTSxzQkFBc0I7UUFDMUIsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixTQUF3RSxFQUN4RSxLQUFpRixFQUNqRixnQkFBc0Q7WUFFdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RSxPQUFPLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFFRCxLQUFLLENBQUMsY0FBYyxDQUNsQixTQUF3RSxFQUN4RSxLQUFpRixFQUNqRixnQkFBNkM7WUFFN0MsTUFBTSxNQUFNLEdBQ1YsT0FBTyxTQUFTLEtBQUssUUFBUTtnQkFDM0IsQ0FBQyxDQUFDLDJFQUEyRTtvQkFDM0Usb0ZBQW9GO29CQUNuRixPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFlO2dCQUN6RCxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUVyQixNQUFNLFNBQVMsR0FBRyxvQ0FBWSxHQUFFLENBQUM7WUFDakMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVoRCxNQUFNLE9BQU8sR0FBRyxpREFBbUIsRUFDakMsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQy9CLHFCQUFxQixFQUNyQiw4QkFBOEIsQ0FDL0IsQ0FBQztZQUVGLGtHQUFrRztZQUNsRyxnR0FBZ0c7WUFDaEcsaUdBQWlHO1lBQ2pHLDBFQUEwRTtZQUMxRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQztnQkFDckQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2dCQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUM3QixTQUFTLEVBQUUsTUFBTTtnQkFDakIsT0FBTyxFQUFFO29CQUNQLEdBQUcsZ0JBQWdCO29CQUNuQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsSUFBSSw2QkFBNkI7aUJBQ3RGO2dCQUNELE9BQU8sRUFBRSxFQUFFO2dCQUNYLEdBQUc7Z0JBQ0gsS0FBSzthQUNOLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDN0IsU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLEtBQUs7Z0JBQ0wsS0FBSyxDQUFDLE1BQU07b0JBQ1YsT0FBTyxhQUF5QyxDQUFDO2dCQUNuRCxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUVELE9BQU8sSUFBSSxzQkFBc0IsRUFBSyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLDhCQUE4QixDQUFDLEVBQ3RDLEtBQUssRUFDTCxRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxFQUNILE9BQU8sR0FDa0I7SUFDekIsTUFBTSxTQUFTLEdBQUcsb0NBQVksR0FBRSxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHO1FBQ2QsSUFBSSxFQUFFLFVBQW1CO1FBQ3pCLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVM7UUFDbkMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVTtLQUN0QyxDQUFDO0lBRUYsT0FBTyxJQUFJLE9BQU8sQ0FBNEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDaEUsTUFBTSxLQUFLLEdBQUcsc0NBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QixrQ0FBYyxFQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixrQ0FBYyxFQUNaLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDL0IsTUFBTSxTQUFTLEdBQ2IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQ25ELENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXpELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDZixTQUFTLENBQUMsV0FBVyxDQUFDO3dCQUNwQiwyQkFBMkIsRUFBRSxFQUFFLEdBQUcsRUFBRTtxQkFDckMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsOEJBQThCO1lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO1FBRUQsU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUNwQixzQkFBc0IsRUFBRTtnQkFDdEIsR0FBRztnQkFDSCxRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsU0FBUztnQkFDVCxXQUFXLEVBQUUsT0FBTztnQkFDcEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztnQkFDM0Qsc0JBQXNCLEVBQUUseUJBQWMsRUFBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUM7Z0JBQ3ZFLHNCQUFzQixFQUFFLHlCQUFjLEVBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDO2dCQUN2RSxtQkFBbUIsRUFBRSx5QkFBYyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQztnQkFDakUsZ0JBQWdCLEVBQUUsb0NBQW9DLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDO2FBQ2xGO1lBQ0QsWUFBWSxFQUFFLHlDQUFxQixFQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUM7U0FDdEcsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ2pELE9BQU87WUFDUCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsc0dBQXNHO0FBQ3pGLHNDQUE4QixHQUFHO0lBQzVDOzs7T0FHRztJQUNILE9BQU8sRUFBRSxTQUFTO0lBRWxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSCxVQUFVLEVBQUUsWUFBWTtJQUV4Qjs7O09BR0c7SUFDSCwyQkFBMkIsRUFBRSw2QkFBNkI7SUFFMUQ7OztPQUdHO0lBQ0gsMkJBQTJCLEVBQUUsNkJBQTZCO0NBQ2xELENBQUM7QUFJWCxNQUFNLENBQUMsb0NBQW9DLEVBQUUsQ0FBQyxDQUFDLEdBQUcsMkNBQXVCLEVBT3ZFO0lBQ0UsQ0FBQyxzQ0FBOEIsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7SUFDL0QsQ0FBQyxzQ0FBOEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQzNDLENBQUMsc0NBQThCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLHNDQUE4QixDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQztDQUN2RCxFQUNWLEVBQUUsQ0FDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdURixzR0FBc0c7QUFDdEcsa0ZBQWtGO0FBQ2xGLDZEQUE2RDtBQUM3RCxhQUFhO0FBQ2IsZ01BQWtDO0FBRWxDLHFCQUFlLHNCQUF3QyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ054RCx3Q0FLQztBQUVELDBDQWFDO0FBcEJELFNBQWdCLGNBQWMsQ0FBQyxNQUFvQixFQUFFLEtBQWlCO0lBQ3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxNQUFvQjtJQUNsRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuRCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUM5RixJQUFJLENB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OztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QVc7O0FBRVgsUUFBUSxrQkFBa0IsRUFBRSxtQkFBTyxDQUFDLDBLQUE4QztBQUNsRjs7QUFFQSxzQkFBc0I7O0FBRXRCOztBQUVBLHVCQUF1QjtBQUN2QixTQUFTLG1CQUFPLDRCQUE0Qiw4RUFBZ0c7QUFDNUk7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvYWN0aXZpdHktb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb250aW51ZS1hcy1uZXcudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2RhdGEtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1jb2RlYy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3BheWxvYWQtc2VhcmNoLWF0dHJpYnV0ZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3R5cGVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2RlcHJlY2F0ZWQtdGltZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9lbmNvZGluZy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9lcnJvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZmFpbHVyZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmNlcHRvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJmYWNlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcm5hbC13b3JrZmxvdy9lbnVtcy1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L29iamVjdHMtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9sb2dnZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvbWV0cmljcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9wcmlvcml0eS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9yZXNlcnZlZC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9yZXRyeS1wb2xpY3kudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvc2VhcmNoLWF0dHJpYnV0ZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdGltZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90eXBlLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdXNlci1tZXRhZGF0YS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy92ZXJzaW9uaW5nLWludGVudC1lbnVtLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtlci1kZXBsb3ltZW50cy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctaGFuZGxlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LW9wdGlvbnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2FsZWEudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2NhbmNlbGxhdGlvbi1zY29wZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvY3VycmVudC1yYW5kb20udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2Vycm9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZmxhZ3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2dsb2JhbC1hdHRyaWJ1dGVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9nbG9iYWwtb3ZlcnJpZGVzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJjZXB0b3ItY29tcG9zaXRpb24udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJmYWNlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJuYWxzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9sb2dzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9uZXh1cy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcGtnLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9yYW5kb20taGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcmFuZG9tLXN0cmVhbS1zZWVkLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9yYW5kb20tc3RyZWFtcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc2lua3MudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3N0YWNrLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3RyaWdnZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTguMS9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3VwZGF0ZS1zY29wZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvd29ya2VyLWludGVyZmFjZS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xOC4xL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvd29ya2Zsb3cudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9jb21tb24vaGFuZGxlci1lcnJvci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9vcGVyYXRpb24tZXJyb3IudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9vcGVyYXRpb24taGFuZGxlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvc2VydmljZS1oYW5kbGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9zdGFydC1vcGVyYXRpb24tcmVzdWx0LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbnRlcm5hbC9vYmplY3QtdXRpbHMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbnRlcm5hbC9zeW1ib2wtaW5zdGFuY2VvZi50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2UvaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2UvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaGlwZm94L3NoaXBmb3gvbm9kZV9tb2R1bGVzLy5wbnBtL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9zZXJ2aWNlL3NlcnZpY2UtZGVmaW5pdGlvbi50cyIsImlnbm9yZWR8L2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYnxfX3RlbXBvcmFsX2N1c3RvbV9mYWlsdXJlX2NvbnZlcnRlciIsImlnbm9yZWR8L2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE4LjEvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYnxfX3RlbXBvcmFsX2N1c3RvbV9wYXlsb2FkX2NvbnZlcnRlciIsIi9ob21lL3J1bm5lci93b3JrL3NoaXBmb3gvc2hpcGZveC9ub2RlX21vZHVsZXMvLnBucG0vbXNAMy4wLjAtY2FuYXJ5LjEvbm9kZV9tb2R1bGVzL21zL2Rpc3QvaW5kZXgubWpzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L25vZGVfbW9kdWxlcy8ucG5wbS9sb25nQDUuMy4yL25vZGVfbW9kdWxlcy9sb25nL2luZGV4LmpzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL2ludGVncmF0aW9uL3NlbnRyeS9zcmMvdGVtcG9yYWwvd29ya2Zsb3dzL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL2ludGVncmF0aW9uL3NlbnRyeS9zcmMvdGVtcG9yYWwvd29ya2Zsb3dzL3BydW5lLXVuY2xhaW1lZC1pbnN0YWxsYXRpb25zLWNyb24udHMiLCJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0IiwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL2ludGVncmF0aW9uL3NlbnRyeS9kaXN0L3RlbXBvcmFsL3dvcmtmbG93cy9pbmRleC1hdXRvZ2VuZXJhdGVkLWVudHJ5cG9pbnQuY2pzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzSG9sZGVyIHtcbiAgZGV0YWlscz86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHNPcHRpb25zIHtcbiAgbm90Rm91bmQ/OiBib29sZWFuO1xuICBjYW5jZWxSZXF1ZXN0ZWQ/OiBib29sZWFuO1xuICBwYXVzZWQ/OiBib29sZWFuO1xuICB0aW1lZE91dD86IGJvb2xlYW47XG4gIHdvcmtlclNodXRkb3duPzogYm9vbGVhbjtcbiAgcmVzZXQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZWFzb25zIGZvciB0aGUgYWN0aXZpdHkncyBjYW5jZWxsYXRpb24uIENhbmNlbGxhdGlvbiBkZXRhaWxzIGFyZSBzZXQgb25jZSBhbmQgZG8gbm90IGNoYW5nZSBvbmNlIHNldC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB7XG4gIHJlYWRvbmx5IG5vdEZvdW5kOiBib29sZWFuO1xuICByZWFkb25seSBjYW5jZWxSZXF1ZXN0ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGltZWRPdXQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHdvcmtlclNodXRkb3duOiBib29sZWFuO1xuICByZWFkb25seSByZXNldDogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5ub3RGb3VuZCA9IG9wdGlvbnMubm90Rm91bmQgPz8gZmFsc2U7XG4gICAgdGhpcy5jYW5jZWxSZXF1ZXN0ZWQgPSBvcHRpb25zLmNhbmNlbFJlcXVlc3RlZCA/PyBmYWxzZTtcbiAgICB0aGlzLnBhdXNlZCA9IG9wdGlvbnMucGF1c2VkID8/IGZhbHNlO1xuICAgIHRoaXMudGltZWRPdXQgPSBvcHRpb25zLnRpbWVkT3V0ID8/IGZhbHNlO1xuICAgIHRoaXMud29ya2VyU2h1dGRvd24gPSBvcHRpb25zLndvcmtlclNodXRkb3duID8/IGZhbHNlO1xuICAgIHRoaXMucmVzZXQgPSBvcHRpb25zLnJlc2V0ID8/IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGZyb21Qcm90byhcbiAgICBwcm90bzogY29yZXNkay5hY3Rpdml0eV90YXNrLklBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB7XG4gICAgaWYgKHByb3RvID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuZXcgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzKHtcbiAgICAgIG5vdEZvdW5kOiBwcm90by5pc05vdEZvdW5kID8/IGZhbHNlLFxuICAgICAgY2FuY2VsUmVxdWVzdGVkOiBwcm90by5pc0NhbmNlbGxlZCA/PyBmYWxzZSxcbiAgICAgIHBhdXNlZDogcHJvdG8uaXNQYXVzZWQgPz8gZmFsc2UsXG4gICAgICB0aW1lZE91dDogcHJvdG8uaXNUaW1lZE91dCA/PyBmYWxzZSxcbiAgICAgIHdvcmtlclNodXRkb3duOiBwcm90by5pc1dvcmtlclNodXRkb3duID8/IGZhbHNlLFxuICAgICAgcmVzZXQ6IHByb3RvLmlzUmVzZXQgPz8gZmFsc2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB0eXBlIHsgVmVyc2lvbmluZ0ludGVudCB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB0eXBlIHsgUHJpb3JpdHkgfSBmcm9tICcuL3ByaW9yaXR5JztcblxuLy8gTm90ZTogVGhlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFyZSBoZXJlIGZvciBsZWdhY3kgcmVhc29ucy4gVGhleSBzaG91bGQgaGF2ZSBiZWVuIGRlZmluZWRcbi8vIGluIHRoZSAnd29ya2Zsb3cnIHBhY2thZ2UsIGluc3RlYWQgb2YgJ2NvbW1vbicuIFRoZXkgYXJlIG5vdyByZWV4cG9ydGVkIGZyb20gdGhlICd3b3JrZmxvdydcbi8vIHBhY2thZ2UsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGltcG9ydCB0aGVtLCBidXQgd2UgdW5mb3J0dW5hdGVseSBjYW4ndCByZW1vdmUgdGhlbSBmcm9tXG4vLyBoZXJlIGFzIHRoYXQgd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UuXG5cbi8qKlxuICogRGV0ZXJtaW5lczpcbiAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHk7IGFuZFxuICogLSB3aGVuIHNob3VsZCB0aGUgQWN0aXZpdHkgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIHRvIFdvcmtmbG93IChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlXG4gKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gY2FuY2VsbGF0aW9uIGJlaW5nXG4gKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAqIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlIEFjdGl2aXR5IGNhbGwgd2FzIG1hZGUuIFRlcm1pbmF0aW9uIG9mIGEgV29ya2Zsb3cgRXhlY3V0aW9uXG4gKiBhbHdheXMgcmVzdWx0cyBpbiBjYW5jZWxsYXRpb24gb2YgaXRzIG91dHN0YW5kaW5nIEFjdGl2aXR5IGV4ZWN1dGlvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhvc2VcbiAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICpcbiAqIEBkZWZhdWx0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAqL1xuLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYEFjdGl2aXR5T3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlYCBhbmRcbi8vICAgICAgICAgICAgICBgTG9jYWxBY3Rpdml0eU9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgZmllbGRzIGxhdGVyIGluIHRoaXMgZmlsZS5cbmV4cG9ydCBjb25zdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgQWN0aXZpdHksIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uXG4gICAqIHRvIHRoZSBjYWxsZXIuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHksIHlldCBfaW1tZWRpYXRlbHlfIHJlcG9ydFxuICAgKiBjYW5jZWxsYXRpb24gdG8gdGhlIGNhbGxlciwgaS5lLiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uXG4gICAqIHJlcXVlc3QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIGNhbmNlbGxhdGlvbiB0eXBlIHByb3ZpZGVzIG5vIGd1YXJhbnRlZSwgZnJvbSB0aGUgV29ya2Zsb3ctc2lkZSwgdGhhdCB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3Qgd2lsbCBhY3R1YWxseSBiZSBkZWxpdmVyZWQgdG8gdGhlIEFjdGl2aXR5OyBlLmcuIHRoZSBjYWxsaW5nIFdvcmtmbG93XG4gICAqIG1heSBleGl0IGJlZm9yZSB0aGUgZGVsaXZlcnkgaXMgY29tcGxldGVkLCBvciB0aGUgQWN0aXZpdHkgbWF5IGNvbXBsZXRlIChlaXRoZXIgc3VjY2Vzc2Z1bGx5XG4gICAqIG9yIHVuY2Vzc2Z1bGx5KSBiZWZvcmUgdGhlIGNhbmNlbGxhdGlvbiBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGVcbiAgICogd29ya2Zsb3cgdGhpbmtzIHRoZSBhY3Rpdml0eSB3YXMgY2FuY2VsbGVkLCBidXQgdGhlIGFjdGl2aXR5IGFjdHVhbGx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIFRvIGVuc3VyZSB0aGF0IHRoZSBXb3JrZmxvdyBpcyBwcm9wZXJseSBpbmZvcm1lZCBvZiB0aGUgQWN0aXZpdHkncyBmaW5hbCBzdGF0ZSAoaS5lLiBlaXRoZXJcbiAgICogY29tcGxldGlvbiBvciBjYW5jZWxsYXRpb24pLCB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRH0uXG4gICAqL1xuICBUUllfQ0FOQ0VMOiAnVFJZX0NBTkNFTCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgQWN0aXZpdHksIGFuZCB3YWl0IGZvciB0aGUgYWN0aXZpdHlcbiAgICogdG8gY29tcGxldGUgaXRzIGV4ZWN1dGlvbiAoZWl0aGVyIHN1Y2Nlc3NmdWxseSwgdW5jZXNzZnVsbHksIG9yIGFzIGNhbmNlbGxlZCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgQWN0aXZpdHkgbXVzdCBoZWFydGJlYXQgdG8gcmVjZWl2ZSBhIGNhbmNlbGxhdGlvbiBub3RpZmljYXRpb24uIFRoaXMgY2FuIGJsb2NrXG4gICAqIHRoZSBXb3JrZmxvdydzIGNhbmNlbGxhdGlvbiBmb3IgYSBsb25nIHRpbWUgaWYgdGhlIEFjdGl2aXR5IGRvZXNuJ3QgaGVhcnRiZWF0IG9yIGNob29zZXMgdG9cbiAgICogaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdC5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlID0gKHR5cGVvZiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMCxcbiAgICBbQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDEsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igbm9uLWxvY2FsIGFjdGl2aXR5IGludm9jYXRpb24gaW5zaWRlIGEgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eU9wdGlvbnMge1xuICAvKipcbiAgICogSWRlbnRpZmllciB0byB1c2UgZm9yIHRyYWNraW5nIHRoZSBhY3Rpdml0eSBpbiBXb3JrZmxvdyBoaXN0b3J5LlxuICAgKiBUaGUgYGFjdGl2aXR5SWRgIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgYWN0aXZpdHkgZnVuY3Rpb24uXG4gICAqIERvZXMgbm90IG5lZWQgdG8gYmUgdW5pcXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhbiBpbmNyZW1lbnRhbCBzZXF1ZW5jZSBudW1iZXJcbiAgICovXG4gIGFjdGl2aXR5SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgY3VycmVudCB3b3JrZXIgdGFzayBxdWV1ZVxuICAgKi9cbiAgdGFza1F1ZXVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIZWFydGJlYXQgaW50ZXJ2YWwuIEFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IGJlZm9yZSB0aGlzIGludGVydmFsIHBhc3NlcyBhZnRlciBhIGxhc3QgaGVhcnRiZWF0IG9yIGFjdGl2aXR5IHN0YXJ0LlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIGhlYXJ0YmVhdFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogUmV0cnlQb2xpY3kgdGhhdCBkZWZpbmUgaG93IGFjdGl2aXR5IGlzIHJldHJpZWQgaW4gY2FzZSBvZiBmYWlsdXJlLiBJZiB0aGlzIGlzIG5vdCBzZXQsIHRoZW4gdGhlIHNlcnZlci1kZWZpbmVkIGRlZmF1bHQgYWN0aXZpdHkgcmV0cnkgcG9saWN5IHdpbGwgYmUgdXNlZC4gVG8gZW5zdXJlIHplcm8gcmV0cmllcywgc2V0IG1heGltdW0gYXR0ZW1wdHMgdG8gMS5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSBvZiBhIHNpbmdsZSBBY3Rpdml0eSBleGVjdXRpb24gYXR0ZW1wdC4gTm90ZSB0aGF0IHRoZSBUZW1wb3JhbCBTZXJ2ZXIgZG9lc24ndCBkZXRlY3QgV29ya2VyIHByb2Nlc3NcbiAgICogZmFpbHVyZXMgZGlyZWN0bHk6IGluc3RlYWQsIGl0IHJlbGllcyBvbiB0aGlzIHRpbWVvdXQgdG8gZGV0ZWN0IHRoYXQgYW4gQWN0aXZpdHkgZGlkbid0IGNvbXBsZXRlIG9uIHRpbWUuIFRoZXJlZm9yZSwgdGhpc1xuICAgKiB0aW1lb3V0IHNob3VsZCBiZSBhcyBzaG9ydCBhcyB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBleGVjdXRpb24gb2YgdGhlIEFjdGl2aXR5IGJvZHkuIFBvdGVudGlhbGx5IGxvbmctcnVubmluZ1xuICAgKiBBY3Rpdml0aWVzIG11c3Qgc3BlY2lmeSB7QGxpbmsgaGVhcnRiZWF0VGltZW91dH0gYW5kIGNhbGwge0BsaW5rIGFjdGl2aXR5LkNvbnRleHQuaGVhcnRiZWF0fSBwZXJpb2RpY2FsbHkgZm9yXG4gICAqIHRpbWVseSBmYWlsdXJlIGRldGVjdGlvbi5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHNjaGVkdWxlVG9DbG9zZVRpbWVvdXRgIG9yIHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGltZSB0aGF0IHRoZSBBY3Rpdml0eSBUYXNrIGNhbiBzdGF5IGluIHRoZSBUYXNrIFF1ZXVlIGJlZm9yZSBpdCBpcyBwaWNrZWQgdXAgYnkgYSBXb3JrZXIuIERvIG5vdCBzcGVjaWZ5IHRoaXMgdGltZW91dCB1bmxlc3MgdXNpbmcgaG9zdC1zcGVjaWZpYyBUYXNrIFF1ZXVlcyBmb3IgQWN0aXZpdHkgVGFza3MgYXJlIGJlaW5nIHVzZWQgZm9yIHJvdXRpbmcuXG4gICAqIGBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0YCBpcyBhbHdheXMgbm9uLXJldHJ5YWJsZS4gUmV0cnlpbmcgYWZ0ZXIgdGhpcyB0aW1lb3V0IGRvZXNuJ3QgbWFrZSBzZW5zZSBhcyBpdCB3b3VsZCBqdXN0IHB1dCB0aGUgQWN0aXZpdHkgVGFzayBiYWNrIGludG8gdGhlIHNhbWUgVGFzayBRdWV1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHNjaGVkdWxlVG9DbG9zZVRpbWVvdXRgIG9yIHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVG90YWwgdGltZSB0aGF0IGEgd29ya2Zsb3cgaXMgd2lsbGluZyB0byB3YWl0IGZvciB0aGUgQWN0aXZpdHkgdG8gY29tcGxldGUuXG4gICAqIGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBsaW1pdHMgdGhlIHRvdGFsIHRpbWUgb2YgYW4gQWN0aXZpdHkncyBleGVjdXRpb24gaW5jbHVkaW5nIHJldHJpZXMgKHVzZSB7QGxpbmsgc3RhcnRUb0Nsb3NlVGltZW91dH0gdG8gbGltaXQgdGhlIHRpbWUgb2YgYSBzaW5nbGUgYXR0ZW1wdCkuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc3RhcnRUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gICAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICAgKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICAgKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAgICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gICAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEVhZ2VyIGRpc3BhdGNoIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IGltcHJvdmVzIHRoZSB0aHJvdWdocHV0IGFuZCBsb2FkIG9uIHRoZSBzZXJ2ZXIgZm9yIHNjaGVkdWxpbmcgQWN0aXZpdGllcy5cbiAgICogV2hlbiB1c2VkLCB0aGUgc2VydmVyIHdpbGwgaGFuZCBvdXQgQWN0aXZpdHkgdGFza3MgYmFjayB0byB0aGUgV29ya2VyIHdoZW4gaXQgY29tcGxldGVzIGEgV29ya2Zsb3cgdGFzay5cbiAgICogSXQgaXMgYXZhaWxhYmxlIGZyb20gc2VydmVyIHZlcnNpb24gMS4xNyBiZWhpbmQgdGhlIGBzeXN0ZW0uZW5hYmxlQWN0aXZpdHlFYWdlckV4ZWN1dGlvbmAgZmVhdHVyZSBmbGFnLlxuICAgKlxuICAgKiBFYWdlciBkaXNwYXRjaCB3aWxsIG9ubHkgYmUgdXNlZCBpZiBgYWxsb3dFYWdlckRpc3BhdGNoYCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgYW5kIHtAbGluayB0YXNrUXVldWV9IGlzIGVpdGhlclxuICAgKiBvbWl0dGVkIG9yIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhbGxvd0VhZ2VyRGlzcGF0Y2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIEFjdGl2aXR5IHNob3VsZCBydW4gb24gYVxuICAgKiB3b3JrZXIgd2l0aCBhIGNvbXBhdGlibGUgQnVpbGQgSWQgb3Igbm90LiBTZWUge0BsaW5rIFZlcnNpb25pbmdJbnRlbnR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ09NUEFUSUJMRSdcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gICAqL1xuICB2ZXJzaW9uaW5nSW50ZW50PzogVmVyc2lvbmluZ0ludGVudDtcblxuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlLWxpbmUgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3VtbWFyeT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgdGhpcyBhY3Rpdml0eVxuICAgKi9cbiAgcHJpb3JpdHk/OiBQcmlvcml0eTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBsb2NhbCBhY3Rpdml0eSBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxBY3Rpdml0eU9wdGlvbnMge1xuICAvKipcbiAgICogUmV0cnlQb2xpY3kgdGhhdCBkZWZpbmVzIGhvdyBhbiBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBTREstZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuXG4gICAqIE5vdGUgdGhhdCBsb2NhbCBhY3Rpdml0aWVzIGFyZSBhbHdheXMgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSwgZXZlbiBpZiBtYXhpbXVtIGF0dGVtcHRzIGlzIHNldCB0byAxIGR1ZSB0byBXb3JrZmxvdyB0YXNrIHJldHJpZXMuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgdGhlIGxvY2FsIGFjdGl2aXR5IGlzIGFsbG93ZWQgdG8gZXhlY3V0ZSBhZnRlciB0aGUgdGFzayBpcyBkaXNwYXRjaGVkLiBUaGlzXG4gICAqIHRpbWVvdXQgaXMgYWx3YXlzIHJldHJ5YWJsZS5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICogSWYgc2V0LCB0aGlzIG11c3QgYmUgPD0ge0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9LCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgY2xhbXBlZCBkb3duLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGltaXRzIHRpbWUgdGhlIGxvY2FsIGFjdGl2aXR5IGNhbiBpZGxlIGludGVybmFsbHkgYmVmb3JlIGJlaW5nIGV4ZWN1dGVkLiBUaGF0IGNhbiBoYXBwZW4gaWZcbiAgICogdGhlIHdvcmtlciBpcyBjdXJyZW50bHkgYXQgbWF4IGNvbmN1cnJlbnQgbG9jYWwgYWN0aXZpdHkgZXhlY3V0aW9ucy4gVGhpcyB0aW1lb3V0IGlzIGFsd2F5c1xuICAgKiBub24gcmV0cnlhYmxlIGFzIGFsbCBhIHJldHJ5IHdvdWxkIGFjaGlldmUgaXMgdG8gcHV0IGl0IGJhY2sgaW50byB0aGUgc2FtZSBxdWV1ZS4gRGVmYXVsdHNcbiAgICogdG8ge0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9IGlmIG5vdCBzcGVjaWZpZWQgYW5kIHRoYXQgaXMgc2V0LiBNdXN0IGJlIDw9XG4gICAqIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSB3aGVuIHNldCwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaG93IGxvbmcgdGhlIGNhbGxlciBpcyB3aWxsaW5nIHRvIHdhaXQgZm9yIGxvY2FsIGFjdGl2aXR5IGNvbXBsZXRpb24uIExpbWl0cyBob3dcbiAgICogbG9uZyByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhY3Rpdml0eSBpcyByZXRyeWluZyBhbmQgYmFja29mZiB3b3VsZCBleGNlZWQgdGhpcyB2YWx1ZSwgYSBzZXJ2ZXIgc2lkZSB0aW1lciB3aWxsIGJlIHNjaGVkdWxlZCBmb3IgdGhlIG5leHQgYXR0ZW1wdC5cbiAgICogT3RoZXJ3aXNlLCBiYWNrb2ZmIHdpbGwgaGFwcGVuIGludGVybmFsbHkgaW4gdGhlIFNESy5cbiAgICpcbiAgICogQGRlZmF1bHQgMSBtaW51dGVcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqKi9cbiAgbG9jYWxSZXRyeVRocmVzaG9sZD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAgICogLSB3aGVuIHNob3VsZCB0aGUgQWN0aXZpdHkgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIHRvIFdvcmtmbG93IChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlXG4gICAqICAgQWN0aXZpdHkgY2FsbCdzIHByb21pc2UgZmFpbCB3aXRoIGFuIGBBY3Rpdml0eUZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gY2FuY2VsbGF0aW9uIGJlaW5nXG4gICAqIGV4dGVybmFsbHkgcmVxdWVzdGVkIG9uIHRoZSBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZVxuICAgKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKiBhbHdheXMgcmVzdWx0cyBpbiBjYW5jZWxsYXRpb24gb2YgaXRzIG91dHN0YW5kaW5nIEFjdGl2aXR5IGV4ZWN1dGlvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhvc2VcbiAgICogQWN0aXZpdGllcycge0BsaW5rIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZX0gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgY2FuY2VsbGF0aW9uVHlwZT86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlLWxpbmUgc3VtbWFyeSBmb3IgdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgc3VtbWFyeT86IHN0cmluZztcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIFJlYXNvbihzKSB3aHkgY29udGludWUgYXMgbmV3IGlzIHN1Z2dlc3RlZC4gQ2FuIHBvdGVudGlhbGx5IGJlIG11bHRpcGxlIHJlYXNvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBNYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9IHtcbiAgSElTVE9SWV9TSVpFX1RPT19MQVJHRTogJ0hJU1RPUllfU0laRV9UT09fTEFSR0UnLFxuICBUT09fTUFOWV9ISVNUT1JZX0VWRU5UUzogJ1RPT19NQU5ZX0hJU1RPUllfRVZFTlRTJyxcbiAgVE9PX01BTllfVVBEQVRFUzogJ1RPT19NQU5ZX1VQREFURVMnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uID0gKHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbilba2V5b2YgdHlwZW9mIFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uXTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sIGRlY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbixcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4+KFxuICB7XG4gICAgW1N1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLkhJU1RPUllfU0laRV9UT09fTEFSR0VdOiAxLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9ISVNUT1JZX0VWRU5UU106IDIsXG4gICAgW1N1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLlRPT19NQU5ZX1VQREFURVNdOiAzLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnU1VHR0VTVF9DT05USU5VRV9BU19ORVdfUkVBU09OXydcbik7XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgZnVuY3Rpb24gc3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb25zRnJvbVByb3RvKFxuICByZWFzb25zOiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb25bXSB8IG51bGwgfCB1bmRlZmluZWRcbik6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCB1bmRlZmluZWQge1xuICBpZiAocmVhc29ucyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHJlczogU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVhc29ucykge1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbihyKTtcbiAgICBpZiAoZGVjb2RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXMucHVzaChkZWNvZGVkKTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiByZXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZhaWx1cmVDb252ZXJ0ZXIgfSBmcm9tICcuL2ZhaWx1cmUtY29udmVydGVyJztcbmltcG9ydCB7IERlZmF1bHRGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRDb2RlYyB9IGZyb20gJy4vcGF5bG9hZC1jb2RlYyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbi8qKlxuICogV2hlbiB5b3VyIGRhdGEgKGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcykgaXMgc2VudCBvdmVyIHRoZSB3aXJlIGFuZCBzdG9yZWQgYnkgVGVtcG9yYWwgU2VydmVyLCBpdCBpcyBlbmNvZGVkIGluXG4gKiBiaW5hcnkgaW4gYSB7QGxpbmsgUGF5bG9hZH0gUHJvdG9idWYgbWVzc2FnZS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBgRGF0YUNvbnZlcnRlcmAgc3VwcG9ydHMgYHVuZGVmaW5lZGAsIGBVaW50OEFycmF5YCwgYW5kIEpTT04gc2VyaWFsaXphYmxlcyAoc28gaWZcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9KU09OL3N0cmluZ2lmeSNkZXNjcmlwdGlvbiB8IGBKU09OLnN0cmluZ2lmeSh5b3VyQXJnT3JSZXR2YWwpYH1cbiAqIHdvcmtzLCB0aGUgZGVmYXVsdCBkYXRhIGNvbnZlcnRlciB3aWxsIHdvcmspLiBQcm90b2J1ZnMgYXJlIHN1cHBvcnRlZCB2aWFcbiAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9kYXRhLWNvbnZlcnRlcnMjcHJvdG9idWZzIHwgdGhpcyBBUEl9LlxuICpcbiAqIFVzZSBhIGN1c3RvbSBgRGF0YUNvbnZlcnRlcmAgdG8gY29udHJvbCB0aGUgY29udGVudHMgb2YgeW91ciB7QGxpbmsgUGF5bG9hZH1zLiBDb21tb24gcmVhc29ucyBmb3IgdXNpbmcgYSBjdXN0b21cbiAqIGBEYXRhQ29udmVydGVyYCBhcmU6XG4gKiAtIENvbnZlcnRpbmcgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIChmb3IgZXhhbXBsZSwgYEpTT04uc3RyaW5naWZ5KClgIGRvZXNuJ3RcbiAqICAgaGFuZGxlIGBCaWdJbnRgcywgc28gaWYgeW91IHdhbnQgdG8gcmV0dXJuIGB7IHRvdGFsOiAxMDAwbiB9YCBmcm9tIGEgV29ya2Zsb3csIFNpZ25hbCwgb3IgQWN0aXZpdHksIHlvdSBuZWVkIHlvdXJcbiAqICAgb3duIGBEYXRhQ29udmVydGVyYCkuXG4gKiAtIEVuY3J5cHRpbmcgdmFsdWVzIHRoYXQgbWF5IGNvbnRhaW4gcHJpdmF0ZSBpbmZvcm1hdGlvbiB0aGF0IHlvdSBkb24ndCB3YW50IHN0b3JlZCBpbiBwbGFpbnRleHQgaW4gVGVtcG9yYWwgU2VydmVyJ3NcbiAqICAgZGF0YWJhc2UuXG4gKiAtIENvbXByZXNzaW5nIHZhbHVlcyB0byByZWR1Y2UgZGlzayBvciBuZXR3b3JrIHVzYWdlLlxuICpcbiAqIFRvIHVzZSB5b3VyIGN1c3RvbSBgRGF0YUNvbnZlcnRlcmAsIHByb3ZpZGUgaXQgdG8gdGhlIHtAbGluayBXb3JrZmxvd0NsaWVudH0sIHtAbGluayBXb3JrZXJ9LCBhbmRcbiAqIHtAbGluayBidW5kbGVXb3JrZmxvd0NvZGV9IChpZiB5b3UgdXNlIGl0KTpcbiAqIC0gYG5ldyBXb3JrZmxvd0NsaWVudCh7IC4uLiwgZGF0YUNvbnZlcnRlciB9KWBcbiAqIC0gYFdvcmtlci5jcmVhdGUoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBidW5kbGVXb3JrZmxvd0NvZGUoeyAuLi4sIHBheWxvYWRDb252ZXJ0ZXJQYXRoIH0pYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFDb252ZXJ0ZXIge1xuICAvKipcbiAgICogUGF0aCBvZiBhIGZpbGUgdGhhdCBoYXMgYSBgcGF5bG9hZENvbnZlcnRlcmAgbmFtZWQgZXhwb3J0LlxuICAgKiBgcGF5bG9hZENvbnZlcnRlcmAgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKiBJZiBubyBwYXRoIGlzIHByb3ZpZGVkLCB7QGxpbmsgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJ9IGlzIHVzZWQuXG4gICAqL1xuICBwYXlsb2FkQ29udmVydGVyUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvZiBhIGZpbGUgdGhhdCBoYXMgYSBgZmFpbHVyZUNvbnZlcnRlcmAgbmFtZWQgZXhwb3J0LlxuICAgKiBgZmFpbHVyZUNvbnZlcnRlcmAgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9LlxuICAgKiBJZiBubyBwYXRoIGlzIHByb3ZpZGVkLCB7QGxpbmsgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJ9IGlzIHVzZWQuXG4gICAqL1xuICBmYWlsdXJlQ29udmVydGVyUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Yge0BsaW5rIFBheWxvYWRDb2RlY30gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBQYXlsb2FkcyBhcmUgZW5jb2RlZCBpbiB0aGUgb3JkZXIgb2YgdGhlIGFycmF5IGFuZCBkZWNvZGVkIGluIHRoZSBvcHBvc2l0ZSBvcmRlci4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGFcbiAgICogY29tcHJlc3Npb24gY29kZWMgYW5kIGFuIGVuY3J5cHRpb24gY29kZWMsIHRoZW4geW91IHdhbnQgZGF0YSB0byBiZSBlbmNvZGVkIHdpdGggdGhlIGNvbXByZXNzaW9uIGNvZGVjIGZpcnN0LCBzb1xuICAgKiB5b3UnZCBkbyBgcGF5bG9hZENvZGVjczogW2NvbXByZXNzaW9uQ29kZWMsIGVuY3J5cHRpb25Db2RlY11gLlxuICAgKi9cbiAgcGF5bG9hZENvZGVjcz86IFBheWxvYWRDb2RlY1tdO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIERhdGFDb252ZXJ0ZXJ9IHRoYXQgaGFzIGJlZW4gbG9hZGVkIHZpYSB7QGxpbmsgbG9hZERhdGFDb252ZXJ0ZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZERhdGFDb252ZXJ0ZXIge1xuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyO1xuICBmYWlsdXJlQ29udmVydGVyOiBGYWlsdXJlQ29udmVydGVyO1xuICBwYXlsb2FkQ29kZWNzOiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB7QGxpbmsgRmFpbHVyZUNvbnZlcnRlcn0gdXNlZCBieSB0aGUgU0RLLlxuICpcbiAqIEVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgYXJlIHNlcml6YWxpemVkIGFzIHBsYWluIHRleHQuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IG5ldyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlcigpO1xuXG4vKipcbiAqIEEgXCJsb2FkZWRcIiBkYXRhIGNvbnZlcnRlciB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgc2V0IG9mIGZhaWx1cmUgYW5kIHBheWxvYWQgY29udmVydGVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHREYXRhQ29udmVydGVyOiBMb2FkZWREYXRhQ29udmVydGVyID0ge1xuICBwYXlsb2FkQ29udmVydGVyOiBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcixcbiAgZmFpbHVyZUNvbnZlcnRlcjogZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIsXG4gIHBheWxvYWRDb2RlY3M6IFtdLFxufTtcbiIsImltcG9ydCAqIGFzIG5leHVzIGZyb20gJ25leHVzLXJwYyc7XG5pbXBvcnQgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFByb3RvRmFpbHVyZSB9IGZyb20gJy4uL2ZhaWx1cmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBcHBsaWNhdGlvbkZhaWx1cmUsXG4gIENhbmNlbGxlZEZhaWx1cmUsXG4gIENoaWxkV29ya2Zsb3dGYWlsdXJlLFxuICBkZWNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZGVjb2RlUmV0cnlTdGF0ZSxcbiAgZGVjb2RlVGltZW91dFR5cGUsXG4gIGVuY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5LFxuICBlbmNvZGVSZXRyeVN0YXRlLFxuICBlbmNvZGVUaW1lb3V0VHlwZSxcbiAgRkFJTFVSRV9TT1VSQ0UsXG4gIE5leHVzT3BlcmF0aW9uRmFpbHVyZSxcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJy4uL2ZhaWx1cmUnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgeyBpc0Vycm9yIH0gZnJvbSAnLi4vdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb1RzIH0gZnJvbSAnLi4vdGltZSc7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB7IGFycmF5RnJvbVBheWxvYWRzLCBmcm9tUGF5bG9hZHNBdEluZGV4LCB0b1BheWxvYWRzV2l0aENvbnRleHQgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5cbi8vIENhbid0IGltcG9ydCBwcm90byBlbnVtcyBpbnRvIHRoZSB3b3JrZmxvdyBzYW5kYm94LCB1c2UgdGhpcyBoZWxwZXIgdHlwZSBhbmQgZW51bSBjb252ZXJ0ZXIgaW5zdGVhZC5cbmNvbnN0IE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9IHtcbiAgUkVUUllBQkxFOiAnUkVUUllBQkxFJyxcbiAgTk9OX1JFVFJZQUJMRTogJ05PTl9SRVRSWUFCTEUnLFxufSBhcyBjb25zdDtcbnR5cGUgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yID1cbiAgKHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IpW2tleW9mIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3JdO1xuXG5jb25zdCBbZW5jb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLCBkZWNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAgdHlwZW9mIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIFtOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IuUkVUUllBQkxFXTogMSxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLk5PTl9SRVRSWUFCTEVdOiAyLFxuICB9IGFzIGNvbnN0LFxuICAnTkVYVVNfSEFORExFUl9FUlJPUl9SRVRSWV9CRUhBVklPUl8nXG4pO1xuXG5mdW5jdGlvbiBjb21iaW5lUmVnRXhwKC4uLnJlZ2V4cHM6IFJlZ0V4cFtdKTogUmVnRXhwIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhwcy5tYXAoKHgpID0+IGAoPzoke3guc291cmNlfSlgKS5qb2luKCd8JykpO1xufVxuXG4vKipcbiAqIFN0YWNrIHRyYWNlcyB3aWxsIGJlIGN1dG9mZiB3aGVuIG9uIG9mIHRoZXNlIHBhdHRlcm5zIGlzIG1hdGNoZWRcbiAqL1xuY29uc3QgQ1VUT0ZGX1NUQUNLX1BBVFRFUk5TID0gY29tYmluZVJlZ0V4cChcbiAgLyoqIEFjdGl2aXR5IGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0IChBY3Rpdml0eVxcLik/ZXhlY3V0ZSBcXCguKltcXFxcL113b3JrZXJbXFxcXC9dKD86c3JjfGxpYilbXFxcXC9dYWN0aXZpdHlcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogTmV4dXMgZXhlY3V0aW9uICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKE5leHVzSGFuZGxlclxcLik/aW52b2tlVXNlckNvZGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXW5leHVzW1xcXFwvXWluZGV4XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIFdvcmtmbG93IGFjdGl2YXRpb24gKGluYm91bmQgaGFuZGxlcnMgb25seSkgKi9cbiAgL1xccythdCggYXN5bmMpPyAoQWN0aXZhdG9yXFwuKT8oc3RhcnRXb3JrZmxvd3xxdWVyeVdvcmtmbG93fHNpZ25hbFdvcmtmbG93fHVwZGF0ZXx2YWxpZGF0ZVVwZGF0ZSlOZXh0SGFuZGxlciBcXCguKlxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBydW4gYW55dGhpbmcgaW4gY29udGV4dCAqL1xuICAvXFxzK2F0IChTY3JpcHRcXC4pP3J1bkluQ29udGV4dCBcXChuYXRpdmV8dW5rbm93bnwoPzooPzpub2RlOnZtfHZtXFwuanMpOlxcZCs6XFxkKylcXCkvXG4pO1xuXG4vKipcbiAqIEFueSBzdGFjayB0cmFjZSBmcmFtZXMgdGhhdCBtYXRjaCBhbnkgb2YgdGhvc2Ugd2lsIGJlIGRvcHBlZC5cbiAqIFRoZSBcIm51bGwuXCIgcHJlZml4IG9uIHNvbWUgY2FzZXMgaXMgdG8gYXZvaWQgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MjQxN1xuICovXG5jb25zdCBEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/bmV4dCBcXCguKltcXFxcL11jb21tb25bXFxcXC9dKD86c3JjfGxpYilbXFxcXC9daW50ZXJjZXB0b3JzXFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNoYWluIGludGVyY2VwdG9ycyAqL1xuICAvXFxzK2F0IChudWxsXFwuKT9leGVjdXRlTmV4dEhhbmRsZXIgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpL1xuKTtcblxuLyoqXG4gKiBDdXRzIG91dCB0aGUgZnJhbWV3b3JrIHBhcnQgb2YgYSBzdGFjayB0cmFjZSwgbGVhdmluZyBvbmx5IHVzZXIgY29kZSBlbnRyaWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXRvZmZTdGFja1RyYWNlKHN0YWNrPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSAoc3RhY2sgPz8gJycpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IGFjYyA9IEFycmF5PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgaWYgKENVVE9GRl9TVEFDS19QQVRURVJOUy50ZXN0KGxpbmUpKSBicmVhaztcbiAgICBpZiAoIURST1BQRURfU1RBQ0tfRlJBTUVTX1BBVFRFUk5TLnRlc3QobGluZSkpIGFjYy5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBhY2Muam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQSBgRmFpbHVyZUNvbnZlcnRlcmAgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgZnJvbSBwcm90byBgRmFpbHVyZWAgaW5zdGFuY2VzIHRvIEpTIGBFcnJvcnNgIGFuZCBiYWNrLlxuICpcbiAqIFdlIHJlY29tbWVuZGVkIHVzaW5nIHRoZSB7QGxpbmsgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJ9IGluc3RlYWQgb2YgY3VzdG9taXppbmcgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW4gb3JkZXJcbiAqIHRvIG1haW50YWluIGNyb3NzLWxhbmd1YWdlIEZhaWx1cmUgc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmVDb252ZXJ0ZXIge1xuICAvKipcbiAgICogQ29udmVydHMgYSBjYXVnaHQgZXJyb3IgdG8gYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UuXG4gICAqL1xuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFByb3RvRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBlcnJvciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBUZW1wb3JhbEZhaWx1cmVgLlxuICAgKi9cbiAgZmFpbHVyZVRvRXJyb3IoZXJyOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IEVycm9yO1xufVxuXG4vKipcbiAqIFRoZSBcInNoYXBlXCIgb2YgdGhlIGF0dHJpYnV0ZXMgc2V0IGFzIHRoZSB7QGxpbmsgUHJvdG9GYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzfSBwYXlsb2FkIGluIGNhc2VcbiAqIHtAbGluayBEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzLmVuY29kZUNvbW1vbkF0dHJpYnV0ZXN9IGlzIHNldCB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcyB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2tfdHJhY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmNvZGUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyAoZm9yIGVuY3J5cHRpbmcgdGhlc2UgYXR0cmlidXRlcyB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfSkuXG4gICAqL1xuICBlbmNvZGVDb21tb25BdHRyaWJ1dGVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmF1bHQsIGNyb3NzLWxhbmd1YWdlLWNvbXBhdGlibGUgRmFpbHVyZSBjb252ZXJ0ZXIuXG4gKlxuICogQnkgZGVmYXVsdCwgaXQgd2lsbCBsZWF2ZSBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFzIHBsYWluIHRleHQuIEluIG9yZGVyIHRvIGVuY3J5cHQgdGhlbSwgc2V0XG4gKiBgZW5jb2RlQ29tbW9uQXR0cmlidXRlc2AgdG8gYHRydWVgIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfSB0aGF0IGNhbiBlbmNyeXB0IC9cbiAqIGRlY3J5cHQgUGF5bG9hZHMgaW4geW91ciB7QGxpbmsgV29ya2VyT3B0aW9ucy5kYXRhQ29udmVydGVyIHwgV29ya2VyfSBhbmRcbiAqIHtAbGluayBDbGllbnRPcHRpb25zLmRhdGFDb252ZXJ0ZXIgfCBDbGllbnQgb3B0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciBpbXBsZW1lbnRzIEZhaWx1cmVDb252ZXJ0ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucz4pIHtcbiAgICBjb25zdCB7IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogZW5jb2RlQ29tbW9uQXR0cmlidXRlcyA/PyBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzZXQgY29tbW9uIHByb3BlcnRpZXMsIHRoYXQgaXMgZG9uZSBpbiB7QGxpbmsgZmFpbHVyZVRvRXJyb3J9LlxuICAgKi9cbiAgZmFpbHVyZVRvRXJyb3JJbm5lcihcbiAgICBmYWlsdXJlOiBQcm90b0ZhaWx1cmUsXG4gICAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbiAgKTogRXJyb3Ige1xuICAgIGlmIChmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25GYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8udHlwZSxcbiAgICAgICAgQm9vbGVhbihmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8ubm9uUmV0cnlhYmxlKSxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLmRldGFpbHM/LnBheWxvYWRzLCBjb250ZXh0KSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkoZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLmNhdGVnb3J5KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuc2VydmVyRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgU2VydmVyRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgQm9vbGVhbihmYWlsdXJlLnNlcnZlckZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS50aW1lb3V0RmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgVGltZW91dEZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZyb21QYXlsb2Fkc0F0SW5kZXgocGF5bG9hZENvbnZlcnRlciwgMCwgZmFpbHVyZS50aW1lb3V0RmFpbHVyZUluZm8ubGFzdEhlYXJ0YmVhdERldGFpbHM/LnBheWxvYWRzLCBjb250ZXh0KSxcbiAgICAgICAgZGVjb2RlVGltZW91dFR5cGUoZmFpbHVyZS50aW1lb3V0RmFpbHVyZUluZm8udGltZW91dFR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS50ZXJtaW5hdGVkRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgVGVybWluYXRlZEZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5jYW5jZWxlZEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IENhbmNlbGxlZEZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuY2FuY2VsZWRGYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcywgY29udGV4dCksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5yZXNldFdvcmtmbG93RmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25GYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICAnUmVzZXRXb3JrZmxvdycsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLnJlc2V0V29ya2Zsb3dGYWlsdXJlSW5mby5sYXN0SGVhcnRiZWF0RGV0YWlscz8ucGF5bG9hZHMsIGNvbnRleHQpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICBjb25zdCB7IG5hbWVzcGFjZSwgd29ya2Zsb3dUeXBlLCB3b3JrZmxvd0V4ZWN1dGlvbiwgcmV0cnlTdGF0ZSB9ID0gZmFpbHVyZS5jaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm87XG4gICAgICBpZiAoISh3b3JrZmxvd1R5cGU/Lm5hbWUgJiYgd29ya2Zsb3dFeGVjdXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYXR0cmlidXRlcyBvbiBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm8nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUoXG4gICAgICAgIG5hbWVzcGFjZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHdvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICB3b3JrZmxvd1R5cGUubmFtZSxcbiAgICAgICAgZGVjb2RlUmV0cnlTdGF0ZShyZXRyeVN0YXRlKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8pIHtcbiAgICAgIGlmICghZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5VHlwZT8ubmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2aXR5VHlwZT8ubmFtZSBvbiBhY3Rpdml0eUZhaWx1cmVJbmZvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IEFjdGl2aXR5RmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5VHlwZS5uYW1lLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlJZCA/PyB1bmRlZmluZWQsXG4gICAgICAgIGRlY29kZVJldHJ5U3RhdGUoZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLnJldHJ5U3RhdGUpLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uaWRlbnRpdHkgPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUubmV4dXNIYW5kbGVyRmFpbHVyZUluZm8pIHtcbiAgICAgIGxldCByZXRyeWFibGVPdmVycmlkZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJldHJ5QmVoYXZpb3IgPSBkZWNvZGVOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IoZmFpbHVyZS5uZXh1c0hhbmRsZXJGYWlsdXJlSW5mby5yZXRyeUJlaGF2aW9yKTtcbiAgICAgIHN3aXRjaCAocmV0cnlCZWhhdmlvcikge1xuICAgICAgICBjYXNlICdSRVRSWUFCTEUnOlxuICAgICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTk9OX1JFVFJZQUJMRSc6XG4gICAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3RXJyb3JUeXBlID0gZmFpbHVyZS5uZXh1c0hhbmRsZXJGYWlsdXJlSW5mby50eXBlIHx8ICcnO1xuICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlOiBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlID0gT2JqZWN0Lmhhc093bihuZXh1cy5IYW5kbGVyRXJyb3JUeXBlLCByYXdFcnJvclR5cGUpXG4gICAgICAgID8gbmV4dXMuSGFuZGxlckVycm9yVHlwZVtyYXdFcnJvclR5cGUgYXMga2V5b2YgdHlwZW9mIG5leHVzLkhhbmRsZXJFcnJvclR5cGVdXG4gICAgICAgIDogJ1VOS05PV04nO1xuXG4gICAgICByZXR1cm4gbmV3IG5leHVzLkhhbmRsZXJFcnJvcihyZXNvbHZlZFR5cGUsIGZhaWx1cmUubWVzc2FnZSA/PyAnTmV4dXMgaGFuZGxlciBlcnJvcicsIHtcbiAgICAgICAgY2F1c2U6IHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpLFxuICAgICAgICByZXRyeWFibGVPdmVycmlkZSxcbiAgICAgICAgcmF3RXJyb3JUeXBlLFxuICAgICAgICBvcmlnaW5hbEZhaWx1cmU6IHRoaXMudGVtcG9yYWxGYWlsdXJlVG9OZXh1c0ZhaWx1cmUoZmFpbHVyZSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBOZXh1c09wZXJhdGlvbkZhaWx1cmUoXG4gICAgICAgIC8vIFRPRE8obmV4dXMvZXJyb3IpOiBNYXliZSBzZXQgYSBkZWZhdWx0IG1lc3NhZ2UgaGVyZSwgb25jZSB3ZSd2ZSBkZWNpZGVkIG9uIGVycm9yIGhhbmRsaW5nLlxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8uc2NoZWR1bGVkRXZlbnRJZD8udG9OdW1iZXIoKSxcbiAgICAgICAgLy8gV2UgYXNzdW1lIHRoZXNlIHdpbGwgYWx3YXlzIGJlIHNldCBvciBncmFjZWZ1bGx5IHNldCB0byBlbXB0eSBzdHJpbmdzLlxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8uZW5kcG9pbnQgPz8gJycsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5zZXJ2aWNlID8/ICcnLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8ub3BlcmF0aW9uID8/ICcnLFxuICAgICAgICBmYWlsdXJlLm5leHVzT3BlcmF0aW9uRXhlY3V0aW9uRmFpbHVyZUluZm8ub3BlcmF0aW9uVG9rZW4gPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZW1wb3JhbEZhaWx1cmUoXG4gICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dClcbiAgICApO1xuICB9XG5cbiAgZmFpbHVyZVRvRXJyb3IoZmFpbHVyZTogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBFcnJvciB7XG4gICAgaWYgKGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gcGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZDxEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzPihmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzLCBjb250ZXh0KTtcbiAgICAgIC8vIERvbid0IGFwcGx5IGVuY29kZWRBdHRyaWJ1dGVzIHVubGVzcyB0aGV5IGNvbmZvcm0gdG8gYW4gZXhwZWN0ZWQgc2NoZW1hXG4gICAgICBpZiAodHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiBhdHRycyAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlIH0gPSBhdHRycztcbiAgICAgICAgLy8gQXZvaWQgbXV0YXRpbmcgdGhlIGFyZ3VtZW50XG4gICAgICAgIGZhaWx1cmUgPSB7IC4uLmZhaWx1cmUgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGZhaWx1cmUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdGFja190cmFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSBzdGFja190cmFjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcnIgPSB0aGlzLmZhaWx1cmVUb0Vycm9ySW5uZXIoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCk7XG4gICAgZXJyLnN0YWNrID0gZmFpbHVyZS5zdGFja1RyYWNlID8/ICcnO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgIGVyci5mYWlsdXJlID0gZmFpbHVyZTtcbiAgICB9XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KTogUHJvdG9GYWlsdXJlIHtcbiAgICBjb25zdCBmYWlsdXJlID0gdGhpcy5lcnJvclRvRmFpbHVyZUlubmVyKGVyciwgcGF5bG9hZENvbnZlcnRlciwgY29udGV4dCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmNvZGVDb21tb25BdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2UsIHN0YWNrVHJhY2UgfSA9IGZhaWx1cmU7XG4gICAgICBmYWlsdXJlLm1lc3NhZ2UgPSAnRW5jb2RlZCBmYWlsdXJlJztcbiAgICAgIGZhaWx1cmUuc3RhY2tUcmFjZSA9ICcnO1xuICAgICAgZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcyA9IHBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHsgbWVzc2FnZSwgc3RhY2tfdHJhY2U6IHN0YWNrVHJhY2UgfSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSB8fCBlcnIgaW5zdGFuY2VvZiBuZXh1cy5IYW5kbGVyRXJyb3IpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUgJiYgZXJyLmZhaWx1cmUpIHJldHVybiBlcnIuZmFpbHVyZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICBzdGFja1RyYWNlOiBjdXRvZmZTdGFja1RyYWNlKGVyci5zdGFjayksXG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZShlcnIuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpLFxuICAgICAgICBzb3VyY2U6IEZBSUxVUkVfU09VUkNFLFxuICAgICAgfTtcblxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFjdGl2aXR5RmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgYWN0aXZpdHlGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgLi4uZXJyLFxuICAgICAgICAgICAgcmV0cnlTdGF0ZTogZW5jb2RlUmV0cnlTdGF0ZShlcnIucmV0cnlTdGF0ZSksXG4gICAgICAgICAgICBhY3Rpdml0eVR5cGU6IHsgbmFtZTogZXJyLmFjdGl2aXR5VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgLi4uZXJyLFxuICAgICAgICAgICAgcmV0cnlTdGF0ZTogZW5jb2RlUmV0cnlTdGF0ZShlcnIucmV0cnlTdGF0ZSksXG4gICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjogZXJyLmV4ZWN1dGlvbixcbiAgICAgICAgICAgIHdvcmtmbG93VHlwZTogeyBuYW1lOiBlcnIud29ya2Zsb3dUeXBlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFwcGxpY2F0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgICAgbm9uUmV0cnlhYmxlOiBlcnIubm9uUmV0cnlhYmxlLFxuICAgICAgICAgICAgZGV0YWlsczpcbiAgICAgICAgICAgICAgZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB7IHBheWxvYWRzOiB0b1BheWxvYWRzV2l0aENvbnRleHQocGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5leHRSZXRyeURlbGF5OiBtc09wdGlvbmFsVG9UcyhlcnIubmV4dFJldHJ5RGVsYXkpLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGVuY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGVyci5jYXRlZ29yeSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjYW5jZWxlZEZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBkZXRhaWxzOlxuICAgICAgICAgICAgICBlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBlcnIuZGV0YWlscykgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGltZW91dEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRpbWVvdXRGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgdGltZW91dFR5cGU6IGVuY29kZVRpbWVvdXRUeXBlKGVyci50aW1lb3V0VHlwZSksXG4gICAgICAgICAgICBsYXN0SGVhcnRiZWF0RGV0YWlsczogZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzXG4gICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KHBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQsIFtlcnIubGFzdEhlYXJ0YmVhdERldGFpbHNdKSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgU2VydmVyRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgc2VydmVyRmFpbHVyZUluZm86IHsgbm9uUmV0cnlhYmxlOiBlcnIubm9uUmV0cnlhYmxlIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVybWluYXRlZEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRlcm1pbmF0ZWRGYWlsdXJlSW5mbzoge30sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICAgIGlmIChlcnIub3JpZ2luYWxGYWlsdXJlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUoZXJyLm9yaWdpbmFsRmFpbHVyZSwgZXJyLnJldHJ5YWJsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHJ5QmVoYXZpb3I6IHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgc3dpdGNoIChlcnIucmV0cnlhYmxlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvciA9IGVuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcignUkVUUllBQkxFJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvciA9IGVuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcignTk9OX1JFVFJZQUJMRScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgIG5leHVzSGFuZGxlckZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgICAgICByZXRyeUJlaGF2aW9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTmV4dXNPcGVyYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBuZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBzY2hlZHVsZWRFdmVudElkOiBlcnIuc2NoZWR1bGVkRXZlbnRJZCA/IExvbmcuZnJvbU51bWJlcihlcnIuc2NoZWR1bGVkRXZlbnRJZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbmRwb2ludDogZXJyLmVuZHBvaW50LFxuICAgICAgICAgICAgc2VydmljZTogZXJyLnNlcnZpY2UsXG4gICAgICAgICAgICBvcGVyYXRpb246IGVyci5vcGVyYXRpb24sXG4gICAgICAgICAgICBvcGVyYXRpb25Ub2tlbjogZXJyLm9wZXJhdGlvblRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBKdXN0IGEgVGVtcG9yYWxGYWlsdXJlXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlID0ge1xuICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICB9O1xuXG4gICAgaWYgKGlzRXJyb3IoZXJyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nKGVyci5tZXNzYWdlID8/ICcnKSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoKGVyciBhcyBhbnkpLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBgIFtBIG5vbi1FcnJvciB2YWx1ZSB3YXMgdGhyb3duIGZyb20geW91ciBjb2RlLiBXZSByZWNvbW1lbmQgdGhyb3dpbmcgRXJyb3Igb2JqZWN0cyBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIGEgc3RhY2sgdHJhY2VdYDtcblxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogZXJyICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IG1lc3NhZ2UgKyByZWNvbW1lbmRhdGlvbiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IFN0cmluZyhlcnIpICsgcmVjb21tZW5kYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdCBpZiBkZWZpbmVkIG9yIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cbiAgb3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKFxuICAgIGZhaWx1cmU6IFByb3RvRmFpbHVyZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbiAgKTogRXJyb3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmYWlsdXJlID8gdGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBlcnJvciB0byBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSBpZiBkZWZpbmVkIG9yIHJldHVybnMgdW5kZWZpbmVkXG4gICAqL1xuICBvcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoXG4gICAgZXJyOiB1bmtub3duLFxuICAgIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gICAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4gICk6IFByb3RvRmFpbHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGVyciA/IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZXJyLCBwYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUoZmFpbHVyZTogbmV4dXMuRmFpbHVyZSwgcmV0cnlhYmxlOiBib29sZWFuKTogUHJvdG9GYWlsdXJlIHtcbiAgICBpZiAoZmFpbHVyZS5tZXRhZGF0YT8udHlwZSA9PT0gJ3RlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLkZhaWx1cmUnKSB7XG4gICAgICBpZiAoZmFpbHVyZS5kZXRhaWxzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1pc3NpbmcgZGV0YWlscyBmb3IgTmV4dXMgRmFpbHVyZSBvZiB0eXBlICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJ1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWlsdXJlLmRldGFpbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFsRmFpbHVyZTogUHJvdG9GYWlsdXJlID0ge307XG4gICAgICB0ZW1wb3JhbEZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mbyA9IHtcbiAgICAgICAgdHlwZTogJ05leHVzRmFpbHVyZScsXG4gICAgICAgIG5vblJldHJ5YWJsZTogIXJldHJ5YWJsZSxcbiAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgIHBheWxvYWRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7IGVuY29kaW5nOiBlbmNvZGUoJ2pzb24vcGxhaW4nKSB9LFxuICAgICAgICAgICAgICBkYXRhOiBlbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyAuLi5mYWlsdXJlLCBtZXNzYWdlOiAnJyB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLm1lc3NhZ2UgPSBmYWlsdXJlLm1lc3NhZ2U7XG4gICAgICB0ZW1wb3JhbEZhaWx1cmUuc3RhY2tUcmFjZSA9IGZhaWx1cmUuc3RhY2tUcmFjZSA/PyAnJztcbiAgICAgIHJldHVybiB0ZW1wb3JhbEZhaWx1cmU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0ZW1wb3JhbEZhaWx1cmVUb05leHVzRmFpbHVyZShmYWlsdXJlOiBQcm90b0ZhaWx1cmUpOiBuZXh1cy5GYWlsdXJlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogZmFpbHVyZS5tZXNzYWdlID8/ICcnLFxuICAgICAgbWV0YWRhdGE6IHsgdHlwZTogJ3RlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLkZhaWx1cmUnIH0sXG4gICAgICAvLyBTdG9yZSB0aGUgZnVsbCBQcm90b0ZhaWx1cmUgYXMgdGhlIE5leHVzIGZhaWx1cmUgZGV0YWlscyBzbyBpdCBjYW4gYmUgcm91bmQtdHJpcHBlZFxuICAgICAgLy8gbG9zc2xlc3NseSBiYWNrIHRvIGEgUHJvdG9GYWlsdXJlIHZpYSBuZXh1c0ZhaWx1cmVUb1RlbXBvcmFsRmFpbHVyZS5cbiAgICAgIGRldGFpbHM6IHsgLi4uZmFpbHVyZSB9LFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemF0aW9uQ29udGV4dCB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi1jb250ZXh0JztcblxuLyoqXG4gKiBgUGF5bG9hZENvZGVjYCBpcyBhbiBvcHRpb25hbCBzdGVwIHRoYXQgaGFwcGVucyBiZXR3ZWVuIHRoZSB3aXJlIGFuZCB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIFRlbXBvcmFsIFNlcnZlciA8LS0+IFdpcmUgPC0tPiBgUGF5bG9hZENvZGVjYCA8LS0+IGBQYXlsb2FkQ29udmVydGVyYCA8LS0+IFVzZXIgY29kZVxuICpcbiAqIEltcGxlbWVudCB0aGlzIHRvIHRyYW5zZm9ybSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHRvL2Zyb20gdGhlIGZvcm1hdCBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHN0b3JlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBDb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29kZWMge1xuICAvKipcbiAgICogRW5jb2RlIGFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkfXMgZm9yIHNlbmRpbmcgb3ZlciB0aGUgd2lyZS5cbiAgICogQHBhcmFtIHBheWxvYWRzIE1heSBoYXZlIGxlbmd0aCAwLlxuICAgKi9cbiAgZW5jb2RlKHBheWxvYWRzOiBQYXlsb2FkW10sIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFByb21pc2U8UGF5bG9hZFtdPjtcblxuICAvKipcbiAgICogRGVjb2RlIGFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkfXMgcmVjZWl2ZWQgZnJvbSB0aGUgd2lyZS5cbiAgICovXG4gIGRlY29kZShwYXlsb2FkczogUGF5bG9hZFtdLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQcm9taXNlPFBheWxvYWRbXT47XG59XG4iLCJpbXBvcnQgeyBkZWNvZGUsIGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7IFBheWxvYWRDb252ZXJ0ZXJFcnJvciwgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphdGlvbkNvbnRleHQgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5pbXBvcnQgeyBlbmNvZGluZ0tleXMsIGVuY29kaW5nVHlwZXMsIE1FVEFEQVRBX0VOQ09ESU5HX0tFWSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBzZXJpYWxpemUvZGVzZXJpYWxpemUgZGF0YSBsaWtlIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMuXG4gKlxuICogVGhpcyBpcyBjYWxsZWQgaW5zaWRlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20gfCBXb3JrZmxvdyBpc29sYXRlfS5cbiAqIFRvIHdyaXRlIGFzeW5jIGNvZGUgb3IgdXNlIE5vZGUgQVBJcyAob3IgdXNlIHBhY2thZ2VzIHRoYXQgdXNlIE5vZGUgQVBJcyksIHVzZSBhIHtAbGluayBQYXlsb2FkQ29kZWN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXIge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIFNob3VsZCB0aHJvdyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgdW5hYmxlIHRvIGNvbnZlcnQuXG4gICAqL1xuICB0b1BheWxvYWQ8VD4odmFsdWU6IFQsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEge0BsaW5rIFBheWxvYWR9IGJhY2sgdG8gYSB2YWx1ZS5cbiAgICovXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFQ7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlclxuICogQHBhcmFtIHZhbHVlcyBKUyB2YWx1ZXMgdG8gY29udmVydCB0byBQYXlsb2Fkc1xuICogQHJldHVybiBsaXN0IG9mIHtAbGluayBQYXlsb2FkfXNcbiAqIEB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BheWxvYWRzKGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgLi4udmFsdWVzOiB1bmtub3duW10pOiBQYXlsb2FkW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdG9QYXlsb2Fkc1dpdGhDb250ZXh0KGNvbnZlcnRlciwgdW5kZWZpbmVkLCB2YWx1ZXMpO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhIGxpc3Qgb2YgdmFsdWVzIHdpdGggYW4gb3B0aW9uYWwgc2VyaWFsaXphdGlvbiBjb250ZXh0LlxuICpcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGF5bG9hZHNXaXRoQ29udGV4dChcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBjb250ZXh0OiBTZXJpYWxpemF0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCxcbiAgdmFsdWVzOiB1bmtub3duW11cbik6IFBheWxvYWRbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gY29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSwgY29udGV4dCkpO1xufVxuXG4vKipcbiAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlci50b1BheWxvYWR9IG9uIGFuIG9wdGlvbmFsIHZhbHVlLCBhbmQgdGhlbiBlbmNvZGUgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0T3B0aW9uYWxUb1BheWxvYWQoXG4gIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IFBheWxvYWQgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gcGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQodmFsdWUsIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlci50b1BheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIG1hcC5cbiAqXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIGFueSB2YWx1ZSBpbiB0aGUgbWFwIGZhaWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1BheWxvYWRzPEsgZXh0ZW5kcyBzdHJpbmcsIFQgPSBhbnk+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIG1hcDogUmVjb3JkPEssIFQ+LFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IFJlY29yZDxLLCBQYXlsb2FkPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCB2XSk6IFtLLCBQYXlsb2FkXSA9PiBbayBhcyBLLCBjb252ZXJ0ZXIudG9QYXlsb2FkKHYsIGNvbnRleHQpXSlcbiAgKSBhcyBSZWNvcmQ8SywgUGF5bG9hZD47XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGFuIGFycmF5IG9mIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIFVzZWZ1bCBmb3IgZGVzZXJpYWxpemluZ1xuICogYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIHBheWxvYWRzXG4gKiBAcGFyYW0gcGF5bG9hZHMgc2VyaWFsaXplZCB2YWx1ZSB0byBjb252ZXJ0IHRvIEpTIHZhbHVlcy5cbiAqIEByZXR1cm4gY29udmVydGVkIEpTIHZhbHVlXG4gKiBAdGhyb3dzIHtAbGluayBQYXlsb2FkQ29udmVydGVyRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIGRhdGEgcGFzc2VkIGFzIHBhcmFtZXRlciBmYWlsZWQgZm9yIGFueVxuICogICAgIHJlYXNvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QYXlsb2Fkc0F0SW5kZXg8VD4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgaW5kZXg6IG51bWJlcixcbiAgcGF5bG9hZHM/OiBQYXlsb2FkW10gfCBudWxsLFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IFQge1xuICAvLyBUbyBtYWtlIGFkZGluZyBhcmd1bWVudHMgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBjaGFuZ2VcbiAgaWYgKHBheWxvYWRzID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZHMgPT09IG51bGwgfHwgaW5kZXggPj0gcGF5bG9hZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IHBheWxvYWRzPy5baW5kZXhdO1xuICBpZiAoIXBheWxvYWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgfVxuICByZXR1cm4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQsIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZH0gb24gZWFjaCB2YWx1ZSBpbiB0aGUgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUZyb21QYXlsb2FkcyhcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwsXG4gIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dFxuKTogdW5rbm93bltdIHtcbiAgaWYgKCFwYXlsb2Fkcykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZHMubWFwKChwYXlsb2FkOiBQYXlsb2FkKSA9PiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCwgY29udGV4dCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwRnJvbVBheWxvYWRzPEsgZXh0ZW5kcyBzdHJpbmcsIFQgPSB1bmtub3duPihcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBtYXA/OiBSZWNvcmQ8SywgUGF5bG9hZD4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHRcbik6IFJlY29yZDxLLCBUPiB8IHVuZGVmaW5lZCB7XG4gIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXApLm1hcCgoW2ssIHBheWxvYWRdKTogW0ssIHVua25vd25dID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQgYXMgUGF5bG9hZCwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW2sgYXMgSywgdmFsdWVdO1xuICAgIH0pXG4gICkgYXMgUmVjb3JkPEssIFQ+O1xufVxuXG5leHBvcnQgZGVjbGFyZSBjb25zdCByYXdQYXlsb2FkVHlwZUJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuLyoqXG4gKiBSYXdWYWx1ZSBpcyBhIHdyYXBwZXIgb3ZlciBhIHBheWxvYWQuXG4gKiBBIHBheWxvYWQgdGhhdCBiZWxvbmdzIHRvIGEgUmF3VmFsdWUgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGJ5cGFzc2VzIHVzZXItZGVmaW5lZCBwYXlsb2FkIGNvbnZlcnRlcnMsXG4gKiBpbnN0ZWFkIHVzaW5nIHRoZSBkZWZhdWx0IHBheWxvYWQgY29udmVydGVyLiBUaGUgcGF5bG9hZCBzdGlsbCB1bmRlcmdvZXMgY29kZWMgY29udmVyc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJhd1ZhbHVlPFQgPSB1bmtub3duPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BheWxvYWQ6IFBheWxvYWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgW3Jhd1BheWxvYWRUeXBlQnJhbmRdOiBUID0gdW5kZWZpbmVkIGFzIFQ7XG5cbiAgY29uc3RydWN0b3IodmFsdWU6IFQsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIgPSBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciwgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0KSB7XG4gICAgdGhpcy5fcGF5bG9hZCA9IHBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlLCBjb250ZXh0KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUGF5bG9hZChwOiBQYXlsb2FkKTogUmF3VmFsdWUge1xuICAgIHJldHVybiBuZXcgUmF3VmFsdWUocCwgaWRlbnRpdHlQYXlsb2FkQ29udmVydGVyKTtcbiAgfVxuXG4gIGdldCBwYXlsb2FkKCk6IFBheWxvYWQge1xuICAgIHJldHVybiB0aGlzLl9wYXlsb2FkO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuIEV4YW1wbGUgdmFsdWVzIGluY2x1ZGUgdGhlIFdvcmtmbG93IGFyZ3Mgc2VudCBmcm9tIHRoZSBDbGllbnQgYW5kIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYSBXb3JrZmxvdyBvciBBY3Rpdml0eS5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQYXlsb2FkfSwgb3IgYHVuZGVmaW5lZGAgaWYgdW5hYmxlIHRvIGNvbnZlcnQuXG4gICAqL1xuICB0b1BheWxvYWQ8VD4odmFsdWU6IFQsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFBheWxvYWQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEge0BsaW5rIFBheWxvYWR9IGJhY2sgdG8gYSB2YWx1ZS5cbiAgICovXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQsIGNvbnRleHQ/OiBTZXJpYWxpemF0aW9uQ29udGV4dCk6IFQ7XG5cbiAgcmVhZG9ubHkgZW5jb2RpbmdUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJpZXMgdG8gY29udmVydCB2YWx1ZXMgdG8ge0BsaW5rIFBheWxvYWR9cyB1c2luZyB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmd9cyBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IsIGluIHRoZSBvcmRlciBwcm92aWRlZC5cbiAqXG4gKiBDb252ZXJ0cyBQYXlsb2FkcyB0byB2YWx1ZXMgYmFzZWQgb24gdGhlIGBQYXlsb2FkLm1ldGFkYXRhLmVuY29kaW5nYCBmaWVsZCwgd2hpY2ggbWF0Y2hlcyB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZW5jb2RpbmdUeXBlfVxuICogb2YgdGhlIGNvbnZlcnRlciB0aGF0IGNyZWF0ZWQgdGhlIFBheWxvYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIHJlYWRvbmx5IGNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXTtcbiAgcmVhZG9ubHkgY29udmVydGVyQnlFbmNvZGluZzogTWFwPHN0cmluZywgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZz4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoLi4uY29udmVydGVyczogUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZ1tdKSB7XG4gICAgaWYgKGNvbnZlcnRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUGF5bG9hZENvbnZlcnRlckVycm9yKCdNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzO1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIHRoaXMuY29udmVydGVyQnlFbmNvZGluZy5zZXQoY29udmVydGVyLmVuY29kaW5nVHlwZSwgY29udmVydGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gcnVuIGAudG9QYXlsb2FkKHZhbHVlKWAgb24gZWFjaCBjb252ZXJ0ZXIgaW4gdGhlIG9yZGVyIHByb3ZpZGVkIGF0IGNvbnN0cnVjdGlvbi5cbiAgICogUmV0dXJucyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQsIHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgdGhlcmUgaXMgbm8gY29udmVydGVyIHRoYXQgY2FuIGhhbmRsZSB0aGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgdG9QYXlsb2FkPFQ+KHZhbHVlOiBULCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBQYXlsb2FkIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSYXdWYWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnBheWxvYWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIHRoaXMuY29udmVydGVycykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSwgY29udGV4dCk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgJHt2YWx1ZX0gdG8gcGF5bG9hZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZy5mcm9tUGF5bG9hZH0gYmFzZWQgb24gdGhlIGBlbmNvZGluZ2AgbWV0YWRhdGEgb2YgdGhlIHtAbGluayBQYXlsb2FkfS5cbiAgICovXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkLCBjb250ZXh0PzogU2VyaWFsaXphdGlvbkNvbnRleHQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWQubWV0YWRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGluZyA9IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhW01FVEFEQVRBX0VOQ09ESU5HX0tFWV0hKTtcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSB0aGlzLmNvbnZlcnRlckJ5RW5jb2RpbmcuZ2V0KGVuY29kaW5nKTtcbiAgICBpZiAoY29udmVydGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbmtub3duIGVuY29kaW5nOiAke2VuY29kaW5nfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQsIGNvbnRleHQpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBKUyB1bmRlZmluZWQgYW5kIE5VTEwgUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgVW5kZWZpbmVkUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19OVUxMO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWU6IHVua25vd24pOiBQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19OVUxMLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KF9jb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7IC8vIEp1c3QgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBiaW5hcnkgZGF0YSB0eXBlcyBhbmQgUkFXIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIEJpbmFyeVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWU6IHVua25vd24pOiBQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVyxcbiAgICAgIH0sXG4gICAgICBkYXRhOiB2YWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KGNvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gKFxuICAgICAgLy8gV3JhcCB3aXRoIFVpbnQ4QXJyYXkgZnJvbSB0aGlzIGNvbnRleHQgdG8gZW5zdXJlIGBpbnN0YW5jZW9mYCB3b3Jrc1xuICAgICAgKFxuICAgICAgICBjb250ZW50LmRhdGEgPyBuZXcgVWludDhBcnJheShjb250ZW50LmRhdGEuYnVmZmVyLCBjb250ZW50LmRhdGEuYnl0ZU9mZnNldCwgY29udGVudC5kYXRhLmxlbmd0aCkgOiBjb250ZW50LmRhdGFcbiAgICAgICkgYXMgYW55XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gbm9uLXVuZGVmaW5lZCB2YWx1ZXMgYW5kIHNlcmlhbGl6ZWQgSlNPTiBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBKc29uUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19KU09OO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWU6IHVua25vd24pOiBQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQganNvbjtcbiAgICB0cnkge1xuICAgICAganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX0pTT04sXG4gICAgICB9LFxuICAgICAgZGF0YTogZW5jb2RlKGpzb24pLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChjb250ZW50LmRhdGEgPT09IHVuZGVmaW5lZCB8fCBjb250ZW50LmRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdHb3QgcGF5bG9hZCB3aXRoIG5vIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlKGNvbnRlbnQuZGF0YSkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlciBleHRlbmRzIENvbXBvc2l0ZVBheWxvYWRDb252ZXJ0ZXIge1xuICAvLyBNYXRjaCB0aGUgb3JkZXIgdXNlZCBpbiBvdGhlciBTREtzLCBidXQgZXhjbHVkZSBQcm90b2J1ZiBjb252ZXJ0ZXJzIHNvIHRoYXQgdGhlIGNvZGUsIGluY2x1ZGluZ1xuICAvLyBgcHJvdG8zLWpzb24tc2VyaWFsaXplcmAsIGRvZXNuJ3QgdGFrZSBzcGFjZSBpbiBXb3JrZmxvdyBidW5kbGVzIHRoYXQgZG9uJ3QgdXNlIFByb3RvYnVmcy4gVG8gdXNlIFByb3RvYnVmcywgdXNlXG4gIC8vIHtAbGluayBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcldpdGhQcm90b2J1ZnN9LlxuICAvL1xuICAvLyBHbyBTREs6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW1wb3JhbGlvL3Nkay1nby9ibG9iLzVlNTY0NWYwYzU1MGRjZjcxN2MwOTVhZTMyYzc2YTcwODdkMmU5ODUvY29udmVydGVyL2RlZmF1bHRfZGF0YV9jb252ZXJ0ZXIuZ28jTDI4XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKG5ldyBVbmRlZmluZWRQYXlsb2FkQ29udmVydGVyKCksIG5ldyBCaW5hcnlQYXlsb2FkQ29udmVydGVyKCksIG5ldyBKc29uUGF5bG9hZENvbnZlcnRlcigpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHtAbGluayBQYXlsb2FkQ29udmVydGVyfSB1c2VkIGJ5IHRoZSBTREsuIFN1cHBvcnRzIGBVaW50OEFycmF5YCBhbmQgSlNPTiBzZXJpYWxpemFibGVzIChzbyBpZlxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5I2Rlc2NyaXB0aW9uIHwgYEpTT04uc3RyaW5naWZ5KHlvdXJBcmdPclJldHZhbClgfVxuICogd29ya3MsIHRoZSBkZWZhdWx0IHBheWxvYWQgY29udmVydGVyIHdpbGwgd29yaykuXG4gKlxuICogVG8gYWxzbyBzdXBwb3J0IFByb3RvYnVmcywgY3JlYXRlIGEgY3VzdG9tIHBheWxvYWQgY29udmVydGVyIHdpdGgge0BsaW5rIERlZmF1bHRQYXlsb2FkQ29udmVydGVyfTpcbiAqXG4gKiBgY29uc3QgbXlDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIoeyBwcm90b2J1ZlJvb3QgfSlgXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciA9IG5ldyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcigpO1xuXG4vKipcbiAqIFRoZSBpZGVudGl0eSBwYXlsb2FkIGNvbnZlcnRlciByZXR1cm5zIHRoZSBpbnB1dHMgaXQgd2FzIGdpdmVuLlxuICovXG5jbGFzcyBJZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZCB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIFBheWxvYWQ7XG4gIH1cblxuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgVDtcbiAgfVxufVxuXG5jb25zdCBpZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgSWRlbnRpdHlQYXlsb2FkQ29udmVydGVyKCk7XG4iLCJpbXBvcnQgeyBkZWNvZGUsIGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEF0dHJpYnV0ZXMsIFNlYXJjaEF0dHJpYnV0ZVBhaXIsIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIgfSBmcm9tICcuLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQge1xuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVR5cGUsXG4gIGlzVmFsaWRWYWx1ZUZvclR5cGUsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUsXG59IGZyb20gJy4uL3NlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgSnNvblBheWxvYWRDb252ZXJ0ZXIsIG1hcEZyb21QYXlsb2FkcywgbWFwVG9QYXlsb2FkcyB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIENvbnZlcnRzIFNlYXJjaCBBdHRyaWJ1dGUgdmFsdWVzIHVzaW5nIEpzb25QYXlsb2FkQ29udmVydGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKTtcbiAgdmFsaWROb25EYXRlVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWVzOiB1bmtub3duKTogUGF5bG9hZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBTZWFyY2hBdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHR5cGVvZiBmaXJzdFZhbHVlO1xuICAgICAgaWYgKGZpcnN0VHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWR4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgU2VhcmNoQXR0cmlidXRlIHZhbHVlcyBtdXN0IGFycmF5cyBvZiBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb3IgRGF0ZXMuIFRoZSB2YWx1ZSAke3ZhbHVlfSBhdCBpbmRleCAke2lkeH0gaXMgb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkTm9uRGF0ZVR5cGVzLmluY2x1ZGVzKGZpcnN0VHlwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgU2VhcmNoQXR0cmlidXRlIGFycmF5IHZhbHVlcyBtdXN0IGJlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbaWR4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IGZpcnN0VHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBBbGwgU2VhcmNoQXR0cmlidXRlIGFycmF5IHZhbHVlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBmaXJzdCB2YWx1ZSAke2ZpcnN0VmFsdWV9IG9mIHR5cGUgJHtmaXJzdFR5cGV9IGRvZXNuJ3QgbWF0Y2ggdmFsdWUgJHt2YWx1ZX0gb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX0gYXQgaW5kZXggJHtpZHh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKU09OLnN0cmluZ2lmeSB0YWtlcyBjYXJlIG9mIGNvbnZlcnRpbmcgRGF0ZXMgdG8gSVNPIHN0cmluZ3NcbiAgICBjb25zdCByZXQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlcyk7XG4gICAgaWYgKHJldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgc2VhcmNoIGF0dHJpYnV0ZXMgdG8gcGF5bG9hZHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRldGltZSBTZWFyY2ggQXR0cmlidXRlIHZhbHVlcyBhcmUgY29udmVydGVkIHRvIGBEYXRlYHNcbiAgICovXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5qc29uQ29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpO1xuICAgIGxldCBhcnJheVdyYXBwZWRWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIGNvbnN0IHNlYXJjaEF0dHJpYnV0ZVR5cGUgPSBwYXlsb2FkLm1ldGFkYXRhLnR5cGUgPyBkZWNvZGUocGF5bG9hZC5tZXRhZGF0YS50eXBlKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VhcmNoQXR0cmlidXRlVHlwZSA9PT0gJ0RhdGV0aW1lJykge1xuICAgICAgYXJyYXlXcmFwcGVkVmFsdWUgPSBhcnJheVdyYXBwZWRWYWx1ZS5tYXAoKGRhdGVTdHJpbmcpID0+IG5ldyBEYXRlKGRhdGVTdHJpbmcpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5V3JhcHBlZFZhbHVlIGFzIHVua25vd24gYXMgVDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciA9IG5ldyBTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyKCk7XG5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAganNvbkNvbnZlcnRlciA9IG5ldyBKc29uUGF5bG9hZENvbnZlcnRlcigpO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQ8VD4oYXR0cjogVCk6IFBheWxvYWQge1xuICAgIGlmICghKGF0dHIgaW5zdGFuY2VvZiBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlIHx8IGF0dHIgaW5zdGFuY2VvZiBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgIGBFeHBlY3QgaW5wdXQgdG8gYmUgaW5zdGFuY2Ugb2YgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSBvciBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXR0clxuICAgICAgICApfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2UgY2hlY2sgZm9yIGRlbGV0aW9uIGFzIHdlbGwgYXMgcmVndWxhciB0eXBlZCBzZWFyY2ggYXR0cmlidXRlcy5cbiAgICBpZiAoYXR0ci52YWx1ZSAhPT0gbnVsbCAmJiAhaXNWYWxpZFZhbHVlRm9yVHlwZShhdHRyLnR5cGUsIGF0dHIudmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBzZWFyY2ggYXR0cmlidXRlIHZhbHVlICR7YXR0ci52YWx1ZX0gZm9yIGdpdmVuIHR5cGUgJHthdHRyLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHNlcnZlciBzZWFyY2ggYXR0cmlidXRlcyB0byB3b3JrIHByb3Blcmx5LCB3ZSBjYW5ub3Qgc2V0IHRoZSBtZXRhZGF0YVxuICAgIC8vIHR5cGUgd2hlbiB3ZSBzZXQgbnVsbFxuICAgIGlmIChhdHRyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZChhdHRyLnZhbHVlKTtcbiAgICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHR5cGVkIHNlYXJjaCBhdHRyaWJ1dGUgdG8gcGF5bG9hZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgdGFrZXMgY2FyZSBvZiBjb252ZXJ0aW5nIERhdGVzIHRvIElTTyBzdHJpbmdzXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQoYXR0ci52YWx1ZSk7XG4gICAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHR5cGVkIHNlYXJjaCBhdHRyaWJ1dGUgdG8gcGF5bG9hZCcpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IHRoaXMgc2hvdWxkbid0IGJlIHRoZSBjYXNlIGJ1dCB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHdpdGhvdXQgdGhpcyBjaGVjay5cbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuICAgIC8vIEFkZCBlbmNvZGVkIHR5cGUgb2Ygc2VhcmNoIGF0dHJpYnV0ZSB0byBtZXRhdGRhdGFcbiAgICBwYXlsb2FkLm1ldGFkYXRhWyd0eXBlJ10gPSBlbmNvZGUoVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnRvTWV0YWRhdGFUeXBlKGF0dHIudHlwZSkpO1xuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLy8gTm90ZTogdHlwZSBjYXN0aW5nIHVuZGVmaW5lZCB2YWx1ZXMgaXMgbm90IGNsZWFyIHRvIGNhbGxlci5cbiAgLy8gV2UgY2FuJ3QgY2hhbmdlIHRoZSB0eXBpbmcgb2YgdGhlIG1ldGhvZCB0byByZXR1cm4gdW5kZWZpbmVkLCBpdCdzIG5vdCBhbGxvd2VkIGJ5IHRoZSBpbnRlcmZhY2UuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cblxuICAgIC8vIElmIG5vICd0eXBlJyBtZXRhZGF0YSBmaWVsZCBvciBubyBnaXZlbiB2YWx1ZSwgd2Ugc2tpcC5cbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YS50eXBlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IFR5cGVkU2VhcmNoQXR0cmlidXRlcy50b1NlYXJjaEF0dHJpYnV0ZVR5cGUoZGVjb2RlKHBheWxvYWQubWV0YWRhdGEudHlwZSkpO1xuICAgIC8vIFVucmVjb2duaXplZCBtZXRhZGF0YSB0eXBlIChzYW5pdHkgY2hlY2spLlxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWUgPSB0aGlzLmpzb25Db252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG5cbiAgICAvLyBIYW5kbGUgbGVnYWN5IHZhbHVlcyB3aXRob3V0IEtFWVdPUkRfTElTVCB0eXBlLlxuICAgIGlmICh0eXBlICE9PSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gQ2Fubm90IGhhdmUgYW4gYXJyYXkgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgZm9yIG5vbi1LRVlXT1JEX0xJU1QgdHlwZS5cbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgICAgIH1cbiAgICAgIC8vIFVucGFjayBzaW5nbGUgdmFsdWUgYXJyYXkuXG4gICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRSAmJiB2YWx1ZSkge1xuICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBmb3IgdGhlIGdpdmVuIHR5cGUuIElmIG5vdCwgc2tpcC5cbiAgICBpZiAoIWlzVmFsaWRWYWx1ZUZvclR5cGUodHlwZSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSh0eXBlLCB2YWx1ZSkgYXMgVDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyID0gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcigpO1xuXG4vLyBJZiBib3RoIHBhcmFtcyBhcmUgcHJvdmlkZWQsIGNvbmZsaWN0aW5nIGtleXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMoXG4gIHNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVzLFxuICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM/OiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgfCBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW11cbik6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oc2VhcmNoQXR0cmlidXRlcyA/IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcykgOiB7fSksXG4gICAgLi4uKHR5cGVkU2VhcmNoQXR0cmlidXRlc1xuICAgICAgPyBtYXBUb1BheWxvYWRzPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4oXG4gICAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHR5cGVkU2VhcmNoQXR0cmlidXRlcykgPyB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgOiB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMuZ2V0QWxsKCkpLm1hcChcbiAgICAgICAgICAgICAgKHBhaXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BhaXIua2V5Lm5hbWUsIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVZhbHVlKHBhaXIua2V5LnR5cGUsIHBhaXIudmFsdWUpXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgOiB7fSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTZWFyY2hBdHRyaWJ1dGVzKGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbCk6IFNlYXJjaEF0dHJpYnV0ZXMge1xuICBpZiAoIWluZGV4ZWRGaWVsZHMpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBGcm9tUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgaW5kZXhlZEZpZWxkcykgYXMgU2VhcmNoQXR0cmlidXRlcykuZmlsdGVyKFxuICAgICAgKFtfLCB2XSkgPT4gdiAmJiB2Lmxlbmd0aCA+IDBcbiAgICApIC8vIEZpbHRlciBvdXQgZW1wdHkgYXJyYXlzIHJldHVybmVkIGJ5IHByZSAxLjE4IHNlcnZlcnNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgaW5kZXhlZEZpZWxkczogUmVjb3JkPHN0cmluZywgUGF5bG9hZD4gfCB1bmRlZmluZWQgfCBudWxsXG4pOiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIG1hcEZyb21QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQ+KFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgIGluZGV4ZWRGaWVsZHNcbiAgICAgICkgPz8ge31cbiAgICApLnJlZHVjZTxTZWFyY2hBdHRyaWJ1dGVQYWlyW10+KChhY2MsIFtrLCBhdHRyXSkgPT4ge1xuICAgICAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgdmFsdWVzIGZyb20gY29udmVydGVyLlxuICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB7IG5hbWU6IGssIHR5cGU6IGF0dHIudHlwZSB9O1xuICAgICAgLy8gRW5zdXJlIGlzIHZhbGlkIHBhaXIuXG4gICAgICBpZiAoaXNWYWxpZFZhbHVlRm9yVHlwZShrZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgYWNjLnB1c2goeyBrZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKVxuICApO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfRU5DT0RJTkdfS0VZID0gJ2VuY29kaW5nJztcbmV4cG9ydCBjb25zdCBlbmNvZGluZ1R5cGVzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiAnYmluYXJ5L251bGwnLFxuICBNRVRBREFUQV9FTkNPRElOR19SQVc6ICdiaW5hcnkvcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiAnanNvbi9wbGFpbicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046ICdqc29uL3Byb3RvYnVmJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUY6ICdiaW5hcnkvcHJvdG9idWYnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEVuY29kaW5nVHlwZSA9ICh0eXBlb2YgZW5jb2RpbmdUeXBlcylba2V5b2YgdHlwZW9mIGVuY29kaW5nVHlwZXNdO1xuXG5leHBvcnQgY29uc3QgZW5jb2RpbmdLZXlzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19OVUxMKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVcpLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19KU09OKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRiksXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfTUVTU0FHRV9UWVBFX0tFWSA9ICdtZXNzYWdlVHlwZSc7XG4iLCJpbXBvcnQgKiBhcyB0aW1lIGZyb20gJy4vdGltZSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IHR5cGUgVGltZXN0YW1wIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5vcHRpb25hbFRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gdGltZS50c1RvTXModHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc051bWJlclRvVHMobWlsbGlzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc1RvVHMoc3RyKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUubXNPcHRpb25hbFRvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lLm1zVG9OdW1iZXIodmFsKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gdGltZS50c1RvRGF0ZSh0cyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvRGF0ZSh0cyk7XG59XG4iLCIvLyBQYXN0ZWQgd2l0aCBtb2RpZmljYXRpb25zIGZyb206IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbm9ueWNvL0Zhc3Rlc3RTbWFsbGVzdFRleHRFbmNvZGVyRGVjb2Rlci9tYXN0ZXIvRW5jb2RlckRlY29kZXJUb2dldGhlci5zcmMuanNcbi8qIGVzbGludCBuby1mYWxsdGhyb3VnaDogMCAqL1xuXG5jb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuY29uc3QgZW5jb2RlclJlZ2V4cCA9IC9bXFx4ODAtXFx1RDdmZlxcdURDMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXT8vZztcbmNvbnN0IHRtcEJ1ZmZlclUxNiA9IG5ldyBVaW50MTZBcnJheSgzMik7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RGVjb2RlciB7XG4gIGRlY29kZShpbnB1dEFycmF5T3JCdWZmZXI6IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlciB8IFNoYXJlZEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnB1dEFzOCA9IGlucHV0QXJyYXlPckJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBpbnB1dEFycmF5T3JCdWZmZXIgOiBuZXcgVWludDhBcnJheShpbnB1dEFycmF5T3JCdWZmZXIpO1xuXG4gICAgbGV0IHJlc3VsdGluZ1N0cmluZyA9ICcnLFxuICAgICAgdG1wU3RyID0gJycsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBuZXh0RW5kID0gMCxcbiAgICAgIGNwMCA9IDAsXG4gICAgICBjb2RlUG9pbnQgPSAwLFxuICAgICAgbWluQml0cyA9IDAsXG4gICAgICBjcDEgPSAwLFxuICAgICAgcG9zID0gMCxcbiAgICAgIHRtcCA9IC0xO1xuICAgIGNvbnN0IGxlbiA9IGlucHV0QXM4Lmxlbmd0aCB8IDA7XG4gICAgY29uc3QgbGVuTWludXMzMiA9IChsZW4gLSAzMikgfCAwO1xuICAgIC8vIE5vdGUgdGhhdCB0bXAgcmVwcmVzZW50cyB0aGUgMm5kIGhhbGYgb2YgYSBzdXJyb2dhdGUgcGFpciBpbmNhc2UgYSBzdXJyb2dhdGUgZ2V0cyBkaXZpZGVkIGJldHdlZW4gYmxvY2tzXG4gICAgZm9yICg7IGluZGV4IDwgbGVuOyApIHtcbiAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgIGZvciAoOyBwb3MgPCBuZXh0RW5kOyBpbmRleCA9IChpbmRleCArIDEpIHwgMCwgcG9zID0gKHBvcyArIDEpIHwgMCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICBjcDAgPSBpbnB1dEFzOFtpbmRleF0gJiAweGZmO1xuICAgICAgICBzd2l0Y2ggKGNwMCA+PiA0KSB7XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBpZiAoY3AxID4+IDYgIT09IDBiMTAgfHwgMGIxMTExMDExMSA8IGNwMCkge1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSAoKGNwMCAmIDBiMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSA1OyAvLyAyMCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IDB4MTAwOyAvLyAga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgY29kZVBvaW50IDw8PSA2O1xuICAgICAgICAgICAgY29kZVBvaW50IHw9ICgoY3AwICYgMGIxMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSBjcDEgPj4gNiA9PT0gMGIxMCA/IChtaW5CaXRzICsgNCkgfCAwIDogMjQ7IC8vIDI0IGVuc3VyZXMgaXQgbmV2ZXIgcGFzc2VzIC0+IGFsbCBpbnZhbGlkIHJlcGxhY2VtZW50c1xuICAgICAgICAgICAgY3AwID0gKGNwMCArIDB4MTAwKSAmIDB4MzAwOyAvLyBrZWVwIHRyYWNrIG9mIHRoIGJpdCBzaXplXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IChtaW5CaXRzICsgNykgfCAwO1xuXG4gICAgICAgICAgICAvLyBOb3csIHByb2Nlc3MgdGhlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbiAmJiBjcDEgPj4gNiA9PT0gMGIxMCAmJiBjb2RlUG9pbnQgPj4gbWluQml0cyAmJiBjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjcDAgPSBjb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IChjb2RlUG9pbnQgLSAweDEwMDAwKSB8IDA7XG4gICAgICAgICAgICAgIGlmICgwIDw9IGNvZGVQb2ludCAvKjB4ZmZmZiA8IGNvZGVQb2ludCovKSB7XG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICAvL25leHRFbmQgPSBuZXh0RW5kIC0gMXwwO1xuXG4gICAgICAgICAgICAgICAgdG1wID0gKChjb2RlUG9pbnQgPj4gMTApICsgMHhkODAwKSB8IDA7IC8vIGhpZ2hTdXJyb2dhdGVcbiAgICAgICAgICAgICAgICBjcDAgPSAoKGNvZGVQb2ludCAmIDB4M2ZmKSArIDB4ZGMwMCkgfCAwOyAvLyBsb3dTdXJyb2dhdGUgKHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIgaW4gdGhlIHN3aXRjaC1zdGF0ZW1lbnQpXG5cbiAgICAgICAgICAgICAgICBpZiAocG9zIDwgMzEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGljZSAzMSBpbnN0ZWFkIG9mIDMyXG4gICAgICAgICAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHBvcyA9IChwb3MgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgICB0bXAgPSAtMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gZWxzZSwgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0QXM4IGFuZCBsZXQgdG1wMCBiZSBmaWxsZWQgaW4gbGF0ZXIgb25cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEUgdGhhdCBjcDEgaXMgYmVpbmcgdXNlZCBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgdGhlIHN3YXBwaW5nIG9mIHRtcCB3aXRoIGNwMFxuICAgICAgICAgICAgICAgICAgY3AxID0gdG1wO1xuICAgICAgICAgICAgICAgICAgdG1wID0gY3AwO1xuICAgICAgICAgICAgICAgICAgY3AwID0gY3AxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIG5leHRFbmQgPSAobmV4dEVuZCArIDEpIHwgMDsgLy8gYmVjYXVzZSB3ZSBhcmUgYWR2YW5jaW5nIGkgd2l0aG91dCBhZHZhbmNpbmcgcG9zXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNvZGUgcG9pbnQgbWVhbnMgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyB3aXRoIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICBjcDAgPj49IDg7XG4gICAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IC0gY3AwIC0gMSkgfCAwOyAvLyByZXNldCBpbmRleCAgYmFjayB0byB3aGF0IGl0IHdhcyBiZWZvcmVcbiAgICAgICAgICAgICAgY3AwID0gMHhmZmZkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5hbGx5LCByZXNldCB0aGUgdmFyaWFibGVzIGZvciB0aGUgbmV4dCBnby1hcm91bmRcbiAgICAgICAgICAgIG1pbkJpdHMgPSAwO1xuICAgICAgICAgICAgY29kZVBvaW50ID0gMDtcbiAgICAgICAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgICAgICAvKmNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNvZGVQb2ludCA/IGNvZGVQb2ludCA9IDAgOiBjcDAgPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IGNwMDtcbiAgICAgICAgICBjb250aW51ZTsqL1xuICAgICAgICAgIGRlZmF1bHQ6IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgfVxuICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IDB4ZmZmZDsgLy8gZmlsbCB3aXRoIGludmFsaWQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICB9XG4gICAgICB0bXBTdHIgKz0gZnJvbUNoYXJDb2RlKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICB0bXBCdWZmZXJVMTZbMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls0XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls3XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMV1cbiAgICAgICk7XG4gICAgICBpZiAocG9zIDwgMzIpIHRtcFN0ciA9IHRtcFN0ci5zbGljZSgwLCAocG9zIC0gMzIpIHwgMCk7IC8vLSgzMi1wb3MpKTtcbiAgICAgIGlmIChpbmRleCA8IGxlbikge1xuICAgICAgICAvL2Zyb21DaGFyQ29kZS5hcHBseSgwLCB0bXBCdWZmZXJVMTYgOiBVaW50OEFycmF5ID8gIHRtcEJ1ZmZlclUxNi5zdWJhcnJheSgwLHBvcykgOiB0bXBCdWZmZXJVMTYuc2xpY2UoMCxwb3MpKTtcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdID0gdG1wO1xuICAgICAgICBwb3MgPSB+dG1wID4+PiAzMTsgLy90bXAgIT09IC0xID8gMSA6IDA7XG4gICAgICAgIHRtcCA9IC0xO1xuXG4gICAgICAgIGlmICh0bXBTdHIubGVuZ3RoIDwgcmVzdWx0aW5nU3RyaW5nLmxlbmd0aCkgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRtcCAhPT0gLTEpIHtcbiAgICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZSh0bXApO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRpbmdTdHJpbmcgKz0gdG1wU3RyO1xuICAgICAgdG1wU3RyID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ1N0cmluZztcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gZW5jb2RlclJlcGxhY2VyKG5vbkFzY2lpQ2hhcnM6IHN0cmluZykge1xuICAvLyBtYWtlIHRoZSBVVEYgc3RyaW5nIGludG8gYSBiaW5hcnkgVVRGLTggZW5jb2RlZCBzdHJpbmdcbiAgbGV0IHBvaW50ID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDApIHwgMDtcbiAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgIGNvbnN0IG5leHRjb2RlID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDEpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICBpZiAoMHhkYzAwIDw9IG5leHRjb2RlICYmIG5leHRjb2RlIDw9IDB4ZGZmZikge1xuICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgaWYgKHBvaW50ID4gMHhmZmZmKVxuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCksXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi9cbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfVxuICB9XG4gIC8qaWYgKHBvaW50IDw9IDB4MDA3ZikgcmV0dXJuIG5vbkFzY2lpQ2hhcnM7XG4gIGVsc2UgKi8gaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KSwgKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpKTtcbiAgfSBlbHNlXG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZShcbiAgICAgICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMiksXG4gICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRFbmNvZGVyIHtcbiAgcHVibGljIGVuY29kZShpbnB1dFN0cmluZzogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgLy8gMHhjMCA9PiAwYjExMDAwMDAwOyAweGZmID0+IDBiMTExMTExMTE7IDB4YzAtMHhmZiA9PiAwYjExeHh4eHh4XG4gICAgLy8gMHg4MCA9PiAwYjEwMDAwMDAwOyAweGJmID0+IDBiMTAxMTExMTE7IDB4ODAtMHhiZiA9PiAwYjEweHh4eHh4XG4gICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGlucHV0U3RyaW5nID09PSB2b2lkIDAgPyAnJyA6ICcnICsgaW5wdXRTdHJpbmcsXG4gICAgICBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KCgobGVuIDw8IDEpICsgOCkgfCAwKTtcbiAgICBsZXQgdG1wUmVzdWx0OiBVaW50OEFycmF5O1xuICAgIGxldCBpID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICBwb2ludCA9IDAsXG4gICAgICBuZXh0Y29kZSA9IDA7XG4gICAgbGV0IHVwZ3JhZGVkZWRBcnJheVNpemUgPSAhVWludDhBcnJheTsgLy8gbm9ybWFsIGFycmF5cyBhcmUgYXV0by1leHBhbmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpID0gKGkgKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgIHBvaW50ID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgIGlmIChwb2ludCA8PSAweDAwN2YpIHtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSBwb2ludDtcbiAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHgwN2ZmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIDw8IDYpIHwgKHBvaW50ICYgMHgzZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWRlbkNoZWNrOiB7XG4gICAgICAgICAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgICAgICAgICAgaWYgKHBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgICAgICAgICBuZXh0Y29kZSA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdCgoaSA9IChpICsgMSkgfCAwKSkgfCAwOyAvLyBkZWZhdWx0cyB0byAwIHdoZW4gTmFOLCBjYXVzaW5nIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG5cbiAgICAgICAgICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gKChwb2ludCA8PCAxMCkgKyBuZXh0Y29kZSAtIDB4MzVmZGMwMCkgfCAwO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0W3Bvc10gPSAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDEyKSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWsgd2lkZW5DaGVjaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1cGdyYWRlZGVkQXJyYXlTaXplICYmIGkgPDwgMSA8IHBvcyAmJiBpIDw8IDEgPCAoKHBvcyAtIDcpIHwgMCkpIHtcbiAgICAgICAgICAgIHVwZ3JhZGVkZWRBcnJheVNpemUgPSB0cnVlO1xuICAgICAgICAgICAgdG1wUmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuICogMyk7XG4gICAgICAgICAgICB0bXBSZXN1bHQuc2V0KHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0bXBSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4ZSAvKjBiMTExMCovIDw8IDQpIHwgKHBvaW50ID4+IDEyKTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkgPyByZXN1bHQuc3ViYXJyYXkoMCwgcG9zKSA6IHJlc3VsdC5zbGljZSgwLCBwb3MpO1xuICB9XG5cbiAgcHVibGljIGVuY29kZUludG8oaW5wdXRTdHJpbmc6IHN0cmluZywgdThBcnI6IFVpbnQ4QXJyYXkpOiB7IHdyaXR0ZW46IG51bWJlcjsgcmVhZDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAoJycgKyBpbnB1dFN0cmluZykucmVwbGFjZShlbmNvZGVyUmVnZXhwLCBlbmNvZGVyUmVwbGFjZXIpO1xuICAgIGxldCBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoYXIgPSAwLFxuICAgICAgcmVhZCA9IDA7XG4gICAgY29uc3QgdThBcnJMZW4gPSB1OEFyci5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXRTdHJpbmcubGVuZ3RoIHwgMDtcbiAgICBpZiAodThBcnJMZW4gPCBsZW4pIGxlbiA9IHU4QXJyTGVuO1xuICAgIHB1dENoYXJzOiB7XG4gICAgICBmb3IgKDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwKSB7XG4gICAgICAgIGNoYXIgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSkgfCAwO1xuICAgICAgICBzd2l0Y2ggKGNoYXIgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgLy8gZXh0ZW5zaW9uIHBvaW50czpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGlmICgoKGkgKyAxKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgaWYgKCgoaSArIDIpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICAvL2lmICghKGNoYXIgPT09IDB4RUYgJiYgZW5jb2RlZFN0cmluZy5zdWJzdHIoaSsxfDAsMikgPT09IFwiXFx4QkZcXHhCRFwiKSlcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgaWYgKCgoaSArIDMpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhayBwdXRDaGFycztcbiAgICAgICAgfVxuICAgICAgICAvL3JlYWQgPSByZWFkICsgKChjaGFyID4+IDYpICE9PSAyKSB8MDtcbiAgICAgICAgdThBcnJbaV0gPSBjaGFyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB3cml0dGVuOiBpLCByZWFkOiBpbnB1dExlbmd0aCA8IHJlYWQgPyBpbnB1dExlbmd0aCA6IHJlYWQgfTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY29kZSBhIFVURi04IHN0cmluZyBpbnRvIGEgVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBVaW50OEFycmF5IGludG8gYSBVVEYtOCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIFRleHREZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUoYSk7XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLyoqXG4gKiBUaHJvd24gZnJvbSBjb2RlIHRoYXQgcmVjZWl2ZXMgYSB2YWx1ZSB0aGF0IGlzIHVuZXhwZWN0ZWQgb3IgdGhhdCBpdCdzIHVuYWJsZSB0byBoYW5kbGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVmFsdWVFcnJvcicpXG5leHBvcnQgY2xhc3MgVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBQYXlsb2FkIENvbnZlcnRlciBpcyBtaXNjb25maWd1cmVkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1BheWxvYWRDb252ZXJ0ZXJFcnJvcicpXG5leHBvcnQgY2xhc3MgUGF5bG9hZENvbnZlcnRlckVycm9yIGV4dGVuZHMgVmFsdWVFcnJvciB7fVxuXG4vKipcbiAqIFNpZ25hbHMgdGhhdCBhIHJlcXVlc3RlZCBvcGVyYXRpb24gY2FuJ3QgYmUgY29tcGxldGVkIGJlY2F1c2UgaXQgaXMgaWxsZWdhbCBnaXZlbiB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdDsgZS5nLiB0cnlpbmcgdG8gdXNlIGEgcmVzb3VyY2UgYWZ0ZXIgaXQgaGFzIGJlZW4gY2xvc2VkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0lsbGVnYWxTdGF0ZUVycm9yJylcbmV4cG9ydCBjbGFzcyBJbGxlZ2FsU3RhdGVFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBXb3JrZmxvdyB3aXRoIHRoZSBnaXZlbiBJZCBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICogSXQgY291bGQgYmUgYmVjYXVzZTpcbiAqIC0gSWQgcGFzc2VkIGlzIGluY29ycmVjdFxuICogLSBXb3JrZmxvdyBpcyBjbG9zZWQgKGZvciBzb21lIGNhbGxzLCBlLmcuIGB0ZXJtaW5hdGVgKVxuICogLSBXb3JrZmxvdyB3YXMgZGVsZXRlZCBmcm9tIHRoZSBTZXJ2ZXIgYWZ0ZXIgcmVhY2hpbmcgaXRzIHJldGVudGlvbiBsaW1pdFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1dvcmtmbG93Tm90Rm91bmRFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIGlzIG5vdCBrbm93biB0byBUZW1wb3JhbCBTZXJ2ZXIuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignTmFtZXNwYWNlTm90Rm91bmRFcnJvcicpXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYE5hbWVzcGFjZSBub3QgZm91bmQ6ICcke25hbWVzcGFjZX0nYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdyB0aGlzIGVycm9yIGZyb20gYW4gQWN0aXZpdHkgaW4gb3JkZXIgdG8gbWFrZSB0aGUgV29ya2VyIGZvcmdldCBhYm91dCB0aGlzIEFjdGl2aXR5LlxuICpcbiAqIFRoZSBBY3Rpdml0eSBjYW4gdGhlbiBiZSBjb21wbGV0ZWQgYXN5bmNocm9ub3VzbHkgKGZyb20gYW55d2hlcmXigJR1c3VhbGx5IG91dHNpZGUgdGhlIFdvcmtlcikgdXNpbmdcbiAqIHRoZSBDbGllbnQncyBhY3Rpdml0eSBoYW5kbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICppbXBvcnQgeyBDb21wbGV0ZUFzeW5jRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9hY3Rpdml0eSc7XG4gKlxuICpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlBY3Rpdml0eSgpOiBQcm9taXNlPG5ldmVyPiB7XG4gKiAgLy8gLi4uXG4gKiAgdGhyb3cgbmV3IENvbXBsZXRlQXN5bmNFcnJvcigpO1xuICp9XG4gKiBgYGBcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdDb21wbGV0ZUFzeW5jRXJyb3InKVxuZXhwb3J0IGNsYXNzIENvbXBsZXRlQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHt9XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBpc1JlY29yZCwgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbmV4cG9ydCBjb25zdCBGQUlMVVJFX1NPVVJDRSA9ICdUeXBlU2NyaXB0U0RLJztcbmV4cG9ydCB0eXBlIFByb3RvRmFpbHVyZSA9IHRlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLklGYWlsdXJlO1xuXG5leHBvcnQgY29uc3QgVGltZW91dFR5cGUgPSB7XG4gIFNUQVJUX1RPX0NMT1NFOiAnU1RBUlRfVE9fQ0xPU0UnLFxuICBTQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcbiAgU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG4gIEhFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU1RBUlRfVE9fQ0xPU0V9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19TVEFSVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX1NUQVJUOiAnU0NIRURVTEVfVE9fU1RBUlQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNDSEVEVUxFX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSEVBUlRCRUFUfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfSEVBUlRCRUFUOiAnSEVBUlRCRUFUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB1bmRlZmluZWRgIGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRpbWVvdXRUeXBlID0gKHR5cGVvZiBUaW1lb3V0VHlwZSlba2V5b2YgdHlwZW9mIFRpbWVvdXRUeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVUaW1lb3V0VHlwZSwgZGVjb2RlVGltZW91dFR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIFRpbWVvdXRUeXBlLFxuICAnVElNRU9VVF9UWVBFXydcbj4oXG4gIHtcbiAgICBbVGltZW91dFR5cGUuU1RBUlRfVE9fQ0xPU0VdOiAxLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19TVEFSVF06IDIsXG4gICAgW1RpbWVvdXRUeXBlLlNDSEVEVUxFX1RPX0NMT1NFXTogMyxcbiAgICBbVGltZW91dFR5cGUuSEVBUlRCRUFUXTogNCxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4pO1xuXG5leHBvcnQgY29uc3QgUmV0cnlTdGF0ZSA9IHtcbiAgSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG4gIE5PTl9SRVRSWUFCTEVfRkFJTFVSRTogJ05PTl9SRVRSWUFCTEVfRkFJTFVSRScsXG4gIFRJTUVPVVQ6ICdUSU1FT1VUJyxcbiAgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEOiAnTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEJyxcbiAgUkVUUllfUE9MSUNZX05PVF9TRVQ6ICdSRVRSWV9QT0xJQ1lfTk9UX1NFVCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gIENBTkNFTF9SRVFVRVNURUQ6ICdDQU5DRUxfUkVRVUVTVEVEJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTl9QUk9HUkVTU30gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTk9OX1JFVFJZQUJMRV9GQUlMVVJFfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9OT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFRJTUVPVVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1RJTUVPVVQ6ICdUSU1FT1VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVUUllfUE9MSUNZX05PVF9TRVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1JFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElOVEVSTkFMX1NFUlZFUl9FUlJPUn0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5URVJOQUxfU0VSVkVSX0VSUk9SOiAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDQU5DRUxfUkVRVUVTVEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9DQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJldHJ5U3RhdGUgPSAodHlwZW9mIFJldHJ5U3RhdGUpW2tleW9mIHR5cGVvZiBSZXRyeVN0YXRlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVSZXRyeVN0YXRlLCBkZWNvZGVSZXRyeVN0YXRlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiBSZXRyeVN0YXRlLFxuICAnUkVUUllfU1RBVEVfJ1xuPihcbiAge1xuICAgIFtSZXRyeVN0YXRlLklOX1BST0dSRVNTXTogMSxcbiAgICBbUmV0cnlTdGF0ZS5OT05fUkVUUllBQkxFX0ZBSUxVUkVdOiAyLFxuICAgIFtSZXRyeVN0YXRlLlRJTUVPVVRdOiAzLFxuICAgIFtSZXRyeVN0YXRlLk1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRF06IDQsXG4gICAgW1JldHJ5U3RhdGUuUkVUUllfUE9MSUNZX05PVF9TRVRdOiA1LFxuICAgIFtSZXRyeVN0YXRlLklOVEVSTkFMX1NFUlZFUl9FUlJPUl06IDYsXG4gICAgW1JldHJ5U3RhdGUuQ0FOQ0VMX1JFUVVFU1RFRF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdSRVRSWV9TVEFURV8nXG4pO1xuXG4vKipcbiAqIEEgY2F0ZWdvcnkgdG8gZGVzY3JpYmUgdGhlIHNldmVyaXR5IGFuZCBjaGFuZ2UgdGhlIG9ic2VydmFiaWxpdHkgYmVoYXZpb3Igb2YgYW4gYXBwbGljYXRpb24gZmFpbHVyZS5cbiAqXG4gKiBDdXJyZW50bHksIG9ic2VydmFiaWxpdHkgYmVoYXZpb3IgY2hhbmdlcyBhcmUgbGltaXRlZCB0bzpcbiAqIC0gYWN0aXZpdGllcyB0aGF0IGZhaWwgZHVlIHRvIGEgQkVOSUdOIGFwcGxpY2F0aW9uIGZhaWx1cmUgZW1pdCBERUJVRyBsZXZlbCBsb2dzIGFuZCBkbyBub3QgcmVjb3JkIG1ldHJpY3NcbiAqXG4gKiBAZXhwZXJpbWVudGFsIENhdGVnb3J5IGlzIGEgbmV3IGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0ge1xuICBCRU5JR046ICdCRU5JR04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0gKHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSlba2V5b2YgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSwgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuPihcbiAge1xuICAgIFtBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeS5CRU5JR05dOiAxLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuKTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dFeGVjdXRpb24gPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklXb3JrZmxvd0V4ZWN1dGlvbjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGZhaWx1cmVzIHRoYXQgY2FuIGNyb3NzIFdvcmtmbG93IGFuZCBBY3Rpdml0eSBib3VuZGFyaWVzLlxuICpcbiAqICoqTmV2ZXIgZXh0ZW5kIHRoaXMgY2xhc3Mgb3IgYW55IG9mIGl0cyBjaGlsZHJlbi4qKlxuICpcbiAqIFRoZSBvbmx5IGNoaWxkIGNsYXNzIHlvdSBzaG91bGQgZXZlciB0aHJvdyBmcm9tIHlvdXIgY29kZSBpcyB7QGxpbmsgQXBwbGljYXRpb25GYWlsdXJlfS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdUZW1wb3JhbEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlbXBvcmFsRmFpbHVyZSBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBmYWlsdXJlIHRoYXQgY29uc3RydWN0ZWQgdGhpcyBlcnJvci5cbiAgICpcbiAgICogT25seSBwcmVzZW50IGlmIHRoaXMgZXJyb3Igd2FzIGdlbmVyYXRlZCBmcm9tIGFuIGV4dGVybmFsIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmYWlsdXJlPzogUHJvdG9GYWlsdXJlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKiogRXhjZXB0aW9ucyBvcmlnaW5hdGVkIGF0IHRoZSBUZW1wb3JhbCBzZXJ2aWNlLiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdTZXJ2ZXJGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBTZXJ2ZXJGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU6IGJvb2xlYW4sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYHMgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZmFpbHVyZXMgaW4gV29ya2Zsb3dzIGFuZCBBY3Rpdml0aWVzLlxuICpcbiAqIFRoZSB7QGxpbmsgdHlwZX0gcHJvcGVydHkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSB0byBkZXRlcm1pbmUgaWYgYW4gaW5zdGFuY2VcbiAqIG9mIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLiBBbm90aGVyIHdheSB0byBhdm9pZCByZXRyeWluZyBpcyBieSBzZXR0aW5nIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHRvIGB0cnVlYC5cbiAqXG4gKiBJbiBXb3JrZmxvd3MsIGlmIHlvdSB0aHJvdyBhIG5vbi1gQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IFRhc2sgd2lsbCBmYWlsIGFuZCBiZSByZXRyaWVkLiBJZiB5b3UgdGhyb3cgYW5cbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgLCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIHdpbGwgZmFpbC5cbiAqXG4gKiBJbiBBY3Rpdml0aWVzLCB5b3UgY2FuIGVpdGhlciB0aHJvdyBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCBvciBhbm90aGVyIGBFcnJvcmAgdG8gZmFpbCB0aGUgQWN0aXZpdHkgVGFzay4gSW4gdGhlXG4gKiBsYXR0ZXIgY2FzZSwgdGhlIGBFcnJvcmAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuIFRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYXMgZm9sbG93aW5nOlxuICpcbiAqIC0gYHR5cGVgIGlzIHNldCB0byBgZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZWBcbiAqIC0gYG1lc3NhZ2VgIGlzIHNldCB0byBgZXJyb3IubWVzc2FnZWBcbiAqIC0gYG5vblJldHJ5YWJsZWAgaXMgc2V0IHRvIGZhbHNlXG4gKiAtIGBkZXRhaWxzYCBhcmUgc2V0IHRvIG51bGxcbiAqIC0gc3RhY2sgdHJhY2UgaXMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIGVycm9yXG4gKlxuICogV2hlbiBhbiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2FjdGl2aXR5LWV4ZWN1dGlvbiNhY3Rpdml0eS1leGVjdXRpb24gfCBBY3Rpdml0eSBFeGVjdXRpb259IGZhaWxzLCB0aGVcbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgIGZyb20gdGhlIGxhc3QgQWN0aXZpdHkgVGFzayB3aWxsIGJlIHRoZSBgY2F1c2VgIG9mIHRoZSB7QGxpbmsgQWN0aXZpdHlGYWlsdXJlfSB0aHJvd24gaW4gdGhlXG4gKiBXb3JrZmxvdy5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdBcHBsaWNhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIC8qKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB1c2Uge0BsaW5rIGZyb21FcnJvcn0gb3Ige0BsaW5rIGNyZWF0ZX0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IG5vblJldHJ5YWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBkZXRhaWxzPzogdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBjYXVzZT86IEVycm9yLFxuICAgIHB1YmxpYyByZWFkb25seSBuZXh0UmV0cnlEZWxheT86IER1cmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk/OiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSB8IHVuZGVmaW5lZCB8IG51bGxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIGFuIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogRmlyc3QgY2FsbHMge0BsaW5rIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZSB8IGBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUoZXJyb3IpYH0gYW5kIHRoZW4gb3ZlcnJpZGVzIGFueSBmaWVsZHNcbiAgICogcHJvdmlkZWQgaW4gYG92ZXJyaWRlc2AuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IgfCB1bmtub3duLCBvdmVycmlkZXM/OiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCBmYWlsdXJlID0gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKTtcbiAgICBPYmplY3QuYXNzaWduKGZhaWx1cmUsIG92ZXJyaWRlcyk7XG4gICAgcmV0dXJuIGZhaWx1cmU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB3aWxsIGJlIHJldHJ5YWJsZSAodW5sZXNzIGl0cyBgdHlwZWAgaXMgaW5jbHVkZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMpOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlID0gZmFsc2UsIGRldGFpbHMsIG5leHRSZXRyeURlbGF5LCBjYXVzZSwgY2F0ZWdvcnkgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSwgZGV0YWlscywgY2F1c2UsIG5leHRSZXRyeURlbGF5LCBjYXRlZ29yeSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbmV3IGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggdGhlIHtAbGluayBub25SZXRyeWFibGV9IGZsYWcgc2V0IHRvIGZhbHNlLiBOb3RlIHRoYXQgdGhpcyBlcnJvciB3aWxsIHN0aWxsXG4gICAqIG5vdCBiZSByZXRyaWVkIGlmIGl0cyBgdHlwZWAgaXMgaW5jbHVkZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9LlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB0eXBlIE9wdGlvbmFsIGVycm9yIHR5cGUgKHVzZWQgYnkge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KVxuICAgKiBAcGFyYW0gZGV0YWlscyBPcHRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJldHJ5YWJsZShtZXNzYWdlPzogc3RyaW5nIHwgbnVsbCwgdHlwZT86IHN0cmluZyB8IG51bGwsIC4uLmRldGFpbHM6IHVua25vd25bXSk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1lc3NhZ2UsIHR5cGUgPz8gJ0Vycm9yJywgZmFsc2UsIGRldGFpbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBXaGVuIHRocm93biBmcm9tIGFuIEFjdGl2aXR5IG9yIFdvcmtmbG93LCB0aGUgQWN0aXZpdHkgb3IgV29ya2Zsb3cgd2lsbCBub3QgYmUgcmV0cmllZCAoZXZlbiBpZiBgdHlwZWAgaXMgbm90XG4gICAqIGxpc3RlZCBpbiB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB0eXBlIE9wdGlvbmFsIGVycm9yIHR5cGVcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub25SZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIHRydWUsIGRldGFpbHMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICovXG4gIHR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgQWN0aXZpdHkgb3IgV29ya2Zsb3cgY2FuIGJlIHJldHJpZWRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG5vblJldHJ5YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIGRldGFpbHM/OiB1bmtub3duW107XG5cbiAgLyoqXG4gICAqIElmIHNldCwgb3ZlcnJpZGVzIHRoZSBkZWxheSB1bnRpbCB0aGUgbmV4dCByZXRyeSBvZiB0aGlzIEFjdGl2aXR5IC8gV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogUmV0cnkgYXR0ZW1wdHMgd2lsbCBzdGlsbCBiZSBzdWJqZWN0IHRvIHRoZSBtYXhpbXVtIHJldHJpZXMgbGltaXQgYW5kIHRvdGFsIHRpbWUgbGltaXQgZGVmaW5lZFxuICAgKiBieSB0aGUgcG9saWN5LlxuICAgKi9cbiAgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQ2F1c2Ugb2YgdGhlIGZhaWx1cmVcbiAgICovXG4gIGNhdXNlPzogRXJyb3I7XG5cbiAgLyoqXG4gICAqIFNldmVyaXR5IGNhdGVnb3J5IG9mIHRoZSBhcHBsaWNhdGlvbiBlcnJvci5cbiAgICogQWZmZWN0cyB3b3JrZXItc2lkZSBsb2dnaW5nIGFuZCBtZXRyaWNzIGJlaGF2aW9yIG9mIHRoaXMgZmFpbHVyZS5cbiAgICovXG4gIGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnk7XG59XG5cbi8qKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBDYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLiBUbyBhbGxvdyBDYW5jZWxsYXRpb24gdG8gaGFwcGVuLCBsZXQgaXQgcHJvcGFnYXRlLiBUb1xuICogaWdub3JlIENhbmNlbGxhdGlvbiwgY2F0Y2ggaXQgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gTm90ZSB0aGF0IENhbmNlbGxhdGlvbiBjYW4gb25seSBiZSByZXF1ZXN0ZWQgYSBzaW5nbGUgdGltZSwgc29cbiAqIHlvdXIgV29ya2Zsb3cvQWN0aXZpdHkgRXhlY3V0aW9uIHdpbGwgbm90IHJlY2VpdmUgZnVydGhlciBDYW5jZWxsYXRpb24gcmVxdWVzdHMuXG4gKlxuICogV2hlbiBhIFdvcmtmbG93IG9yIEFjdGl2aXR5IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQsIGEgYENhbmNlbGxlZEZhaWx1cmVgIHdpbGwgYmUgdGhlIGBjYXVzZWAuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ2FuY2VsbGVkRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlsczogdW5rbm93bltdID0gW10sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2VkIGFzIHRoZSBgY2F1c2VgIHdoZW4gYSBXb3JrZmxvdyBoYXMgYmVlbiB0ZXJtaW5hdGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGVybWluYXRlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlcm1pbmF0ZWRGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjYXVzZT86IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCB0byByZXByZXNlbnQgdGltZW91dHMgb2YgQWN0aXZpdGllcyBhbmQgV29ya2Zsb3dzXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGltZW91dEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRpbWVvdXRGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBsYXN0SGVhcnRiZWF0RGV0YWlsczogdW5rbm93bixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGltZW91dFR5cGU6IFRpbWVvdXRUeXBlXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW4gQWN0aXZpdHkgZmFpbHVyZS4gQWx3YXlzIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGFzIGl0cyBgY2F1c2VgLlxuICogRm9yIGV4YW1wbGUsIGlmIGFuIEFjdGl2aXR5IHRpbWVkIG91dCwgdGhlIGNhdXNlIHdpbGwgYmUgYSB7QGxpbmsgVGltZW91dEZhaWx1cmV9LlxuICpcbiAqIFRoaXMgZXhjZXB0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHRocm93biBvbmx5IGJ5IHRoZSBmcmFtZXdvcmsgY29kZS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdBY3Rpdml0eUZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIEFjdGl2aXR5RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHJldHJ5U3RhdGU6IFJldHJ5U3RhdGUsXG4gICAgcHVibGljIHJlYWRvbmx5IGlkZW50aXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIENoaWxkIFdvcmtmbG93IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMge0BsaW5rIGNhdXNlfS5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgQ2hpbGQgd2FzIFRlcm1pbmF0ZWQsIHRoZSBgY2F1c2VgIGlzIGEge0BsaW5rIFRlcm1pbmF0ZWRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ2hpbGRXb3JrZmxvd0ZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENoaWxkV29ya2Zsb3dGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXhlY3V0aW9uOiBXb3JrZmxvd0V4ZWN1dGlvbixcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJldHJ5U3RhdGU6IFJldHJ5U3RhdGUsXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcignQ2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGZhaWxlZCcsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgTmV4dXMgT3BlcmF0aW9uIGV4ZWN1dGVkIGluc2lkZSBhIFdvcmtmbG93IGZhaWxzLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ05leHVzT3BlcmF0aW9uRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgTmV4dXNPcGVyYXRpb25GYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2NoZWR1bGVkRXZlbnRJZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8vIFRPRE8obmV4dXMvZXJyb3IpOiBNYXliZSBhZGQgYSBOZXh1c0hhbmRsZXJGYWlsdXJlIGNsYXNzIGhlcmUsIG9uY2Ugd2UndmUgZGVjaWRlZCBvbiBlcnJvciBoYW5kbGluZy5cblxuLyoqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAqICAtIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSUQgaXMgY3VycmVudGx5IHJ1bm5pbmcgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeX0gaXMgYFdPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV9GQUlMYFxuICogIC0gVGhlcmUgaXMgYSBjbG9zZWQgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYFxuICogIC0gVGhlcmUgaXMgY2xvc2VkIFdvcmtmbG93IGluIHRoZSBgQ29tcGxldGVkYCBzdGF0ZSB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElkIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkUmV1c2VQb2xpY3l9XG4gKiAgICBpcyBgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWWBcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIElmIGBlcnJvcmAgaXMgYWxyZWFkeSBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCwgcmV0dXJucyBgZXJyb3JgLlxuICpcbiAqIE90aGVyd2lzZSwgY29udmVydHMgYGVycm9yYCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGg6XG4gKlxuICogLSBgbWVzc2FnZWA6IGBlcnJvci5tZXNzYWdlYCBvciBgU3RyaW5nKGVycm9yKWBcbiAqIC0gYHR5cGVgOiBgZXJyb3IuY29uc3RydWN0b3IubmFtZWAgb3IgYGVycm9yLm5hbWVgXG4gKiAtIGBzdGFja2A6IGBlcnJvci5zdGFja2Agb3IgYCcnYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yOiB1bmtub3duKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB8fCBTdHJpbmcoZXJyb3IpO1xuICBjb25zdCB0eXBlID0gKGlzUmVjb3JkKGVycm9yKSAmJiAoZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZSkpIHx8IHVuZGVmaW5lZDtcbiAgY29uc3QgZmFpbHVyZSA9IEFwcGxpY2F0aW9uRmFpbHVyZS5jcmVhdGUoeyBtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGU6IGZhbHNlIH0pO1xuICBmYWlsdXJlLnN0YWNrID0gKGlzUmVjb3JkKGVycm9yKSAmJiBTdHJpbmcoZXJyb3Iuc3RhY2spKSB8fCAnJztcbiAgcmV0dXJuIGZhaWx1cmU7XG59XG5cbi8qKlxuICogSWYgYGVycmAgaXMgYW4gRXJyb3IgaXQgaXMgdHVybmVkIGludG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuXG4gKlxuICogSWYgYGVycmAgd2FzIGFscmVhZHkgYSBgVGVtcG9yYWxGYWlsdXJlYCwgcmV0dXJucyB0aGUgb3JpZ2luYWwgZXJyb3IuXG4gKlxuICogT3RoZXJ3aXNlIHJldHVybnMgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCBgU3RyaW5nKGVycilgIGFzIHRoZSBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlVGVtcG9yYWxGYWlsdXJlKGVycjogdW5rbm93bik6IFRlbXBvcmFsRmFpbHVyZSB7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIHJldHVybiBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUoZXJyKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJvb3QgY2F1c2UgbWVzc2FnZSBvZiBnaXZlbiBgZXJyb3JgLlxuICpcbiAqIEluIGNhc2UgYGVycm9yYCBpcyBhIHtAbGluayBUZW1wb3JhbEZhaWx1cmV9LCByZWN1cnNlIHRoZSBgY2F1c2VgIGNoYWluIGFuZCByZXR1cm4gdGhlIHJvb3QgYGNhdXNlLm1lc3NhZ2VgLlxuICogT3RoZXJ3aXNlLCByZXR1cm4gYGVycm9yLm1lc3NhZ2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm9vdENhdXNlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlID8gcm9vdENhdXNlKGVycm9yLmNhdXNlKSA6IGVycm9yLm1lc3NhZ2U7XG4gIH1cbiAgcmV0dXJuIGVycm9yTWVzc2FnZShlcnJvcik7XG59XG4iLCIvKipcbiAqIENvbW1vbiBsaWJyYXJ5IGZvciBjb2RlIHRoYXQncyB1c2VkIGFjcm9zcyB0aGUgQ2xpZW50LCBXb3JrZXIsIGFuZC9vciBXb3JrZmxvd1xuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgKiBhcyBlbmNvZGluZyBmcm9tICcuL2VuY29kaW5nJztcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FjdGl2aXR5LW9wdGlvbnMnO1xuZXhwb3J0IHsgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzT3B0aW9ucywgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIH0gZnJvbSAnLi9hY3Rpdml0eS1jYW5jZWxsYXRpb24tZGV0YWlscyc7XG5leHBvcnQgeyBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiB9IGZyb20gJy4vY29udGludWUtYXMtbmV3JztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL2RhdGEtY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29kZWMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuZXhwb3J0IHR5cGUge1xuICBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0LFxuICBTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCxcbn0gZnJvbSAnLi9jb252ZXJ0ZXIvc2VyaWFsaXphdGlvbi1jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwcmVjYXRlZC10aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZmFpbHVyZSc7XG5leHBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpb3JpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktcG9saWN5JztcbmV4cG9ydCB0eXBlIHsgVGltZXN0YW1wLCBEdXJhdGlvbiwgU3RyaW5nVmFsdWUgfSBmcm9tICcuL3RpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZXItZGVwbG95bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuZXhwb3J0IHtcbiAgU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlVmFsdWUsXG4gIFNlYXJjaEF0dHJpYnV0ZVR5cGUsXG4gIFNlYXJjaEF0dHJpYnV0ZVBhaXIsXG4gIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlS2V5LFxufSBmcm9tICcuL3NlYXJjaC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdTgoczogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIHJldHVybiBlbmNvZGluZy5lbmNvZGUocyk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgVWludDhBcnJheSBpbnRvIGEgVVRGLTggc3RyaW5nXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cihhcnI6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICByZXR1cm4gZW5jb2RpbmcuZGVjb2RlKGFycik7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5tZXNzYWdlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBoZWxwZXJzLmVycm9yTWVzc2FnZShlcnJvcik7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5jb2RlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBoZWxwZXJzLmVycm9yQ29kZShlcnJvcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFueUZ1bmMsIE9taXRMYXN0UGFyYW0gfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIFR5cGUgb2YgdGhlIG5leHQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gaW50ZXJjZXB0b3IgZnVuY3Rpb25cbiAqXG4gKiBDYWxsZWQgZnJvbSBhbiBpbnRlcmNlcHRvciB0byBjb250aW51ZSB0aGUgaW50ZXJjZXB0aW9uIGNoYWluXG4gKi9cbmV4cG9ydCB0eXBlIE5leHQ8SUYsIEZOIGV4dGVuZHMga2V5b2YgSUY+ID0gUmVxdWlyZWQ8SUY+W0ZOXSBleHRlbmRzIEFueUZ1bmMgPyBPbWl0TGFzdFBhcmFtPFJlcXVpcmVkPElGPltGTl0+IDogbmV2ZXI7XG5cbi8qKiBIZWFkZXJzIGFyZSBqdXN0IGEgbWFwcGluZyBvZiBoZWFkZXIgbmFtZSB0byBQYXlsb2FkICovXG5leHBvcnQgdHlwZSBIZWFkZXJzID0gUmVjb3JkPHN0cmluZywgUGF5bG9hZD47XG5cbnR5cGUgV3JhcE5leHQgPSA8RiBleHRlbmRzIEFueUZ1bmM+KG5leHQ6IEYpID0+IEY7XG5cbi8qKlxuICogU2hhcmVkIGltcGxlbWVudGF0aW9uIGZvciBpbnRlcmNlcHRvciBjaGFpbmluZy5cbiAqXG4gKiBUaGUgd29ya2Zsb3cgcGFja2FnZSBuZWVkcyBvbmUgc21hbGwgYmVoYXZpb3JhbCBleHRlbnNpb24gb3ZlciB0aGUgZ2VuZXJpYyBpbnRlcmNlcHRvclxuICogc2VtYW50aWNzOiBldmVyeSBgbmV4dCguLi4pYCBjb250aW51YXRpb24gaXQgaGFuZHMgdG8gd29ya2Zsb3cgaW50ZXJjZXB0b3JzIG11c3QgZmlyc3RcbiAqIHJlc3RvcmUgdGhlIHdvcmtmbG93IHJhbmRvbSBzY29wZSB0aGF0IHdhcyBjdXJyZW50IHdoZW4gdGhhdCBjb250aW51YXRpb24gd2FzIGNyZWF0ZWQuXG4gKlxuICogV2Uga2VlcCB0aGUgY2hhaW4tY29uc3RydWN0aW9uIGxvb3AgaGVyZSBhcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBzbyBvcmRlcmluZyBhbmRcbiAqIGJhc2ljIGNvbXBvc2l0aW9uIGJlaGF2aW9yIGNhbm5vdCBkcmlmdCBiZXR3ZWVuIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgY2xpZW50LFxuICogd29ya2VyLCBhY3Rpdml0eSwgYW5kIG5leHVzIGNvZGUgYW5kIHRoZSB3b3JrZmxvdy1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGRlY29yYXRlc1xuICogYG5leHQoLi4uKWAgYXQgZWFjaCBib3VuZGFyeS4gVGhlIG9ubHkgYmVoYXZpb3IgdGhhdCB2YXJpZXMgYmV0d2VlbiBjYWxsZXJzIGlzIHRoZVxuICogYHdyYXBOZXh0YCBob29rOiBtb3N0IHBhY2thZ2VzIHVzZSB0aGUgaWRlbnRpdHkgd3JhcHBlciwgd2hpbGUgd29ya2Zsb3cgY29kZSBzdXBwbGllcyBhXG4gKiB3cmFwcGVyIHRoYXQgcmUtZW50ZXJzIHRoZSBjYXB0dXJlZCB3b3JrZmxvdyBhc3luYy1sb2NhbCByYW5kb20gc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aDxJLCBNIGV4dGVuZHMga2V5b2YgST4oXG4gIGludGVyY2VwdG9yczogSVtdLFxuICBtZXRob2Q6IE0sXG4gIG5leHQ6IE5leHQ8SSwgTT4sXG4gIHdyYXBOZXh0OiBXcmFwTmV4dFxuKTogTmV4dDxJLCBNPiB7XG4gIGxldCBjb21wb3NlZE5leHQ6IGFueSA9IG5leHQ7XG4gIGZvciAobGV0IGkgPSBpbnRlcmNlcHRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICBjb25zdCBpbnRlcmNlcHRvciA9IGludGVyY2VwdG9yc1tpXTtcbiAgICBpZiAoaW50ZXJjZXB0b3I/LlttZXRob2RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHByZXYgPSB3cmFwTmV4dChjb21wb3NlZE5leHQpO1xuICAgICAgLy8gV2UgbG9zZSB0eXBlIHNhZmV0eSBoZXJlIGJlY2F1c2UgVHlwZXNjcmlwdCBjYW4ndCBkZWR1Y2UgdGhhdCBpbnRlcmNlcHRvclttZXRob2RdIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICAvLyB0aGUgc2FtZSB0eXBlIGFzIE5leHQ8SSwgTT5cbiAgICAgIGNvbXBvc2VkTmV4dCA9ICgoaW5wdXQ6IGFueSkgPT4gKGludGVyY2VwdG9yW21ldGhvZF0gYXMgYW55KShpbnB1dCwgcHJldikpIGFzIGFueTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXBvc2VkTmV4dDtcbn1cblxuLyoqXG4gKiBDb21wb3NlIGFsbCBpbnRlcmNlcHRvciBtZXRob2RzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQ2FsbGluZyB0aGUgY29tcG9zZWQgZnVuY3Rpb24gcmVzdWx0cyBpbiBjYWxsaW5nIGVhY2ggb2YgdGhlIHByb3ZpZGVkIGludGVyY2VwdG9yLCBpbiBvcmRlciAoZnJvbSB0aGUgZmlyc3QgdG9cbiAqIHRoZSBsYXN0KSwgZm9sbG93ZWQgYnkgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHByb3ZpZGVkIGFzIGFyZ3VtZW50IHRvIGBjb21wb3NlSW50ZXJjZXB0b3JzKClgLlxuICpcbiAqIEBwYXJhbSBpbnRlcmNlcHRvcnMgYSBsaXN0IG9mIGludGVyY2VwdG9yc1xuICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiB0aGUgaW50ZXJjZXB0b3IgbWV0aG9kIHRvIGNvbXBvc2VcbiAqIEBwYXJhbSBuZXh0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBpbnRlcmNlcHRpb24gY2hhaW5cbiAqL1xuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHQgKGltcG9ydGVkIHZpYSBsaWIvaW50ZXJjZXB0b3JzKVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VJbnRlcmNlcHRvcnM8SSwgTSBleHRlbmRzIGtleW9mIEk+KGludGVyY2VwdG9yczogSVtdLCBtZXRob2Q6IE0sIG5leHQ6IE5leHQ8SSwgTT4pOiBOZXh0PEksIE0+IHtcbiAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnNXaXRoKGludGVyY2VwdG9ycywgbWV0aG9kLCBuZXh0LCAoKHdyYXBwZWROZXh0KSA9PiB3cmFwcGVkTmV4dCkgYXMgV3JhcE5leHQpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuZXhwb3J0IHR5cGUgUGF5bG9hZCA9IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVBheWxvYWQ7XG5cbi8qKiBUeXBlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSBXb3JrZmxvdyBgZXhlY3V0ZWAgZnVuY3Rpb24gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmV0dXJuVHlwZSA9IFByb21pc2U8YW55PjtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+IHwgYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1VwZGF0ZVR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICB2YWxpZGF0b3I/OiBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGU7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93U2lnbmFsVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUgPSB7XG4gIGhhbmRsZXI6IFdvcmtmbG93U2lnbmFsVHlwZTtcbiAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93UXVlcnlUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSA9IHsgaGFuZGxlcjogV29ya2Zsb3dRdWVyeVR5cGU7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQnJvYWQgV29ya2Zsb3cgZnVuY3Rpb24gZGVmaW5pdGlvbiwgc3BlY2lmaWMgV29ya2Zsb3dzIHdpbGwgdHlwaWNhbGx5IHVzZSBhIG5hcnJvd2VyIHR5cGUgZGVmaW5pdGlvbiwgZS5nOlxuICogYGBgdHNcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBXb3JrZmxvd1JldHVyblR5cGU7XG5cbmRlY2xhcmUgY29uc3QgYXJnc0JyYW5kOiB1bmlxdWUgc3ltYm9sO1xuZGVjbGFyZSBjb25zdCByZXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgdXBkYXRlIGRlZmluaXRpb24sIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVVwZGF0ZX1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHVwZGF0ZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAndXBkYXRlJztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IGFyZ3MuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbYXJnc0JyYW5kXTogQXJncztcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFtyZXRCcmFuZF06IFJldDtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgc2lnbmFsIGRlZmluaXRpb24sIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHNpZ25hbCBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlZmluaXRpb248QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3NpZ25hbCc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBTaWduYWxEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHF1ZXJ5IGRlZmluaXRpb24gYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lUXVlcnl9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGFuZCBgUmV0YCBjYW4gYmUgdXNlZCBmb3IgcGFyYW1ldGVyIHR5cGUgaW5mZXJlbmNlIGluIGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBXb3JrZmxvd0hhbmRsZSBtZXRob2RzLlxuICogYE5hbWVgIGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCB3aXRoIGEgc3RyaW5nIGxpdGVyYWwgdHlwZSB0byBwcmVzZXJ2ZSB0eXBlLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgcXVlcnkgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAncXVlcnknO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBRdWVyeURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFtyZXRCcmFuZF06IFJldDtcbn1cblxuLyoqIEdldCB0aGUgXCJ1bndyYXBwZWRcIiByZXR1cm4gdHlwZSAod2l0aG91dCBQcm9taXNlKSBvZiB0aGUgZXhlY3V0ZSBoYW5kbGVyIGZyb20gV29ya2Zsb3cgdHlwZSBgV2AgKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVzdWx0VHlwZTxXIGV4dGVuZHMgV29ya2Zsb3c+ID0gUmV0dXJuVHlwZTxXPiBleHRlbmRzIFByb21pc2U8aW5mZXIgUj4gPyBSIDogbmV2ZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlGdW5jdGlvbjxQIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUiA9IGFueT4ge1xuICAoLi4uYXJnczogUCk6IFByb21pc2U8Uj47XG59XG5cbi8qKlxuICogTWFwcGluZyBvZiBBY3Rpdml0eSBuYW1lIHRvIGZ1bmN0aW9uXG4gKiBAZGVwcmVjYXRlZCBub3QgcmVxdWlyZWQgYW55bW9yZSwgZm9yIHVudHlwZWQgYWN0aXZpdGllcyB1c2Uge0BsaW5rIFVudHlwZWRBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgdHlwZSBBY3Rpdml0eUludGVyZmFjZSA9IFJlY29yZDxzdHJpbmcsIEFjdGl2aXR5RnVuY3Rpb24+O1xuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICovXG5leHBvcnQgdHlwZSBVbnR5cGVkQWN0aXZpdGllcyA9IFJlY29yZDxzdHJpbmcsIEFjdGl2aXR5RnVuY3Rpb24+O1xuXG4vKipcbiAqIEEgd29ya2Zsb3cncyBoaXN0b3J5IGFuZCBJRC4gVXNlZnVsIGZvciByZXBsYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yeUFuZFdvcmtmbG93SWQge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHRlbXBvcmFsLmFwaS5oaXN0b3J5LnYxLkhpc3RvcnkgfCB1bmtub3duIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBvbGljeSBkZWZpbmluZyBhY3Rpb25zIHRha2VuIHdoZW4gYSB3b3JrZmxvdyBleGl0cyB3aGlsZSB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXJzIGFyZSBydW5uaW5nLlxuICogVGhlIHdvcmtmbG93IGV4aXQgbWF5IGJlIGR1ZSB0byBzdWNjZXNzZnVsIHJldHVybiwgZmFpbHVyZSwgY2FuY2VsbGF0aW9uLCBvciBjb250aW51ZS1hcy1uZXcuXG4gKi9cbmV4cG9ydCBjb25zdCBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIElzc3VlIGEgd2FybmluZyBpbiBhZGRpdGlvbiB0byBhYmFuZG9uaW5nIHRoZSBoYW5kbGVyIGV4ZWN1dGlvbi4gVGhlIHdhcm5pbmcgd2lsbCBub3QgYmUgaXNzdWVkIGlmIHRoZSB3b3JrZmxvdyBmYWlscy5cbiAgICovXG4gIFdBUk5fQU5EX0FCQU5ET046ICdXQVJOX0FORF9BQkFORE9OJyxcblxuICAvKipcbiAgICogQWJhbmRvbiB0aGUgaGFuZGxlciBleGVjdXRpb24uXG4gICAqXG4gICAqIEluIHRoZSBjYXNlIG9mIGFuIHVwZGF0ZSBoYW5kbGVyIHRoaXMgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciByYXRoZXIgdGhhblxuICAgKiB0aGUgdXBkYXRlIHJlc3VsdC5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSA9ICh0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kpW2tleW9mIHR5cGVvZiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeV07XG4iLCJpbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgRXhhY3QsIFJlbW92ZVByZWZpeCwgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5cbi8qKlxuICogQ3JlYXRlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIHRoZSBudW1lcmljIGBlbnVtYCB0eXBlcyBwcm9kdWNlZCBieSBvdXJcbiAqIFByb3RvYnVmIGNvbXBpbGVyIGFuZCBcImNvbnN0IG9iamVjdCBvZiBzdHJpbmdzXCIgZW51bSB2YWx1ZXMgdGhhdCB3ZSBleHBvc2UgaW4gb3VyIHB1YmxpYyBBUElzLlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqIE5ld2x5IGludHJvZHVjZWQgZW51bXMgc2hvdWxkIGZvbGxvdyB0aGUgZm9sbG93aW5nIHBhdHRlcm46XG4gKlxuICogYGBgdHNcbiAqICAgICBjb25zdCBQYXJlbnRDbG9zZVBvbGljeSA9IHtcbiAqICAgICAgIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG4gKiAgICAgICBBQkFORE9OOiAnQUJBTkRPTicsXG4gKiAgICAgICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcbiAqICAgICB9IGFzIGNvbnN0O1xuICogICAgIHR5cGUgUGFyZW50Q2xvc2VQb2xpY3kgPSAodHlwZW9mIFBhcmVudENsb3NlUG9saWN5KVtrZXlvZiB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ldO1xuICpcbiAqICAgICBjb25zdCBbZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksIGRlY29kZVBhcmVudENsb3NlUG9saWN5XSA9IC8vXG4gKiAgICAgICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAqICAgICAgICAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgICdQQVJFTlRfQ0xPU0VfUE9MSUNZXycgIC8vIFRoaXMgbWF5IGJlIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcHJvdG8gZW51bSBkb2Vzbid0IGFkZCBhIHJlcGVhdGVkIHByZWZpeCBvbiB2YWx1ZXNcbiAqICAgICAgID4oXG4gKiAgICAgICAgIHtcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFXTogMSwgLy8gVGhlc2UgbnVtYmVycyBtdXN0IG1hdGNoIHRoZSBvbmVzIGluIHRoZSBwcm90byBlbnVtXG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LkFCQU5ET05dOiAyLFxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5SRVFVRVNUX0NBTkNFTF06IDMsXG4gKlxuICogICAgICAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICogICAgICAgICB9IGFzIGNvbnN0LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4gKiAgICAgICApO1xuICogYGBgXG4gKlxuICogYG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzYCBzdXBwb3J0cyBvdGhlciB1c2FnZSBwYXR0ZXJucywgYnV0IHRoZXkgYXJlIG9ubHkgbWVhbnQgZm9yXG4gKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZm9ybWVyIGVudW0gZGVmaW5pdGlvbnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgbmV3IGVudW1zLlxuICpcbiAqICMjIyBDb250ZXh0XG4gKlxuICogVGVtcG9yYWwncyBQcm90b2J1ZiBBUElzIGRlZmluZSBzZXZlcmFsIGBlbnVtYCB0eXBlczsgb3VyIFByb3RvYnVmIGNvbXBpbGVyIHRyYW5zZm9ybXMgdGhlc2UgdG9cbiAqIHRyYWRpdGlvbmFsIChpLmUuIG5vbi1jb25zdCkgW1R5cGVTY3JpcHQgbnVtZXJpYyBgZW51bWBzXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9lbnVtcy5odG1sI251bWVyaWMtZW51bXMpLlxuICpcbiAqIEZvciB2YXJpb3VzIHJlYXNvbnMsIHRoaXMgaXMgZmFyIGZyb20gaWRlYWw6XG4gKlxuICogIC0gRHVlIHRvIHRoZSBkdWFsIG5hdHVyZSBvZiBub24tY29uc3QgVHlwZVNjcmlwdCBgZW51bWBzICh0aGV5IGFyZSBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSksXG4gKiAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVmZXIgdG8gYW4gZW51bSB2YWx1ZSBmcm9tIGNvZGUgd2l0aG91dCBhIFwicmVhbFwiIGltcG9ydCBvZiB0aGUgZW51bSB0eXBlXG4gKiAgICAoaS5lLiBjYW4ndCBzaW1wbHkgZG8gYGltcG9ydCB0eXBlIC4uLmApLiBJbiBXb3JrZmxvdyBjb2RlLCBzdWNoIGFuIGltcG9ydCB3b3VsZCByZXN1bHQgaW5cbiAqICAgIGxvYWRpbmcgb3VyIGVudGlyZSBQcm90b2J1ZiBkZWZpbml0aW9ucyBpbnRvIHRoZSB3b3JrZmxvdyBzYW5kYm94LCBhZGRpbmcgc2V2ZXJhbCBtZWdhYnl0ZXMgdG9cbiAqICAgIHRoZSBwZXItd29ya2Zsb3cgbWVtb3J5IGZvb3RwcmludCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlOyB0byBhdm9pZCB0aGF0LCB3ZSBuZWVkIHRvIG1haW50YWluXG4gKiAgICBhIG1pcnJvciBjb3B5IG9mIGVhY2ggZW51bSB0eXBlcyB1c2VkIGJ5IGluLXdvcmtmbG93IEFQSXMsIGFuZCBleHBvcnQgdGhlc2UgZnJvbSBlaXRoZXJcbiAqICAgIGBAdGVtcG9yYWxpby9jb21tb25gIG9yIGBAdGVtcG9yYWxpby93b3JrZmxvd2AuXG4gKiAgLSBJdCBpcyBub3QgZGVzaXJhYmxlIGZvciB1c2VycyB0byBuZWVkIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgb24gYEB0ZW1wb3JhbGlvL3Byb3RvYCBqdXN0IHRvXG4gKiAgICBnZXQgYWNjZXNzIHRvIHRoZXNlIGVudW0gdHlwZXM7IHdlIHRoZXJlZm9yZSBtYWRlIGl0IGEgY29tbW9uIHByYWN0aWNlIHRvIHJlZXhwb3J0IHRoZXNlIGVudW1zXG4gKiAgICBmcm9tIG91ciBwdWJsaWMgZmFjaW5nIHBhY2thZ2VzLiBIb3dldmVyLCBleHBlcmllbmNlIGRlbW9udHJhdGVkIHRoYXQgdGhlc2UgcmVleHBvcnRzIGVmZmVjdGl2ZWx5XG4gKiAgICByZXN1bHRlZCBpbiBwb29yIGFuZCBpbmNvbnNpc3RlbnQgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBjb21wYXJlZCB0byBtaXJyb3JlZCBlbnVtcyB0eXBlcy5cbiAqICAtIE91ciBQcm90b2J1ZiBlbnVtIHR5cGVzIHRlbmQgdG8gZm9sbG93IGEgdmVyYm9zZSBhbmQgcmVkdW5kYW50IG5hbWluZyBjb252ZW50aW9uLCB3aGljaCBmZWVsc1xuICogICAgdW5hdHVyYWwgYW5kIGV4Y2Vzc2l2ZSBhY2NvcmRpbmcgdG8gbW9zdCBUeXBlU2NyaXB0IHN0eWxlIGd1aWRlczsgZS5nLiBpbnN0ZWFkIG9mXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1JFSkVDVF9EVVBMSUNBVEVgLFxuICogICAgYSBUeXBlU2NyaXB0IGRldmVsb3BlciB3b3VsZCBnZW5lcmFsbHkgZXhwZWN0IHRvIGJlIGFibGUgdG8gd3JpdGUgc29tZXRoaW5nIHNpbWlsYXIgdG9cbiAqICAgIGB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6ICdSRUpFQ1RfRFVQTElDQVRFJ2AuXG4gKiAgLSBCZWNhdXNlIG9mIHRoZSB3YXkgUHJvdG9idWYgd29ya3MsIG1hbnkgb2Ygb3VyIGVudW0gdHlwZXMgY29udGFpbiBhbiBgVU5TUEVDSUZJRURgIHZhbHVlLCB3aGljaFxuICogICAgaXMgdXNlZCB0byBleHBsaWNpdGx5IGlkZW50aWZ5IGEgdmFsdWUgdGhhdCBpcyB1bnNldC4gSW4gVHlwZVNjcmlwdCBjb2RlLCB0aGUgYHVuZGVmaW5lZGAgdmFsdWVcbiAqICAgIGFscmVhZHkgc2VydmVzIHRoYXQgcHVycG9zZSwgYW5kIGlzIGRlZmluaXRlbHkgbW9yZSBpZGlvbWF0aWMgdG8gVFMgZGV2ZWxvcGVycywgd2hlcmVhcyB0aGVzZVxuICogICAgYFVOU1BFQ0lGSUVEYCB2YWx1ZXMgY3JlYXRlIG5vaXNlIGFuZCBjb25mdXNpb24gaW4gb3VyIEFQSXMuXG4gKiAgLSBUeXBlU2NyaXB0IGVkaXRvcnMgZ2VuZXJhbGx5IGRvIGEgdmVyeSBiYWQgam9iIGF0IHByb3ZpZGluZyBhdXRvY29tcGxldGlvbiB0aGF0IGltcGxpZXMgcmVhY2hpbmdcbiAqICAgIGZvciB2YWx1ZXMgb2YgYSBUeXBlU2NyaXB0IGVudW0gdHlwZSwgZm9yY2luZyBkZXZlbG9wZXJzIHRvIGV4cGxpY2l0bHkgdHlwZSBpbiBhdCBsZWFzdCBwYXJ0XG4gKiAgICBvZiB0aGUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIGJlZm9yZSB0aGV5IGNhbiBnZXQgYXV0b2NvbXBsZXRpb24gZm9yIGl0cyB2YWx1ZXMuIE9uIHRoZSBvdGhlclxuICogICAgaGFuZCwgYWxsIFRTIGVkaXRvcnMgaW1tZWRpYXRlbHkgcHJvdmlkZSBhdXRvY29tcGxldGlvbiBmb3Igc3RyaW5nIHVuaW9uIHR5cGVzLlxuICogIC0gVGhlIFtUeXBlU2NyaXB0J3Mgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNvYmplY3RzLXZzLWVudW1zKVxuICogICAgaXRzZWxmIHN1Z2dlc3RzIHRoYXQsIGluIG1vZGVybiBUeXBlU2NyaXB0LCB0aGUgdXNlIG9mIGBhcyBjb25zdGAgb2JqZWN0cyBtYXkgZ2VuZXJhbGx5IHN1ZmZpY2VcbiAqICAgIGFuZCBtYXkgYmUgYWR2YW50YWdlb3VzIG92ZXIgdGhlIHVzZSBvZiBgZW51bWAgdHlwZXMuXG4gKlxuICogQSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncywgY29tYmluZWQgd2l0aCBhIHVuaW9uIHR5cGUgb2YgcG9zc2libGUgc3RyaW5nIHZhbHVlcywgcHJvdmlkZXMgYSBtdWNoXG4gKiBtb3JlIGlkaW9tYXRpYyBzeW50YXggYW5kIGEgYmV0dGVyIERYIGZvciBUeXBlU2NyaXB0IGRldmVsb3BlcnMuIFRoaXMgaG93ZXZlciByZXF1aXJlcyBhIHdheSB0b1xuICogY29udmVydCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSBgZW51bWAgdmFsdWVzIHByb2R1Y2VkIGJ5IHRoZSBQcm90b2J1ZiBjb21waWxlciBhbmQgdGhlXG4gKiBlcXVpdmFsZW50IHN0cmluZyB2YWx1ZXMuXG4gKlxuICogVGhpcyBoZWxwZXIgZHluYW1pY2FsbHkgY3JlYXRlcyB0aGVzZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgYSBnaXZlbiBQcm90b2J1ZiBlbnVtIHR5cGUsXG4gKiBzdHJvbmdseSBidWlsZGluZyB1cG9uIHNwZWNpZmljIGNvbnZlbnRpb25zIHRoYXQgd2UgaGF2ZSBhZG9wdGVkIGluIG91ciBQcm90b2J1ZiBkZWZpbml0aW9ucy5cbiAqXG4gKiAjIyMgVmFsaWRhdGlvbnNcbiAqXG4gKiBUaGUgY29tcGxleCB0eXBlIHNpZ25hdHVyZSBvZiB0aGlzIGhlbHBlciBpcyB0aGVyZSB0byBwcmV2ZW50IG1vc3QgcG90ZW50aWFsIGluY29oZXJlbmNpZXNcbiAqIHRoYXQgY291bGQgcmVzdWx0IGZyb20gaGF2aW5nIHRvIG1hbnVhbGx5IHN5bmNocm9uaXplIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIGFuZCB0aGVcbiAqIGNvbnZlcnNpb24gdGFibGUgd2l0aCB0aGUgcHJvdG8gZW51bSwgd2hpbGUgbm90IHJlcXVpcmluZyBhIHJlZ3VsYXIgaW1wb3J0IG9uIHRoZSBQcm90b2J1ZiBlbnVtXG4gKiBpdHNlbGYgKHNvIGl0IGNhbiBiZSB1c2VkIHNhZmVseSBmb3IgZW51bXMgbWVhbnQgdG8gYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvZGUpLlxuICpcbiAqIEluIHBhcnRpY3VsYXIsIGZhaWxpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyB3aWxsIHJlc3VsdCBpbiBidWlsZCB0aW1lIGVycm9yczpcbiAqXG4gKiAtIEZvciBldmVyeSBrZXkgb2YgdGhlIGZvcm0gYFBSRUZJWF9LRVk6IG51bWJlcmAgaW4gdGhlIHByb3RvIGVudW0sIGV4Y2x1ZGluZyB0aGUgYFVOU1BFQ0lGSUVEYCBrZXk6XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogJ0tFWSdgIGVudHJ5IGluIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtO1xuICogICAtIFRoZXJlIE1BWSBiZSBhIGNvcnJlc3BvbmRpbmcgYFBSRUZJWF9LRVk6ICdLRVknYCBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogICAgICh0aGlzIGlzIG1lYW50IHRvIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZm9ybWVyIHN5bnRheDsgc3VjaCBhbGlhc2VzIHNob3VsZFxuICogICAgIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGFuZCBlbnVtIGVudHJpZXMgaW50cm9kdWNlZCBnb2luZyBmb3J3YXJkKTtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGEgY29ycmVzcG9uZGluZyBgS0VZOiBudW1iZXJgIGluIHRoZSBtYXBwaW5nIHRhYmxlLlxuICogLSBJZiB0aGUgcHJvdG8gZW51bSBjb250YWlucyBhIGBQUkVGSVhfVU5TUEVDSUZJRURgIGVudHJ5LCB0aGVuOlxuICogICAtIFRoZXJlIE1BWSBiZSBhIGNvcnJlc3BvbmRpbmcgYFBSRUZJWF9VTlNQRUNJRklFRDogdW5kZWZpbmVkYCBhbmQvb3IgYFVOU1BFQ0lGSUVEOiB1bmRlZmluZWRgXG4gKiAgICAgZW50cmllcyBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSDigJQgdGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiAgICAgd2l0aCB0aGUgZm9ybWVyIHN5bnRheDsgdGhpcyBhbGlhcyBzaG91bGQgbm90IGJlIGFkZGVkIGZvciBuZXcgZW51bXMgaW50cm9kdWNlZCBnb2luZyBmb3J3YXJkO1xuICogICAtIFRoZXJlIE1VU1QgYmUgYW4gYFVOU1BFQ0lGSUVEOiAwYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gVGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0gTVVTVCBOT1QgY29udGFpbiBhbnkgb3RoZXIga2V5cyB0aGFuIHRoZSBvbmVzIG1hbmRhdGVkIG9yXG4gKiAgIG9wdGlvbmFsbHkgYWxsb3dlZCBiZSB0aGUgcHJlY2VlZGluZyBydWxlcy5cbiAqIC0gVGhlIG1hcHBpbmcgdGFibGUgTVVTVCBOT1QgY29udGFpbiBhbnkgb3RoZXIga2V5cyB0aGFuIHRoZSBvbmVzIG1hbmRhdGVkIGFib3ZlLlxuICpcbiAqIFRoZXNlIHJ1bGVzIG5vdGFibHkgZW5zdXJlIHRoYXQgd2hlbmV2ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgUHJvdG8gZW51bSwgdGhlIGNvZGVcbiAqIHdpbGwgZmFpbCB0byBjb21waWxlIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGlzIGFkZGVkIG9uIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtXG4gKiBhbmQgdGhlIG1hcHBpbmcgdGFibGUuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFN0cmluZ0VudW1UeXBlQWN0dWFsIGV4dGVuZHMgRXhhY3Q8U3RyaW5nRW51bVR5cGUsIFN0cmluZ0VudW1UeXBlQWN0dWFsPixcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICAvL1xuICAvLyBQYXJhbWV0ZXJzIGFmdGVyIHRoaXMgcG9pbnQgd2lsbCBiZSBpbmZlcnJlZDsgdGhleSdyZSBub3QgbWVhbnQgbm90IHRvIGJlIHNwZWNpZmllZCBieSBkZXZlbG9wZXJzXG4gIFVuc3BlY2lmaWVkID0gUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fVVOU1BFQ0lGSUVEYCA/ICdVTlNQRUNJRklFRCcgOiBuZXZlcixcbiAgU2hvcnRTdHJpbmdFbnVtS2V5IGV4dGVuZHMgUmVtb3ZlUHJlZml4PFByZWZpeCwgUHJvdG9FbnVtS2V5PiA9IEV4Y2x1ZGU8XG4gICAgUmVtb3ZlUHJlZml4PFByZWZpeCwgUHJvdG9FbnVtS2V5PixcbiAgICBVbnNwZWNpZmllZFxuICA+LFxuICBTdHJpbmdFbnVtVHlwZSBleHRlbmRzIFByb3RvQ29uc3RPYmplY3RPZlN0cmluZ3NFbnVtPFxuICAgIFNob3J0U3RyaW5nRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWRcbiAgPiA9IFByb3RvQ29uc3RPYmplY3RPZlN0cmluZ3NFbnVtPFNob3J0U3RyaW5nRW51bUtleSwgUHJlZml4LCBVbnNwZWNpZmllZD4sXG4gIE1hcFRhYmxlIGV4dGVuZHMgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4gPSBQcm90b0VudW1Ub0NvbnN0T2JqZWN0T2ZTdHJpbmdNYXBUYWJsZTxcbiAgICBTdHJpbmdFbnVtVHlwZSxcbiAgICBQcm90b0VudW1WYWx1ZSxcbiAgICBQcm90b0VudW0sXG4gICAgUHJvdG9FbnVtS2V5LFxuICAgIFByZWZpeCxcbiAgICBVbnNwZWNpZmllZCxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXlcbiAgPixcbj4oXG4gIG1hcFRhYmxlOiBNYXBUYWJsZSxcbiAgcHJlZml4OiBQcmVmaXhcbik6IFtcbiAgKFxuICAgIGlucHV0OiBTaG9ydFN0cmluZ0VudW1LZXkgfCBgJHtQcmVmaXh9JHtTaG9ydFN0cmluZ0VudW1LZXl9YCB8IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApID0+IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkLCAvL1xuICAoaW5wdXQ6IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gU2hvcnRTdHJpbmdFbnVtS2V5IHwgdW5kZWZpbmVkLCAvL1xuXSB7XG4gIGNvbnN0IHJldmVyc2VUYWJsZTogUmVjb3JkPFByb3RvRW51bVZhbHVlLCBTaG9ydFN0cmluZ0VudW1LZXk+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcFRhYmxlKS5tYXAoKFtrLCB2XSkgPT4gW3YsIGtdKVxuICApO1xuICBjb25zdCBoYXNVbnNwZWNpZmllZCA9IChtYXBUYWJsZSBhcyBhbnkpWydVTlNQRUNJRklFRCddID09PSAwIHx8IChtYXBUYWJsZSBhcyBhbnkpW2Ake3ByZWZpeH1VTlNQRUNJRklFRGBdID09PSAwO1xuXG4gIGZ1bmN0aW9uIGlzU2hvcnRTdHJpbmdFbnVtS2V5cyh4OiB1bmtub3duKTogeCBpcyBTaG9ydFN0cmluZ0VudW1LZXkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiYgeCBpbiBtYXBUYWJsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTnVtZXJpY0VudW1WYWx1ZSh4OiB1bmtub3duKTogeCBpcyBQcm90b0VudW1ba2V5b2YgUHJvdG9FbnVtXSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnbnVtYmVyJyAmJiB4IGluIHJldmVyc2VUYWJsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuY29kZShcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogUHJvdG9FbnVtVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IHNob3J0ZW46IHN0cmluZyA9IGlucHV0O1xuICAgICAgaWYgKHNob3J0ZW4uc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIHNob3J0ZW4gPSBzaG9ydGVuLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2hvcnRTdHJpbmdFbnVtS2V5cyhzaG9ydGVuKSkge1xuICAgICAgICByZXR1cm4gbWFwVGFibGVbc2hvcnRlbl07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nYCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIGVudW0gdmFsdWU6ICcke2lucHV0fScgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQ6IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaGFzVW5zcGVjaWZpZWQgJiYgaW5wdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTnVtZXJpY0VudW1WYWx1ZShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIHJldmVyc2VUYWJsZVtpbnB1dF07XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGdvdCBhIHByb3RvIGVudW0gdmFsdWUgdGhhdCB3ZSBkb24ndCB5ZXQga25vdyBhYm91dCAoaS5lLiBpdCBkaWRuJ3QgZXhpc3Qgd2hlbiB0aGlzIGNvZGVcbiAgICAgIC8vIHdhcyBjb21waWxlZCkuIFRoaXMgaXMgY2VydGFpbmx5IGEgcG9zc2liaWxpdHksIGJ1dCBnaXZlbiBob3cgb3VyIEFQSXMgZXZvbHZlLCB0aGlzIGlzIGlzXG4gICAgICAvLyB1bmxpa2VseSB0byBiZSBhIHRlcnJpYmx5IGJhZCB0aGluZyBieSBpdHNlbGYgKHdlIGF2b2lkIGFkZGluZyBuZXcgZW51bSB2YWx1ZXMgaW4gcGxhY2VzXG4gICAgICAvLyB0aGF0IHdvdWxkIGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBkZXBsb3llZCBjb2RlKS4gVGhlcmVmb3JlLCB0aHJvd2luZ1xuICAgICAgLy8gb24gXCJ1bmV4cGVjdGVkXCIgdmFsdWVzIGlzIGxpa2VseSB0byBlbmQgdXAgY2F1c2luZyBtb3JlIHByb2JsZW1zIHRoYW4gaXQgbWlnaHQgYXZvaWQsXG4gICAgICAvLyBlc3BlY2lhbGx5IGdpdmVuIHRoYXQgdGhlIGRlY29kZWQgdmFsdWUgbWF5IGFjdHVhbGx5IG5ldmVyIGdldCByZWFkIGFud3lheS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGVyZWZvcmUsIHdlIGluc3RlYWQgY2hlYXQgb24gdHlwZSBjb25zdHJhaW50cyBhbmQgcmV0dXJuIGEgc3RyaW5nIG9mIHRoZSBmb3JtIFwidW5rbm93bl8yM1wiLlxuICAgICAgLy8gVGhhdCBzb21ld2hhdCBtaXJyb3JzIHRoZSBiZWhhdmlvciB3ZSdkIGdldCB3aXRoIHRoZSBwdXJlIG51bWVyaWNhbCBhcHByb2FjaC5cbiAgICAgIHJldHVybiBgdW5rbm93bl8ke2lucHV0fWAgYXMgU2hvcnRTdHJpbmdFbnVtS2V5O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHByb3RvIGVudW0gdmFsdWU6ICcke2lucHV0fScgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbiAgfVxuXG4gIHJldHVybiBbZW5jb2RlLCBkZWNvZGVdIGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtLFxuICogZS5nLiB0aGUgdHlwZSB0aGF0IHRoZSBkZXZlbG9wZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgIFRFUk1JTkFURTogXCJURVJNSU5BVEVcIjtcbiAqICAgQUJBTkRPTjogXCJBQkFORE9OXCI7XG4gKiAgIFJFUVVFU1RfQ0FOQ0VMOiBcIlJFUVVFU1RfQ0FOQ0VMXCI7XG4gKlxuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURT86IFwiVEVSTUlOQVRFXCI7XG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTj86IFwiQUJBTkRPTlwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMPzogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9VTlNQRUNJRklFRD86IHVuZGVmaW5lZDtcbiAqIH1cbiAqL1xudHlwZSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgU2hvcnRTdHJpbmdFbnVtS2V5IGV4dGVuZHMgc3RyaW5nLFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4gIFVuc3BlY2lmaWVkLCAvLyBlLmcuICdVTlNQRUNJRklFRCdcbj4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICB8IHtcbiAgICAgIC8vIGUuZy46IFwiVEVSTUlOQVRFXCI6IFwiVEVSTUlOQVRFXCJcbiAgICAgIHJlYWRvbmx5IFtrIGluIFNob3J0U3RyaW5nRW51bUtleV06IGs7XG4gICAgfVxuICB8IHtcbiAgICAgIFtrIGluIFNob3J0U3RyaW5nRW51bUtleV06IFByZWZpeCBleHRlbmRzICcnXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURVwiPzogXCJURVJNSU5BVEVcIlxuICAgICAgICAgICAgcmVhZG9ubHkgW2trIGluIGAke1ByZWZpeH0ke2t9YF0/OiBrO1xuICAgICAgICAgIH07XG4gICAgfVtTaG9ydFN0cmluZ0VudW1LZXldXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRURcIj86IHVuZGVmaW5lZFxuICAgICAgICAgIFtrIGluIGAke1ByZWZpeH0ke1Vuc3BlY2lmaWVkfWBdPzogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICA6IG9iamVjdClcbiAgfCAoVW5zcGVjaWZpZWQgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8ge1xuICAgICAgICAgIC8vIGUuZy46IFwiVU5TUEVDSUZJRURcIj86IHVuZGVmaW5lZFxuICAgICAgICAgIFtrIGluIGAke1Vuc3BlY2lmaWVkfWBdPzogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICA6IG9iamVjdClcbj47XG5cbi8qKlxuICogR2l2ZW4gdGhlIGV4cGxvZGVkIHBhcmFtZXRlcnMgb2YgYSBwcm90byBlbnVtIChpLmUuIHNob3J0IGtleXMsIHByZWZpeCwgYW5kIHNob3J0IGtleSBvZiB0aGVcbiAqIHVuc3BlY2lmaWVkIHZhbHVlKSwgbWFrZSBhIHR5cGUgdGhhdCBfZXhhY3RseV8gY29ycmVzcG9uZHMgdG8gdGhlIG1hcHBpbmcgdGFibGUgdGhhdCB0aGUgdXNlciBpc1xuICogZXhwZWN0ZWQgdG8gcHJvdmlkZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZm9yIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksIHRoaXMgZXZhbHVhdGVzIHRvOlxuICpcbiAqIHtcbiAqICBVTlNQRUNJRklFRDogMCxcbiAqICBURVJNSU5BVEU6IDEsXG4gKiAgQUJBTkRPTjogMixcbiAqICBSRVFVRVNUX0NBTkNFTDogMyxcbiAqIH1cbiAqL1xudHlwZSBQcm90b0VudW1Ub0NvbnN0T2JqZWN0T2ZTdHJpbmdNYXBUYWJsZTxcbiAgX1N0cmluZ0VudW0gZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBQcm90b0VudW1WYWx1ZSBleHRlbmRzIG51bWJlcixcbiAgUHJvdG9FbnVtIGV4dGVuZHMgeyBbayBpbiBQcm90b0VudW1LZXldOiBQcm90b0VudW1WYWx1ZSB9LFxuICBQcm90b0VudW1LZXkgZXh0ZW5kcyBgJHtQcmVmaXh9JHtzdHJpbmd9YCxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCxcbiAgU2hvcnRTdHJpbmdFbnVtS2V5IGV4dGVuZHMgUmVtb3ZlUHJlZml4PFByZWZpeCwgUHJvdG9FbnVtS2V5Pixcbj4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICB7XG4gICAgW2sgaW4gUHJvdG9FbnVtS2V5XToge1xuICAgICAgW2trIGluIFJlbW92ZVByZWZpeDxQcmVmaXgsIGs+XTogUHJvdG9FbnVtW2tdIGV4dGVuZHMgbnVtYmVyID8gUHJvdG9FbnVtW2tdIDogbmV2ZXI7XG4gICAgfTtcbiAgfVtQcm90b0VudW1LZXldXG4+O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9lbnVtcy1oZWxwZXJzJztcbmV4cG9ydCB7XG4gIGZpbHRlck51bGxBbmRVbmRlZmluZWQsXG4gIG1lcmdlT2JqZWN0cyxcbiAgLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbiAgZGVlcE1lcmdlLFxufSBmcm9tICcuL29iamVjdHMtaGVscGVycyc7XG4iLCIvKipcbiAqIEhlbHBlciB0byBwcmV2ZW50IGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgdmFsdWVzIG92ZXJyaWRpbmcgZGVmYXVsdHMgd2hlbiBtZXJnaW5nIG1hcHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvYmo6IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW19rLCB2XSkgPT4gdiAhPSBudWxsKSkgYXMgYW55O1xufVxuXG4vKipcbiAqIE1lcmdlIHR3byBvYmplY3RzLCBwb3NzaWJseSByZW1vdmluZyBrZXlzLlxuICpcbiAqIE1vcmUgc3BlY2lmaWNhbGx5OlxuICogLSBBbnkga2V5L3ZhbHVlIHBhaXIgaW4gYGRlbHRhYCBvdmVycmlkZXMgdGhlIGNvcnJlc3BvbmRpbmcga2V5L3ZhbHVlIHBhaXIgaW4gYG9yaWdpbmFsYDtcbiAqIC0gQSBrZXkgcHJlc2VudCBpbiBgZGVsdGFgIHdpdGggdmFsdWUgYHVuZGVmaW5lZGAgcmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlIHJlc3VsdGluZyBvYmplY3Q7XG4gKiAtIElmIGBvcmlnaW5hbGAgaXMgYHVuZGVmaW5lZGAgb3IgZW1wdHksIHJldHVybiBgZGVsdGFgO1xuICogLSBJZiBgZGVsdGFgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYG9yaWdpbmFsYCAob3IgdW5kZWZpbmVkIGlmIGBvcmlnaW5hbGAgaXMgYWxzbyB1bmRlZmluZWQpO1xuICogLSBJZiB0aGVyZSBhcmUgbm8gY2hhbmdlcywgdGhlbiByZXR1cm4gYG9yaWdpbmFsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlT2JqZWN0czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob3JpZ2luYWw6IFQsIGRlbHRhOiBUIHwgdW5kZWZpbmVkKTogVDtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBvcmlnaW5hbDogVCB8IHVuZGVmaW5lZCxcbiAgZGVsdGE6IFQgfCB1bmRlZmluZWRcbik6IFQgfCB1bmRlZmluZWQge1xuICBpZiAob3JpZ2luYWwgPT0gbnVsbCkgcmV0dXJuIGRlbHRhO1xuICBpZiAoZGVsdGEgPT0gbnVsbCkgcmV0dXJuIG9yaWdpbmFsO1xuXG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4ub3JpZ2luYWwgfTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZGVsdGEpKSB7XG4gICAgaWYgKHYgIT09IG1lcmdlZFtrXSkge1xuICAgICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIG1lcmdlZFtrXTtcbiAgICAgIGVsc2UgbWVyZ2VkW2tdID0gdjtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VkID8gKG1lcmdlZCBhcyBUKSA6IG9yaWdpbmFsO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChpdGVtOiBhbnkpOiBpdGVtIGlzIFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICByZXR1cm4gaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSk7XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgbWVyZ2VzIHR3byBvYmplY3RzLCByZXR1cm5pbmcgYSBuZXcgb2JqZWN0LlxuICpcbiAqIFByb3BlcnRpZXMgZnJvbSBgc291cmNlYCB3aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9uIGB0YXJnZXRgLlxuICogTmVzdGVkIG9iamVjdHMgYXJlIG1lcmdlZCByZWN1cnNpdmVseS5cbiAqXG4gKiBPYmplY3QgZmllbGRzIGluIHRoZSByZXR1cm5lZCBvYmplY3QgYXJlIHJlZmVyZW5jZXMsIGFzIGluLFxuICogdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgY29tcGxldGVseSBmcmVzaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNZXJnZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4odGFyZ2V0OiBULCBzb3VyY2U6IFBhcnRpYWw8VD4pOiBUIHtcbiAgY29uc3Qgb3V0cHV0ID0geyAuLi50YXJnZXQgfTtcblxuICBpZiAoaXNPYmplY3QodGFyZ2V0KSAmJiBpc09iamVjdChzb3VyY2UpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2VWYWx1ZSkgJiYga2V5IGluIHRhcmdldCAmJiBpc09iamVjdCh0YXJnZXRba2V5XSBhcyBhbnkpKSB7XG4gICAgICAgIG91dHB1dFtrZXkgYXMga2V5b2YgVF0gPSBkZWVwTWVyZ2UodGFyZ2V0W2tleV0sIHNvdXJjZVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChvdXRwdXQgYXMgYW55KVtrZXldID0gc291cmNlVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdUUkFDRScgfCAnREVCVUcnIHwgJ0lORk8nIHwgJ1dBUk4nIHwgJ0VSUk9SJztcblxuZXhwb3J0IHR5cGUgTG9nTWV0YWRhdGEgPSBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBhbnk+O1xuXG4vKipcbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBjdXN0b21pemUgd29ya2VyIGxvZ2dpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXIge1xuICBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbn1cblxuLyoqXG4gKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBzZGtDb21wb25lbnRgIG1ldGEgYXR0cmlidXRlcyBvbiBsb2cgbWVzc2FnZXMuIFRoaXNcbiAqIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgd2hpY2ggc3Vic3lzdGVtIGVtaXR0ZWQgdGhlIGxvZyBtZXNzYWdlOyB0aGlzIG1heSBmb3JcbiAqIGV4YW1wbGUgYmUgdXNlZCB0byBpbXBsZW1lbnQgZmluZS1ncmFpbmVkIGZpbHRlcmluZyBvZiBsb2cgbWVzc2FnZXMuXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgbGlzdCB3aWxsIHJlbWFpbiBzdGFibGUgaW4gdGhlXG4gKiBmdXR1cmU7IHZhbHVlcyBtYXkgYmUgYWRkZWQgb3IgcmVtb3ZlZCwgYW5kIG1lc3NhZ2VzIHRoYXQgYXJlIGN1cnJlbnRseVxuICogZW1pdHRlZCB3aXRoIHNvbWUgYHNka0NvbXBvbmVudGAgdmFsdWUgbWF5IHVzZSBhIGRpZmZlcmVudCB2YWx1ZSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgZW51bSBTZGtDb21wb25lbnQge1xuICAvKipcbiAgICogQ29tcG9uZW50IG5hbWUgZm9yIG1lc3NhZ2VzIGVtaXRlZCBmcm9tIFdvcmtmbG93IGNvZGUsIHVzaW5nIHRoZSB7QGxpbmsgV29ya2Zsb3cgY29udGV4dCBsb2dnZXJ8d29ya2Zsb3cubG9nfS5cbiAgICogVGhlIFNESyBpdHNlbGYgbmV2ZXIgcHVibGlzaGVzIG1lc3NhZ2VzIHdpdGggdGhpcyBjb21wb25lbnQgbmFtZS5cbiAgICovXG4gIHdvcmtmbG93ID0gJ3dvcmtmbG93JyxcblxuICAvKipcbiAgICogQ29tcG9uZW50IG5hbWUgZm9yIG1lc3NhZ2VzIGVtaXRlZCBmcm9tIGFuIGFjdGl2aXR5LCB1c2luZyB0aGUge0BsaW5rIGFjdGl2aXR5IGNvbnRleHQgbG9nZ2VyfENvbnRleHQubG9nfS5cbiAgICogVGhlIFNESyBpdHNlbGYgbmV2ZXIgcHVibGlzaGVzIG1lc3NhZ2VzIHdpdGggdGhpcyBjb21wb25lbnQgbmFtZS5cbiAgICovXG4gIGFjdGl2aXR5ID0gJ2FjdGl2aXR5JyxcblxuICAvKipcbiAgICogQ29tcG9uZW50IG5hbWUgZm9yIG1lc3NhZ2VzIGVtaXRlZCBmcm9tIGEgTmV4dXMgT3BlcmF0aW9uIEhhbmRsZXIsIHVzaW5nIHRoZSBOZXh1cyBjb250ZXh0IGxvZ2dlci5cbiAgICogVGhlIFNESyBpdHNlbGYgbmV2ZXIgcHVibGlzaGVzIG1lc3NhZ2VzIHdpdGggdGhpcyBjb21wb25lbnQgbmFtZS5cbiAgICovXG4gIG5leHVzID0gJ25leHVzJyxcblxuICAvKipcbiAgICogQ29tcG9uZW50IG5hbWUgZm9yIG1lc3NhZ2VzIGVtaXRlZCBmcm9tIGEgVGVtcG9yYWwgV29ya2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBUaGlzIG5vdGFibHkgaW5jbHVkZXM6XG4gICAqIC0gSXNzdWVzIHdpdGggV29ya2VyIG9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbiwgb3IgdGhlIEpTIGV4ZWN1dGlvbiBlbnZpcm9ubWVudDtcbiAgICogLSBXb3JrZXIncywgQWN0aXZpdHkncywgYW5kIFdvcmtmbG93J3MgbGlmZWN5Y2xlIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBBY3RpdmF0aW9uIGFuZCBBY3Rpdml0eSBUYXNrIHByb2Nlc3NpbmcgZXZlbnRzO1xuICAgKiAtIFdvcmtmbG93IGJ1bmRsaW5nIG1lc3NhZ2VzO1xuICAgKiAtIFNpbmsgcHJvY2Vzc2luZyBpc3N1ZXMuXG4gICAqL1xuICB3b3JrZXIgPSAnd29ya2VyJyxcblxuICAvKipcbiAgICogQ29tcG9uZW50IG5hbWUgZm9yIGFsbCBtZXNzYWdlcyBlbWl0dGVkIGJ5IHRoZSBSdXN0IENvcmUgU0RLIGxpYnJhcnkuXG4gICAqL1xuICBjb3JlID0gJ2NvcmUnLFxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIExvZ01ldGFPckZ1bmMgPSBMb2dNZXRhZGF0YSB8ICgoKSA9PiBMb2dNZXRhZGF0YSk7XG5cbi8qKlxuICogQSBsb2dnZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhZGRzIG1ldGFkYXRhIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IGxvZ2dlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhIGltcGxlbWVudHMgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIHtAbGluayBMb2dnZXJ9IHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gICAqXG4gICAqIE5ldyBtZXRhZGF0YSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uIGV2YWx1YXRlZFxuICAgKiBldmVyeSB0aW1lIGEgbG9nIGlzIGVtaXR0ZWQgdGhhdCB3aWxsIHJldHVybiBhIGRlbHRhIG9iamVjdC5cbiAgICpcbiAgICogU29tZSBvcHRpbWl6YXRpb25zIGFyZSBwZXJmb3JtZWQgdG8gYXZvaWQgY3JlYXRpbmcgdW5uZWNlc3Nhcnkgb2JqZWN0cyBhbmQgdG8ga2VlcCBydW50aW1lXG4gICAqIG92ZXJoZWFkIGFzc29jaWF0ZWQgd2l0aCByZXNvbHZpbmcgbWV0YWRhdGEgYXMgbG93IGFzIHBvc3NpYmxlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb21wb3NlKGxvZ2dlcjogTG9nZ2VyLCBtZXRhT3JGdW5jOiBMb2dNZXRhT3JGdW5jKTogTG9nZ2VyIHtcbiAgICAvLyBGbGF0dGVuIHJlY3Vyc2l2ZSBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbnN0YW5jZXNcbiAgICBpZiAobG9nZ2VyIGluc3RhbmNlb2YgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4obG9nZ2VyLmNvbnRyaWJ1dG9ycywgbWV0YU9yRnVuYyk7XG4gICAgICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW4sIHRoZW4gd2UgZG9uJ3QgbmVlZCBhIG5ldyBsb2dnZXJcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLnBhcmVudExvZ2dlciwgY29udHJpYnV0b3JzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih1bmRlZmluZWQsIG1ldGFPckZ1bmMpO1xuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbG9nZ2VyO1xuICAgICAgcmV0dXJuIG5ldyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YShsb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRMb2dnZXI6IExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dG9yczogTG9nTWV0YU9yRnVuY1tdXG4gICkge31cblxuICBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIubG9nKGxldmVsLCBtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLnRyYWNlKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZGVidWcobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmluZm8obWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLndhcm4obWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5lcnJvcihtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNZXRhZGF0YShjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXSwgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiBMb2dNZXRhZGF0YSB7XG4gIGNvbnN0IHJlc29sdmVkID0ge307XG4gIGZvciAoY29uc3QgY29udHJpYnV0b3Igb2YgY29udHJpYnV0b3JzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgdHlwZW9mIGNvbnRyaWJ1dG9yID09PSAnZnVuY3Rpb24nID8gY29udHJpYnV0b3IoKSA6IGNvbnRyaWJ1dG9yKTtcbiAgfVxuICBPYmplY3QuYXNzaWduKHJlc29sdmVkLCBleHRyYU1ldGEpO1xuICByZXR1cm4gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZChyZXNvbHZlZCk7XG59XG5cbi8qKlxuICogQXBwZW5kIGEgbWV0YWRhdGEgY29udHJpYnV0b3IgdG8gdGhlIGNoYWluLCBtZXJnaW5nIGl0IHdpdGggdGhlIGZvcm1lciBsYXN0IGNvbnRyaWJ1dG9yIGlmIGJvdGggYXJlIHBsYWluIG9iamVjdHNcbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9DaGFpbihcbiAgZXhpc3RpbmdDb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXSB8IHVuZGVmaW5lZCxcbiAgbmV3Q29udHJpYnV0b3I6IExvZ01ldGFPckZ1bmNcbik6IExvZ01ldGFPckZ1bmNbXSB8IHVuZGVmaW5lZCB7XG4gIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgYW4gZW1wdHkgb2JqZWN0LCB0aGVuIGl0IHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW5cbiAgaWYgKHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobmV3Q29udHJpYnV0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgfVxuXG4gIC8vIElmIGV4aXN0aW5nIGNoYWluIGlzIGVtcHR5LCB0aGVuIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgdGhlIGNoYWluXG4gIGlmIChleGlzdGluZ0NvbnRyaWJ1dG9ycyA9PSBudWxsIHx8IGV4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbbmV3Q29udHJpYnV0b3JdO1xuICB9XG5cbiAgLy8gSWYgYm90aCBsYXN0IGNvbnRyaWJ1dG9yIGFuZCBuZXcgY29udHJpYnV0b3IgYXJlIHBsYWluIG9iamVjdHMsIG1lcmdlIHRoZW0gdG8gYSBzaW5nbGUgb2JqZWN0LlxuICBjb25zdCBsYXN0ID0gZXhpc3RpbmdDb250cmlidXRvcnNbZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoIC0gMV07XG4gIGlmICh0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlT2JqZWN0cyhsYXN0LCBuZXdDb250cmlidXRvcik7XG4gICAgaWYgKG1lcmdlZCA9PT0gbGFzdCkgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICAgIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMuc2xpY2UoMCwgLTEpLCBtZXJnZWRdO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFwcGVuZCB0aGUgbmV3IGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbi5cbiAgcmV0dXJuIFsuLi5leGlzdGluZ0NvbnRyaWJ1dG9ycywgbmV3Q29udHJpYnV0b3JdO1xufVxuIiwiaW1wb3J0IHsgZmlsdGVyTnVsbEFuZFVuZGVmaW5lZCwgbWVyZ2VPYmplY3RzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbi8qKlxuICogQSBtZXRlciBmb3IgY3JlYXRpbmcgbWV0cmljcyB0byByZWNvcmQgdmFsdWVzIG9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNNZXRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY291bnRlciBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgY291bnRlciBtZXRyaWMuXG4gICAqIEBwYXJhbSB1bml0IFVuaXQgZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY0NvdW50ZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBoaXN0b2dyYW0gbWV0cmljIHRoYXQgc3VwcG9ydHMgcmVjb3JkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuXG4gICAqIEBwYXJhbSB2YWx1ZVR5cGUgVHlwZSBvZiB2YWx1ZSB0byByZWNvcmQuIERlZmF1bHRzIHRvIGBpbnRgLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgaGlzdG9ncmFtIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKi9cbiAgY3JlYXRlSGlzdG9ncmFtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU/OiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZ2F1Z2UgbWV0cmljIHRoYXQgc3VwcG9ydHMgc2V0dGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBnYXVnZSBtZXRyaWMuXG4gICAqIEBwYXJhbSB2YWx1ZVR5cGUgVHlwZSBvZiB2YWx1ZSB0byBzZXQuIERlZmF1bHRzIHRvIGBpbnRgLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgZ2F1Z2UgbWV0cmljLiBPcHRpb25hbC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIGZvciB0aGUgZ2F1Z2UgbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUdhdWdlKG5hbWU6IHN0cmluZywgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSwgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNHYXVnZTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHVwLWRvd24gY291bnRlciBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgc2lnbmVkIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIHVwLWRvd24gY291bnRlciBtZXRyaWMuXG4gICAqIEBwYXJhbSB1bml0IFVuaXQgZm9yIHRoZSB1cC1kb3duIGNvdW50ZXIgbWV0cmljLiBPcHRpb25hbC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIGZvciB0aGUgdXAtZG93biBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVVcERvd25Db3VudGVyPyhuYW1lOiBzdHJpbmcsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljVXBEb3duQ291bnRlcjtcblxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBtZXRlciwgd2l0aCBhZGRpdGlvbmFsIHRhZ3MuIEFsbCBtZXRyaWNzIGNyZWF0ZWQgb2ZmIHRoZSBtZXRlciB3aWxsXG4gICAqIGhhdmUgdGhlIHRhZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIFRhZ3MgdG8gYXBwZW5kLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY01ldGVyO1xufVxuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbGwgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRyaWMuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bml0IG9mIHRoZSBtZXRyaWMsIGlmIGFueS5cbiAgICovXG4gIHVuaXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIG1ldHJpYyAoZS5nLiBgY291bnRlcmAsIGBoaXN0b2dyYW1gLCBgZ2F1Z2VgKS5cbiAgICovXG4gIGtpbmQ6IE1ldHJpY0tpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHZhbHVlIHJlY29yZGVkIGJ5IHRoZSBtZXRyaWMuIEVpdGhlciBgaW50YCBvciBgZmxvYXRgLlxuICAgKi9cbiAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlO1xufVxuXG4vKipcbiAqIFRhZ3MgdG8gYmUgYXR0YWNoZWQgdG8gc29tZSBtZXRyaWNzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWV0cmljVGFncyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuXG4vKipcbiAqIFR5cGUgb2YgbnVtZXJpY2FsIHZhbHVlcyByZWNvcmRlZCBieSBhIG1ldHJpYy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyByZXByZXNlbnRzIHRoZSBfY29uZmlndXJhdGlvbl8gb2YgdGhlIG1ldHJpYzsgaG93ZXZlciwgc2luY2UgSmF2YVNjcmlwdCBkb2Vzbid0XG4gKiBoYXZlIGRpZmZlcmVudCBydW50aW1lIHJlcHJlc2VudGF0aW9uIGZvciBpbnRlZ2VycyBhbmQgZmxvYXRzLCB0aGUgYWN0dWFsIHZhbHVlIHR5cGUgaXMgYWx3YXlzXG4gKiBhIEpTICdudW1iZXInLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IHR5cGUgTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnIHwgJ2Zsb2F0JztcblxuLyoqXG4gKiBUaGUga2luZCBvZiBhIG1ldHJpYy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY0tpbmQgPSAnY291bnRlcicgfCAnaGlzdG9ncmFtJyB8ICdnYXVnZScgfCAndXAtZG93bi1jb3VudGVyJztcblxuLyoqXG4gKiBBIG1ldHJpYyB0aGF0IHN1cHBvcnRzIGFkZGluZyB2YWx1ZXMgYXMgYSBjb3VudGVyLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNDb3VudGVyIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIEFkZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGNvdW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgY291bnRlciwgd2l0aCBhZGRpdGlvbmFsIHRhZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIFRhZ3MgdG8gYXBwZW5kIHRvIGV4aXN0aW5nIHRhZ3MuXG4gICAqL1xuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljQ291bnRlcjtcblxuICBraW5kOiAnY291bnRlcic7XG4gIHZhbHVlVHlwZTogJ2ludCc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyByZWNvcmRpbmcgdmFsdWVzIG9uIGEgaGlzdG9ncmFtLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNIaXN0b2dyYW0gZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogUmVjb3JkIHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgaGlzdG9ncmFtLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gcmVjb3JkLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gVmFsdWUgd2lsbCBiZSBjYXN0ZWQgdG8gdGhlIGdpdmVuXG4gICAqICAgICAgICAgICAgICB7QGxpbmsgdmFsdWVUeXBlfS4gTG9zcyBvZiBwcmVjaXNpb24gbWF5IG9jY3VyIGlmIHRoZSB2YWx1ZSBpcyBub3QgYWxyZWFkeSBvZiB0aGVcbiAgICogICAgICAgICAgICAgIGNvcnJlY3QgdHlwZS5cbiAgICogQHBhcmFtIGV4dHJhVGFncyBFeHRyYSB0YWdzIGlmIGFueS5cbiAgICovXG4gIHJlY29yZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBoaXN0b2dyYW0sIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICBraW5kOiAnaGlzdG9ncmFtJztcbn1cblxuLyoqXG4gKiBBIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNHYXVnZSBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBnYXVnZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNldC5cbiAgICogQHBhcmFtIGV4dHJhVGFncyBFeHRyYSB0YWdzIGlmIGFueS5cbiAgICovXG4gIHNldCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBnYXVnZSwgd2l0aCBhZGRpdGlvbmFsIHRhZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB0YWdzIFRhZ3MgdG8gYXBwZW5kIHRvIGV4aXN0aW5nIHRhZ3MuXG4gICAqL1xuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2U7XG5cbiAga2luZDogJ2dhdWdlJztcbn1cblxuLyoqXG4gKiBBIG1ldHJpYyB0aGF0IHN1cHBvcnRzIGFkZGluZyBzaWduZWQgdmFsdWVzIGFzIGFuIHVwLWRvd24gY291bnRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljVXBEb3duQ291bnRlciBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSB1cC1kb3duIGNvdW50ZXIuIFZhbHVlIG1heSBiZSBuZWdhdGl2ZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGFkZCAoY2FuIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlKS5cbiAgICogQHBhcmFtIGV4dHJhVGFncyBFeHRyYSB0YWdzIGlmIGFueS5cbiAgICovXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhpcyB1cC1kb3duIGNvdW50ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY1VwRG93bkNvdW50ZXI7XG5cbiAga2luZDogJ3VwLWRvd24tY291bnRlcic7XG4gIHZhbHVlVHlwZTogJ2ludCc7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBBIG1ldGVyIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3RoaW5nLlxuICovXG5jbGFzcyBOb29wTWV0cmljTWV0ZXIgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIGNyZWF0ZUNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY0NvdW50ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnY291bnRlcicsXG4gICAgICB2YWx1ZVR5cGU6ICdpbnQnLFxuXG4gICAgICBhZGQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnaGlzdG9ncmFtJyxcbiAgICAgIHZhbHVlVHlwZSxcblxuICAgICAgcmVjb3JkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVHYXVnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNHYXVnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICB1bml0LFxuICAgICAgZGVzY3JpcHRpb24sXG5cbiAgICAgIGtpbmQ6ICdnYXVnZScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHNldChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlVXBEb3duQ291bnRlcihuYW1lOiBzdHJpbmcsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICB1bml0LFxuICAgICAgZGVzY3JpcHRpb24sXG5cbiAgICAgIGtpbmQ6ICd1cC1kb3duLWNvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB3aXRoVGFncyhfZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBub29wTWV0cmljTWV0ZXIgPSBuZXcgTm9vcE1ldHJpY01ldGVyKCk7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IHR5cGUgTWV0cmljVGFnc09yRnVuYyA9IE1ldHJpY1RhZ3MgfCAoKCkgPT4gTWV0cmljVGFncyk7XG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFkZHMgdGFncyBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBtZXRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY01ldGVyIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIHtAbGluayBNZXRyaWNNZXRlcn0gdGhhdCBhZGRzIHRhZ3MgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbWV0ZXIuXG4gICAqXG4gICAqIE5ldyB0YWdzIG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIHN0YXRpY2FsbHkgYXMgYSBkZWx0YSBvYmplY3QsIG9yIGFzIGEgZnVuY3Rpb24gZXZhbHVhdGVkXG4gICAqIGV2ZXJ5IHRpbWUgYSBtZXRyaWMgaXMgcmVjb3JkZWQgdGhhdCB3aWxsIHJldHVybiBhIGRlbHRhIG9iamVjdC5cbiAgICpcbiAgICogU29tZSBvcHRpbWl6YXRpb25zIGFyZSBwZXJmb3JtZWQgdG8gYXZvaWQgY3JlYXRpbmcgdW5uZWNlc3Nhcnkgb2JqZWN0cyBhbmQgdG8ga2VlcCBydW50aW1lXG4gICAqIG92ZXJoZWFkIGFzc29jaWF0ZWQgd2l0aCByZXNvbHZpbmcgdGFncyBhcyBsb3cgYXMgcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRlciBUaGUgcGFyZW50IG1ldGVyIHRvIGRlbGVnYXRlIGNhbGxzIHRvLlxuICAgKiBAcGFyYW0gdGFnc09yRnVuYyBOZXcgdGFncyBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uXG4gICAqICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCBldmVyeSB0aW1lIGEgbWV0cmljIGlzIHJlY29yZGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqIEBwYXJhbSBmb3JjZSBpZiBgdHJ1ZWAsIHRoZW4gYSBgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzYCB3aWxsIGJlIGNyZWF0ZWQgZXZlbiBpZiB0aGVyZVxuICAgKiAgICAgICAgICAgICAgaXMgbm8gdGFncyB0byBhZGQuIFRoaXMgaXMgdXNlZnVsIHRvIGFkZCB0YWdzIHN1cHBvcnQgdG8gYW4gdW5kZXJseWluZyBtZXRlclxuICAgKiAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRhZ3MgZGlyZWN0bHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbXBvc2UobWV0ZXI6IE1ldHJpY01ldGVyLCB0YWdzT3JGdW5jOiBNZXRyaWNUYWdzT3JGdW5jLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogTWV0cmljTWV0ZXIge1xuICAgIGlmIChtZXRlciBpbnN0YW5jZW9mIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncykge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbihtZXRlci5jb250cmlidXRvcnMsIHRhZ3NPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbWV0ZXJcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCAmJiAhZm9yY2UpIHJldHVybiBtZXRlcjtcbiAgICAgIHJldHVybiBuZXcgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzKG1ldGVyLnBhcmVudE1ldGVyLCBjb250cmlidXRvcnMgPz8gW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHVuZGVmaW5lZCwgdGFnc09yRnVuYyk7XG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gbWV0ZXI7XG4gICAgICByZXR1cm4gbmV3IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyhtZXRlciwgY29udHJpYnV0b3JzID8/IFtdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TWV0ZXI6IE1ldHJpY01ldGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIGNyZWF0ZUNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY0NvdW50ZXIge1xuICAgIGNvbnN0IHBhcmVudENvdW50ZXIgPSB0aGlzLnBhcmVudE1ldGVyLmNyZWF0ZUNvdW50ZXIobmFtZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MocGFyZW50Q291bnRlciwgdGhpcy5jb250cmlidXRvcnMpO1xuICB9XG5cbiAgY3JlYXRlSGlzdG9ncmFtKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgY29uc3QgcGFyZW50SGlzdG9ncmFtID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVIaXN0b2dyYW0obmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHBhcmVudEhpc3RvZ3JhbSwgdGhpcy5jb250cmlidXRvcnMpO1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IHBhcmVudEdhdWdlID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVHYXVnZShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyhwYXJlbnRHYXVnZSwgdGhpcy5jb250cmlidXRvcnMpO1xuICB9XG5cbiAgY3JlYXRlVXBEb3duQ291bnRlcihuYW1lOiBzdHJpbmcsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGd1YXJkIG9uY2UgdXAtZG93bi1jb3VudGVyIHN1cHBvcnQgaXMgY29tcGxldGUgb24gYWxsIE1ldHJpY01ldGVyXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIGFuZCBgY3JlYXRlVXBEb3duQ291bnRlcmAgaXMgbm8gbG9uZ2VyIG9wdGlvbmFsIG9uIE1ldHJpY01ldGVyLlxuICAgIGlmICghdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVVcERvd25Db3VudGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVVwRG93bkNvdW50ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBtZXRlcicpO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRDb3VudGVyID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVVcERvd25Db3VudGVyKG5hbWUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY1VwRG93bkNvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHBhcmVudENvdW50ZXIsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlciB7XG4gICAgcmV0dXJuIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncy5jb21wb3NlKHRoaXMsIHRhZ3MpO1xuICB9XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5jbGFzcyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0NvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdjb3VudGVyJztcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlVHlwZSA9ICdpbnQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGFyZW50Q291bnRlcjogTWV0cmljQ291bnRlcixcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50Q291bnRlci5hZGQodmFsdWUsIHJlc29sdmVUYWdzKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpKTtcbiAgfVxuXG4gIHdpdGhUYWdzKGV4dHJhVGFnczogTWV0cmljVGFncyk6IE1ldHJpY0NvdW50ZXIge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0NvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50Q291bnRlciwgY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5uYW1lO1xuICB9XG5cbiAgZ2V0IHVuaXQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLmRlc2NyaXB0aW9uO1xuICB9XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5jbGFzcyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljSGlzdG9ncmFtIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnaGlzdG9ncmFtJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudEhpc3RvZ3JhbTogTWV0cmljSGlzdG9ncmFtLFxuICAgIHByaXZhdGUgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIHJlY29yZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRIaXN0b2dyYW0ucmVjb3JkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0hpc3RvZ3JhbVdpdGhDb21wb3NlZFRhZ3ModGhpcy5wYXJlbnRIaXN0b2dyYW0sIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEhpc3RvZ3JhbS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0udmFsdWVUeXBlO1xuICB9XG5cbiAgZ2V0IHVuaXQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0udW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEhpc3RvZ3JhbS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5jbGFzcyBNZXRyaWNHYXVnZVdpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNHYXVnZSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2dhdWdlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudEdhdWdlOiBNZXRyaWNHYXVnZSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBzZXQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50R2F1Z2Uuc2V0KHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNHYXVnZSB7XG4gICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKTtcbiAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBuZXcgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50R2F1Z2UsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLm5hbWU7XG4gIH1cblxuICBnZXQgdmFsdWVUeXBlKCk6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50R2F1Z2UudW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLmRlc2NyaXB0aW9uO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmNsYXNzIE1ldHJpY1VwRG93bkNvdW50ZXJXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljVXBEb3duQ291bnRlciB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ3VwLWRvd24tY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY1VwRG93bkNvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNVcERvd25Db3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlVGFncyhjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IE1ldHJpY1RhZ3Mge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFUYWdzKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIHRhZ3MgY29udHJpYnV0b3IgdG8gdGhlIGNoYWluLCBtZXJnaW5nIGl0IHdpdGggdGhlIGZvcm1lciBsYXN0IGNvbnRyaWJ1dG9yIGlmIHBvc3NpYmxlLlxuICpcbiAqIElmIGFwcGVuZGluZyB0aGUgbmV3IGNvbnRyaWJ1dG9yIHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW4gb2YgY29udHJpYnV0b3JzLCByZXR1cm5cbiAqIGBleGlzdGluZ0NvbnRyaWJ1dG9yc2A7IGluIHRoYXQgY2FzZSwgdGhlIGNhbGxlciBzaG91bGQgYXZvaWQgY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGlmIHBvc3NpYmxlLlxuICovXG5mdW5jdGlvbiBhcHBlbmRUb0NoYWluKFxuICBleGlzdGluZ0NvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdIHwgdW5kZWZpbmVkLFxuICBuZXdDb250cmlidXRvcjogTWV0cmljVGFnc09yRnVuY1xuKTogTWV0cmljVGFnc09yRnVuY1tdIHwgdW5kZWZpbmVkIHtcbiAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciBpcyBhbiBlbXB0eSBvYmplY3QsIHRoZW4gaXQgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpblxuICBpZiAodHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhuZXdDb250cmlidXRvcikubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICB9XG5cbiAgLy8gSWYgZXhpc3RpbmcgY2hhaW4gaXMgZW1wdHksIHRoZW4gdGhlIG5ldyBjb250cmlidXRvciBpcyB0aGUgY2hhaW5cbiAgaWYgKGV4aXN0aW5nQ29udHJpYnV0b3JzID09IG51bGwgfHwgZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtuZXdDb250cmlidXRvcl07XG4gIH1cblxuICAvLyBJZiBib3RoIGxhc3QgY29udHJpYnV0b3IgYW5kIG5ldyBjb250cmlidXRvciBhcmUgcGxhaW4gb2JqZWN0cywgbWVyZ2UgdGhlbSB0byBhIHNpbmdsZSBvYmplY3QuXG4gIGNvbnN0IGxhc3QgPSBleGlzdGluZ0NvbnRyaWJ1dG9yc1tleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggLSAxXTtcbiAgaWYgKHR5cGVvZiBsYXN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VPYmplY3RzKGxhc3QsIG5ld0NvbnRyaWJ1dG9yKTtcbiAgICBpZiAobWVyZ2VkID09PSBsYXN0KSByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gICAgcmV0dXJuIFsuLi5leGlzdGluZ0NvbnRyaWJ1dG9ycy5zbGljZSgwLCAtMSksIG1lcmdlZCFdO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCBqdXN0IGFwcGVuZCB0aGUgbmV3IGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbi5cbiAgcmV0dXJuIFsuLi5leGlzdGluZ0NvbnRyaWJ1dG9ycywgbmV3Q29udHJpYnV0b3JdO1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBQcmlvcml0eSBjb250YWlucyBtZXRhZGF0YSB0aGF0IGNvbnRyb2xzIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHRhc2sgcHJvY2Vzc2luZyB3aGVuIHRhc2tzIGFyZVxuICogYmFja2xvZ2dlZCBpbiBhIHF1ZXVlLiBJbml0aWFsbHksIFByaW9yaXR5IHdpbGwgYmUgdXNlZCBpbiBhY3Rpdml0eSBhbmQgd29ya2Zsb3cgdGFzayBxdWV1ZXMsXG4gKiB3aGljaCBhcmUgdHlwaWNhbGx5IHdoZXJlIGJhY2tsb2dzIGV4aXN0LlxuICogUHJpb3JpdHkgaXMgKGZvciBub3cpIGF0dGFjaGVkIHRvIHdvcmtmbG93cyBhbmQgYWN0aXZpdGllcy4gQWN0aXZpdGllcyBhbmQgY2hpbGQgd29ya2Zsb3dzXG4gKiBpbmhlcml0IFByaW9yaXR5IGZyb20gdGhlIHdvcmtmbG93IHRoYXQgY3JlYXRlZCB0aGVtLCBidXQgbWF5IG92ZXJyaWRlIGZpZWxkcyB3aGVuIHRoZXkgYXJlXG4gKiBzdGFydGVkIG9yIG1vZGlmaWVkLiBGb3IgZWFjaCBmaWVsZCBvZiBhIFByaW9yaXR5IG9uIGFuIGFjdGl2aXR5L3dvcmtmbG93LCBub3QgcHJlc2VudCBvciBlcXVhbFxuICogdG8gemVyby9lbXB0eSBzdHJpbmcgbWVhbnMgdG8gaW5oZXJpdCB0aGUgdmFsdWUgZnJvbSB0aGUgY2FsbGluZyB3b3JrZmxvdywgb3IgaWYgdGhlcmUgaXMgbm9cbiAqIGNhbGxpbmcgd29ya2Zsb3csIHRoZW4gdXNlIHRoZSBkZWZhdWx0IChkb2N1bWVudGVkIG9uIHRoZSBmaWVsZCkuXG4gKiBUaGUgb3ZlcmFsbCBzZW1hbnRpY3Mgb2YgUHJpb3JpdHkgYXJlOlxuICogMS4gRmlyc3QsIGNvbnNpZGVyIFwicHJpb3JpdHlfa2V5XCI6IGxvd2VyIG51bWJlciBnb2VzIGZpcnN0LlxuICogMi4gVGhlbiwgY29uc2lkZXIgZmFpcm5lc3M6IHRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gKiAgICBwcm9wb3J0aW9uIHRvIGl0cyB3ZWlnaHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpb3JpdHkge1xuICAvKipcbiAgICogUHJpb3JpdHkga2V5IGlzIGEgcG9zaXRpdmUgaW50ZWdlciBmcm9tIDEgdG8gbiwgd2hlcmUgc21hbGxlciBpbnRlZ2Vyc1xuICAgKiBjb3JyZXNwb25kIHRvIGhpZ2hlciBwcmlvcml0aWVzICh0YXNrcyBydW4gc29vbmVyKS4gSW4gZ2VuZXJhbCwgdGFza3MgaW5cbiAgICogYSBxdWV1ZSBzaG91bGQgYmUgcHJvY2Vzc2VkIGluIGNsb3NlIHRvIHByaW9yaXR5IG9yZGVyLCBhbHRob3VnaCBzbWFsbFxuICAgKiBkZXZpYXRpb25zIGFyZSBwb3NzaWJsZS5cbiAgICpcbiAgICogVGhlIG1heGltdW0gcHJpb3JpdHkgdmFsdWUgKG1pbmltdW0gcHJpb3JpdHkpIGlzIGRldGVybWluZWQgYnkgc2VydmVyIGNvbmZpZ3VyYXRpb24sIGFuZFxuICAgKiBkZWZhdWx0cyB0byA1LlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyAobWluK21heCkvMi4gV2l0aCB0aGUgZGVmYXVsdCBtYXggb2YgNSBhbmQgbWluIG9mIDEsIHRoYXQgY29tZXMgb3V0IHRvIDMuXG4gICAqL1xuICBwcmlvcml0eUtleT86IG51bWJlcjtcblxuICAvKipcbiAgICogRmFpcm5lc3NLZXkgaXMgYSBzaG9ydCBzdHJpbmcgdGhhdCdzIHVzZWQgYXMgYSBrZXkgZm9yIGEgZmFpcm5lc3NcbiAgICogYmFsYW5jaW5nIG1lY2hhbmlzbS4gSXQgbWF5IGNvcnJlc3BvbmQgdG8gYSB0ZW5hbnQgaWQsIG9yIHRvIGEgZml4ZWRcbiAgICogc3RyaW5nIGxpa2UgXCJoaWdoXCIgb3IgXCJsb3dcIi4gVGhlIGRlZmF1bHQgaXMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogVGhlIGZhaXJuZXNzIG1lY2hhbmlzbSBhdHRlbXB0cyB0byBkaXNwYXRjaCB0YXNrcyBmb3IgYSBnaXZlbiBrZXkgaW5cbiAgICogcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LiBGb3IgZXhhbXBsZSwgdXNpbmcgYSB0aG91c2FuZCBkaXN0aW5jdCB0ZW5hbnRcbiAgICogaWRzLCBlYWNoIHdpdGggYSB3ZWlnaHQgb2YgMS4wICh0aGUgZGVmYXVsdCkgd2lsbCByZXN1bHQgaW4gZWFjaCB0ZW5hbnRcbiAgICogZ2V0dGluZyBhIHJvdWdobHkgZXF1YWwgc2hhcmUgb2YgdGFzayBkaXNwYXRjaCB0aHJvdWdocHV0LlxuICAgKlxuICAgKiBGYWlybmVzcyBrZXlzIGFyZSBsaW1pdGVkIHRvIDY0IGJ5dGVzLlxuICAgKi9cbiAgZmFpcm5lc3NLZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzV2VpZ2h0IGZvciBhIHRhc2sgY2FuIGNvbWUgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIGZvclxuICAgKiBmbGV4aWJpbGl0eS4gRnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBwcmVjZWRlbmNlOlxuICAgKiAxLiBXZWlnaHRzIGZvciBhIHNtYWxsIHNldCBvZiBrZXlzIGNhbiBiZSBvdmVycmlkZGVuIGluIHRhc2sgcXVldWVcbiAgICogICAgY29uZmlndXJhdGlvbiB3aXRoIGFuIEFQSS5cbiAgICogMi4gSXQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSB3b3JrZmxvdy9hY3Rpdml0eSBpbiB0aGlzIGZpZWxkLlxuICAgKiAzLiBUaGUgZGVmYXVsdCB3ZWlnaHQgb2YgMS4wIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogV2VpZ2h0IHZhbHVlcyBhcmUgY2xhbXBlZCB0byB0aGUgcmFuZ2UgWzAuMDAxLCAxMDAwXS5cbiAgICovXG4gIGZhaXJuZXNzV2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFByaW9yaXR5IGludG8gYSBUUyBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUHJpb3JpdHkocHJpb3JpdHk/OiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQcmlvcml0eSB8IG51bGwpOiBQcmlvcml0eSB7XG4gIHJldHVybiB7XG4gICAgcHJpb3JpdHlLZXk6IHByaW9yaXR5Py5wcmlvcml0eUtleSA/PyB1bmRlZmluZWQsXG4gICAgZmFpcm5lc3NLZXk6IHByaW9yaXR5Py5mYWlybmVzc0tleSA/PyB1bmRlZmluZWQsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5Py5mYWlybmVzc1dlaWdodCA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogVHVybiBhIFRTIFByaW9yaXR5IGludG8gYSBwcm90byBjb21wYXRpYmxlIFByaW9yaXR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlUHJpb3JpdHkocHJpb3JpdHk6IFByaW9yaXR5KTogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkge1xuICBpZiAocHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IHVuZGVmaW5lZCAmJiBwcmlvcml0eS5wcmlvcml0eUtleSAhPT0gbnVsbCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwcmlvcml0eS5wcmlvcml0eUtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cbiAgICBpZiAocHJpb3JpdHkucHJpb3JpdHlLZXkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigncHJpb3JpdHlLZXkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eS5wcmlvcml0eUtleSA/PyAwLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eS5mYWlybmVzc0tleSA/PyAnJyxcbiAgICBmYWlybmVzc1dlaWdodDogcHJpb3JpdHkuZmFpcm5lc3NXZWlnaHQgPz8gMCxcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVggPSAnX190ZW1wb3JhbF8nO1xuZXhwb3J0IGNvbnN0IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19zdGFja190cmFjZSc7XG5leHBvcnQgY29uc3QgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSA9ICdfX2VuaGFuY2VkX3N0YWNrX3RyYWNlJztcblxuLyoqXG4gKiBWYWxpZCBlbnRpdHkgdHlwZXMgdGhhdCBjYW4gYmUgY2hlY2tlZCBmb3IgcmVzZXJ2ZWQgbmFtZSB2aW9sYXRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIFJlc2VydmVkTmFtZUVudGl0eVR5cGUgPSAncXVlcnknIHwgJ3NpZ25hbCcgfCAndXBkYXRlJyB8ICdhY3Rpdml0eScgfCAndGFzayBxdWV1ZScgfCAnc2luaycgfCAnd29ya2Zsb3cnO1xuXG4vKipcbiAqIFdpcmUgaWRlbnRpZmllcnMgdXNlZCBieSBmaXJzdC1wYXJ0eSBTREsgY29udHJpYiBwYWNrYWdlcy4gRWFjaCBlbnRyeSBwYWlyc1xuICogYSBuYW1lIHdpdGggdGhlIGVudGl0eSB0eXBlIGl0J3MgYWxsb3dlZCB0byByZWdpc3RlciBhczsgdGhhdCBwYWlyIGJ5cGFzc2VzXG4gKiB0aGUge0BsaW5rIFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0gY2hlY2sgYXQgcmVnaXN0cmF0aW9uIHRpbWUuIFJlZ2lzdGVyaW5nXG4gKiB0aGUgc2FtZSBuYW1lIGFzIGEgZGlmZmVyZW50IGVudGl0eSB0eXBlIGlzIHN0aWxsIHJlamVjdGVkLlxuICovXG5jb25zdCBJTlRFUk5BTF9IQU5ETEVSX05BTUVfQUxMT1dMSVNUOiBSZWFkb25seU1hcDxzdHJpbmcsIFJlc2VydmVkTmFtZUVudGl0eVR5cGU+ID0gbmV3IE1hcChbXG4gIC8vIEB0ZW1wb3JhbGlvL3dvcmtmbG93LXN0cmVhbXNcbiAgWydfX3RlbXBvcmFsX3dvcmtmbG93X3N0cmVhbV9wdWJsaXNoJywgJ3NpZ25hbCddLFxuICBbJ19fdGVtcG9yYWxfd29ya2Zsb3dfc3RyZWFtX3BvbGwnLCAndXBkYXRlJ10sXG4gIFsnX190ZW1wb3JhbF93b3JrZmxvd19zdHJlYW1fb2Zmc2V0JywgJ3F1ZXJ5J10sXG5dKTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgaWYgdGhlIHByb3ZpZGVkIG5hbWUgY29udGFpbnMgYW55IHJlc2VydmVkIHByZWZpeGVzIG9yIG1hdGNoZXMgYW55IHJlc2VydmVkIG5hbWVzLlxuICogVGhyb3dzIGEgVHlwZUVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHMsIHdpdGggYSBzcGVjaWZpYyBtZXNzYWdlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXNzdWVcbiAqIGlzIHdpdGggYSByZXNlcnZlZCBwcmVmaXggb3IgYW4gZXhhY3QgbWF0Y2ggdG8gYSByZXNlcnZlZCBuYW1lLlxuICpcbiAqIEBwYXJhbSB0eXBlIFRoZSBlbnRpdHkgdHlwZSBiZWluZyBjaGVja2VkXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBjaGVjayBhZ2FpbnN0IHJlc2VydmVkIHByZWZpeGVzL25hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmUmVzZXJ2ZWROYW1lKHR5cGU6IFJlc2VydmVkTmFtZUVudGl0eVR5cGUsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiYgSU5URVJOQUxfSEFORExFUl9OQU1FX0FMTE9XTElTVC5nZXQobmFtZSkgIT09IHR5cGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlICR7dHlwZX0gbmFtZTogJyR7bmFtZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgfVxuXG4gIGlmIChuYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8IG5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlICR7dHlwZX0gbmFtZTogJyR7bmFtZX0nLCB3aGljaCBpcyBhIHJlc2VydmVkIG5hbWVgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb051bWJlciwgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9Ucywgb3B0aW9uYWxUc1RvTXMgfSBmcm9tICcuL3RpbWUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJldHJ5aW5nIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIENvZWZmaWNpZW50IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuZXh0IHJldHJ5IGludGVydmFsLlxuICAgKiBUaGUgbmV4dCByZXRyeSBpbnRlcnZhbCBpcyBwcmV2aW91cyBpbnRlcnZhbCBtdWx0aXBsaWVkIGJ5IHRoaXMgY29lZmZpY2llbnQuXG4gICAqIEBtaW5pbXVtIDFcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgYmFja29mZkNvZWZmaWNpZW50PzogbnVtYmVyO1xuICAvKipcbiAgICogSW50ZXJ2YWwgb2YgdGhlIGZpcnN0IHJldHJ5LlxuICAgKiBJZiBjb2VmZmljaWVudCBpcyAxIHRoZW4gaXQgaXMgdXNlZCBmb3IgYWxsIHJldHJpZXNcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqIEBkZWZhdWx0IDEgc2Vjb25kXG4gICAqL1xuICBpbml0aWFsSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzLiBXaGVuIGV4Y2VlZGVkLCByZXRyaWVzIHN0b3AgKGV2ZW4gaWYge0BsaW5rIEFjdGl2aXR5T3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fVxuICAgKiBoYXNuJ3QgYmVlbiByZWFjaGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgSW5maW5pdHlcbiAgICovXG4gIG1heGltdW1BdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZXRyaWVzLlxuICAgKiBFeHBvbmVudGlhbCBiYWNrb2ZmIGxlYWRzIHRvIGludGVydmFsIGluY3JlYXNlLlxuICAgKiBUaGlzIHZhbHVlIGlzIHRoZSBjYXAgb2YgdGhlIGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDB4IG9mIHtAbGluayBpbml0aWFsSW50ZXJ2YWx9XG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgbWF4aW11bUludGVydmFsPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXBwbGljYXRpb24gZmFpbHVyZXMgdHlwZXMgdG8gbm90IHJldHJ5LlxuICAgKi9cbiAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBSZXRyeVBvbGljeSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVJldHJ5UG9saWN5KHJldHJ5UG9saWN5OiBSZXRyeVBvbGljeSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVJldHJ5UG9saWN5IHtcbiAgaWYgKHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCAhPSBudWxsICYmIHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gIH1cbiAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyAhPSBudWxsKSB7XG4gICAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAvLyBkcm9wIGZpZWxkIChJbmZpbml0eSBpcyB0aGUgZGVmYXVsdClcbiAgICAgIGNvbnN0IHsgbWF4aW11bUF0dGVtcHRzOiBfLCAuLi53aXRob3V0IH0gPSByZXRyeVBvbGljeTtcbiAgICAgIHJldHJ5UG9saWN5ID0gd2l0aG91dDtcbiAgICB9IGVsc2UgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfSBlbHNlIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXhpbXVtSW50ZXJ2YWwgPSBtc09wdGlvbmFsVG9OdW1iZXIocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKTtcbiAgY29uc3QgaW5pdGlhbEludGVydmFsID0gbXNUb051bWJlcihyZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgPz8gMTAwMCk7XG4gIGlmIChtYXhpbXVtSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKGluaXRpYWxJbnRlcnZhbCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgY2Fubm90IGJlIDAnKTtcbiAgfVxuICBpZiAobWF4aW11bUludGVydmFsICE9IG51bGwgJiYgbWF4aW11bUludGVydmFsIDwgaW5pdGlhbEludGVydmFsKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0cyBpbml0aWFsSW50ZXJ2YWwnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heGltdW1BdHRlbXB0czogcmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzLFxuICAgIGluaXRpYWxJbnRlcnZhbDogbXNUb1RzKGluaXRpYWxJbnRlcnZhbCksXG4gICAgbWF4aW11bUludGVydmFsOiBtc09wdGlvbmFsVG9UcyhtYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50LFxuICAgIG5vblJldHJ5YWJsZUVycm9yVHlwZXM6IHJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXMsXG4gIH07XG59XG5cbi8qKlxuICogVHVybiBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3kgaW50byBhIFRTIFJldHJ5UG9saWN5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXBpbGVSZXRyeVBvbGljeShcbiAgcmV0cnlQb2xpY3k/OiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB8IG51bGxcbik6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXRyeVBvbGljeSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50ID8/IHVuZGVmaW5lZCxcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUludGVydmFsOiBvcHRpb25hbFRzVG9NcyhyZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGluaXRpYWxJbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsKSxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzID8/IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZU9yUmVhZG9ubHkgPSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSB8IFJlYWRvbmx5PFNlYXJjaEF0dHJpYnV0ZVZhbHVlPiB8IHVuZGVmaW5lZDtcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZXMgPSBSZWNvcmQ8c3RyaW5nLCBTZWFyY2hBdHRyaWJ1dGVWYWx1ZU9yUmVhZG9ubHk+O1xuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVmFsdWUgPSBzdHJpbmdbXSB8IG51bWJlcltdIHwgYm9vbGVhbltdIHwgRGF0ZVtdO1xuXG5leHBvcnQgY29uc3QgU2VhcmNoQXR0cmlidXRlVHlwZSA9IHtcbiAgVEVYVDogJ1RFWFQnLFxuICBLRVlXT1JEOiAnS0VZV09SRCcsXG4gIElOVDogJ0lOVCcsXG4gIERPVUJMRTogJ0RPVUJMRScsXG4gIEJPT0w6ICdCT09MJyxcbiAgREFURVRJTUU6ICdEQVRFVElNRScsXG4gIEtFWVdPUkRfTElTVDogJ0tFWVdPUkRfTElTVCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVHlwZSA9ICh0eXBlb2YgU2VhcmNoQXR0cmlidXRlVHlwZSlba2V5b2YgdHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGVdO1xuXG4vLyBOb3RlOiBlbmNvZGVTZWFyY2hBdHRyaWJ1dGVJbmRleGVkVmFsdWVUeXBlIGV4cG9ydGVkIGZvciB1c2UgaW4gdGVzdHMgdG8gcmVnaXN0ZXIgc2VhcmNoIGF0dHJpYnV0ZXNcbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVNlYXJjaEF0dHJpYnV0ZUluZGV4ZWRWYWx1ZVR5cGUsIF9dID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAgdHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGUsXG4gICdJTkRFWEVEX1ZBTFVFX1RZUEVfJ1xuPihcbiAge1xuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFRdOiAxLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRdOiAyLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLklOVF06IDMsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuRE9VQkxFXTogNCxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5CT09MXTogNSxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRV06IDYsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUXTogNyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ0lOREVYRURfVkFMVUVfVFlQRV8nXG4pO1xuXG5pbnRlcmZhY2UgSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmcge1xuICBURVhUOiBzdHJpbmc7XG4gIEtFWVdPUkQ6IHN0cmluZztcbiAgSU5UOiBudW1iZXI7XG4gIERPVUJMRTogbnVtYmVyO1xuICBCT09MOiBib29sZWFuO1xuICBEQVRFVElNRTogRGF0ZTtcbiAgS0VZV09SRF9MSVNUOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRWYWx1ZUZvclR5cGU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KFxuICB0eXBlOiBULFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuVEVYVDpcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQ6XG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRTpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5CT09MOlxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5EQVRFVElNRTpcbiAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVDpcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoQXR0cmlidXRlS2V5PFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogVDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4obmFtZTogc3RyaW5nLCB0eXBlOiBUKTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+IHtcbiAgcmV0dXJuIHsgbmFtZSwgdHlwZSB9O1xufVxuXG5jbGFzcyBCYXNlU2VhcmNoQXR0cmlidXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGUsIFYgPSBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF90eXBlOiBUO1xuICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZTogVjtcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBULCB2YWx1ZTogVikge1xuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgdHlwZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBWIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbn1cblxuLy8gSW50ZXJuYWwgdHlwZSBmb3IgY2xhc3MgcHJpdmF0ZSBkYXRhLlxuLy8gRXhwb3J0ZWQgZm9yIHVzZSBpbiBwYXlsb2FkIGNvbnZlcnNpb24uXG5leHBvcnQgY2xhc3MgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4gZXh0ZW5kcyBCYXNlU2VhcmNoQXR0cmlidXRlVmFsdWU8VD4ge31cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY2xhc3MgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4gZXh0ZW5kcyBCYXNlU2VhcmNoQXR0cmlidXRlVmFsdWU8XG4gIFQsXG4gIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHwgbnVsbFxuPiB7fVxuXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVQYWlyID0ge1xuICBbVCBpbiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTogeyBrZXk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPjsgdmFsdWU6IEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIH07XG59W1NlYXJjaEF0dHJpYnV0ZVR5cGVdO1xuXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyID0ge1xuICBbVCBpbiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTogeyBrZXk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPjsgdmFsdWU6IEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHwgbnVsbCB9O1xufVtTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gIHByaXZhdGUgc2VhcmNoQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSkge1xuICAgIGlmIChpbml0aWFsQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBwYWlyIG9mIGluaXRpYWxBdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAocGFpci5rZXkubmFtZSBpbiB0aGlzLnNlYXJjaEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc2VhcmNoIGF0dHJpYnV0ZSBrZXk6ICR7cGFpci5rZXkubmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKHBhaXIua2V5LnR5cGUsIHBhaXIudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldDxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4oa2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD4pOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuc2VhcmNoQXR0cmlidXRlc1trZXkubmFtZV07XG4gICAgLy8gS2V5IG5vdCBmb3VuZCBvciB0eXBlIG1pc21hdGNoLlxuICAgIGlmIChhdHRyID09PSB1bmRlZmluZWQgfHwgIWlzVmFsaWRWYWx1ZUZvclR5cGUoa2V5LnR5cGUsIGF0dHIudmFsdWUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYXR0ci52YWx1ZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSBnaXZlbiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgaW5zdGFuY2UgKi9cbiAgY29weSgpOiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICAgIGNvbnN0IHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlPFNlYXJjaEF0dHJpYnV0ZVR5cGU+PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBhdHRyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzXG4gICAgICBsZXQgdmFsdWUgPSBhdHRyLnZhbHVlO1xuICAgICAgLy8gRm9yIG5vbi1wcmltaXRpdmUgdHlwZXMsIGNyZWF0ZSBhIGRlZXAgY29weVxuICAgICAgaWYgKGF0dHIudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUoYXR0ci52YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBbLi4uYXR0ci52YWx1ZV07XG4gICAgICB9XG4gICAgICBzdGF0ZVtrZXldID0gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUoYXR0ci50eXBlLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJldHVybiB2YWx1ZSB3aXRoIG1hbnVhbGx5IGFzc2lnbmVkIHN0YXRlLlxuICAgIGNvbnN0IHJlcyA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoKTtcbiAgICByZXMuc2VhcmNoQXR0cmlidXRlcyA9IHN0YXRlO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGhpZGRlblxuICAgKiBSZXR1cm4gSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGFzIFNlYXJjaEF0dHJpYnV0ZVBhaXJbXVxuICAgKiBEZWZhdWx0IHRvSlNPTiBtZXRob2QgaXMgbm90IHVzZWQgYmVjYXVzZSBpdCdzIEpTT04gcmVwcmVzZW50YXRpb24gaW5jbHVkZXMgcHJpdmF0ZSBzdGF0ZS5cbiAgICovXG4gIHRvSlNPTigpOiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbCgpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IFR5cGVkU2VhcmNoQXR0cmlidXRlcyBpbnN0YW5jZSB3aXRoIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZXMuICovXG4gIHVwZGF0ZUNvcHkodXBkYXRlczogU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgICAvLyBDcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UuXG4gICAgY29uc3QgcmVzID0gdGhpcy5jb3B5KCk7XG4gICAgLy8gQXBwbHkgdXBkYXRlcy5cbiAgICByZXMudXBkYXRlKHVwZGF0ZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBQZXJmb3JtcyBkaXJlY3QgbXV0YXRpb24gb24gdGhlIGN1cnJlbnQgaW5zdGFuY2UuXG4gIHByaXZhdGUgdXBkYXRlKHVwZGF0ZXM6IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSkge1xuICAgIC8vIEFwcGx5IHVwZGF0ZXMuXG4gICAgZm9yIChjb25zdCBwYWlyIG9mIHVwZGF0ZXMpIHtcbiAgICAgIC8vIERlbGV0ZSBhdHRyaWJ1dGUuXG4gICAgICBpZiAocGFpci52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBEZWxldGUgb25seSBpZiB0aGUgdXBkYXRlIG1hdGNoZXMgYSBrZXkgYW5kIHR5cGUuXG4gICAgICAgIGNvbnN0IGF0dHJWYWwgPSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV07XG4gICAgICAgIGlmIChhdHRyVmFsICYmIGF0dHJWYWwudHlwZSA9PT0gcGFpci5rZXkudHlwZSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBZGQgb3IgdXBkYXRlIGF0dHJpYnV0ZS5cbiAgICAgIHRoaXMuc2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKHBhaXIua2V5LnR5cGUsIHBhaXIudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbCgpOiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10ge1xuICAgIGNvbnN0IHJlczogU2VhcmNoQXR0cmlidXRlUGFpcltdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCBhdHRyXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyS2V5ID0geyBuYW1lOiBrZXksIHR5cGU6IGF0dHIudHlwZSB9O1xuICAgICAgLy8gU2FuaXR5IGNoZWNrLCBzaG91bGQgYWx3YXlzIGJlIGxlZ2FsLlxuICAgICAgaWYgKGlzVmFsaWRWYWx1ZUZvclR5cGUoYXR0cktleS50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgICByZXMucHVzaCh7IGtleTogYXR0cktleSwgdmFsdWU6IGF0dHIudmFsdWUgfSBhcyBTZWFyY2hBdHRyaWJ1dGVQYWlyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXRLZXlGcm9tVW50eXBlZChcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogU2VhcmNoQXR0cmlidXRlVmFsdWVPclJlYWRvbmx5XG4gICk6IFNlYXJjaEF0dHJpYnV0ZUtleTxTZWFyY2hBdHRyaWJ1dGVUeXBlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVbnBhY2sgc2luZ2xlLWVsZW1lbnQgYXJyYXlzLlxuICAgIGNvbnN0IHZhbCA9IHZhbHVlLmxlbmd0aCA9PT0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAvLyBDaGVjayBpZiB2YWwgaXMgYW4gSVNPIHN0cmluZywgaWYgc28sIHJldHVybiBhIERBVEVUSU1FIGtleS5cbiAgICAgICAgaWYgKCFpc05hTihEYXRlLnBhcnNlKHZhbCkpICYmIERhdGUucGFyc2UodmFsKSA9PT0gbmV3IERhdGUodmFsKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuVEVYVCB9O1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgdHlwZTogTnVtYmVyLmlzSW50ZWdlcih2YWwpID8gU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQgOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTCB9O1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIHJldHVybiB7IG5hbWU6IGtleSwgdHlwZTogU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1QgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRvTWV0YWRhdGFUeXBlKHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgICAgIHJldHVybiAnVGV4dCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDpcbiAgICAgICAgcmV0dXJuICdLZXl3b3JkJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQ6XG4gICAgICAgIHJldHVybiAnSW50JztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICAgIHJldHVybiAnRG91YmxlJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5CT09MOlxuICAgICAgICByZXR1cm4gJ0Jvb2wnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FOlxuICAgICAgICByZXR1cm4gJ0RhdGV0aW1lJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICAgIHJldHVybiAnS2V5d29yZExpc3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNlYXJjaCBhdHRyaWJ1dGUgdHlwZTogJHt0eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b1NlYXJjaEF0dHJpYnV0ZVR5cGUodHlwZTogc3RyaW5nKTogU2VhcmNoQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhlIHR5cGUgbWV0YWRhdGEgaXMgdXN1YWxseSBpbiBQYXNjYWxDYXNlIChlLmcuIFwiS2V5d29yZExpc3RcIikgYnV0IGluXG4gICAgLy8gcmFyZSBjYXNlcyBtYXkgYmUgaW4gU0NSRUFNSU5HX1NOQUtFX0NBU0UgKGUuZy4gXCJJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRF9MSVNUXCIpLlxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnVGV4dCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfVEVYVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ7XG4gICAgICBjYXNlICdLZXl3b3JkJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDtcbiAgICAgIGNhc2UgJ0ludCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfSU5UJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UO1xuICAgICAgY2FzZSAnRG91YmxlJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9ET1VCTEUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU7XG4gICAgICBjYXNlICdCb29sJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9CT09MJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDtcbiAgICAgIGNhc2UgJ0RhdGV0aW1lJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9EQVRFVElNRSc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FO1xuICAgICAgY2FzZSAnS2V5d29yZExpc3QnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBMb25nIGZyb20gJ2xvbmcnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgdHlwZSB7IGdvb2dsZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIE5PVEU6IHRoZXNlIGFyZSB0aGUgc2FtZSBpbnRlcmZhY2UgaW4gSlNcbi8vIGdvb2dsZS5wcm90b2J1Zi5JRHVyYXRpb247XG4vLyBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcbi8vIFRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBiZWxvdyBzaG91bGQgd29yayBmb3IgYm90aFxuXG5leHBvcnQgdHlwZSBUaW1lc3RhbXAgPSBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcblxuLyoqXG4gKiBBIGR1cmF0aW9uLCBleHByZXNzZWQgZWl0aGVyIGFzIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgb3IgYXMgYSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb24gPSBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdy5cbiAqIElmIHRzIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aHJvd3MgYSBUeXBlRXJyb3IsIHdpdGggZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAke2ZpZWxkTmFtZX0gdG8gYmUgYSB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRpbWVzdGFtcCwgZ290ICR7dHN9YCk7XG4gIH1cbiAgY29uc3QgeyBzZWNvbmRzLCBuYW5vcyB9ID0gdHM7XG4gIHJldHVybiAoc2Vjb25kcyB8fCBMb25nLlVaRVJPKVxuICAgIC5tdWwoMTAwMClcbiAgICAuYWRkKE1hdGguZmxvb3IoKG5hbm9zIHx8IDApIC8gMTAwMDAwMCkpXG4gICAgLnRvTnVtYmVyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTtcbiAgY29uc3QgbmFub3MgPSAobWlsbGlzICUgMTAwMCkgKiAxMDAwMDAwO1xuICBpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpIHx8IE51bWJlci5pc05hTihuYW5vcykpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBtaWxsaXMgJHttaWxsaXN9YCk7XG4gIH1cbiAgcmV0dXJuIHsgc2Vjb25kczogTG9uZy5mcm9tTnVtYmVyKHNlY29uZHMpLCBuYW5vcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gbXNOdW1iZXJUb1RzKG1zVG9OdW1iZXIoc3RyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9UcyhzdHI6IER1cmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHIgPyBtc1RvVHMoc3RyKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbXNUb051bWJlcih2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb051bWJlcih2YWw6IER1cmF0aW9uKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gbXNXaXRoVmFsaWRhdGlvbih2YWwpO1xufVxuXG5mdW5jdGlvbiBtc1dpdGhWYWxpZGF0aW9uKHN0cjogU3RyaW5nVmFsdWUpOiBudW1iZXIge1xuICBjb25zdCBtaWxsaXMgPSBtcyhzdHIpO1xuICBpZiAobWlsbGlzID09IG51bGwgfHwgaXNOYU4obWlsbGlzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZHVyYXRpb24gc3RyaW5nOiAnJHtzdHJ9J2ApO1xuICB9XG4gIHJldHVybiBtaWxsaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0c1RvRGF0ZSh0czogVGltZXN0YW1wKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUocmVxdWlyZWRUc1RvTXModHMsIGZpZWxkTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKHRzVG9Ncyh0cykpO1xufVxuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIHNjaGVkdWxlLWhlbHBlcnMudHMpXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxEYXRlVG9UcyhkYXRlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1zVG9UcyhkYXRlLmdldFRpbWUoKSk7XG59XG4iLCJleHBvcnQgdHlwZSBOb25OdWxsYWJsZU9iamVjdDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0tPzogTm9uTnVsbGFibGU8VFtQXT4gfTtcblxuLyoqIFNob3J0aGFuZCBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgQW55RnVuYyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4vKiogQSB0dXBsZSB3aXRob3V0IGl0cyBsYXN0IGVsZW1lbnQgKi9cbmV4cG9ydCB0eXBlIE9taXRMYXN0PFQ+ID0gVCBleHRlbmRzIFsuLi5pbmZlciBSRVNULCBhbnldID8gUkVTVCA6IG5ldmVyO1xuXG4vKiogRiB3aXRoIGFsbCBhcmd1bWVudHMgYnV0IHRoZSBsYXN0ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdFBhcmFtPEYgZXh0ZW5kcyBBbnlGdW5jPiA9ICguLi5hcmdzOiBPbWl0TGFzdDxQYXJhbWV0ZXJzPEY+PikgPT4gUmV0dXJuVHlwZTxGPjtcblxuZXhwb3J0IHR5cGUgT21pdEZpcnN0PFQ+ID0gVCBleHRlbmRzIFthbnksIC4uLmluZmVyIFJFU1RdID8gUkVTVCA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPbWl0Rmlyc3RQYXJhbTxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueVxuICA/ICguLi5hcmdzOiBPbWl0Rmlyc3Q8UGFyYW1ldGVyczxUPj4pID0+IFJldHVyblR5cGU8VD5cbiAgOiBuZXZlcjtcblxuLyoqIFJlcXVpcmUgdGhhdCBUIGhhcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZGVmaW5lZCAqL1xuZXhwb3J0IHR5cGUgUmVxdWlyZUF0TGVhc3RPbmU8VCwgS2V5cyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IFBpY2s8VCwgRXhjbHVkZTxrZXlvZiBULCBLZXlzPj4gJlxuICB7XG4gICAgW0sgaW4gS2V5c10tPzogUmVxdWlyZWQ8UGljazxULCBLPj4gJiBQYXJ0aWFsPFBpY2s8VCwgRXhjbHVkZTxLZXlzLCBLPj4+O1xuICB9W0tleXNdO1xuXG4vKiogVmVyaWZ5IHRoYXQgYW4gdHlwZSBfQ29weSBleHRlbmRzIF9PcmlnICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFeHRlbmRzPF9PcmlnLCBfQ29weSBleHRlbmRzIF9PcmlnPigpOiB2b2lkIHtcbiAgLy8gbm9vcCwganVzdCB0eXBlIGNoZWNrXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxhY2U8QmFzZSwgTmV3PiA9IE9taXQ8QmFzZSwga2V5b2YgTmV3PiAmIE5ldztcblxuLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG4vLyBNSVQgb3IgQ0MwLTEuMCDigJQgSXQgaXMgbWVhbnQgdG8gYmUgY29waWVkIGludG8geW91ciBjb2RlYmFzZSByYXRoZXIgdGhhbiBiZWluZyB1c2VkIGFzIGEgZGVwZW5kZW5jeS5cbmV4cG9ydCB0eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VW5pb24+ID1cbiAgLy8gYGV4dGVuZHMgdW5rbm93bmAgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZSBjYXNlIGFuZCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGBVbmlvbmAgaW50byBhXG4gIC8vIFtkaXN0cmlidXRpdmUgY29uZGl0aW9uYWwgdHlwZV0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svcmVsZWFzZS1ub3Rlcy90eXBlc2NyaXB0LTItOC5odG1sI2Rpc3RyaWJ1dGl2ZS1jb25kaXRpb25hbC10eXBlcykuXG4gIChcbiAgICBVbmlvbiBleHRlbmRzIHVua25vd25cbiAgICAgID8gLy8gVGhlIHVuaW9uIHR5cGUgaXMgdXNlZCBhcyB0aGUgb25seSBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIHNpbmNlIHRoZSB1bmlvblxuICAgICAgICAvLyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaXMgYW4gaW50ZXJzZWN0aW9uLlxuICAgICAgICAoZGlzdHJpYnV0ZWRVbmlvbjogVW5pb24pID0+IHZvaWRcbiAgICAgIDogLy8gVGhpcyB3b24ndCBoYXBwZW4uXG4gICAgICAgIG5ldmVyXG4gICkgZXh0ZW5kcyAvLyBJbmZlciB0aGUgYEludGVyc2VjdGlvbmAgdHlwZSBzaW5jZSBUeXBlU2NyaXB0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWxcbiAgLy8gYXJndW1lbnRzIG9mIHVuaW9ucyBvZiBmdW5jdGlvbnMgYXMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSB1bmlvbi5cbiAgKG1lcmdlZEludGVyc2VjdGlvbjogaW5mZXIgSW50ZXJzZWN0aW9uKSA9PiB2b2lkXG4gICAgPyAvLyBUaGUgYCYgVW5pb25gIGlzIHRvIGFsbG93IGluZGV4aW5nIGJ5IHRoZSByZXN1bHRpbmcgdHlwZVxuICAgICAgSW50ZXJzZWN0aW9uICYgVW5pb25cbiAgICA6IG5ldmVyO1xuXG50eXBlIElzRXF1YWw8QSwgQj4gPSAoPEc+KCkgPT4gRyBleHRlbmRzIEEgPyAxIDogMikgZXh0ZW5kcyA8Rz4oKSA9PiBHIGV4dGVuZHMgQiA/IDEgOiAyID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFByaW1pdGl2ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3ltYm9sIHwgYmlnaW50O1xuXG50eXBlIElzTnVsbDxUPiA9IFtUXSBleHRlbmRzIFtudWxsXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Vua25vd248VD4gPSB1bmtub3duIGV4dGVuZHMgVCAvLyBgVGAgY2FuIGJlIGB1bmtub3duYCBvciBgYW55YFxuICA/IElzTnVsbDxUPiBleHRlbmRzIGZhbHNlIC8vIGBhbnlgIGNhbiBiZSBgbnVsbGAsIGJ1dCBgdW5rbm93bmAgY2FuJ3QgYmVcbiAgICA/IHRydWVcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0VmFsdWU8VCwgSz4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICA/IFRbS11cbiAgOiBUb1N0cmluZzxLPiBleHRlbmRzIGtleW9mIFRcbiAgICA/IFRbVG9TdHJpbmc8Sz5dXG4gICAgOiBLIGV4dGVuZHMgYCR7aW5mZXIgTnVtYmVySyBleHRlbmRzIG51bWJlcn1gXG4gICAgICA/IE51bWJlcksgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICAgID8gVFtOdW1iZXJLXVxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IG5ldmVyO1xuXG50eXBlIFRvU3RyaW5nPFQ+ID0gVCBleHRlbmRzIHN0cmluZyB8IG51bWJlciA/IGAke1R9YCA6IG5ldmVyO1xuXG50eXBlIEtleXNPZlVuaW9uPE9iamVjdFR5cGU+ID0gT2JqZWN0VHlwZSBleHRlbmRzIHVua25vd24gPyBrZXlvZiBPYmplY3RUeXBlIDogbmV2ZXI7XG5cbnR5cGUgQXJyYXlFbGVtZW50PFQ+ID0gVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA/IFRbMF0gOiBuZXZlcjtcblxudHlwZSBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+ID0ge1xuICBbS2V5IGluIGtleW9mIFBhcmFtZXRlclR5cGVdOiBFeGFjdDxQYXJhbWV0ZXJUeXBlW0tleV0sIE9iamVjdFZhbHVlPElucHV0VHlwZSwgS2V5Pj47XG59ICYgUmVjb3JkPEV4Y2x1ZGU8a2V5b2YgSW5wdXRUeXBlLCBLZXlzT2ZVbmlvbjxQYXJhbWV0ZXJUeXBlPj4sIG5ldmVyPjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9XG4gIC8vIEJlZm9yZSBkaXN0cmlidXRpbmcsIGNoZWNrIGlmIHRoZSB0d28gdHlwZXMgYXJlIGVxdWFsIGFuZCBpZiBzbywgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbW1lZGlhdGVseVxuICBJc0VxdWFsPFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGEgcHJpbWl0aXZlLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gICAgICA/IFBhcmFtZXRlclR5cGVcbiAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhbiB1bmtub3duLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICAgIElzVW5rbm93bjxQYXJhbWV0ZXJUeXBlPiBleHRlbmRzIHRydWVcbiAgICAgICAgPyB1bmtub3duXG4gICAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIEZ1bmN0aW9uLCByZXR1cm4gaXQgYXMgaXMgYmVjYXVzZSB0aGlzIHR5cGUgaXMgbm90IGNhcGFibGUgb2YgaGFuZGxpbmcgZnVuY3Rpb24sIGxlYXZlIGl0IHRvIFR5cGVTY3JpcHRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gICAgICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICAgICAgOiAvLyBDb252ZXJ0IHVuaW9uIG9mIGFycmF5IHRvIGFycmF5IG9mIHVuaW9uOiBBW10gJiBCW10gPT4gKEEgJiBCKVtdXG4gICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgdW5rbm93bltdXG4gICAgICAgICAgICA/IEFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgOiAvLyBJbiBUeXBlU2NyaXB0LCBBcnJheSBpcyBhIHN1YnR5cGUgb2YgUmVhZG9ubHlBcnJheSwgc28gYWx3YXlzIHRlc3QgQXJyYXkgYmVmb3JlIFJlYWRvbmx5QXJyYXkuXG4gICAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW11cbiAgICAgICAgICAgICAgPyBSZWFkb25seUFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgICA6IEV4YWN0T2JqZWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT47XG4vLyBFbmQgb2YgYm9ycm93IGZyb20gIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2UvdW5pb24tdG8taW50ZXJzZWN0aW9uLmQudHNcblxuZXhwb3J0IHR5cGUgUmVtb3ZlUHJlZml4PFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5cyBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEtleXNdOiBrIGV4dGVuZHMgYCR7UHJlZml4fSR7aW5mZXIgU3VmZml4fWAgPyBTdWZmaXggOiBuZXZlcjtcbn1bS2V5c107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eTxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcDogWVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcCBpbiByZWNvcmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0aWVzPFggZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcmVjb3JkOiBYLFxuICBwcm9wczogWVtdXG4pOiByZWNvcmQgaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9wcy5ldmVyeSgocHJvcCkgPT4gcHJvcCBpbiByZWNvcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBpc1JlY29yZChlcnJvcikgJiZcbiAgICB0eXBlb2YgZXJyb3IubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAoZXJyb3Iuc3RhY2sgPT0gbnVsbCB8fCB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09ICdzdHJpbmcnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBYm9ydEVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3IgJiB7IG5hbWU6ICdBYm9ydEVycm9yJyB9IHtcbiAgcmV0dXJuIGlzRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLm1lc3NhZ2VgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIEVycm9yV2l0aENvZGUge1xuICBjb2RlOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JXaXRoQ29kZShlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yV2l0aENvZGUge1xuICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLmNvZGVgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBzb21lIHR5cGUgaXMgdGhlIG5ldmVyIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKG1zZzogc3RyaW5nLCB4OiBuZXZlcik6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2cgKyAnOiAnICsgeCk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzPEUgZXh0ZW5kcyBFcnJvcj4gPSB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59O1xuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHRvIGJlIHVzZWQgb24gZXJyb3IgY2xhc3Nlcy4gSXQgYWRkcyB0aGUgJ25hbWUnIHByb3BlcnR5IEFORCBwcm92aWRlcyBhIGN1c3RvbVxuICogJ2luc3RhbmNlb2YnIGhhbmRsZXIgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcjxFIGV4dGVuZHMgRXJyb3I+KG1hcmtlck5hbWU6IHN0cmluZyk6IChjbGF6ejogQ2xhc3M8RT4pID0+IHZvaWQge1xuICByZXR1cm4gKGNsYXp6OiBDbGFzczxFPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fdGVtcG9yYWxfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCAnbmFtZScsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgbWFya2VyLCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9iamVjdC1zaG9ydGhhbmRcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCBlcnJvcjogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICAgIHJldHVybiBpc1JlY29yZChlcnJvcikgJiYgKGVycm9yIGFzIGFueSlbbWFya2VyXSA9PT0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgICAvLyBmcm9tIGNsYXp6J3MgW1N5bWJvbC5oYXNJbnN0YW5jZV0uIElmIHdlIGRvbid0IGhhbmRsZSB0aGlzIHBhcnRpY3VsYXIgc2l0dWF0aW9uLCB0aGVuXG4gICAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWRlYWxseSwgaXQnZCBiZSBwcmVmZXJhYmxlIHRvIGF2b2lkIHRoaXMgY2FzZSBlbnRpcmVseSwgYnkgbWFraW5nIHN1cmUgdGhhdCBhbGwgc3ViY2xhc3NlcyBvZiAnY2xhenonXG4gICAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlcnJvcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgY29udmVydE9wdGlvbmFsVG9QYXlsb2FkIH0gZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemF0aW9uQ29udGV4dCB9IGZyb20gJy4vY29udmVydGVyL3NlcmlhbGl6YXRpb24tY29udGV4dCc7XG5cbi8qKlxuICogVXNlciBtZXRhZGF0YSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byB3b3JrZmxvdyBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyTWV0YWRhdGEge1xuICAvKiogQGV4cGVyaW1lbnRhbCBBIGZpeGVkLCBzaW5nbGUgbGluZSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kJ3MgcHVycG9zZSAqL1xuICBzdGF0aWNTdW1tYXJ5Pzogc3RyaW5nO1xuICAvKiogQGV4cGVyaW1lbnRhbCBGaXhlZCBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQgZm9yIGxvbmdlci10ZXh0IGRlc2NyaXB0aW9uLCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAqL1xuICBzdGF0aWNEZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlck1ldGFkYXRhVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBzdGF0aWNTdW1tYXJ5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0YXRpY0RldGFpbHM6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udGV4dD86IFNlcmlhbGl6YXRpb25Db250ZXh0XG4pOiB0ZW1wb3JhbC5hcGkuc2RrLnYxLklVc2VyTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICBpZiAoc3RhdGljU3VtbWFyeSA9PSBudWxsICYmIHN0YXRpY0RldGFpbHMgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzdW1tYXJ5ID0gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKHBheWxvYWRDb252ZXJ0ZXIsIHN0YXRpY1N1bW1hcnksIGNvbnRleHQpO1xuICBjb25zdCBkZXRhaWxzID0gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKHBheWxvYWRDb252ZXJ0ZXIsIHN0YXRpY0RldGFpbHMsIGNvbnRleHQpO1xuXG4gIGlmIChzdW1tYXJ5ID09IG51bGwgJiYgZGV0YWlscyA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IHN1bW1hcnksIGRldGFpbHMgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgVmVyc2lvbmluZ0ludGVudCBhcyBWZXJzaW9uaW5nSW50ZW50U3RyaW5nIH0gZnJvbSAnLi92ZXJzaW9uaW5nLWludGVudCc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciwgY2hlY2tFeHRlbmRzIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuXG4vLyBBdm9pZCBpbXBvcnRpbmcgdGhlIHByb3RvIGltcGxlbWVudGF0aW9uIHRvIHJlZHVjZSB3b3JrZmxvdyBidW5kbGUgc2l6ZVxuLy8gQ29waWVkIGZyb20gY29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudFxuLyoqXG4gKiBQcm90b2J1ZiBlbnVtIHJlcHJlc2VudGF0aW9uIG9mIHtAbGluayBWZXJzaW9uaW5nSW50ZW50U3RyaW5nfS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvbmluZ0ludGVudCB7XG4gIFVOU1BFQ0lGSUVEID0gMCxcbiAgQ09NUEFUSUJMRSA9IDEsXG4gIERFRkFVTFQgPSAyLFxufVxuXG5jaGVja0V4dGVuZHM8Y29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudCwgVmVyc2lvbmluZ0ludGVudD4oKTtcbmNoZWNrRXh0ZW5kczxWZXJzaW9uaW5nSW50ZW50LCBjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50PigpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbmluZ0ludGVudFRvUHJvdG8oaW50ZW50OiBWZXJzaW9uaW5nSW50ZW50U3RyaW5nIHwgdW5kZWZpbmVkKTogVmVyc2lvbmluZ0ludGVudCB7XG4gIHN3aXRjaCAoaW50ZW50KSB7XG4gICAgY2FzZSAnREVGQVVMVCc6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5ERUZBVUxUO1xuICAgIGNhc2UgJ0NPTVBBVElCTEUnOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuQ09NUEFUSUJMRTtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LlVOU1BFQ0lGSUVEO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcignVW5leHBlY3RlZCBWZXJzaW9uaW5nSW50ZW50JywgaW50ZW50KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpbnRlbmRzIGNlcnRhaW4gY29tbWFuZHMgdG8gYmUgcnVuIG9uIGEgY29tcGF0aWJsZSB3b3JrZXIgQnVpbGQgSWQgdmVyc2lvbiBvciBub3QuXG4gKlxuICogYENPTVBBVElCTEVgIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHNob3VsZCBydW4gb24gYSB3b3JrZXIgd2l0aCBjb21wYXRpYmxlIHZlcnNpb24gaWYgcG9zc2libGUuIEl0IG1heSBub3QgYmVcbiAqIHBvc3NpYmxlIGlmIHRoZSB0YXJnZXQgdGFzayBxdWV1ZSBkb2VzIG5vdCBhbHNvIGhhdmUga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IHdvcmtlcidzIEJ1aWxkIElkLlxuICpcbiAqIGBERUZBVUxUYCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcnVuIG9uIHRoZSB0YXJnZXQgdGFzayBxdWV1ZSdzIGN1cnJlbnQgb3ZlcmFsbC1kZWZhdWx0IEJ1aWxkIElkLlxuICpcbiAqIFdoZXJlIHRoaXMgdHlwZSBpcyBhY2NlcHRlZCBvcHRpb25hbGx5LCBhbiB1bnNldCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgU0RLIHNob3VsZCBjaG9vc2UgdGhlIG1vc3Qgc2Vuc2libGUgZGVmYXVsdFxuICogYmVoYXZpb3IgZm9yIHRoZSB0eXBlIG9mIGNvbW1hbmQsIGFjY291bnRpbmcgZm9yIHdoZXRoZXIgdGhlIGNvbW1hbmQgd2lsbCBiZSBydW4gb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyB0aGVcbiAqIGN1cnJlbnQgd29ya2VyLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3Igc3RhcnRpbmcgV29ya2Zsb3dzIGlzIGBERUZBVUxUYC4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIFdvcmtmbG93cyBzdGFydGluZ1xuICogQWN0aXZpdGllcywgc3RhcnRpbmcgQ2hpbGQgV29ya2Zsb3dzLCBvciBDb250aW51aW5nIEFzIE5ldyBpcyBgQ09NUEFUSUJMRWAuXG4gKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdJbnRlbnQgPSAnQ09NUEFUSUJMRScgfCAnREVGQVVMVCc7XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGssIHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG9mIGEgc3BlY2lmaWMgd29ya2VyIGRlcGxveW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyRGVwbG95bWVudFZlcnNpb24ge1xuICByZWFkb25seSBidWlsZElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlcGxveW1lbnROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHJldHVybnMgVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBvZiBhIGRlcGxveW1lbnQgdmVyc2lvbiwgd2hpY2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdFxuICogYGRlcGxveW1lbnROYW1lLmJ1aWxkSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW5vbmljYWxTdHJpbmcodmVyc2lvbjogV29ya2VyRGVwbG95bWVudFZlcnNpb24pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7dmVyc2lvbi5kZXBsb3ltZW50TmFtZX0uJHt2ZXJzaW9uLmJ1aWxkSWR9YDtcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hlbiBhIHdvcmtmbG93IG1pZ2h0IG1vdmUgZnJvbSBhIHdvcmtlciBvZiBvbmUgQnVpbGQgSWQgdG8gYW5vdGhlci5cbiAqXG4gKiAqICdQSU5ORUQnIC0gVGhlIHdvcmtmbG93IHdpbGwgYmUgcGlubmVkIHRvIHRoZSBjdXJyZW50IEJ1aWxkIElEIHVubGVzcyBtYW51YWxseSBtb3ZlZC5cbiAqICogJ0FVVE9fVVBHUkFERScgLSBUaGUgd29ya2Zsb3cgd2lsbCBhdXRvbWF0aWNhbGx5IG1vdmUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIChkZWZhdWx0IEJ1aWxkIElEXG4gKiAgICBvZiB0aGUgdGFzayBxdWV1ZSkgd2hlbiB0aGUgbmV4dCB0YXNrIGlzIGRpc3BhdGNoZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBWZXJzaW9uaW5nQmVoYXZpb3IgPSB7XG4gIFBJTk5FRDogJ1BJTk5FRCcsXG4gIEFVVE9fVVBHUkFERTogJ0FVVE9fVVBHUkFERScsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVmVyc2lvbmluZ0JlaGF2aW9yID0gKHR5cGVvZiBWZXJzaW9uaW5nQmVoYXZpb3IpW2tleW9mIHR5cGVvZiBWZXJzaW9uaW5nQmVoYXZpb3JdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZVZlcnNpb25pbmdCZWhhdmlvciwgZGVjb2RlVmVyc2lvbmluZ0JlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gICdWRVJTSU9OSU5HX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBbVmVyc2lvbmluZ0JlaGF2aW9yLlBJTk5FRF06IDEsXG4gICAgW1ZlcnNpb25pbmdCZWhhdmlvci5BVVRPX1VQR1JBREVdOiAyLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnVkVSU0lPTklOR19CRUhBVklPUl8nXG4pO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdmVyc2lvbmluZyBvdmVycmlkZXMuIEZvciBleGFtcGxlLCB3aGVuIHN0YXJ0aW5nIHdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IHR5cGUgVmVyc2lvbmluZ092ZXJyaWRlID0gUGlubmVkVmVyc2lvbmluZ092ZXJyaWRlIHwgJ0FVVE9fVVBHUkFERSc7XG5cbi8qKlxuICogV29ya2Zsb3cgd2lsbCBiZSBwaW5uZWQgdG8gYSBzcGVjaWZpYyBkZXBsb3ltZW50IHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlubmVkVmVyc2lvbmluZ092ZXJyaWRlIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JrZXIgZGVwbG95bWVudCB2ZXJzaW9uIHRvIHBpbiB0aGUgd29ya2Zsb3cgdG8uXG4gICAqL1xuICBwaW5uZWRUbzogV29ya2VyRGVwbG95bWVudFZlcnNpb247XG59XG5cbi8qKlxuICogVGhlIHdvcmtmbG93IHdpbGwgYXV0by11cGdyYWRlIHRvIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdmVyc2lvbiBvbiB0aGUgbmV4dCB3b3JrZmxvdyB0YXNrLlxuICovXG5leHBvcnQgdHlwZSBBdXRvVXBncmFkZVZlcnNpb25pbmdPdmVycmlkZSA9ICdBVVRPX1VQR1JBREUnO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIHZlcnNpb25pbmcgYmVoYXZpb3IgdG8gYmUgdXNlZCBieSB0aGUgZmlyc3QgdGFzayBvZiBhIG5ldyB3b3JrZmxvdyBydW4gaW4gYSBjb250aW51ZS1hcy1uZXcgY2hhaW4uXG4gKlxuICogQVVUT19VUEdSQURFIC0gU3RhcnQgdGhlIG5ldyBydW4gd2l0aCBBdXRvVXBncmFkZSBiZWhhdmlvci4gVXNlIHRoZSBUYXJnZXQgVmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cncyB0YXNrIHF1ZXVlIGF0XG4gKiAgIHN0YXJ0LXRpbWUsIGFzIEF1dG9VcGdyYWRlIHdvcmtmbG93cyBkby4gQWZ0ZXIgdGhlIGZpcnN0IHdvcmtmbG93IHRhc2sgY29tcGxldGVzLCB1c2Ugd2hhdGV2ZXJcbiAqICAgVmVyc2lvbmluZyBCZWhhdmlvciB0aGUgd29ya2Zsb3cgaXMgYW5ub3RhdGVkIHdpdGggaW4gdGhlIHdvcmtmbG93IGNvZGUuXG4gKlxuICogICBOb3RlIHRoYXQgaWYgdGhlIHByZXZpb3VzIHdvcmtmbG93IGhhZCBhIFBpbm5lZCBvdmVycmlkZSwgdGhhdCBvdmVycmlkZSB3aWxsIGJlIGluaGVyaXRlZCBieSB0aGVcbiAqICAgbmV3IHdvcmtmbG93IHJ1biByZWdhcmRsZXNzIG9mIHRoZSBDb250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yIHNwZWNpZmllZCBpbiB0aGUgY29udGludWUtYXMtbmV3XG4gKiAgIGNvbW1hbmQuIElmIGEgUGlubmVkIG92ZXJyaWRlIGlzIGluaGVyaXRlZCBieSB0aGUgbmV3IHJ1biwgYW5kIHRoZSBuZXcgcnVuIHN0YXJ0cyB3aXRoIEF1dG9VcGdyYWRlXG4gKiAgIGJlaGF2aW9yLCB0aGUgYmFzZSB2ZXJzaW9uIG9mIHRoZSBuZXcgcnVuIHdpbGwgYmUgdGhlIFRhcmdldCBWZXJzaW9uIGFzIGRlc2NyaWJlZCBhYm92ZSwgYnV0IHRoZVxuICogICBlZmZlY3RpdmUgdmVyc2lvbiB3aWxsIGJlIHdoYXRldmVyIGlzIHNwZWNpZmllZCBieSB0aGUgVmVyc2lvbmluZyBPdmVycmlkZSB1bnRpbCB0aGUgb3ZlcnJpZGUgaXMgcmVtb3ZlZC5cbiAqXG4gKiBVU0VfUkFNUElOR19WRVJTSU9OIC0gVXNlIHRoZSBSYW1waW5nIFZlcnNpb24gb2YgdGhlIHdvcmtmbG93J3MgdGFzayBxdWV1ZSBhdCBzdGFydCB0aW1lLCByZWdhcmRsZXNzIG9mIHRoZSB3b3JrZmxvdydzXG4gKiAgIFRhcmdldCBWZXJzaW9uIChhY2NvcmRpbmcgdG8gZih3b3JrZmxvd19pZCwgcmFtcF9wZXJjZW50YWdlKSkuIEFmdGVyIHRoZSBmaXJzdCB3b3JrZmxvdyB0YXNrIGNvbXBsZXRlcyxcbiAqICAgdGhlIHdvcmtmbG93IHdpbGwgdXNlIHdoYXRldmVyIFZlcnNpb25pbmcgQmVoYXZpb3IgaXQgaXMgYW5ub3RhdGVkIHdpdGguIElmIHRoZXJlIGlzIG5vIFJhbXBpbmdcbiAqICAgVmVyc2lvbiBieSB0aGUgdGltZSB0aGF0IHRoZSBmaXJzdCB3b3JrZmxvdyB0YXNrIGlzIGRpc3BhdGNoZWQsIGl0IHdpbGwgYmUgc2VudCB0byB0aGUgQ3VycmVudCBWZXJzaW9uLlxuICpcbiAqICAgSXQgaXMgaGlnaGx5IGRpc2NvdXJhZ2VkIHRvIHVzZSB0aGlzIGlmIHRoZSB3b3JrZmxvdyBpcyBhbm5vdGF0ZWQgd2l0aCBBdXRvVXBncmFkZSBiZWhhdmlvciwgYmVjYXVzZVxuICogICB0aGlzIHNldHRpbmcgT05MWSBhcHBsaWVzIHRvIHRoZSBmaXJzdCB0YXNrIG9mIHRoZSB3b3JrZmxvdy4gSWYsIGFmdGVyIHRoZSBmaXJzdCB0YXNrLCB0aGUgd29ya2Zsb3dcbiAqICAgaXMgQXV0b1VwZ3JhZGUsIGl0IHdpbGwgYmVoYXZlIGxpa2UgYSBub3JtYWwgQXV0b1VwZ3JhZGUgd29ya2Zsb3cgYW5kIGdvIHRvIHRoZSBUYXJnZXQgVmVyc2lvbiwgd2hpY2hcbiAqICAgbWF5IGJlIHRoZSBDdXJyZW50IFZlcnNpb24gaW5zdGVhZCBvZiB0aGUgUmFtcGluZyBWZXJzaW9uLlxuICpcbiAqICAgTm90ZSB0aGF0IGlmIHRoZSB3b3JrZmxvdyBiZWluZyBjb250aW51ZWQgaGFzIGEgUGlubmVkIG92ZXJyaWRlLCB0aGF0IG92ZXJyaWRlIHdpbGwgYmUgaW5oZXJpdGVkIGJ5IHRoZVxuICogICBuZXcgd29ya2Zsb3cgcnVuIHJlZ2FyZGxlc3Mgb2YgdGhlIENvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3Igc3BlY2lmaWVkIGluIHRoZSBjb250aW51ZS1hcy1uZXdcbiAqICAgY29tbWFuZC4gVmVyc2lvbmluZyBPdmVycmlkZSBhbHdheXMgdGFrZXMgcHJlY2VkZW5jZSB1bnRpbCBpdCdzIHJlbW92ZWQgbWFudWFsbHkgdmlhIFVwZGF0ZVdvcmtmbG93RXhlY3V0aW9uT3B0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFZlcnNpb25pbmcgc2VtYW50aWNzIHdpdGggY29udGludWUtYXMtbmV3IGFyZSBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IgPSB7XG4gIEFVVE9fVVBHUkFERTogJ0FVVE9fVVBHUkFERScsXG4gIFVTRV9SQU1QSU5HX1ZFUlNJT046ICdVU0VfUkFNUElOR19WRVJTSU9OJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yID0gKHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yKVtrZXlvZiB0eXBlb2YgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcl07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvciwgZGVjb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICB0eXBlb2YgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcixcbiAgJ0NPTlRJTlVFX0FTX05FV19WRVJTSU9OSU5HX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBbSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvci5BVVRPX1VQR1JBREVdOiAxLFxuICAgIFtJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLlVTRV9SQU1QSU5HX1ZFUlNJT05dOiAyLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnQ09OVElOVUVfQVNfTkVXX1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuKTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREZXBsb3ltZW50VmVyc2lvbihcbiAgdjogY29yZXNkay5jb21tb24uSVdvcmtlckRlcGxveW1lbnRWZXJzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogV29ya2VyRGVwbG95bWVudFZlcnNpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIXYgfHwgIXYuYnVpbGRJZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJ1aWxkSWQ6IHYuYnVpbGRJZCxcbiAgICBkZXBsb3ltZW50TmFtZTogdi5kZXBsb3ltZW50TmFtZSA/PyAnJyxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgVmVyc2lvbmluZ0JlaGF2aW9yIH0gZnJvbSAnLi93b3JrZXItZGVwbG95bWVudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGRlZmluaW5nIGEgd29ya2Zsb3cgdmlhIHtAbGluayBzZXRXb3JrZmxvd09wdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMge1xuICB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlcyBvZiBlcnJvcnMgdGhhdCwgaWYgdGhyb3duIGJ5IHRoZSBXb3JrZmxvdyBmdW5jdGlvbiwgYSBzaWduYWwgaGFuZGxlciwgb3IgYW4gdXBkYXRlXG4gICAqIGhhbmRsZXIsIHdpbGwgY2F1c2UgdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiBvciB0aGUgVXBkYXRlIHRvIGZhaWwgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZVxuICAgKiBXb3JrZmxvdyBUYXNrICh3aGljaCB3b3VsZCByZXN1bHQgaW4gcmV0cnlpbmcgdGhlIFdvcmtmbG93IFRhc2sgdW50aWwgaXQgZXZlbnR1YWxseSBzdWNjZWVkcykuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBwZXItV29ya2Zsb3ctdHlwZSBlcXVpdmFsZW50IG9mIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9LlxuICAgKiBCb3RoIHNldHRpbmdzIGFyZSBldmFsdWF0ZWQ7IGFuIGVycm9yIG1hdGNoaW5nIGVpdGhlciB3aWxsIGNhdXNlIFdvcmtmbG93IGZhaWx1cmUuXG4gICAqIFVubGlrZSB0aGUgc3RyaW5nLWJhc2VkIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9LCB0aGlzIGFjY2VwdHNcbiAgICogYWN0dWFsIGNsYXNzIHJlZmVyZW5jZXMsIGVuYWJsaW5nIHN1YmNsYXNzIG1hdGNoaW5nIHZpYSBgaW5zdGFuY2VvZmAsIGJ1dCBkb2Vzbid0IGFsbG93XG4gICAqIGZhaWxpbmcgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBvbiBfbm9uLWRldGVybWluaXNtIGVycm9yc18uIEZhaWxpbmcgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBvblxuICAgKiBub24tZGV0ZXJtaW5pc20gZXJyb3JzIGNhbiBvbmx5IGJlIHNldCB2aWEge0BsaW5rIFdvcmtlck9wdGlvbnMud29ya2Zsb3dGYWlsdXJlRXJyb3JUeXBlc30uXG4gICAqXG4gICAqIFBhc3NpbmcgdGhlIGBFcnJvcmAgY2xhc3MgdG8gdGhpcyBzZXR0aW5nIHdpbGwgZmFpbCB0aGUgV29ya2Zsb3cgb24gYW55IGVycm9yLCBleGNlcHRcbiAgICogbm9uLWRldGVybWluaXNtIGVycm9ycy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHtAbGluayBUZW1wb3JhbEZhaWx1cmV9IHN1YmNsYXNzZXMgYW5kIGNhbmNlbGxhdGlvbiBlcnJvcnMgdGhhdCBidWJibGVzIG91dFxuICAgKiBvZiB0aGUgV29ya2Zsb3cgYWx3YXlzIGZhaWwgdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiwgcmVnYXJkbGVzcyBvZiBlaXRoZXIgdGhpcyBhbmQgdGhlXG4gICAqIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBmYWlsdXJlRXhjZXB0aW9uVHlwZXM/OiBBcnJheTxuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBFcnJvcj47XG59XG5cbnR5cGUgQXN5bmNGdW5jdGlvbjxBcmdzIGV4dGVuZHMgYW55W10sIFJldHVyblR5cGU+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8UmV0dXJuVHlwZT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zT3JHZXR0ZXIgPSBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zIHwgKCgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMpO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICogQSB3b3JrZmxvdyBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuIGRlZmluZWQgd2l0aCBvcHRpb25zIGZyb20ge0BsaW5rIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9uczxBcmdzIGV4dGVuZHMgYW55W10sIFJldHVyblR5cGU+IGV4dGVuZHMgQXN5bmNGdW5jdGlvbjxBcmdzLCBSZXR1cm5UeXBlPiB7XG4gIHdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM6IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcjtcbn1cbiIsImltcG9ydCB0eXBlIHsgV29ya2Zsb3csIFdvcmtmbG93UmVzdWx0VHlwZSwgU2lnbmFsRGVmaW5pdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogQmFzZSBXb3JrZmxvd0hhbmRsZSBpbnRlcmZhY2UsIGV4dGVuZGVkIGluIHdvcmtmbG93IGFuZCBjbGllbnQgbGlicy5cbiAqXG4gKiBUcmFuc2Zvcm1zIGEgd29ya2Zsb3cgaW50ZXJmYWNlIGBUYCBpbnRvIGEgY2xpZW50IGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dIYW5kbGU8VCBleHRlbmRzIFdvcmtmbG93PiB7XG4gIC8qKlxuICAgKiBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBXb3JrZmxvdyBleGVjdXRpb24gY29tcGxldGVzXG4gICAqL1xuICByZXN1bHQoKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4gIC8qKlxuICAgKiBTaWduYWwgYSBydW5uaW5nIFdvcmtmbG93LlxuICAgKlxuICAgKiBAcGFyYW0gZGVmIGEgc2lnbmFsIGRlZmluaXRpb24gYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lU2lnbmFsfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBhd2FpdCBoYW5kbGUuc2lnbmFsKGluY3JlbWVudFNpZ25hbCwgMyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgICBkZWY6IFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT4gfCBzdHJpbmcsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2Zsb3dJZCBvZiB0aGUgY3VycmVudCBXb3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3cgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeVBvbGljeSB9IGZyb20gJy4vcmV0cnktcG9saWN5JztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB0eXBlIHsgU2VhcmNoQXR0cmlidXRlUGFpciwgU2VhcmNoQXR0cmlidXRlcywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIH0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgdHlwZSB7IFByaW9yaXR5IH0gZnJvbSAnLi9wcmlvcml0eSc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyB9IGZyb20gJy4vd29ya2Zsb3ctZGVmaW5pdGlvbi1vcHRpb25zJztcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiBTZWUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGZvciB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYVxuICogV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAqXG4gKiBDb25jZXB0OiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtmbG93LWV4ZWN1dGlvbi93b3JrZmxvd2lkLXJ1bmlkI3dvcmtmbG93LWlkLXJldXNlLXBvbGljeSB8IFdvcmtmbG93IElkIFJldXNlIFBvbGljeX1cbiAqXG4gKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRSZXVzZVBvbGljeSA9IHtcbiAgLyoqXG4gICAqIFRoZSBXb3JrZmxvdyBjYW4gYmUgc3RhcnRlZCBpZiB0aGUgcHJldmlvdXMgV29ya2Zsb3cgaXMgaW4gYSBDbG9zZWQgc3RhdGUuXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBBTExPV19EVVBMSUNBVEU6ICdBTExPV19EVVBMSUNBVEUnLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlIHRoYXQgaXMgbm90IENvbXBsZXRlZC5cbiAgICovXG4gIEFMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWTogJ0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWScsXG5cbiAgLyoqXG4gICAqIFRoZSBXb3JrZmxvdyBjYW5ub3QgYmUgc3RhcnRlZC5cbiAgICovXG4gIFJFSkVDVF9EVVBMSUNBVEU6ICdSRUpFQ1RfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGVybWluYXRlIHRoZSBjdXJyZW50IFdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmc7IG90aGVyd2lzZSBhbGxvdyByZXVzaW5nIHRoZSBXb3JrZmxvdyBJRC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLCBhbmRcbiAgICogICAgICAgICAgICAgc2V0IGBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5YCB0b1xuICAgKiAgICAgICAgICAgICB7QGxpbmsgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LldPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV9URVJNSU5BVEVfRVhJU1RJTkd9LlxuICAgKiAgICAgICAgICAgICBXaGVuIHVzaW5nIHRoaXMgb3B0aW9uLCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgbXVzdCBiZSBsZWZ0IHVuc3BlY2lmaWVkLlxuICAgKi9cbiAgVEVSTUlOQVRFX0lGX1JVTk5JTkc6ICdURVJNSU5BVEVfSUZfUlVOTklORycsXG5cbiAgLy8vIEFueXRoaW5nIGJlbG93IHRoaXMgbGluZSBoYXMgYmVlbiBkZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIE5vIG5lZWQgdG8gdXNlIHRoaXMuIElmIGEgYFdvcmtmbG93SWRSZXVzZVBvbGljeWAgaXMgc2V0IHRvIHRoaXMsIG9yIGlzIG5vdCBzZXQgYXQgYWxsLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEVpdGhlciBsZWF2ZSBwcm9wZXJ0eSBgdW5kZWZpbmVkYCwgb3IgdXNlIHtAbGluayBBTExPV19EVVBMSUNBVEV9IGluc3RlYWQuXG4gICAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEU6ICdBTExPV19EVVBMSUNBVEUnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEFMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWX0gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWTogJ0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVKRUNUX0RVUExJQ0FURX0gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1JFSkVDVF9EVVBMSUNBVEU6ICdSRUpFQ1RfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBURVJNSU5BVEVfSUZfUlVOTklOR30gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1RFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRSZXVzZVBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZFJldXNlUG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZFJldXNlUG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICAnV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LkFMTE9XX0RVUExJQ0FURV06IDEsXG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFldOiAyLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuUkVKRUNUX0RVUExJQ0FURV06IDMsXG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5URVJNSU5BVEVfSUZfUlVOTklOR106IDQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4pO1xuXG4vKipcbiAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAqXG4gKiBTZWUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkUmV1c2VQb2xpY3l9IGZvciB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvd1xuICogd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICpcbiAqICpOb3RlOiBJdCBpcyBuZXZlciBwb3NzaWJsZSB0byBoYXZlIHR3byBfYWN0aXZlbHkgcnVubmluZ18gV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5ID0ge1xuICAvKipcbiAgICogRG8gbm90IHN0YXJ0IGEgbmV3IFdvcmtmbG93LiBJbnN0ZWFkIHJhaXNlIGEgYFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcmAuXG4gICAqL1xuICBGQUlMOiAnRkFJTCcsXG5cbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByZXR1cm4gYSBXb3JrZmxvdyBIYW5kbGUgZm9yIHRoZSBhbHJlYWR5IFJ1bm5pbmcgV29ya2Zsb3cuXG4gICAqL1xuICBVU0VfRVhJU1RJTkc6ICdVU0VfRVhJU1RJTkcnLFxuXG4gIC8qKlxuICAgKiBTdGFydCBhIG5ldyBXb3JrZmxvdywgdGVybWluYXRpbmcgdGhlIGN1cnJlbnQgd29ya2Zsb3cgaWYgb25lIGlzIGFscmVhZHkgcnVubmluZy5cbiAgICovXG4gIFRFUk1JTkFURV9FWElTVElORzogJ1RFUk1JTkFURV9FWElTVElORycsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5ID0gKHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kpW2tleW9mIHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ldO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeSwgZGVjb2RlV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuRkFJTF06IDEsXG4gICAgW1dvcmtmbG93SWRDb25mbGljdFBvbGljeS5VU0VfRVhJU1RJTkddOiAyLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVEVSTUlOQVRFX0VYSVNUSU5HXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1dPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV8nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VXb3JrZmxvd09wdGlvbnMge1xuICAvKipcbiAgICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRSZXVzZVBvbGljeS5XT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFXG4gICAqL1xuICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k/OiBXb3JrZmxvd0lkUmV1c2VQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAgICpcbiAgICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAgICpcbiAgICogQGRlZmF1bHQgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LldPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV9VTlNQRUNJRklFRFxuICAgKi9cbiAgd29ya2Zsb3dJZENvbmZsaWN0UG9saWN5PzogV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgYSBXb3JrZmxvdyBFeGVjdXRpb24gaXMgcmV0cmllZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgV29ya2Zsb3cgRXhlY3V0aW9ucyBhcmUgbm90IHJldHJpZWQuIERvIG5vdCBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9lbmN5Y2xvcGVkaWEvcmV0cnktcG9saWNpZXMgfCBNb3JlIGluZm9ybWF0aW9ufS5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNyb24gc2NoZWR1bGUgZm9yIFdvcmtmbG93LiBJZiBhIGNyb24gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgV29ya2Zsb3cgd2lsbCBydW4gYXMgYSBjcm9uIGJhc2VkIG9uIHRoZVxuICAgKiBzY2hlZHVsZS4gVGhlIHNjaGVkdWxpbmcgd2lsbCBiZSBiYXNlZCBvbiBVVEMgdGltZS4gVGhlIHNjaGVkdWxlIGZvciB0aGUgbmV4dCBydW4gb25seSBoYXBwZW5zIGFmdGVyIHRoZSBjdXJyZW50XG4gICAqIHJ1biBpcyBjb21wbGV0ZWQvZmFpbGVkL3RpbWVvdXQuIElmIGEgUmV0cnlQb2xpY3kgaXMgYWxzbyBzdXBwbGllZCwgYW5kIHRoZSBXb3JrZmxvdyBmYWlsZWQgb3IgdGltZWQgb3V0LCB0aGVcbiAgICogV29ya2Zsb3cgd2lsbCBiZSByZXRyaWVkIGJhc2VkIG9uIHRoZSByZXRyeSBwb2xpY3kuIFdoaWxlIHRoZSBXb3JrZmxvdyBpcyByZXRyeWluZywgaXQgd29uJ3Qgc2NoZWR1bGUgaXRzIG5leHQgcnVuLlxuICAgKiBJZiB0aGUgbmV4dCBzY2hlZHVsZSBpcyBkdWUgd2hpbGUgdGhlIFdvcmtmbG93IGlzIHJ1bm5pbmcgKG9yIHJldHJ5aW5nKSwgdGhlbiBpdCB3aWxsIHNraXAgdGhhdCBzY2hlZHVsZS4gQ3JvblxuICAgKiBXb3JrZmxvdyB3aWxsIG5vdCBzdG9wIHVudGlsIGl0IGlzIHRlcm1pbmF0ZWQgb3IgY2FuY2VsbGVkIChieSByZXR1cm5pbmcgdGVtcG9yYWwuQ2FuY2VsZWRFcnJvcikuXG4gICAqIGh0dHBzOi8vY3JvbnRhYi5ndXJ1LyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgeW91ciBjcm9uIGV4cHJlc3Npb25zLlxuICAgKi9cbiAgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBub24taW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gVGhlIHZhbHVlcyBjYW4gYmUgYW55dGhpbmcgdGhhdFxuICAgKiBpcyBzZXJpYWxpemFibGUgYnkge0BsaW5rIERhdGFDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBpbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBNb3JlIGluZm86XG4gICAqIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kb2NzL3R5cGVzY3JpcHQvc2VhcmNoLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogVmFsdWVzIGFyZSBhbHdheXMgY29udmVydGVkIHVzaW5nIHtAbGluayBKc29uUGF5bG9hZENvbnZlcnRlcn0sIGV2ZW4gd2hlbiBhIGN1c3RvbSBkYXRhIGNvbnZlcnRlciBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqIE5vdGUgdGhhdCBzZWFyY2ggYXR0cmlidXRlcyBhcmUgbm90IGVuY29kZWQsIGFzIHN1Y2gsIGRvIG5vdCBpbmNsdWRlIGFueSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIElmIGJvdGgge0BsaW5rIHNlYXJjaEF0dHJpYnV0ZXN9IGFuZCB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBhcmUgcHJvdmlkZWQsIGNvbmZsaWN0aW5nIGtleXMgd2lsbCBiZSBvdmVyd3JpdHRlblxuICAgKiBieSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfS5cbiAgICovXG4gIHR5cGVkU2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSB8IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogR2VuZXJhbCBmaXhlZCBkZXRhaWxzIGZvciB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbiB0aGF0IG1heSBhcHBlYXIgaW4gVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQgYW5kIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICBzdGF0aWNEZXRhaWxzPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBzaW5nbGUtbGluZSBmaXhlZCBzdW1tYXJ5IGZvciB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbiB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIFVJL0NMSS5cbiAgICogVGhpcyBjYW4gYmUgaW4gc2luZ2xlLWxpbmUgVGVtcG9yYWwgbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVzZXIgbWV0YWRhdGEgaXMgYSBuZXcgQVBJIGFuZCBzdXNjZXB0aWJsZSB0byBjaGFuZ2UuXG4gICAqL1xuICBzdGF0aWNTdW1tYXJ5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmlvcml0eSBvZiBhIHdvcmtmbG93XG4gICAqL1xuICBwcmlvcml0eT86IFByaW9yaXR5O1xufVxuXG5leHBvcnQgdHlwZSBXaXRoV29ya2Zsb3dBcmdzPFcgZXh0ZW5kcyBXb3JrZmxvdywgVD4gPSBUICZcbiAgKFBhcmFtZXRlcnM8Vz4gZXh0ZW5kcyBbYW55LCAuLi5hbnlbXV1cbiAgICA/IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBXb3JrZmxvd1xuICAgICAgICAgKi9cbiAgICAgICAgYXJnczogUGFyYW1ldGVyczxXPiB8IFJlYWRvbmx5PFBhcmFtZXRlcnM8Vz4+O1xuICAgICAgfVxuICAgIDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIFdvcmtmbG93XG4gICAgICAgICAqL1xuICAgICAgICBhcmdzPzogUGFyYW1ldGVyczxXPiB8IFJlYWRvbmx5PFBhcmFtZXRlcnM8Vz4+O1xuICAgICAgfSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dEdXJhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHRpbWUgYWZ0ZXIgd2hpY2ggd29ya2Zsb3cgcnVuIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBzZXJ2aWNlLiBEbyBub3RcbiAgICogcmVseSBvbiBydW4gdGltZW91dCBmb3IgYnVzaW5lc3MgbGV2ZWwgdGltZW91dHMuIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgaW4gd29ya2Zsb3cgdGltZXJzXG4gICAqIGZvciB0aGlzIHB1cnBvc2UuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dSdW5UaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdvcmtmbG93IGV4ZWN1dGlvbiAod2hpY2ggaW5jbHVkZXMgcnVuIHJldHJpZXMgYW5kIGNvbnRpbnVlIGFzIG5ldykgaXNcbiAgICogYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIHNlcnZpY2UuIERvIG5vdCByZWx5IG9uIGV4ZWN1dGlvbiB0aW1lb3V0IGZvciBidXNpbmVzc1xuICAgKiBsZXZlbCB0aW1lb3V0cy4gSXQgaXMgcHJlZmVycmVkIHRvIHVzZSBpbiB3b3JrZmxvdyB0aW1lcnMgZm9yIHRoaXMgcHVycG9zZS5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhIHNpbmdsZSB3b3JrZmxvdyB0YXNrLiBEZWZhdWx0IGlzIDEwIHNlY29uZHMuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBDb21tb25Xb3JrZmxvd09wdGlvbnMgPSBCYXNlV29ya2Zsb3dPcHRpb25zICYgV29ya2Zsb3dEdXJhdGlvbk9wdGlvbnM7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0V29ya2Zsb3dUeXBlPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCB8IFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9uczxhbnlbXSwgYW55PlxuKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB3b3JrZmxvd1R5cGVPckZ1bmMgPT09ICdzdHJpbmcnKSByZXR1cm4gd29ya2Zsb3dUeXBlT3JGdW5jIGFzIHN0cmluZztcbiAgaWYgKHR5cGVvZiB3b3JrZmxvd1R5cGVPckZ1bmMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAod29ya2Zsb3dUeXBlT3JGdW5jPy5uYW1lKSByZXR1cm4gd29ya2Zsb3dUeXBlT3JGdW5jLm5hbWU7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3b3JrZmxvdyB0eXBlOiB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgYW5vbnltb3VzJyk7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgSW52YWxpZCB3b3JrZmxvdyB0eXBlOiBleHBlY3RlZCBlaXRoZXIgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbiwgZ290ICcke3R5cGVvZiB3b3JrZmxvd1R5cGVPckZ1bmN9J2BcbiAgKTtcbn1cbiIsIi8vIEEgcG9ydCBvZiBhbiBhbGdvcml0aG0gYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5jb20+LCAyMDEwXG4vLyBodHRwOi8vYmFhZ29lLmNvbS9lbi9SYW5kb21NdXNpbmdzL2phdmFzY3JpcHQvXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbnF1aW5sYW4vYmV0dGVyLXJhbmRvbS1udW1iZXJzLWZvci1qYXZhc2NyaXB0LW1pcnJvclxuLy8gT3JpZ2luYWwgd29yayBpcyB1bmRlciBNSVQgbGljZW5zZSAtXG5cbi8vIENvcHlyaWdodCAoQykgMjAxMCBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLm9yZz5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vLyBUYWtlbiBhbmQgbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZGF2aWRiYXUvc2VlZHJhbmRvbS9ibG9iL3JlbGVhc2VkL2xpYi9hbGVhLmpzXG5cbmNsYXNzIEFsZWEge1xuICBwdWJsaWMgYzogbnVtYmVyO1xuICBwdWJsaWMgczA6IG51bWJlcjtcbiAgcHVibGljIHMxOiBudW1iZXI7XG4gIHB1YmxpYyBzMjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNlZWQ6IG51bWJlcltdKSB7XG4gICAgY29uc3QgbWFzaCA9IG5ldyBNYXNoKCk7XG4gICAgLy8gQXBwbHkgdGhlIHNlZWRpbmcgYWxnb3JpdGhtIGZyb20gQmFhZ29lLlxuICAgIHRoaXMuYyA9IDE7XG4gICAgdGhpcy5zMCA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMxID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczIgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMCAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczAgPCAwKSB7XG4gICAgICB0aGlzLnMwICs9IDE7XG4gICAgfVxuICAgIHRoaXMuczEgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMxIDwgMCkge1xuICAgICAgdGhpcy5zMSArPSAxO1xuICAgIH1cbiAgICB0aGlzLnMyIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMiA8IDApIHtcbiAgICAgIHRoaXMuczIgKz0gMTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmV4dCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHQgPSAyMDkxNjM5ICogdGhpcy5zMCArIHRoaXMuYyAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gICAgdGhpcy5zMCA9IHRoaXMuczE7XG4gICAgdGhpcy5zMSA9IHRoaXMuczI7XG4gICAgcmV0dXJuICh0aGlzLnMyID0gdCAtICh0aGlzLmMgPSB0IHwgMCkpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJORyA9ICgpID0+IG51bWJlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFsZWEoc2VlZDogbnVtYmVyW10pOiBSTkcge1xuICBjb25zdCB4ZyA9IG5ldyBBbGVhKHNlZWQpO1xuICByZXR1cm4geGcubmV4dC5iaW5kKHhnKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1hc2gge1xuICBwcml2YXRlIG4gPSAweGVmYzgyNDlkO1xuXG4gIHB1YmxpYyBtYXNoKGRhdGE6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBsZXQgeyBuIH0gPSB0aGlzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgbiArPSBkYXRhW2ldITtcbiAgICAgIGxldCBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgdGhpcy5uID0gbjtcbiAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3luY0xvY2FsU3RvcmFnZSBhcyBBTFMgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgQ2FuY2VsbGVkRmFpbHVyZSwgSWxsZWdhbFN0YXRlRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvTnVtYmVyIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgU2RrRmxhZ3MgfSBmcm9tICcuL2ZsYWdzJztcblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbi8qKiBNYWdpYyBzeW1ib2wgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3Qgc2NvcGUgLSBpbnRlbnRpb25hbGx5IG5vdCBleHBvcnRlZCAqL1xuY29uc3QgTk9fUEFSRU5UID0gU3ltYm9sKCdOT19QQVJFTlQnKTtcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIENhbmNlbGxhdGlvblNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NvcGUgY2FuY2VsbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdGVkXG4gICAqL1xuICB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBwcmV2ZW50IG91dGVyIGNhbmNlbGxhdGlvbiBmcm9tIHByb3BhZ2F0aW5nIHRvIGlubmVyIHNjb3BlcywgQWN0aXZpdGllcywgdGltZXJzLCBhbmQgVHJpZ2dlcnMsIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIChTY29wZSBzdGlsbCBwcm9wYWdhdGVzIENhbmNlbGxlZEZhaWx1cmUgdGhyb3duIGZyb20gd2l0aGluKS5cbiAgICovXG4gIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgQ2FuY2VsbGF0aW9uU2NvcGUgKHVzZWZ1bCBmb3IgcnVubmluZyBiYWNrZ3JvdW5kIHRhc2tzKS5cbiAgICogVGhlIGBOT19QQVJFTlRgIHN5bWJvbCBpcyByZXNlcnZlZCBmb3IgdGhlIHJvb3Qgc2NvcGUuXG4gICAqL1xuICBwYXJlbnQ/OiBDYW5jZWxsYXRpb25TY29wZSB8IHR5cGVvZiBOT19QQVJFTlQ7XG59XG5cbi8qKlxuICogQ2FuY2VsbGF0aW9uIFNjb3BlcyBwcm92aWRlIHRoZSBtZWNoYW5pYyBieSB3aGljaCBhIFdvcmtmbG93IG1heSBncmFjZWZ1bGx5IGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBmb3IgY2FuY2VsbGF0aW9uXG4gKiAoZS5nLiBpbiByZXNwb25zZSB0byB7QGxpbmsgV29ya2Zsb3dIYW5kbGUuY2FuY2VsfSBvciB0aHJvdWdoIHRoZSBVSSBvciBDTEkpLCBhcyB3ZWxsIGFzIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mXG4gKiBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGl0IG93bnMgKGUuZy4gQWN0aXZpdGllcywgVGltZXJzLCBDaGlsZCBXb3JrZmxvd3MsIGV0YykuXG4gKlxuICogQ2FuY2VsbGF0aW9uIFNjb3BlcyBmb3JtIGEgdHJlZSwgd2l0aCB0aGUgV29ya2Zsb3cncyBtYWluIGZ1bmN0aW9uIHJ1bm5pbmcgaW4gdGhlIHJvb3Qgc2NvcGUgb2YgdGhhdCB0cmVlLlxuICogQnkgZGVmYXVsdCwgY2FuY2VsbGF0aW9uIHByb3BhZ2F0ZXMgZG93biBmcm9tIGEgcGFyZW50IHNjb3BlIHRvIGl0cyBjaGlsZHJlbiBhbmQgaXRzIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMuXG4gKiBBIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBjYW4gcmVjZWl2ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMsIGJ1dCBpcyBuZXZlciBlZmZlY3RpdmVseSBjb25zaWRlcmVkIGFzIGNhbmNlbGxlZCxcbiAqIHRodXMgc2hpZWxkZGluZyBpdHMgY2hpbGRyZW4gYW5kIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgZnJvbSBwcm9wYWdhdGlvbiBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgaXQgcmVjZWl2ZXMuXG4gKlxuICogU2NvcGVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGNvbnN0cnVjdG9yIG9yIHRoZSBzdGF0aWMgaGVscGVyIG1ldGhvZHMge0BsaW5rIGNhbmNlbGxhYmxlfSxcbiAqIHtAbGluayBub25DYW5jZWxsYWJsZX0gYW5kIHtAbGluayB3aXRoVGltZW91dH0uIGB3aXRoVGltZW91dGAgY3JlYXRlcyBhIHNjb3BlIHRoYXQgYXV0b21hdGljYWxseSBjYW5jZWxzIGl0c2VsZiBhZnRlclxuICogc29tZSBkdXJhdGlvbi5cbiAqXG4gKiBDYW5jZWxsYXRpb24gb2YgYSBjYW5jZWxsYWJsZSBzY29wZSByZXN1bHRzIGluIGFsbCBvcGVyYXRpb25zIGNyZWF0ZWQgZGlyZWN0bHkgaW4gdGhhdCBzY29wZSB0byB0aHJvdyBhXG4gKiB7QGxpbmsgQ2FuY2VsbGVkRmFpbHVyZX0gKGVpdGhlciBkaXJlY3RseSwgb3IgYXMgdGhlIGBjYXVzZWAgb2YgYW4ge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gb3IgYVxuICoge0BsaW5rIENoaWxkV29ya2Zsb3dGYWlsdXJlfSkuIEZ1cnRoZXIgYXR0ZW1wdCB0byBjcmVhdGUgbmV3IGNhbmNlbGxhYmxlIHNjb3BlcyBvciBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIHdpdGhpbiBhXG4gKiBzY29wZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkIHdpbGwgYWxzbyBpbW1lZGlhdGVseSB0aHJvdyBhIHtAbGluayBDYW5jZWxsZWRGYWlsdXJlfSBleGNlcHRpb24uIEl0IGlzIGhvd2V2ZXJcbiAqIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBhdCB0aGF0IHBvaW50OyB0aGlzIGlzIG9mdGVuIHVzZWQgdG8gZXhlY3V0ZSByb2xsYmFjayBvciBjbGVhbnVwXG4gKiBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyguLi4pOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgdHJ5IHtcbiAqICAgICAvLyBUaGlzIGFjdGl2aXR5IHJ1bnMgaW4gdGhlIHJvb3QgY2FuY2VsbGF0aW9uIHNjb3BlLiBUaGVyZWZvcmUsIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3Qgb25cbiAqICAgICAvLyB0aGUgV29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuIHRocm91Z2ggdGhlIFVJIG9yIENMSSkgYXV0b21hdGljYWxseSBwcm9wYWdhdGVzIHRvIHRoaXNcbiAqICAgICAvLyBhY3Rpdml0eS4gQXNzdW1pbmcgdGhhdCB0aGUgYWN0aXZpdHkgcHJvcGVybHkgaGFuZGxlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgdGhlbiB0aGVcbiAqICAgICAvLyBjYWxsIGJlbG93IHdpbGwgdGhyb3cgYW4gYEFjdGl2aXR5RmFpbHVyZWAgZXhjZXB0aW9uLCB3aXRoIGBjYXVzZWAgc2V0cyB0byBhblxuICogICAgIC8vIGluc3RhbmNlIG9mIGBDYW5jZWxsZWRGYWlsdXJlYC5cbiAqICAgICBhd2FpdCBzb21lQWN0aXZpdHkoKTtcbiAqICAgfSBjYXRjaCAoZSkge1xuICogICAgIGlmIChpc0NhbmNlbGxhdGlvbihlKSkge1xuICogICAgICAgLy8gUnVuIGNsZWFudXAgYWN0aXZpdHkgaW4gYSBub24tY2FuY2VsbGFibGUgc2NvcGVcbiAqICAgICAgIGF3YWl0IENhbmNlbGxhdGlvblNjb3BlLm5vbkNhbmNlbGxhYmxlKGFzeW5jICgpID0+IHtcbiAqICAgICAgICAgYXdhaXQgY2xlYW51cEFjdGl2aXR5KCk7XG4gKiAgICAgICB9XG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRocm93IGU7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIGNhbmNlbGxhYmxlIHNjb3BlIG1heSBiZSBwcm9ncmFtYXRpY2FsbHkgY2FuY2VsbGVkIGJ5IGNhbGxpbmcge0BsaW5rIGNhbmNlbHxgc2NvcGUuY2FuY2VsKClgfWAuIFRoaXMgbWF5IGJlIHVzZWQsXG4gKiBmb3IgZXhhbXBsZSwgdG8gZXhwbGljaXRseSByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBBY3Rpdml0eSBvciBDaGlsZCBXb3JrZmxvdzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKCk7XG4gKiBjb25zdCBhY3Rpdml0eVByb21pc2UgPSBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUucnVuKCgpID0+IHNvbWVBY3Rpdml0eSgpKTtcbiAqIGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZS5jYW5jZWwoKTsgLy8gQ2FuY2VscyB0aGUgYWN0aXZpdHlcbiAqIGF3YWl0IGFjdGl2aXR5UHJvbWlzZTsgLy8gVGhyb3dzIGBBY3Rpdml0eUZhaWx1cmVgIHdpdGggYGNhdXNlYCBzZXQgdG8gYENhbmNlbGxlZEZhaWx1cmVgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvblNjb3BlIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NvcGUgY2FuY2VsbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHRoZW4gdGhpcyBzY29wZSB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLCBldmVuIGlmIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaXMgcmVjZWl2ZWQgKGVpdGhlclxuICAgKiBkaXJlY3RseSBieSBjYWxsaW5nIGBzY29wZS5jYW5jZWwoKWAgb3IgaW5kaXJlY3RseSBieSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgcGFyZW50IHNjb3BlKS4gVGhpcyBlZmZlY3RpdmVseVxuICAgKiBzaGllbGRzIHRoZSBzY29wZSdzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIG1hZGUgb24gdGhlXG4gICAqIG5vbi1jYW5jZWxsYWJsZSBzY29wZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgcnVuYCBmdW5jdGlvbiBvZiBub24tY2FuY2VsbGFibGUgc2NvcGUgbWF5IHN0aWxsIHRocm93IGEgYENhbmNlbGxlZEZhaWx1cmVgXG4gICAqIGlmIHN1Y2ggYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIHdpdGhpbiB0aGF0IHNjb3BlIChlLmcuIGJ5IGRpcmVjdGx5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBjaGlsZCBzY29wZSkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsbGFibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENhbmNlbGxhdGlvblNjb3BlICh1c2VmdWwgZm9yIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrcyksIGRlZmF1bHRzIHRvIHtAbGluayBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50fSgpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50PzogQ2FuY2VsbGF0aW9uU2NvcGU7XG5cbiAgLyoqXG4gICAqIEEgUHJvbWlzZSB0aGF0IHRocm93cyB3aGVuIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVjZWl2ZXMgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgZWl0aGVyIGRpcmVjdGx5XG4gICAqIChpLmUuIGBzY29wZS5jYW5jZWwoKWApLCBvciBpbmRpcmVjdGx5IChieSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgcGFyZW50IHNjb3BlKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSByZWNlaXZlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cywgcmVzdWx0aW5nIGluIHRoZSBgY2FuY2VsUmVxdWVzdGVkYCBwcm9taXNlIGZvclxuICAgKiB0aGF0IHNjb3BlIHRvIHRocm93LCB0aG91Z2ggdGhlIHNjb3BlIHdpbGwgbm90IGVmZmVjdGl2ZWx5IGdldCBjYW5jZWxsZWQgKGkuZS4gYGNvbnNpZGVyZWRDYW5jZWxsZWRgIHdpbGwgc3RpbGxcbiAgICogcmV0dXJuIGBmYWxzZWAsIGFuZCBjYW5jZWxsYXRpb24gd2lsbCBub3QgYmUgcHJvcGFnYXRlZCB0byBjaGlsZCBzY29wZXMgYW5kIGNvbnRhaW5lZCBvcGVyYXRpb25zKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5jZWxSZXF1ZXN0ZWQ6IFByb21pc2U8bmV2ZXI+O1xuXG4gICNjYW5jZWxSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICAvLyBUeXBlc2NyaXB0IGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCB0aGUgUHJvbWlzZSBleGVjdXRvciBydW5zIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSBtc09wdGlvbmFsVG9OdW1iZXIob3B0aW9ucz8udGltZW91dCk7XG4gICAgdGhpcy5jYW5jZWxsYWJsZSA9IG9wdGlvbnM/LmNhbmNlbGxhYmxlID8/IHRydWU7XG4gICAgdGhpcy5jYW5jZWxSZXF1ZXN0ZWQgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRTQyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGUgUHJvbWlzZSBleGVjdXRvciBydW5zIHN5bmNocm9ub3VzbHlcbiAgICAgIHRoaXMucmVqZWN0ID0gKGVycikgPT4ge1xuICAgICAgICB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdW50cmFja1Byb21pc2UodGhpcy5jYW5jZWxSZXF1ZXN0ZWQpO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gICAgaWYgKG9wdGlvbnM/LnBhcmVudCAhPT0gTk9fUEFSRU5UKSB7XG4gICAgICB0aGlzLnBhcmVudCA9IG9wdGlvbnM/LnBhcmVudCB8fCBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFyZW50LmNhbmNlbGxhYmxlIHx8XG4gICAgICAgICh0aGlzLnBhcmVudC4jY2FuY2VsUmVxdWVzdGVkICYmXG4gICAgICAgICAgIWdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZDtcbiAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzY29wZSB3YXMgZWZmZWN0aXZlbHkgY2FuY2VsbGVkLiBBIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBjYW4gbmV2ZXIgYmUgY29uc2lkZXJlZCBjYW5jZWxsZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnNpZGVyZWRDYW5jZWxsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCAmJiB0aGlzLmNhbmNlbGxhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBzY29wZSBhcyBjdXJyZW50IGFuZCBydW4gIGBmbmBcbiAgICpcbiAgICogQW55IHRpbWVycywgQWN0aXZpdGllcywgVHJpZ2dlcnMgYW5kIENhbmNlbGxhdGlvblNjb3BlcyBjcmVhdGVkIGluIHRoZSBib2R5IG9mIGBmbmBcbiAgICogYXV0b21hdGljYWxseSBsaW5rIHRoZWlyIGNhbmNlbGxhdGlvbiB0byB0aGlzIHNjb3BlLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYGZuYFxuICAgKi9cbiAgcnVuPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHN0b3JhZ2UucnVuKHRoaXMsIHRoaXMucnVuSW5Db250ZXh0LmJpbmQodGhpcywgZm4pIGFzICgpID0+IFByb21pc2U8VD4pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0aGF0IHJ1bnMgYSBmdW5jdGlvbiBpbiBBc3luY0xvY2FsU3RvcmFnZSBjb250ZXh0LlxuICAgKlxuICAgKiBDb3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBhcyBhbm9ueW1vdXMgZnVuY3Rpb24sIG1hZGUgaW50byBhIG1ldGhvZCBmb3IgaW1wcm92ZWQgc3RhY2sgdHJhY2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1bkluQ29udGV4dDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGxldCB0aW1lclNjb3BlOiBDYW5jZWxsYXRpb25TY29wZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKCk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgdGltZXJTY29wZVxuICAgICAgICAgIC5ydW4oKCkgPT4gc2xlZXAodGhpcy50aW1lb3V0IGFzIG51bWJlcikpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNhbmNlbCgpLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBzY29wZSB3YXMgYWxyZWFkeSBjYW5jZWxsZWQsIGlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKFxuICAgICAgICB0aW1lclNjb3BlICYmXG4gICAgICAgICF0aW1lclNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQgJiZcbiAgICAgICAgZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIHRpbWVyU2NvcGUuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdG8gY2FuY2VsIHRoZSBzY29wZSBhbmQgbGlua2VkIGNoaWxkcmVuXG4gICAqL1xuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWplY3QobmV3IENhbmNlbGxlZEZhaWx1cmUoJ0NhbmNlbGxhdGlvbiBzY29wZSBjYW5jZWxsZWQnKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgc2NvcGVcbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCk6IENhbmNlbGxhdGlvblNjb3BlIHtcbiAgICAvLyBVc2luZyBnbG9iYWxzIGRpcmVjdGx5IGluc3RlYWQgb2YgYSBoZWxwZXIgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0XG4gICAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fVEVNUE9SQUxfQUNUSVZBVE9SX18ucm9vdFNjb3BlO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgY2FuY2VsbGFibGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogZmFsc2UgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIG5vbkNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbik7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlLCB0aW1lb3V0IH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB3aXRoVGltZW91dDxUPih0aW1lb3V0OiBEdXJhdGlvbiwgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pO1xuICB9XG59XG5cbmNvbnN0IHN0b3JhZ2U6IEFMUzxDYW5jZWxsYXRpb25TY29wZT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuZXhwb3J0IGNsYXNzIFJvb3RDYW5jZWxsYXRpb25TY29wZSBleHRlbmRzIENhbmNlbGxhdGlvblNjb3BlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgcGFyZW50OiBOT19QQVJFTlQgfSk7XG4gIH1cblxuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWplY3QobmV3IENhbmNlbGxlZEZhaWx1cmUoJ1dvcmtmbG93IGNhbmNlbGxlZCcpKTtcbiAgfVxufVxuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvIGF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoaXMgbW9kdWxlIGFuZCB3b3JrZmxvdy50cyAqL1xubGV0IHNsZWVwID0gKF86IER1cmF0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgaGFzIG5vdCBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkJyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKGZuOiB0eXBlb2Ygc2xlZXApOiB2b2lkIHtcbiAgc2xlZXAgPSBmbjtcbn1cbiIsImltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJyZW50UmFuZG9tKCk6IG51bWJlciB7XG4gIHJldHVybiBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cgcmFuZG9tIEFQSXMgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJykuY3VycmVudFJhbmRvbSgpO1xufVxuIiwiaW1wb3J0IHsgQWN0aXZpdHlGYWlsdXJlLCBDYW5jZWxsZWRGYWlsdXJlLCBDaGlsZFdvcmtmbG93RmFpbHVyZSwgTmV4dXNPcGVyYXRpb25GYWlsdXJlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB3b3JrZmxvdyBlcnJvcnNcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd0Vycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Vycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaHJvd24gaW4gd29ya2Zsb3cgd2hlbiBpdCB0cmllcyB0byBkbyBzb21ldGhpbmcgdGhhdCBub24tZGV0ZXJtaW5pc3RpYyBzdWNoIGFzIGNvbnN0cnVjdCBhIFdlYWtSZWYoKVxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0RldGVybWluaXNtVmlvbGF0aW9uRXJyb3InKVxuZXhwb3J0IGNsYXNzIERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHt9XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGFjdHMgYXMgYSBtYXJrZXIgZm9yIHRoaXMgc3BlY2lhbCByZXN1bHQgdHlwZVxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0xvY2FsQWN0aXZpdHlEb0JhY2tvZmYnKVxuZXhwb3J0IGNsYXNzIExvY2FsQWN0aXZpdHlEb0JhY2tvZmYgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBiYWNrb2ZmOiBjb3Jlc2RrLmFjdGl2aXR5X3Jlc3VsdC5JRG9CYWNrb2ZmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBwcm92aWRlZCBgZXJyYCBpcyBjYXVzZWQgYnkgY2FuY2VsbGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbmNlbGxhdGlvbihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlIHx8XG4gICAgKChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgTmV4dXNPcGVyYXRpb25GYWlsdXJlKSAmJlxuICAgICAgZXJyLmNhdXNlIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHR5cGUgU2RrRmxhZyA9IHtcbiAgZ2V0IGlkKCk6IG51bWJlcjtcbiAgZ2V0IGRlZmF1bHQoKTogYm9vbGVhbjtcbiAgZ2V0IGFsdGVybmF0aXZlQ29uZGl0aW9ucygpOiBBbHRDb25kaXRpb25GbltdIHwgdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZmxhZ3NSZWdpc3RyeTogTWFwPG51bWJlciwgU2RrRmxhZz4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBTZGtGbGFncyA9IHtcbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBnYXRlcyBtdWx0aXBsZSBmaXhlcyByZWxhdGVkIHRvIGNhbmNlbGxhdGlvbiBzY29wZXMgYW5kIHRpbWVycyBpbnRyb2R1Y2VkIGluIDEuMTAuMi8xLjExLjA6XG4gICAqIC0gQ2FuY2VsbGF0aW9uIG9mIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG5vIGxvbmdlciBwcm9wYWdhdGVzIHRvIGNoaWxkcmVuIHNjb3Blc1xuICAgKiAgIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLXR5cGVzY3JpcHQvaXNzdWVzLzE0MjMpLlxuICAgKiAtIENhbmNlbGxhdGlvblNjb3BlLndpdGhUaW1lb3V0KGZuKSBub3cgY2FuY2VsIHRoZSB0aW1lciBpZiBgZm5gIGNvbXBsZXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuICAgKiAgIG9mIHRoZSB0aW1lb3V0LCBzaW1pbGFyIHRvIGhvdyBgY29uZGl0aW9uKGZuLCB0aW1lb3V0KWAgd29ya3MuXG4gICAqIC0gVGltZXJzIGNyZWF0ZWQgdXNpbmcgc2V0VGltZW91dCBjYW4gbm93IGJlIGludGVyY2VwdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wLiBIb3dldmVyLCBkdWUgdG8gYW4gU0RLIGJ1ZywgU0RLcyB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90XG4gICAqICAgICAgICBwcm9wZXJseSB3cml0aW5nIGJhY2sgdGhlIGZsYWdzIHRvIGhpc3RvcnksIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmVcbiAgICogICAgICAgIGNvbnNpZGVyIHRoYXQgYSBXRlQgZW1pdHRlZCBieSBXb3JrZXIgdjEuMTEuMCBvciB2MS4xMS4xIHRvIGltcGxpY2l0bHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBOb25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uOiBkZWZpbmVGbGFnKDEsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBQcmlvciB0byAxLjExLjAsIHdoZW4gcHJvY2Vzc2luZyBhIFdvcmtmbG93IGFjdGl2YXRpb24sIHRoZSBTREsgd291bGQgZXhlY3V0ZSBgbm90aWZ5SGFzUGF0Y2hgXG4gICAqIGFuZCBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgaW4gZGlzdGluY3QgcGhhc2VzLCBiZWZvcmUgb3RoZXIgdHlwZXMgb2Ygam9icy4gVGhlIHByaW1hcnkgcmVhc29uXG4gICAqIGJlaGluZCB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3YXMgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSBXb3JrZmxvdyBleGVjdXRpb24gbWlnaHRcbiAgICogY29tcGxldGUgYmVmb3JlIGFsbCBpbmNvbWluZyBzaWduYWxzIGhhdmUgYmVlbiBkaXNwYXRjaGVkIChhdCBsZWFzdCB0byB0aGUgcG9pbnQgdGhhdCB0aGVcbiAgICogX3N5bmNocm9ub3VzXyBwYXJ0IG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkKS5cbiAgICpcbiAgICogVGhpcyBmbGFnIHJlcGxhY2VzIHRoYXQgbXVsdGktcGhhc2UgYWxnb3JpdGhtIHdpdGggYSBzaW1wbGVyIG9uZSB3aGVyZSBqb2JzIGFyZSBzaW1wbHkgc29ydGVkIGFzXG4gICAqIGAoc2lnbmFscyBhbmQgdXBkYXRlcykgLT4gb3RoZXJzYCwgYnV0IHdpdGhvdXQgcHJvY2Vzc2luZyB0aGVtIGFzIGRpc3RpbmN0IGJhdGNoZXMgKGkuZS4gd2l0aG91dFxuICAgKiBsZWF2aW5nL3JlZW50ZXJpbmcgdGhlIFZNIGNvbnRleHQgYmV0d2VlbiBlYWNoIGdyb3VwLCB3aGljaCBhdXRvbWF0aWNhbGx5IHRyaWdnZXJzIHRoZSBleGVjdXRpb25cbiAgICogb2YgYWxsIG91dHN0YW5kaW5nIG1pY3JvdGFza3MpLiBUaGF0IHNpbmdsZS1waGFzZSBhcHByb2FjaCByZXNvbHZlcyBhIG51bWJlciBvZiBxdWlya3Mgb2YgdGhlXG4gICAqIGZvcm1lciBhbGdvcml0aG0sIGFuZCB5ZXQgc3RpbGwgc2F0aXNmaWVzIHRvIHRoZSBvcmlnaW5hbCByZXF1aXJlbWVudCBvZiBlbnN1cmluZyB0aGF0IGV2ZXJ5XG4gICAqIGBzaWduYWxXb3JrZmxvd2Agam9icyAtIGFuZCBub3cgYGRvVXBkYXRlYCBqb2JzIGFzIHdlbGwgLSBoYXZlIGJlZW4gZ2l2ZW4gYSBwcm9wZXIgY2hhbmNlIHRvXG4gICAqIGV4ZWN1dGUgYmVmb3JlIHRoZSBXb3JrZmxvdyBtYWluIGZ1bmN0aW9uIG1pZ2h0IGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMS4wLiBUaGlzIGNoYW5nZSBpcyBub3Qgcm9sbGJhY2stc2FmZS4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3NcbiAgICogICAgICAgIHYxLjExLjAgYW5kIHYxLjExLjEgd2VyZSBub3QgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmdcbiAgICogICAgICAgIGluIE5ERSBvbiByZXBsYXkuIFdlIHRoZXJlZm9yZSBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMVxuICAgKiAgICAgICAgdG8gaW1wbGljaXRlbHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBQcm9jZXNzV29ya2Zsb3dBY3RpdmF0aW9uSm9ic0FzU2luZ2xlQmF0Y2g6IGRlZmluZUZsYWcoMiwgdHJ1ZSwgW2J1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcygvMVxcLjExXFwuWzAxXS8pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTEuNSB0aGUgYGhhbmRsZVNpZ25hbGAgaW50ZXJjZXB0b3Igd2FzIGFkZGVkIHRvIEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5XG4gICAqIHdoaWNoIGFkZGVkIGEgeWllbGQgcG9pbnQuIFRoZSBhZGRlZCB5aWVsZCBwb2ludCBjYW4gY2F1c2UgTkRFIGlmIHRoZXJlIHdhcyBhIHNpZ25hbCBoYW5kbGVyIGFuZFxuICAgKiB0aGUgd29ya2Zsb3cgd2FzIHN0YXJ0ZWQgd2l0aCBhIHNpZ25hbC5cbiAgICpcbiAgICogVGhpcyB5aWVsZCBwb2ludCB3YXMgcmVtb3ZlZCBpbiAxLjEzLjIsIGJ1dCBpbiBvcmRlciB0byBwcmV2ZW50IHdvcmtmbG93cyBmcm9tIHRoZVxuICAgKiBhZmZlY3RlZCB2ZXJzaW9ucyByZXN1bHRpbmcgaW4gTkRFLCB3ZSBoYXZlIHRvIGluamVjdCB0aGUgeWllbGQgcG9pbnQgb24gcmVwbGF5LlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjIuXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzVHJhY2VzSW5ib3VuZFNpZ25hbHM6IGRlZmluZUZsYWcoMywgdHJ1ZSwgW2lzQXRMZWFzdCh7IG1ham9yOiAxLCBtaW5vcjogMTEsIHBhdGNoOiA1IH0pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTEuNiwgdGhlIGBzY2hlZHVsZUxvY2FsQWN0aXZpdHlgIGludGVyY2VwdG9yIHdhcyBhZGRlZCB0b1xuICAgKiBgQHRlbXBvcmFsaW8vaW50ZXJjZXB0b3JzLW9wZW50ZWxlbWV0cnlgIHdoaWNoIGFkZGVkIGEgeWllbGQgcG9pbnQgdG8gdGhlXG4gICAqIG91dGJvdW5kIGludGVyY2VwdG9yLiBUaGlzIHlpZWxkIHBvaW50IHdhcyByZW1vdmVkIGluIDEuMTMuMi5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzVHJhY2VzTG9jYWxBY3Rpdml0aWVzOiBkZWZpbmVGbGFnKDQsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDExLCBwYXRjaDogNiB9KV0pLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJjZXB0b3JzIHByb3ZpZGVkIGJ5IEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5IGluaXRpYWxseSBoYWQgdW5uZWNlc3NhcnlcbiAgICogeWllbGQgcG9pbnRzIG9uIGNhbGxpbmcgdG8gYGV4dHJhY3RDb250ZXh0RnJvbUhlYWRlcnNgLlxuICAgKiBJZiByZXBsYXlpbmcgYSB3b3JrZmxvdyBjcmVhdGVkIGZyb20gdGhlc2UgdmVyc2lvbnMgYSB5aWVsZCBwb2ludCBpcyBpbmplY3RlZCB0byBwcmV2ZW50IGFueSBOREUuXG4gICAqXG4gICAqIElmIHRoZSBoaXN0b3J5IGRvZXMgbm90IGluY2x1ZGUgdGhlIFNESyB2ZXJzaW9uLCBkZWZhdWx0IHRvIGV4dHJhIHlpZWxkcyBzaW5jZSB0aGUgeWllbGRzIHdlcmUgcHJlc2VudCBzaW5jZSB0aGUgT1RFTFxuICAgKiBwYWNrYWdlIHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjJcbiAgICovXG4gIE9wZW5UZWxlbWV0cnlJbnRlcmNlcG9yc0F2b2lkc0V4dHJhWWllbGRzOiBkZWZpbmVGbGFnKDUsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDEzLCBwYXRjaDogMiB9KV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjEzLjMsIGFsbCByZW1haW5pbmcgaW50ZXJjZXB0b3IgbWV0aG9kcyB3ZXJlIGltcGxlbWVudGVkIGluIEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5XG4gICAqIGluY2x1ZGluZyBgaGFuZGxlVXBkYXRlYCwgYHZhbGlkYXRlVXBkYXRlYCwgYGhhbmRsZVF1ZXJ5YCwgYHN0YXJ0VGltZXJgLCBhbmQgYHN0YXJ0TmV4dXNPcGVyYXRpb25gLlxuICAgKiBUaGVzZSBhZGQgaW5zdHJ1bWVudGF0aW9uIGFuZCB5aWVsZCBwb2ludHMgdGhhdCB3ZXJlIG5vdCBwcmVzZW50IGluIGVhcmxpZXIgdmVyc2lvbnMuXG4gICAqIFRoaXMgZmxhZyBnYXRlcyB0aGVzZSBuZXcgaW50ZXJjZXB0b3IgbWV0aG9kcyB0byBwcmV2ZW50IE5ERSBvbiByZXBsYXkgb2Ygd29ya2Zsb3dzIGZyb20gZWFybGllciB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4zXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzSW5zdHJ1bWVudHNBbGxNZXRob2RzOiBkZWZpbmVGbGFnKDYsIHRydWUpLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZGVmaW5lRmxhZyhpZDogbnVtYmVyLCBkZWY6IGJvb2xlYW4sIGFsdGVybmF0aXZlQ29uZGl0aW9ucz86IEFsdENvbmRpdGlvbkZuW10pOiBTZGtGbGFnIHtcbiAgY29uc3QgZmxhZyA9IHsgaWQsIGRlZmF1bHQ6IGRlZiwgYWx0ZXJuYXRpdmVDb25kaXRpb25zIH07XG4gIGZsYWdzUmVnaXN0cnkuc2V0KGlkLCBmbGFnKTtcbiAgcmV0dXJuIGZsYWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZEZsYWcoaWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWZsYWdzUmVnaXN0cnkuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBTREsgZmxhZzogJHtpZH1gKTtcbn1cblxuLyoqXG4gKiBBbiBTREsgRmxhZyBBbHRlcm5hdGUgQ29uZGl0aW9uIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgZmxhZ1xuICogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNES1xuICogdGhhdCBlbWl0dGVkIGEgV0ZULiBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byByZXRyb2FjdGl2ZWx5IHR1cm4gb24gc29tZSBmbGFncyBmb3IgV0ZUXG4gKiBlbWl0dGVkIGJ5IHByZXZpb3VzIFNES3MgdGhhdCBjb250YWluZWQgYSBidWcuXG4gKlxuICogTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZywgYW5kIG9ubHkgaWYgdGhlIGNvcnJlc3BvbmluZyBmbGFnIGlzXG4gKiBub3QgYWxyZWFkeSBzZXQuIEFsc28sIGFsdGVybmF0ZSBjb25kaXRpb25zIHdpbGwgbm90IGNhdXNlIHRoZSBmbGFnIHRvIGJlIHBlcnNpc3RlZCB0byB0aGVcbiAqIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzIG1heSBub3QgcmVmbGVjdCB0aGlzIGZsYWcgaWYgdGhlXG4gKiBjb25kaXRpb24gbm8gbG9uZ2VyIGhvbGRzLiBUaGlzIGlzIHNvIHRvIGF2b2lkIGluY29ycmVjdCBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93XG4gKiBFeGVjdXRpb24gaGFzIGdvbmUgdGhyb3VnaCBhIG5ld2VyIFNESyB2ZXJzaW9uIHRoZW4gYWdhaW4gdGhyb3VnaCBhbiBvbGRlciBvbmUuXG4gKi9cbnR5cGUgQWx0Q29uZGl0aW9uRm4gPSAoY3R4OiB7IGluZm86IFdvcmtmbG93SW5mbzsgc2RrVmVyc2lvbj86IHN0cmluZyB9KSA9PiBib29sZWFuO1xuXG5mdW5jdGlvbiBidWlsZElkU2RrVmVyc2lvbk1hdGNoZXModmVyc2lvbjogUmVnRXhwKTogQWx0Q29uZGl0aW9uRm4ge1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF5AdGVtcG9yYWxpby93b3JrZXJAKCR7dmVyc2lvbi5zb3VyY2V9KVsrXWApO1xuICByZXR1cm4gKHsgaW5mbyB9KSA9PiBpbmZvLmN1cnJlbnRCdWlsZElkICE9IG51bGwgJiYgcmVnZXgudGVzdChpbmZvLmN1cnJlbnRCdWlsZElkKTtcbn1cblxudHlwZSBTZW1WZXIgPSB7XG4gIG1ham9yOiBudW1iZXI7XG4gIG1pbm9yOiBudW1iZXI7XG4gIHBhdGNoOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYEFsdENvbmRpdGlvbkZuYCB0aGF0IGNoZWNrcyBpZiB0aGUgU0RLIHZlcnNpb24gaXMgZXF1YWwgdG8gb3IgYWZ0ZXIgdGhlIHByb3ZpZGVkIHZlcnNpb24uXG4gKiBBbiBvcHRpb25hbCBkZWZhdWx0IGNhbiBiZSBwcm92aWRlZCBpbiBjYXNlIHRoZSBTREsgdmVyc2lvbiBpcyBub3QgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBpc0F0TGVhc3QoY29tcGFyZTogU2VtVmVyLCBtaXNzaW5nRGVmYXVsdD86IGJvb2xlYW4pOiBBbHRDb25kaXRpb25GbiB7XG4gIHJldHVybiAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIGlzQ29tcGFyZWQoY29tcGFyZSwgLTEsIG1pc3NpbmdEZWZhdWx0KShjdHgpIHx8IGlzQ29tcGFyZWQoY29tcGFyZSwgMCwgbWlzc2luZ0RlZmF1bHQpKGN0eCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQ29tcGFyZWQoY29tcGFyZTogU2VtVmVyLCBjb21wYXJpc29uOiAtMSB8IDAgfCAxLCBtaXNzaW5nRGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlKTogQWx0Q29uZGl0aW9uRm4ge1xuICByZXR1cm4gKHsgc2RrVmVyc2lvbiB9KSA9PiB7XG4gICAgaWYgKCFzZGtWZXJzaW9uKSByZXR1cm4gbWlzc2luZ0RlZmF1bHQ7XG4gICAgY29uc3QgdmVyc2lvbiA9IHBhcnNlU2VtdmVyKHNka1ZlcnNpb24pO1xuICAgIGlmICghdmVyc2lvbikgcmV0dXJuIG1pc3NpbmdEZWZhdWx0O1xuICAgIHJldHVybiBjb21wYXJlU2VtdmVyKGNvbXBhcmUsIHZlcnNpb24pID09PSBjb21wYXJpc29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNlbXZlcih2ZXJzaW9uOiBzdHJpbmcpOiBTZW1WZXIgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IFtfLCBtYWpvciwgbWlub3IsIHBhdGNoXSA9IHZlcnNpb24ubWF0Y2goLyhcXGQrKVxcLihcXGQrKVxcLihcXGQrKS8pITtcbiAgICByZXR1cm4ge1xuICAgICAgbWFqb3I6IE51bWJlci5wYXJzZUludChtYWpvciEpLFxuICAgICAgbWlub3I6IE51bWJlci5wYXJzZUludChtaW5vciEpLFxuICAgICAgcGF0Y2g6IE51bWJlci5wYXJzZUludChwYXRjaCEpLFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZVNlbXZlcihhOiBTZW1WZXIsIGI6IFNlbVZlcik6IC0xIHwgMCB8IDEge1xuICBpZiAoYS5tYWpvciA8IGIubWFqb3IpIHJldHVybiAtMTtcbiAgaWYgKGEubWFqb3IgPiBiLm1ham9yKSByZXR1cm4gKzE7XG4gIGlmIChhLm1pbm9yIDwgYi5taW5vcikgcmV0dXJuIC0xO1xuICBpZiAoYS5taW5vciA+IGIubWlub3IpIHJldHVybiArMTtcbiAgaWYgKGEucGF0Y2ggPCBiLnBhdGNoKSByZXR1cm4gLTE7XG4gIGlmIChhLnBhdGNoID4gYi5wYXRjaCkgcmV0dXJuICsxO1xuICByZXR1cm4gMDtcbn1cbiIsImltcG9ydCB7IElsbGVnYWxTdGF0ZUVycm9yLCB0eXBlIFdvcmtmbG93IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgQWN0aXZhdG9yIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgLy8gVGhlIF9fVEVNUE9SQUxfXyBvYmplY3Qgd2lsbCBiZSBhc3NpZ25lZCBieSBXZWJwYWNrIHRvIHRoZSBleHBvcnRzIG9mIHRoZSBlbnRyeXBvaW50IG1vZHVsZVxuICAvLyBmaWxlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgYnVuZGxlciAoc2VlIHdvcmtmbG93L2J1bmRsZXIudHMjZ2VuRW50cnlwb2ludCgpKS5cbiAgLy9cbiAgLy8gRklYTUU6IFJlbmFtZSB0byBsb3dlcmNhc2Ugc3ludGF4IGJlZm9yZSAxLjE1LjAuIEkgcHJlc2VydmVkIHRoZSB1cHBlcmNhc2UgbmFtZSBmb3IgYmFja3dhcmRcbiAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIGJ1bmRsZXMgZ2VuZXJhdGVkIGJ5IDEuMTQuMC4gV2UgZ2VuZXJhbGx5IGRvIG5vdCBndWFyYW50ZWUgY29tcGF0aWJpbGl0eSBvZlxuICAvLyBidW5kbGVzIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBTREssIGJ1dCBpbiB0aGlzIHNwZWNpZmljIGNhc2UsIHRoZXJlJ3MgcmVhbGx5IG5vXG4gIC8vIHVzZXItc2lkZSB2YWx1ZSBpbiByZW5hbWluZyB0aGlzLCBzbyBtYWtpbmcgYSBicmVha2luZyBjaGFuZ2UgZm9yIHRoYXQgd291bGQgbm90IGJlIGp1c3RpZmllZC5cbiAgLy9cblxuICB2YXIgX19URU1QT1JBTF9fOiB7XG4gICAgYXBpOiB0eXBlb2YgaW1wb3J0KCcuL3dvcmtlci1pbnRlcmZhY2UudHMnKTtcbiAgICBwcmVsb2FkTW9kdWxlcz86ICgpID0+IHZvaWQ7XG4gICAgaW1wb3J0V29ya2Zsb3dzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBXb3JrZmxvdz47XG4gICAgaW1wb3J0SW50ZXJjZXB0b3JzOiAoKSA9PiBbeyBpbnRlcmNlcHRvcnM6IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSB9XTtcbiAgfTtcblxuICAvLyBEZXN0cnVjdG9ycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc2hhcmVkIHNhbmRib3ggaXMgZGVzdHJveWVkLlxuXG4gIHZhciBfX3RlbXBvcmFsX2dsb2JhbFNhbmRib3hEZXN0cnVjdG9yczogKCgpID0+IHZvaWQpW10gfCB1bmRlZmluZWQ7XG5cbiAgLy8gRklYTUU6IFJlbmFtZSB0byBsb3dlcmNhc2Ugc3ludGF4IGJlZm9yZSAxLjE1LjAuXG5cbiAgdmFyIF9fVEVNUE9SQUxfQUNUSVZBVE9SX186IEFjdGl2YXRvciB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEFjdGl2YXRvcihhY3RpdmF0b3I6IEFjdGl2YXRvciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBnbG9iYWxUaGlzLl9fVEVNUE9SQUxfQUNUSVZBVE9SX18gPSBhY3RpdmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUdldEFjdGl2YXRvcigpOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX0FDVElWQVRPUl9fO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQodW5pbml0aWFsaXplZEVycm9yTWVzc2FnZTogc3RyaW5nKTogQWN0aXZhdG9yIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgaWYgKGFjdGl2YXRvciA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IodW5pbml0aWFsaXplZEVycm9yTWVzc2FnZSk7XG4gIHJldHVybiBhY3RpdmF0b3I7XG59XG5cbi8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYW4gYWxpYXMgZm9yIGBhc3NlcnRJbldvcmtmbG93Q29udGV4dGAgd2l0aCBhIGRlZmF1bHQgZXJyb3IgbWVzc2FnZSxcbi8vIGJlY2F1c2UgdGhhdCBuYW1lIGJldHRlciBjb252ZXlzIHRoZSBpbnRlbnQgaW4gc29tZSB2ZXJ5IGNvbW1vbiB1c2UgY2FzZXMuXG5leHBvcnQgY29uc3QgZ2V0QWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQuYmluZChudWxsLCAnV29ya2Zsb3cgdW5pbml0aWFsaXplZCcpO1xuIiwiLyoqXG4gKiBPdmVycmlkZXMgc29tZSBnbG9iYWwgb2JqZWN0cyB0byBtYWtlIHRoZW0gZGV0ZXJtaW5pc3RpYy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IG1zVG9UcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGN1cnJlbnRSYW5kb20gfSBmcm9tICcuL2N1cnJlbnQtcmFuZG9tJztcbmltcG9ydCB7IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFNka0ZsYWdzIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vd29ya2Zsb3cnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIGFueTtcbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJyaWRlR2xvYmFscygpOiB2b2lkIHtcbiAgLy8gTW9jayBhbnkgd2VhayByZWZlcmVuY2UgYmVjYXVzZSBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYyBhbmQgdGhlIGVmZmVjdCBpcyBvYnNlcnZhYmxlIGZyb20gdGhlIFdvcmtmbG93LlxuICAvLyBXb3JrZmxvdyBkZXZlbG9wZXIgd2lsbCBnZXQgYSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiBpZiB0aGV5IHRyeSB0byB1c2UgdGhlc2UuXG4gIGdsb2JhbC5XZWFrUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdXZWFrUmVmIGNhbm5vdCBiZSB1c2VkIGluIFdvcmtmbG93cyBiZWNhdXNlIHY4IEdDIGlzIG5vbi1kZXRlcm1pbmlzdGljJyk7XG4gIH07XG4gIGdsb2JhbC5GaW5hbGl6YXRpb25SZWdpc3RyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcihcbiAgICAgICdGaW5hbGl6YXRpb25SZWdpc3RyeSBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYydcbiAgICApO1xuICB9O1xuXG4gIGdsb2JhbC5EYXRlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBuZXcgKE9yaWdpbmFsRGF0ZSBhcyBhbnkpKC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9yaWdpbmFsRGF0ZShnZXRBY3RpdmF0b3IoKS5ub3cpO1xuICB9O1xuXG4gIGdsb2JhbC5EYXRlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0QWN0aXZhdG9yKCkubm93O1xuICB9O1xuXG4gIGdsb2JhbC5EYXRlLnBhcnNlID0gT3JpZ2luYWxEYXRlLnBhcnNlLmJpbmQoT3JpZ2luYWxEYXRlKTtcbiAgZ2xvYmFsLkRhdGUuVVRDID0gT3JpZ2luYWxEYXRlLlVUQy5iaW5kKE9yaWdpbmFsRGF0ZSk7XG5cbiAgZ2xvYmFsLkRhdGUucHJvdG90eXBlID0gT3JpZ2luYWxEYXRlLnByb3RvdHlwZTtcblxuICBjb25zdCB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzID0gbmV3IE1hcDxudW1iZXIsIENhbmNlbGxhdGlvblNjb3BlPigpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbXMgc2xlZXAgZHVyYXRpb24gLSAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gSWYgZ2l2ZW4gYSBuZWdhdGl2ZSBudW1iZXIsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gICAqL1xuICBnbG9iYWwuc2V0VGltZW91dCA9IGZ1bmN0aW9uIChjYjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIG1zOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogbnVtYmVyIHtcbiAgICBtcyA9IE1hdGgubWF4KDEsIG1zKTtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICBpZiAoYWN0aXZhdG9yLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpIHtcbiAgICAgIC8vIENhcHR1cmUgdGhlIHNlcXVlbmNlIG51bWJlciB0aGF0IHNsZWVwIHdpbGwgYWxsb2NhdGVcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcjtcbiAgICAgIGNvbnN0IHRpbWVyU2NvcGUgPSBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHNsZWVwUHJvbWlzZSA9IHRpbWVyU2NvcGUucnVuKCgpID0+IHNsZWVwKG1zKSk7XG4gICAgICBzbGVlcFByb21pc2UudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgY2IoLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aW1lb3V0Q2FuY2VsbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdW50cmFja1Byb21pc2Uoc2xlZXBQcm9taXNlKTtcbiAgICAgIHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMuc2V0KHNlcSwgdGltZXJTY29wZSk7XG4gICAgICByZXR1cm4gc2VxO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXIrKztcbiAgICAgIC8vIENyZWF0ZSBhIFByb21pc2UgZm9yIEFzeW5jTG9jYWxTdG9yYWdlIHRvIGJlIGFibGUgdG8gdHJhY2sgdGhpcyBjb21wbGV0aW9uIHVzaW5nIHByb21pc2UgaG9va3MuXG4gICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICBzdGFydFRpbWVyOiB7XG4gICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICBzdGFydFRvRmlyZVRpbWVvdXQ6IG1zVG9UcyhtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KS50aGVuKFxuICAgICAgICAoKSA9PiBjYiguLi5hcmdzKSxcbiAgICAgICAgKCkgPT4gdW5kZWZpbmVkIC8qIGlnbm9yZSBjYW5jZWxsYXRpb24gKi9cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VxO1xuICAgIH1cbiAgfTtcblxuICBnbG9iYWwuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKGhhbmRsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gICAgY29uc3QgdGltZXJTY29wZSA9IHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMuZ2V0KGhhbmRsZSk7XG4gICAgaWYgKHRpbWVyU2NvcGUpIHtcbiAgICAgIHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMuZGVsZXRlKGhhbmRsZSk7XG4gICAgICB0aW1lclNjb3BlLmNhbmNlbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmF0b3IubmV4dFNlcXMudGltZXIrKzsgLy8gU2hvdWxkbid0IGluY3JlYXNlIHNlcSBudW1iZXIsIGJ1dCB0aGF0J3MgdGhlIGxlZ2FjeSBiZWhhdmlvclxuICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgY2FuY2VsVGltZXI6IHtcbiAgICAgICAgICBzZXE6IGhhbmRsZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBjdXJyZW50UmFuZG9tKCkgZGlzcGF0Y2hlcyB0byBhIHNjb3BlZCBzdHJlYW0gd2hlbiBXb3JrZmxvd1JhbmRvbVN0cmVhbS53aXRoKC4uLikgaXMgYWN0aXZlLlxuICBNYXRoLnJhbmRvbSA9IGN1cnJlbnRSYW5kb207XG59XG4iLCIvKipcbiAqIFRoaXMgbGlicmFyeSBwcm92aWRlcyB0b29scyByZXF1aXJlZCBmb3IgYXV0aG9yaW5nIHdvcmtmbG93cy5cbiAqXG4gKiAjIyBVc2FnZVxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvaGVsbG8td29ybGQjd29ya2Zsb3dzIHwgdHV0b3JpYWx9IGZvciB3cml0aW5nIHlvdXIgZmlyc3Qgd29ya2Zsb3cuXG4gKlxuICogIyMjIFRpbWVyc1xuICpcbiAqIFRoZSByZWNvbW1lbmRlZCB3YXkgb2Ygc2NoZWR1bGluZyB0aW1lcnMgaXMgYnkgdXNpbmcgdGhlIHtAbGluayBzbGVlcH0gZnVuY3Rpb24uIFdlJ3ZlIHJlcGxhY2VkIGBzZXRUaW1lb3V0YCBhbmRcbiAqIGBjbGVhclRpbWVvdXRgIHdpdGggZGV0ZXJtaW5pc3RpYyB2ZXJzaW9ucyBzbyB0aGVzZSBhcmUgYWxzbyB1c2FibGUgYnV0IGhhdmUgYSBsaW1pdGF0aW9uIHRoYXQgdGhleSBkb24ndCBwbGF5IHdlbGxcbiAqIHdpdGgge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2NhbmNlbGxhdGlvbi1zY29wZXMgfCBjYW5jZWxsYXRpb24gc2NvcGVzfS5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwZXIobXMgPSAxMDApOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgYXdhaXQgc2xlZXAobXMpO1xuICogICBjb25zb2xlLmxvZygnc2xlcHQnKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBBY3Rpdml0aWVzXG4gKlxuICogVG8gc2NoZWR1bGUgQWN0aXZpdGllcywgdXNlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9IHRvIG9idGFpbiBhbiBBY3Rpdml0eSBmdW5jdGlvbiBhbmQgY2FsbC5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcHJveHlBY3Rpdml0aWVzIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICogaW1wb3J0IHR5cGUgKiBhcyBhY3Rpdml0aWVzIGZyb20gJy4vYWN0aXZpdGllcyc7XG4gKlxuICogY29uc3QgeyBzZW5kRW1haWwgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMSBtaW51dGUnLFxuICogfSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYW1wbGVXb3JrZmxvdygpOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBzZW5kRW1haWwoXCJ0b0BleGFtcGxlLmNvbVwiLFwiSGVsbG8sIFRlbXBvcmFsIVwiKTtcbn1cblxuICogYGBgXG4gKiBcbiAqICMjIyBVcGRhdGVzLCBTaWduYWxzIGFuZCBRdWVyaWVzXG4gKlxuICogVXNlIHtAbGluayBzZXRIYW5kbGVyfSB0byBzZXQgaGFuZGxlcnMgZm9yIFVwZGF0ZXMsIFNpZ25hbHMsIGFuZCBRdWVyaWVzLlxuICpcbiAqIFVwZGF0ZSBhbmQgU2lnbmFsIGhhbmRsZXJzIGNhbiBiZSBlaXRoZXIgYXN5bmMgb3Igbm9uLWFzeW5jIGZ1bmN0aW9ucy4gVXBkYXRlIGhhbmRsZXJzIG1heSByZXR1cm4gYSB2YWx1ZSwgYnV0IHNpZ25hbFxuICogaGFuZGxlcnMgbWF5IG5vdCAocmV0dXJuIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmApLiBZb3UgbWF5IHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsIGNoaWxkIFdvcmtmbG93cywgZXRjIGluIFVwZGF0ZVxuICogYW5kIFNpZ25hbCBoYW5kbGVycywgYnV0IHRoaXMgc2hvdWxkIGJlIGRvbmUgY2F1dGlvdXNseTogZm9yIGV4YW1wbGUsIG5vdGUgdGhhdCBpZiB5b3UgYXdhaXQgYXN5bmMgb3BlcmF0aW9ucyBzdWNoIGFzXG4gKiB0aGVzZSBpbiBhbiBVcGRhdGUgb3IgU2lnbmFsIGhhbmRsZXIsIHRoZW4geW91IGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgd29ya2Zsb3cgZG9lcyBub3QgY29tcGxldGUgZmlyc3QuXG4gKlxuICogUXVlcnkgaGFuZGxlcnMgbWF5ICoqbm90KiogYmUgYXN5bmMgZnVuY3Rpb25zLCBhbmQgbWF5ICoqbm90KiogbXV0YXRlIGFueSB2YXJpYWJsZXMgb3IgdXNlIEFjdGl2aXRpZXMsIFRpbWVycyxcbiAqIGNoaWxkIFdvcmtmbG93cywgZXRjLlxuICpcbiAqICMjIyMgSW1wbGVtZW50YXRpb25cbiAqXG4gKiBgYGB0c1xuICogZXhwb3J0IGNvbnN0IGluY3JlbWVudFNpZ25hbCA9IHdmLmRlZmluZVNpZ25hbDxbbnVtYmVyXT4oJ2luY3JlbWVudCcpO1xuICogZXhwb3J0IGNvbnN0IGdldFZhbHVlUXVlcnkgPSB3Zi5kZWZpbmVRdWVyeTxudW1iZXI+KCdnZXRWYWx1ZScpO1xuICogZXhwb3J0IGNvbnN0IGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlID0gd2YuZGVmaW5lVXBkYXRlPG51bWJlciwgW251bWJlcl0+KCdpbmNyZW1lbnRBbmRHZXRWYWx1ZScpO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudGVyV29ya2Zsb3coaW5pdGlhbFZhbHVlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgbGV0IGNvdW50ID0gaW5pdGlhbFZhbHVlO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudFNpZ25hbCwgKGFyZzogbnVtYmVyKSA9PiB7XG4gKiAgICAgY291bnQgKz0gYXJnO1xuICogICB9KTtcbiAqICAgd2Yuc2V0SGFuZGxlcihnZXRWYWx1ZVF1ZXJ5LCAoKSA9PiBjb3VudCk7XG4gKiAgIHdmLnNldEhhbmRsZXIoaW5jcmVtZW50QW5kR2V0VmFsdWVVcGRhdGUsIChhcmc6IG51bWJlcik6IG51bWJlciA9PiB7XG4gKiAgICAgY291bnQgKz0gYXJnO1xuICogICAgIHJldHVybiBjb3VudDtcbiAqICAgfSk7XG4gKiAgIGF3YWl0IHdmLmNvbmRpdGlvbigoKSA9PiBmYWxzZSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgTW9yZVxuICpcbiAqIC0gW0RldGVybWluaXN0aWMgYnVpbHQtaW5zXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9kZXRlcm1pbmlzbSNzb3VyY2VzLW9mLW5vbi1kZXRlcm1pbmlzbSlcbiAqIC0gW0NhbmNlbGxhdGlvbiBhbmQgc2NvcGVzXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzKVxuICogICAtIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1cbiAqICAgLSB7QGxpbmsgVHJpZ2dlcn1cbiAqIC0gW1NpbmtzXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vYXBwbGljYXRpb24tZGV2ZWxvcG1lbnQvb2JzZXJ2YWJpbGl0eS8/bGFuZz10cyNsb2dnaW5nKVxuICogICAtIHtAbGluayBTaW5rc31cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuZXhwb3J0IHtcbiAgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICBBY3Rpdml0eUZhaWx1cmUsXG4gIEFjdGl2aXR5T3B0aW9ucyxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIFBheWxvYWRDb252ZXJ0ZXIsXG4gIFJldHJ5UG9saWN5LFxuICByb290Q2F1c2UsXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTZXJ2ZXJGYWlsdXJlLFxuICBUZW1wb3JhbEZhaWx1cmUsXG4gIFRlcm1pbmF0ZWRGYWlsdXJlLFxuICBUaW1lb3V0RmFpbHVyZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmV4cG9ydCAqIGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvZXJyb3JzJztcbmV4cG9ydCB7XG4gIEFjdGl2aXR5RnVuY3Rpb24sXG4gIEFjdGl2aXR5SW50ZXJmYWNlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gIFBheWxvYWQsXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgU2lnbmFsRGVmaW5pdGlvbixcbiAgVW50eXBlZEFjdGl2aXRpZXMsXG4gIFdvcmtmbG93LFxuICBXb3JrZmxvd1F1ZXJ5VHlwZSxcbiAgV29ya2Zsb3dSZXN1bHRUeXBlLFxuICBXb3JrZmxvd1JldHVyblR5cGUsXG4gIFdvcmtmbG93U2lnbmFsVHlwZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvd29ya2Zsb3ctb3B0aW9ucyc7XG5leHBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSwgQ2FuY2VsbGF0aW9uU2NvcGUsIENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucyB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmV4cG9ydCB7XG4gIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBDaGlsZFdvcmtmbG93T3B0aW9ucyxcbiAgQ29udGludWVBc05ldyxcbiAgQ29udGludWVBc05ld09wdGlvbnMsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbiAgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbixcbiAgU3RhY2tUcmFjZUZpbGVTbGljZSxcbiAgUGFyZW50Q2xvc2VQb2xpY3ksXG4gIFBhcmVudFdvcmtmbG93SW5mbyxcbiAgUm9vdFdvcmtmbG93SW5mbyxcbiAgU3RhY2tUcmFjZVNES0luZm8sXG4gIFN0YWNrVHJhY2UsXG4gIFVuc2FmZVdvcmtmbG93SW5mbyxcbiAgV29ya2Zsb3dJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgcHJveHlTaW5rcywgU2luaywgU2lua0NhbGwsIFNpbmtGdW5jdGlvbiwgU2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmV4cG9ydCB0eXBlIHsgV29ya2Zsb3dSYW5kb21TdHJlYW0gfSBmcm9tICcuL3JhbmRvbS1zdHJlYW1zJztcbmV4cG9ydCB7IGdldFJhbmRvbVN0cmVhbSwgd29ya2Zsb3dSYW5kb20gfSBmcm9tICcuL3JhbmRvbS1zdHJlYW1zJztcbmV4cG9ydCB7IGxvZyB9IGZyb20gJy4vbG9ncyc7XG5leHBvcnQgeyBUcmlnZ2VyIH0gZnJvbSAnLi90cmlnZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3cnO1xuZXhwb3J0IHsgQ2hpbGRXb3JrZmxvd0hhbmRsZSwgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSB9IGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCB7IG1ldHJpY01ldGVyIH0gZnJvbSAnLi9tZXRyaWNzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudCxcbiAgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9ucyxcbiAgTmV4dXNTZXJ2aWNlQ2xpZW50LFxuICBOZXh1c09wZXJhdGlvbkhhbmRsZSxcbiAgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxufSBmcm9tICcuL25leHVzJztcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBEZXByZWNhdGVkIEFQSXNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAgICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICAgKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gICAqL1xuXG4gIExvZ2dlclNpbmtzRGVwcmVjYXRlZCBhcyBMb2dnZXJTaW5rcyxcbn0gZnJvbSAnLi9sb2dzJztcbiIsImltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnNXaXRoLCB0eXBlIE5leHQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLyoqXG4gKiBDb21wb3NlIHdvcmtmbG93IGludGVyY2VwdG9ycyB3aGlsZSBtYWtpbmcgZXZlcnkgYG5leHQoLi4uKWAgY29udGludWF0aW9uIHJlLWVudGVyXG4gKiB0aGUgd29ya2Zsb3ctcmFuZG9tIHNjb3BlIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiB0aGF0IGNvbnRpbnVhdGlvbiB3YXMgY3JlYXRlZC5cbiAqXG4gKiBUaGlzIGlzIGludGVudGlvbmFsbHkgYSB0aGluIHdyYXBwZXIgb3ZlciB0aGUgc2hhcmVkIGludGVyY2VwdG9yIGNvbXBvc2l0aW9uIGhlbHBlclxuICogaW4gYHBhY2thZ2VzL2NvbW1vbmAuIFRoZSBzaGFyZWQgaGVscGVyIG93bnMgdGhlIGFjdHVhbCBjaGFpbi1jb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLFxuICogb3JkZXJpbmcsIGFuZCBgbmV4dCguLi4pYCB3aXJpbmcgc28gd29ya2Zsb3cgY29kZSBjYW5ub3Qgc2lsZW50bHkgZHJpZnQgYXdheSBmcm9tIHRoZVxuICogc2VtYW50aWNzIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIFNESy5cbiAqXG4gKiBUaGUgd29ya2Zsb3ctc3BlY2lmaWMgYmVoYXZpb3IgbGl2ZXMgZW50aXJlbHkgaW4gdGhlIGB3cmFwTmV4dGAgaG9vayB3ZSBwYXNzIGludG8gdGhhdFxuICogc2hhcmVkIGhlbHBlci4gRWFjaCBgbmV4dCguLi4pYCBjb250aW51YXRpb24gaGFuZGVkIHRvIGEgd29ya2Zsb3cgaW50ZXJjZXB0b3IgaXMgd3JhcHBlZFxuICogd2l0aCBgQWN0aXZhdG9yLmJpbmRDdXJyZW50UmFuZG9tKC4uLilgLCB3aGljaCBjYXB0dXJlcyB0aGUgY3VycmVudGx5IGFjdGl2ZSB3b3JrZmxvd1xuICogcmFuZG9tIHNjb3BlLCBpbmNsdWRpbmcgdGhlIGFic2VuY2Ugb2YgYW55IHNjb3BlZCBvdmVycmlkZS4gV2hlbiB0aGUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAqIGNhbGxzIGBuZXh0KC4uLilgLCB0aGUgd3JhcHBlciByZXN0b3JlcyB0aGF0IGNhcHR1cmVkIHNjb3BlIGJlZm9yZSBlbnRlcmluZyB0aGUgcmVzdCBvZlxuICogdGhlIGludGVyY2VwdG9yIGNoYWluIG9yIHRoZSBiYXNlIHdvcmtmbG93L3J1bnRpbWUgaGFuZGxlci5cbiAqXG4gKiBUaGF0IGlzIHRoZSBiZWhhdmlvciB3ZSBuZWVkIGZvciBgV29ya2Zsb3dSYW5kb21TdHJlYW0ud2l0aCguLi4pYDogYSB0ZW1wb3JhcnlcbiAqIHBsdWdpbi9pbnRlcmNlcHRvciBzY29wZSBzaG91bGQgYXBwbHkgdG8gdGhlIHBsdWdpbidzIG93biBjb2RlLCBidXQgaXQgbXVzdCBub3RcbiAqIGxlYWsgdGhyb3VnaCBgbmV4dCguLi4pYCBpbnRvIGRvd25zdHJlYW0gd29ya2Zsb3cgY29kZSB1bmxlc3MgdGhhdCBkb3duc3RyZWFtIGNvZGVcbiAqIGV4cGxpY2l0bHkgZXN0YWJsaXNoZXMgaXRzIG93biBzY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VJbnRlcmNlcHRvcnM8SSwgTSBleHRlbmRzIGtleW9mIEk+KGludGVyY2VwdG9yczogSVtdLCBtZXRob2Q6IE0sIG5leHQ6IE5leHQ8SSwgTT4pOiBOZXh0PEksIE0+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHJldHVybiBjb21wb3NlSW50ZXJjZXB0b3JzV2l0aChpbnRlcmNlcHRvcnMsIG1ldGhvZCwgbmV4dCwgKCh3cmFwcGVkTmV4dCkgPT5cbiAgICBhY3RpdmF0b3IuYmluZEN1cnJlbnRSYW5kb20od3JhcHBlZE5leHQgYXMgYW55KSkgYXMgPEYgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oXG4gICAgbmV4dDogRlxuICApID0+IEYpIGFzIHVua25vd24gYXMgTmV4dDxJLCBNPjtcbn1cbiIsIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgV29ya2Zsb3cgaW50ZXJjZXB0b3JzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFjdGl2aXR5T3B0aW9ucyxcbiAgRHVyYXRpb24sXG4gIExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICBNZXRyaWNUYWdzLFxuICBUaW1lc3RhbXAsXG4gIFdvcmtmbG93RXhlY3V0aW9uLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgSGVhZGVycywgTmV4dCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLCBDb250aW51ZUFzTmV3T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSB9IGZyb20gJy4vbmV4dXMnO1xuXG5leHBvcnQgeyBOZXh0LCBIZWFkZXJzIH07XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGluc3RhbnRpYXRlcyB7QGxpbmsgV29ya2Zsb3dJbnRlcmNlcHRvcnN9LlxuICpcbiAqIFdvcmtmbG93IGludGVyY2VwdG9yIG1vZHVsZXMgc2hvdWxkIGV4cG9ydCBhbiBgaW50ZXJjZXB0b3JzYCBmdW5jdGlvbiBvZiB0aGlzIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogZXhwb3J0IGZ1bmN0aW9uIGludGVyY2VwdG9ycygpOiBXb3JrZmxvd0ludGVyY2VwdG9ycyB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgaW5ib3VuZDogW10sICAgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIGluYm91bmQgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgICAgb3V0Ym91bmQ6IFtdLCAgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIG91dGJvdW5kIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICAgIGludGVybmFsczogW10sIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbnRlcm5hbHMgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgIH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5ID0gKCkgPT4gV29ya2Zsb3dJbnRlcmNlcHRvcnM7XG5cbi8qKlxuICogQSBtYXBwaW5nIGZyb20gaW50ZXJjZXB0b3IgdHlwZSB0byBhbiBvcHRpb25hbCBsaXN0IG9mIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW50ZXJjZXB0b3JzIHtcbiAgaW5ib3VuZD86IFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3JbXTtcbiAgb3V0Ym91bmQ/OiBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvcltdO1xuICBpbnRlcm5hbHM/OiBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yW107XG59XG5cbi8vIFdvcmtmbG93IEluYm91bmQgQ2FsbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEltcGxlbWVudCBhbnkgb2YgdGhlc2UgbWV0aG9kcyB0byBpbnRlcmNlcHQgV29ya2Zsb3cgaW5ib3VuZCBjYWxscyBsaWtlIGV4ZWN1dGlvbiwgYW5kIHNpZ25hbCBhbmQgcXVlcnkgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBleGVjdXRlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIFdvcmtmbG93IGV4ZWN1dGlvblxuICAgKi9cbiAgZXhlY3V0ZT86IChpbnB1dDogV29ya2Zsb3dFeGVjdXRlSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2V4ZWN1dGUnPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gVXBkYXRlIGhhbmRsZXIgaXMgY2FsbGVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBVcGRhdGVcbiAgICovXG4gIGhhbmRsZVVwZGF0ZT86IChpbnB1dDogVXBkYXRlSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2hhbmRsZVVwZGF0ZSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB1cGRhdGUgdmFsaWRhdG9yIGNhbGxlZFxuICAgKi9cbiAgdmFsaWRhdGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICd2YWxpZGF0ZVVwZGF0ZSc+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIGEgV29ya2Zsb3cgZXhlY3V0aW9uXG4gICAqL1xuICBoYW5kbGVTaWduYWw/OiAoaW5wdXQ6IFNpZ25hbElucHV0LCBuZXh0OiBOZXh0PFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IsICdoYW5kbGVTaWduYWwnPikgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBXb3JrZmxvdyBpcyBxdWVyaWVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBxdWVyeVxuICAgKi9cbiAgaGFuZGxlUXVlcnk/OiAoaW5wdXQ6IFF1ZXJ5SW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2hhbmRsZVF1ZXJ5Jz4pID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmV4ZWN1dGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RXhlY3V0ZUlucHV0IHtcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVVcGRhdGV9IGFuZCB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci52YWxpZGF0ZVVwZGF0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5wdXQge1xuICByZWFkb25seSB1cGRhdGVJZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlU2lnbmFsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxJbnB1dCB7XG4gIHJlYWRvbmx5IHNpZ25hbE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVRdWVyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlJbnB1dCB7XG4gIHJlYWRvbmx5IHF1ZXJ5SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLy8gV29ya2Zsb3cgT3V0Ym91bmQgQ2FsbHMgSW50ZXJjZXB0b3JzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEltcGxlbWVudCBhbnkgb2YgdGhlc2UgbWV0aG9kcyB0byBpbnRlcmNlcHQgV29ya2Zsb3cgY29kZSBjYWxscyB0byB0aGUgVGVtcG9yYWwgQVBJcywgbGlrZSBzY2hlZHVsaW5nIGFuIGFjdGl2aXR5XG4gKiBhbmQgc3RhcnRpbmcgYSB0aW1lci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSB0aW1lci5cbiAgICovXG4gIHN0YXJ0VGltZXI/OiAoaW5wdXQ6IFRpbWVySW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydFRpbWVyJz4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhbiBBY3Rpdml0eS5cbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGFjdGl2aXR5IGV4ZWN1dGlvblxuICAgKi9cbiAgc2NoZWR1bGVBY3Rpdml0eT86IChcbiAgICBpbnB1dDogQWN0aXZpdHlJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2NoZWR1bGVBY3Rpdml0eSc+XG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2NoZWR1bGVzIGEgbG9jYWwgQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlTG9jYWxBY3Rpdml0eT86IChcbiAgICBpbnB1dDogTG9jYWxBY3Rpdml0eUlucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzY2hlZHVsZUxvY2FsQWN0aXZpdHknPlxuICApID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE5leHVzT3BlcmF0aW9uPzogKFxuICAgIGlucHV0OiBTdGFydE5leHVzT3BlcmF0aW9uSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nPlxuICApID0+IFByb21pc2U8U3RhcnROZXh1c09wZXJhdGlvbk91dHB1dD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIGNoaWxkIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAgICpcbiAgICogVGhlIGludGVyY2VwdG9yIGZ1bmN0aW9uIHJldHVybnMgMiBwcm9taXNlczpcbiAgICogLSBUaGUgZmlyc3QgcmVzb2x2ZXMgd2l0aCB0aGUgYHJ1bklkYCB3aGVuIHRoZSBjaGlsZCB3b3JrZmxvdyBoYXMgc3RhcnRlZCBvciByZWplY3RzIGlmIGZhaWxlZCB0byBzdGFydC5cbiAgICogLSBUaGUgc2Vjb25kIHJlc29sdmVzIHdpdGggdGhlIHdvcmtmbG93IHJlc3VsdCB3aGVuIHRoZSBjaGlsZCB3b3JrZmxvdyBjb21wbGV0ZXMgb3IgcmVqZWN0cyBvbiBmYWlsdXJlLlxuICAgKi9cbiAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uPzogKFxuICAgIGlucHV0OiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJz5cbiAgKSA9PiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2lnbmFscyBhIGNoaWxkIG9yIGV4dGVybmFsIFdvcmtmbG93LlxuICAgKi9cbiAgc2lnbmFsV29ya2Zsb3c/OiAoXG4gICAgaW5wdXQ6IFNpZ25hbFdvcmtmbG93SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NpZ25hbFdvcmtmbG93Jz5cbiAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBjYWxscyBjb250aW51ZUFzTmV3LlxuICAgKi9cbiAgY29udGludWVBc05ldz86IChcbiAgICBpbnB1dDogQ29udGludWVBc05ld0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdjb250aW51ZUFzTmV3Jz5cbiAgKSA9PiBQcm9taXNlPG5ldmVyPjtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgYHdvcmtmbG93LmxvZ2AgbWV0aG9kcy5cbiAgICpcbiAgICogVGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgaW4gdGhpcyBjYWxsIGFyZSBhdHRhY2hlZCB0byBldmVyeSBsb2cgbWVzc2FnZS5cbiAgICovXG4gIGdldExvZ0F0dHJpYnV0ZXM/OiAoXG4gICAgaW5wdXQ6IEdldExvZ0F0dHJpYnV0ZXNJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnZ2V0TG9nQXR0cmlidXRlcyc+XG4gICkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGV2ZXJ5IHRpbWUgYSBtZXRyaWMgaXMgZW1pdHRlZCBmcm9tIGEgV29ya2Zsb3cgbWV0cmljIChpZS4gYSBtZXRyaWMgY3JlYXRlZFxuICAgKiBmcm9tIHtAbGluayB3b3JrZmxvdy5tZXRyaWNNZXRlcn0pLlxuICAgKlxuICAgKiBUYWdzIHJldHVybmVkIGJ5IHRoaXMgaG9vayBhcmUgX3ByZXBlbmRlZF8gdG8gdGFncyBkZWZpbmVkIGF0IHRoZSBtZXRyaWMgbGV2ZWwgYW5kIHRhZ3NcbiAgICogZGVmaW5lZCBvbiB0aGUgZW1pdHRlciBmdW5jdGlvbiBpdHNlbGYuXG4gICAqL1xuICBnZXRNZXRyaWNUYWdzPzogKFxuICAgIGlucHV0OiBHZXRNZXRyaWNUYWdzSW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2dldE1ldHJpY1RhZ3MnPlxuICApID0+IE1ldHJpY1RhZ3M7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydFRpbWVyfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVySW5wdXQge1xuICByZWFkb25seSBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBvcHRpb25zPzogVGltZXJPcHRpb25zO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgdGltZXIgKGkuZS4gc2xlZXApXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZSBsaW5lIHN1bW1hcnkgb2YgdGhlIGNvbW1hbmQncyBwdXJwb3NlXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUFjdGl2aXR5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZpdHlUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgb3B0aW9uczogQWN0aXZpdHlPcHRpb25zO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNjaGVkdWxlTG9jYWxBY3Rpdml0eX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxBY3Rpdml0eUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZpdHlUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBvcmlnaW5hbFNjaGVkdWxlVGltZT86IFRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnROZXh1c09wZXJhdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbklucHV0IHtcbiAgcmVhZG9ubHkgaW5wdXQ6IHVua25vd247XG4gIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIE5leHVzIE9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZW5kIHRvIGVuZCB0aW1lb3V0IGZvciB0aGUgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgVGVtcG9yYWwgc2VydmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG1heSB3YWl0IGJlZm9yZSBpdCBiZWdpbnMgZXhlY3V0aW5nLiBJZiB0aGUgb3BlcmF0aW9uIGhhcyBub3Qgc3RhcnRlZFxuICAgKiB3aXRoaW4gdGhpcyB3aW5kb3csIGEgdGltZW91dCBlcnJvciB3aXRoIHR5cGUgU0NIRURVTEVfVE9fU1RBUlQgaXMgcmFpc2VkLlxuICAgKlxuICAgKiBPcHRpb25hbDogZGVmYXVsdHMgdG8gbm8gdGltZW91dC5cbiAgICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IGxvbmcgYW4gYXN5bmMgb3BlcmF0aW9uIG1heSB0YWtlIHRvIGNvbXBsZXRlIGFmdGVyIGl0IGhhcyBzdGFydGVkLiBJZiB0aGUgb3BlcmF0aW9uIGRvZXNcbiAgICogbm90IGNvbXBsZXRlIHdpdGhpbiB0aGlzIHdpbmRvdywgYSB0aW1lb3V0IGVycm9yIHdpdGggdHlwZSBTVEFSVF9UT19DTE9TRSBpcyByYWlzZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsOiBkZWZhdWx0cyB0byBubyB0aW1lb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBOZXh1cyBPcGVyYXRpb25cbiAgICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgT3BlcmF0aW9uJ3MgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIGJhY2sgdG8gdGhlIFdvcmtmbG93XG4gICAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0IHByb21pc2UgZmFpbCB3aXRoIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZWAsXG4gICAqICAgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICAgKiBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICAgKiBPcGVyYXRpb24gY2FsbCB3YXMgbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIHJlYWRvbmx5IGNhbmNlbGxhdGlvblR5cGU/OiBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgTmV4dXMgT3BlcmF0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3V0cHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnROZXh1c09wZXJhdGlvbn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnROZXh1c09wZXJhdGlvbk91dHB1dCB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4gZm9yIHRoZSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIFVuZGVmaW5lZCBpZiB0aGUgTmV4dXMgT3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5LCBpbiB3aGljaCBjYXNlIHRoZSB7QGxpbmsgcmVzdWx0fVxuICAgKiB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlc29sdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBOZXh1cyBPcGVyYXRpb24gY29tcGxldGVzLCBlaXRoZXIgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZVxuICAgKiBPcGVyYXRpb24gaWYgaXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3IgYSBmYWlsdXJlIGlmIHRoZSBOZXh1cyBPcGVyYXRpb24gZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdWx0OiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zaWduYWxXb3JrZmxvd30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsV29ya2Zsb3dJbnB1dCB7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgdGFyZ2V0OlxuICAgIHwge1xuICAgICAgICByZWFkb25seSB0eXBlOiAnZXh0ZXJuYWwnO1xuICAgICAgICByZWFkb25seSB3b3JrZmxvd0V4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6ICdjaGlsZCc7XG4gICAgICAgIHJlYWRvbmx5IGNoaWxkV29ya2Zsb3dJZDogc3RyaW5nO1xuICAgICAgfTtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmNvbnRpbnVlQXNOZXd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVlQXNOZXdJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ29udGludWVBc05ld0lucHV0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmNvbnRpbnVlQXNOZXd9LlxuICovXG5leHBvcnQgdHlwZSBDb250aW51ZUFzTmV3SW5wdXRPcHRpb25zID0gQ29udGludWVBc05ld09wdGlvbnMgJiBSZXF1aXJlZDxQaWNrPENvbnRpbnVlQXNOZXdPcHRpb25zLCAnd29ya2Zsb3dUeXBlJz4+O1xuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuZ2V0TG9nQXR0cmlidXRlc30uXG4gKi9cbmV4cG9ydCB0eXBlIEdldExvZ0F0dHJpYnV0ZXNJbnB1dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuZ2V0TWV0cmljVGFnc30uXG4gKi9cbmV4cG9ydCB0eXBlIEdldE1ldHJpY1RhZ3NJbnB1dCA9IE1ldHJpY1RhZ3M7XG5cbi8vIFdvcmtmbG93IEludGVybmFscyBJbnRlcmNlcHRvcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEludGVyY2VwdG9yIGZvciB0aGUgaW50ZXJuYWxzIG9mIHRoZSBXb3JrZmxvdyBydW50aW1lLlxuICpcbiAqIFVzZSB0byBtYW5pcHVsYXRlIG9yIHRyYWNlIFdvcmtmbG93IGFjdGl2YXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgaXMgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcyBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIFdvcmtmbG93IHJ1bnRpbWUgcnVucyBhIFdvcmtmbG93QWN0aXZhdGlvbkpvYi5cbiAgICovXG4gIGFjdGl2YXRlPyhpbnB1dDogQWN0aXZhdGVJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnYWN0aXZhdGUnPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBhbGwgYFdvcmtmbG93QWN0aXZhdGlvbkpvYmBzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGFuIGFjdGl2YXRpb24uXG4gICAqXG4gICAqIENhbiBtYW5pcHVsYXRlIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYnkgdGhlIFdvcmtmbG93XG4gICAqL1xuICBjb25jbHVkZUFjdGl2YXRpb24/KGlucHV0OiBDb25jbHVkZUFjdGl2YXRpb25JbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnY29uY2x1ZGVBY3RpdmF0aW9uJz4pOiBDb25jbHVkZUFjdGl2YXRpb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBiZWZvcmUgZGlzcG9zaW5nIHRoZSBXb3JrZmxvdyBpc29sYXRlIGNvbnRleHQuXG4gICAqXG4gICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGFueSByZXNvdXJjZSBjbGVhbnVwLlxuICAgKi9cbiAgZGlzcG9zZT8oaW5wdXQ6IERpc3Bvc2VJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnZGlzcG9zZSc+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuYWN0aXZhdGV9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGVJbnB1dCB7XG4gIHJlYWRvbmx5IGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uO1xuICByZWFkb25seSBiYXRjaEluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmRpc3Bvc2V9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zZUlucHV0IHt9XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmNvbmNsdWRlQWN0aXZhdGlvbn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jbHVkZUFjdGl2YXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbn1cblxuLyoqXG4gKiBPdXRwdXQgZm9yIHtAbGluayBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmNvbmNsdWRlQWN0aXZhdGlvbn1cbiAqL1xuZXhwb3J0IHR5cGUgQ29uY2x1ZGVBY3RpdmF0aW9uT3V0cHV0ID0gQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQ7XG4iLCJpbXBvcnQgdHlwZSB7IFJhd1NvdXJjZU1hcCB9IGZyb20gJ3NvdXJjZS1tYXAnO1xuaW1wb3J0IHR5cGUge1xuICBSZXRyeVBvbGljeSxcbiAgQ29tbW9uV29ya2Zsb3dPcHRpb25zLFxuICBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSxcbiAgU2VhcmNoQXR0cmlidXRlcyxcbiAgU2lnbmFsRGVmaW5pdGlvbixcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgUXVlcnlEZWZpbml0aW9uLFxuICBEdXJhdGlvbixcbiAgVmVyc2lvbmluZ0ludGVudCxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBQcmlvcml0eSxcbiAgV29ya2VyRGVwbG95bWVudFZlcnNpb24sXG4gIFZlcnNpb25pbmdCZWhhdmlvcixcbiAgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcixcbiAgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdy9lbnVtcy1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBXb3JrZmxvdyBFeGVjdXRpb24gaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0luZm8ge1xuICAvKipcbiAgICogSUQgb2YgdGhlIFdvcmtmbG93LCB0aGlzIGNhbiBiZSBzZXQgYnkgdGhlIGNsaWVudCBkdXJpbmcgV29ya2Zsb3cgY3JlYXRpb24uXG4gICAqIEEgc2luZ2xlIFdvcmtmbG93IG1heSBydW4gbXVsdGlwbGUgdGltZXMgZS5nLiB3aGVuIHNjaGVkdWxlZCB3aXRoIGNyb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEIG9mIGEgc2luZ2xlIFdvcmtmbG93IHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV29ya2Zsb3cgZnVuY3Rpb24ncyBuYW1lXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBzZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzO1xuXG4gIC8qKlxuICAgKiBJbmRleGVkIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24sIGV4cG9zZWQgdGhyb3VnaCBhbiBpbnRlcmZhY2UuXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVkU2VhcmNoQXR0cmlidXRlczogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzO1xuXG4gIC8qKlxuICAgKiBOb24taW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBtZW1vPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpbmZvIChwcmVzZW50IGlmIHRoaXMgaXMgYSBDaGlsZCBXb3JrZmxvdylcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudD86IFBhcmVudFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogVGhlIHJvb3Qgd29ya2Zsb3cgZXhlY3V0aW9uLCBkZWZpbmVkIGFzIGZvbGxvd3M6XG4gICAqIDEuIEEgd29ya2Zsb3cgd2l0aG91dCBhIHBhcmVudCB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3cuXG4gICAqIDIuIEEgd29ya2Zsb3cgd2l0aCBhIHBhcmVudCB3b3JrZmxvdyBoYXMgdGhlIHNhbWUgcm9vdCB3b3JrZmxvdyBhc1xuICAgKiBpdHMgcGFyZW50LlxuICAgKlxuICAgKiBXaGVuIHRoZXJlIGlzIG5vIHBhcmVudCB3b3JrZmxvdywgaS5lLiwgdGhlIHdvcmtmbG93IGlzIGl0cyBvd24gcm9vdCB3b3JrZmxvdyxcbiAgICogdGhpcyBmaWVsZCBpcyBgdW5kZWZpbmVkYC5cbiAgICpcbiAgICogTm90ZSB0aGF0IENvbnRpbnVlLWFzLU5ldyAob3IgcmVzZXQpIHByb3BhZ2F0ZXMgdGhlIHdvcmtmbG93IHBhcmVudGFnZSByZWxhdGlvbnNoaXAsXG4gICAqIGFuZCB0aGVyZWZvcmUsIHdoZXRoZXIgdGhlIG5ldyB3b3JrZmxvdyBoYXMgdGhlIHNhbWUgcm9vdCB3b3JrZmxvdyBhcyB0aGUgb3JpZ2luYWwgb25lXG4gICAqIGRlcGVuZHMgb24gd2hldGhlciBpdCBoYWQgYSBwYXJlbnQuXG4gICAqXG4gICAqL1xuICByZWFkb25seSByb290PzogUm9vdFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogUmVzdWx0IGZyb20gdGhlIHByZXZpb3VzIFJ1biAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ3JvbiBXb3JrZmxvdyBvciB3YXMgQ29udGludWVkIEFzIE5ldykuXG4gICAqXG4gICAqIEFuIGFycmF5IG9mIHZhbHVlcywgc2luY2Ugb3RoZXIgU0RLcyBtYXkgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyBmcm9tIGEgV29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBsYXN0UmVzdWx0PzogdW5rbm93bjtcblxuICAvKipcbiAgICogRmFpbHVyZSBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgd2hlbiB0aGlzIFJ1biBpcyBhIHJldHJ5LCBvciB0aGUgbGFzdCBSdW4gb2YgYSBDcm9uIFdvcmtmbG93IGZhaWxlZClcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RGYWlsdXJlPzogRXJyb3I7XG5cbiAgLyoqXG4gICAqIExlbmd0aCBvZiBXb3JrZmxvdyBoaXN0b3J5IHVwIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogWW91IG1heSBzYWZlbHkgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGVjaWRlIHdoZW4gdG8ge0BsaW5rIGNvbnRpbnVlQXNOZXd9LlxuICAgKi9cbiAgcmVhZG9ubHkgaGlzdG9yeUxlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIFdvcmtmbG93IGhpc3RvcnkgaW4gYnl0ZXMgdW50aWwgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgb25seSBvbiBUZW1wb3JhbCBTZXJ2ZXIgMS4yMCssIGFsd2F5cyB6ZXJvIG9uIG9sZGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlTaXplOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgaGludCBwcm92aWRlZCBieSB0aGUgY3VycmVudCBXb3JrZmxvd1Rhc2tTdGFydGVkIGV2ZW50IHJlY29tbWVuZGluZyB3aGV0aGVyIHRvXG4gICAqIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgb25seSBvbiBUZW1wb3JhbCBTZXJ2ZXIgMS4yMCssIGFsd2F5cyBgZmFsc2VgIG9uIG9sZGVyIHNlcnZlcnMuXG4gICAqL1xuICByZWFkb25seSBjb250aW51ZUFzTmV3U3VnZ2VzdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdydzIFRhcmdldCBXb3JrZXIgRGVwbG95bWVudCBWZXJzaW9uIGhhcyBjaGFuZ2VkIGZyb20gaXRzIFBpbm5lZCBWZXJzaW9uLlxuICAgKiBXaGVuIHRydWUsIHRoZSB3b3JrZmxvdyBzaG91bGQgY29uc2lkZXIgY29udGludWluZy1hcy1uZXcgd2l0aFxuICAgKiBgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjogJ0FVVE9fVVBHUkFERSdgIHRvIG1vdmUgdG8gdGhlIG5ldyB2ZXJzaW9uLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXBncmFkZS1vbi1Db250aW51ZS1hcy1OZXcgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0V29ya2VyRGVwbG95bWVudFZlcnNpb25DaGFuZ2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE1heSBiZSByZW1vdmVkIG9yIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZENvbnRpbnVlQXNOZXdSZWFzb25zPzogU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb25bXTtcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSB0aGlzIFdvcmtmbG93IGlzIGV4ZWN1dGluZyBvblxuICAgKi9cbiAgcmVhZG9ubHkgdGFza1F1ZXVlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzcGFjZSB0aGlzIFdvcmtmbG93IGlzIGV4ZWN1dGluZyBpblxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1biBJZCBvZiB0aGUgZmlyc3QgUnVuIGluIHRoaXMgRXhlY3V0aW9uIENoYWluXG4gICAqL1xuICByZWFkb25seSBmaXJzdEV4ZWN1dGlvblJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IFJ1biBJZCBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVkRnJvbUV4ZWN1dGlvblJ1bklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoaXMgW1dvcmtmbG93IEV4ZWN1dGlvbiBDaGFpbl0oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtmbG93cyN3b3JrZmxvdy1leGVjdXRpb24tY2hhaW4pIHdhcyBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBzdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhlIGN1cnJlbnQgV29ya2Zsb3cgUnVuIHN0YXJ0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1blN0YXJ0VGltZTogRGF0ZTtcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIFNlcnZlci4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25UaW1lb3V0TXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiBleHBpcmVzXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25FeHBpcmF0aW9uVGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgUnVuIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgV29ya2Zsb3cgVGFzayBpbiBtaWxsaXNlY29uZHMuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd1Rhc2tUaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tUaW1lb3V0TXM6IG51bWJlcjtcblxuICAvKipcbiAgICogUmV0cnkgUG9saWN5IGZvciB0aGlzIEV4ZWN1dGlvbi4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLnJldHJ5fS5cbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5UG9saWN5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhdCAxIGFuZCBpbmNyZW1lbnRzIGZvciBldmVyeSByZXRyeSBpZiB0aGVyZSBpcyBhIGByZXRyeVBvbGljeWBcbiAgICovXG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JvbiBTY2hlZHVsZSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5jcm9uU2NoZWR1bGV9LlxuICAgKi9cbiAgcmVhZG9ubHkgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYmV0d2VlbiBDcm9uIFJ1bnNcbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZVRvU2NoZWR1bGVJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEJ1aWxkIElEIG9mIHRoZSB3b3JrZXIgd2hpY2ggZXhlY3V0ZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay4gTWF5IGJlIHVuZGVmaW5lZCBpZiB0aGVcbiAgICogdGFzayB3YXMgY29tcGxldGVkIGJ5IGEgd29ya2VyIHdpdGhvdXQgYSBCdWlsZCBJRC4gSWYgdGhpcyB3b3JrZXIgaXMgdGhlIG9uZSBleGVjdXRpbmcgdGhpc1xuICAgKiB0YXNrIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgaGFzIGEgQnVpbGQgSUQgc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZVxuICAgKiBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBjdXJyZW50RGVwbG95bWVudFZlcnNpb25gIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRCdWlsZElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGVwbG95bWVudCBWZXJzaW9uIG9mIHRoZSB3b3JrZXIgd2hpY2ggZXhlY3V0ZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay4gTWF5IGJlIHVuZGVmaW5lZFxuICAgKiBpZiB0aGUgdGFzayB3YXMgY29tcGxldGVkIGJ5IGEgd29ya2VyIHdpdGhvdXQgYSBEZXBsb3ltZW50IFZlcnNpb24uIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmVcbiAgICogZXhlY3V0aW5nIHRoaXMgdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIERlcGxveW1lbnQgVmVyc2lvbiBzZXQsIHRoZW4gaXRzIElEIHdpbGwgYmVcbiAgICogdXNlZC4gVGhpcyB2YWx1ZSBtYXkgY2hhbmdlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSB3b3JrZmxvdyBydW4sIGJ1dCBpcyBkZXRlcm1pbmlzdGljIGFuZFxuICAgKiBzYWZlIHRvIHVzZSBmb3IgYnJhbmNoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudERlcGxveW1lbnRWZXJzaW9uPzogV29ya2VyRGVwbG95bWVudFZlcnNpb247XG5cbiAgcmVhZG9ubHkgdW5zYWZlOiBVbnNhZmVXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgd29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogVW5zYWZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbi5cbiAqXG4gKiBOZXZlciByZWx5IG9uIHRoaXMgaW5mb3JtYXRpb24gaW4gV29ya2Zsb3cgbG9naWMgYXMgaXQgd2lsbCBjYXVzZSBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnNhZmVXb3JrZmxvd0luZm8ge1xuICAvKipcbiAgICogQ3VycmVudCBzeXN0ZW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICpcbiAgICogVGhlIHNhZmUgdmVyc2lvbiBvZiB0aW1lIGlzIGBuZXcgRGF0ZSgpYCBhbmQgYERhdGUubm93KClgLCB3aGljaCBhcmUgc2V0IG9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIGEgV29ya2Zsb3dcbiAgICogVGFzayBhbmQgc3RheSBjb25zdGFudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBUYXNrIGFuZCBkdXJpbmcgcmVwbGF5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcuXG4gICAqL1xuICByZWFkb25seSBpc1JlcGxheWluZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cgaXMgY3VycmVudGx5IHJlcGxheWluZyBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHtAbGluayBpc1JlcGxheWluZ30sIGJ1dCByZXR1cm5zIGBmYWxzZWAgZHVyaW5nIHF1ZXJ5IGhhbmRsZXJzIGFuZCB1cGRhdGVcbiAgICogdmFsaWRhdG9ycywgd2hpY2ggYXJlIGxpdmUgcmVhZC1vbmx5IG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYXMgcmVwbGF5aW5nXG4gICAqIGhpc3RvcnkgZXZlbnRzLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgdHJ1ZSwgd29ya2Zsb3cgbG9nIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkIGFuZCBzaW5rcyBkZWZpbmVkIHdpdGhcbiAgICogY2FsbER1cmluZ1JlcGxheT1mYWxzZSB3b24ndCBnZXQgcHJvY2Vzc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgd29ya2Zsb3cgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUluZm8ge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFdvcmtmbG93SW5mbyB7XG4gIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdFdvcmtmbG93SW5mbyB7XG4gIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBOb3QgYW4gYWN0dWFsIGVycm9yLCB1c2VkIGJ5IHRoZSBXb3JrZmxvdyBydW50aW1lIHRvIGFib3J0IGV4ZWN1dGlvbiB3aGVuIHtAbGluayBjb250aW51ZUFzTmV3fSBpcyBjYWxsZWRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdDb250aW51ZUFzTmV3JylcbmV4cG9ydCBjbGFzcyBDb250aW51ZUFzTmV3IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JQ29udGludWVBc05ld1dvcmtmbG93RXhlY3V0aW9uKSB7XG4gICAgc3VwZXIoJ1dvcmtmbG93IGNvbnRpbnVlZCBhcyBuZXcnKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnRpbnVpbmcgYSBXb3JrZmxvdyBhcyBuZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFdvcmtmbG93IHR5cGUgbmFtZSwgZS5nLiB0aGUgZmlsZW5hbWUgaW4gdGhlIE5vZGUuanMgU0RLIG9yIGNsYXNzIG5hbWUgaW4gSmF2YVxuICAgKi9cbiAgd29ya2Zsb3dUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGFzayBxdWV1ZSB0byBjb250aW51ZSB0aGUgV29ya2Zsb3cgaW5cbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIHRoZSBlbnRpcmUgV29ya2Zsb3cgcnVuXG4gICAqIEBmb3JtYXQge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGltZW91dCBmb3IgYSBzaW5nbGUgV29ya2Zsb3cgdGFza1xuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1Rhc2tUaW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBOb24tc2VhcmNoYWJsZSBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byBuZXh0IFdvcmtmbG93IHJ1blxuICAgKi9cbiAgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogU2VhcmNoYWJsZSBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byBuZXh0IFdvcmtmbG93IHJ1blxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZC5cbiAgICovXG4gIHNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVzO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqIE5vdGUgdGhhdCBzZWFyY2ggYXR0cmlidXRlcyBhcmUgbm90IGVuY29kZWQsIGFzIHN1Y2gsIGRvIG5vdCBpbmNsdWRlIGFueSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIElmIGJvdGgge0BsaW5rIHNlYXJjaEF0dHJpYnV0ZXN9IGFuZCB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBhcmUgcHJvdmlkZWQsIGNvbmZsaWN0aW5nIGtleXMgd2lsbCBiZSBvdmVyd3JpdHRlblxuICAgKiBieSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfS5cbiAgICovXG4gIHR5cGVkU2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSB8IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgV29ya2Zsb3cgc2hvdWxkXG4gICAqIENvbnRpbnVlLWFzLU5ldyBvbnRvIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSB2ZXJzaW9uaW5nIGJlaGF2aW9yIHRvIGJlIHVzZWQgYnkgdGhlIGZpcnN0IHRhc2sgb2YgYSBuZXcgd29ya2Zsb3cgcnVuIGluIGEgY29udGludWUtYXMtbmV3IGNoYWluLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFZlcnNpb25pbmcgc2VtYW50aWNzIHdpdGggY29udGludWUtYXMtbmV3IGFyZSBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I/OiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yO1xufVxuXG4vKipcbiAqIERldGVybWluZXM6XG4gKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIGFuZFxuICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgQ2hpbGQncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgUGFyZW50IFdvcmtmbG93XG4gKiAgIChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlIHtAbGluayBleGVjdXRlQ2hpbGR9J3Mgb3Ige0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fSdzXG4gKiAgIHByb21pc2UgZmFpbCB3aXRoIGEgYENoaWxkV29ya2Zsb3dGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gKiBQYXJlbnQgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAqIENoaWxkIFdvcmtmbG93IGNhbGwgd2FzIG1hZGUuIEV2ZW50dWFsIENhbmNlbGxhdGlvbiBvZiBhIENoaWxkIFdvcmtmbG93IG9uIGNvbXBsZXRpb24gb2YgdGhlXG4gKiBQYXJlbnQgV29ya2Zsb3cgaXMgY29udHJvbGxlZCBieSB0aGUge0BsaW5rIFBhcmVudENsb3NlUG9saWN5fSBzZXR0aW5nLlxuICpcbiAqIEBkZWZhdWx0IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQ2hpbGRXb3JrZmxvd09wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgZmllbGRcbmV4cG9ydCBjb25zdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHRvIHRoZSBDaGlsZCwgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydCBjYW5jZWxsYXRpb25cbiAgICogdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIHlldCBfaW1tZWRpYXRlbHlfIHJlcG9ydFxuICAgKiBjYW5jZWxsYXRpb24gdG8gdGhlIGNhbGxlciwgaS5lLiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uXG4gICAqIHJlcXVlc3QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIGNhbmNlbGxhdGlvbiB0eXBlIHByb3ZpZGVzIG5vIGd1YXJhbnRlZSwgZnJvbSB0aGUgUGFyZW50LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYWN0dWFsbHkgYmUgYXRvbWljYWxseSBhZGRlZCB0byB0aGUgQ2hpbGQgd29ya2Zsb3cncyBoaXN0b3J5LlxuICAgKiBJbiBwYXJ0aWN1bGFyLCB0aGUgQ2hpbGQgbWF5IGNvbXBsZXRlIChlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHVuY2Vzc2Z1bGx5KSBiZWZvcmUgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgUGFyZW50IHdvcmtmbG93IHRoaW5rcyBpdHMgY2hpbGRcbiAgICogd2FzIGNhbmNlbGxlZCwgYnV0IHRoZSBjaGlsZCBhY3R1YWxseSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBUbyBndWFyYW50ZWUgdGhhdCB0aGUgQ2hpbGQgd2lsbCBldmVudHVhbGx5IGJlIG5vdGlmaWVkIG9mIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgdGhlbiB3YWl0IGZvciB0aGUgc2VydmVyXG4gICAqIHRvIGNvbmZpcm0gdGhhdCB0aGUgQ2hpbGQgV29ya2Zsb3cgY2FuY2VsbGF0aW9uIHJlcXVlc3Qgd2FzIHJlY29yZGVkIGluIGl0cyBoaXN0b3J5LlxuICAgKlxuICAgKiBUaGlzIGNhbmNlbGxhdGlvbiB0eXBlIGd1YXJhbnRlZXMgdGhhdCB0aGUgQ2hpbGQgd2lsbCBldmVudHVhbGx5IGJlIG5vdGlmaWVkIG9mIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCAodGhhdCBpcywgdW5sZXNzIHRoZSBDaGlsZCB0ZXJtaW5hdGVzIGluYmV0d2VlbiBkdWUgdG8gdW5leHBlY3RlZCBjYXVzZXMpLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIHRoZW4gd2FpdCBmb3IgY29tcGxldGlvblxuICAgKiBvZiB0aGUgQ2hpbGQgV29ya2Zsb3cuXG4gICAqXG4gICAqIFRoZSBDaGlsZCBtYXkgcmVzcGVjdCBjYW5jZWxsYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIFBhcmVudCdzIGBleGVjdXRlQ2hpbGRgIG9yXG4gICAqIGBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdGAgcHJvbWlzZSB3aWxsIGZhaWwgd2l0aCBhIGBDaGlsZFdvcmtmbG93RmFpbHVyZWAsIHdpdGggYGNhdXNlYFxuICAgKiBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWAuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgQ2hpbGQgbWF5IGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsXG4gICAqIGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJvbWlzZSB3aWxsIGVpdGhlciByZXNvbHZlIHdpdGggYSByZXN1bHQgKGlmIENoaWxkIGNvbXBsZXRlZFxuICAgKiBzdWNjZXNzZnVsbHkpIG9yIHJlamVjdCB3aXRoIGEgZGlmZmVyZW50IGNhdXNlIChpZiBDaGlsZCBjb21wbGV0ZWQgdW5jZXNzZnVsbHkpLlxuICAgKlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSA9XG4gICh0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZV07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLCBkZWNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLkFCQU5ET05dOiAwLFxuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMSxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXTogMixcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEXTogMyxcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG5cbi8qKlxuICogSG93IGEgQ2hpbGQgV29ya2Zsb3cgcmVhY3RzIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3cgcmVhY2hpbmcgYSBDbG9zZWQgc3RhdGUuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYS1wYXJlbnQtY2xvc2UtcG9saWN5LyB8IFBhcmVudCBDbG9zZSBQb2xpY3l9XG4gKi9cbmV4cG9ydCBjb25zdCBQYXJlbnRDbG9zZVBvbGljeSA9IHtcbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBUZXJtaW5hdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICovXG4gIFJFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBJZiBhIGBQYXJlbnRDbG9zZVBvbGljeWAgaXMgc2V0IHRvIHRoaXMsIG9yIGlzIG5vdCBzZXQgYXQgYWxsLCB0aGUgc2VydmVyIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHNldCBhbiBleHBsaWNpdCBwb2xpY3kgaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIFRlcm1pbmF0ZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCBub3RoaW5nIGlzIGRvbmUgdG8gdGhlIENoaWxkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LkFCQU5ET059IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5SRVFVRVNUX0NBTkNFTH0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGFyZW50Q2xvc2VQb2xpY3kgPSAodHlwZW9mIFBhcmVudENsb3NlUG9saWN5KVtrZXlvZiB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ldO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSwgZGVjb2RlUGFyZW50Q2xvc2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsXG4gICAgW1BhcmVudENsb3NlUG9saWN5LkFCQU5ET05dOiAyLFxuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5SRVFVRVNUX0NBTkNFTF06IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdQQVJFTlRfQ0xPU0VfUE9MSUNZXydcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRXb3JrZmxvd09wdGlvbnMgZXh0ZW5kcyBPbWl0PENvbW1vbldvcmtmbG93T3B0aW9ucywgJ3dvcmtmbG93SWRDb25mbGljdFBvbGljeSc+IHtcbiAgLyoqXG4gICAqIFdvcmtmbG93IGlkIHRvIHVzZSB3aGVuIHN0YXJ0aW5nLiBJZiBub3Qgc3BlY2lmaWVkIGEgVVVJRCBpcyBnZW5lcmF0ZWQuIE5vdGUgdGhhdCBpdCBpc1xuICAgKiBkYW5nZXJvdXMgYXMgaW4gY2FzZSBvZiBjbGllbnQgc2lkZSByZXRyaWVzIG5vIGRlZHVwbGljYXRpb24gd2lsbCBoYXBwZW4gYmFzZWQgb24gdGhlXG4gICAqIGdlbmVyYXRlZCBpZC4gU28gcHJlZmVyIGFzc2lnbmluZyBidXNpbmVzcyBtZWFuaW5nZnVsIGlkcyBpZiBwb3NzaWJsZS5cbiAgICovXG4gIHdvcmtmbG93SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gdXNlIGZvciBXb3JrZmxvdyB0YXNrcy4gSXQgc2hvdWxkIG1hdGNoIGEgdGFzayBxdWV1ZSBzcGVjaWZpZWQgd2hlbiBjcmVhdGluZyBhXG4gICAqIGBXb3JrZXJgIHRoYXQgaG9zdHMgdGhlIFdvcmtmbG93IGNvZGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGEgY2hpbGQgaXMgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIFRhc2sgUXVldWUgYXMgdGhlIHBhcmVudC5cbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCBhbmRcbiAgICogLSB3aGV0aGVyIGFuZCB3aGVuIHNob3VsZCB0aGUgQ2hpbGQncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgUGFyZW50IFdvcmtmbG93XG4gICAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUge0BsaW5rIGV4ZWN1dGVDaGlsZH0ncyBvciB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHR9J3NcbiAgICogICBwcm9taXNlIGZhaWwgd2l0aCBhIGBDaGlsZFdvcmtmbG93RmFpbHVyZWAsIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAgICogUGFyZW50IFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gICAqIENoaWxkIFdvcmtmbG93IGNhbGwgd2FzIG1hZGUuIEV2ZW50dWFsIENhbmNlbGxhdGlvbiBvZiBhIENoaWxkIFdvcmtmbG93IG9uIGNvbXBsZXRpb24gb2YgdGhlXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpcyBjb250cm9sbGVkIGJ5IHRoZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3l9IHNldHRpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICAgKi9cbiAgLy8gTUFJTlRFTkFOQ0U6IEtlZXAgdGhpcyB0eXBlZG9jIGluIHN5bmMgd2l0aCB0aGUgYENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyB0aGUgQ2hpbGQgcmVhY3RzIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3cgcmVhY2hpbmcgYSBDbG9zZWQgc3RhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IFBhcmVudENsb3NlUG9saWN5LlBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFXG4gICAqL1xuICBwYXJlbnRDbG9zZVBvbGljeT86IFBhcmVudENsb3NlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIENoaWxkIFdvcmtmbG93IHNob3VsZCBydW4gb25cbiAgICogYSB3b3JrZXIgd2l0aCBhIGNvbXBhdGlibGUgQnVpbGQgSWQgb3Igbm90LiBTZWUge0BsaW5rIFZlcnNpb25pbmdJbnRlbnR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ09NUEFUSUJMRSdcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gICAqL1xuICB2ZXJzaW9uaW5nSW50ZW50PzogVmVyc2lvbmluZ0ludGVudDtcbn1cblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRDaGlsZFdvcmtmbG93T3B0aW9ucyA9IFJlcXVpcmVkPFBpY2s8Q2hpbGRXb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkJyB8ICdjYW5jZWxsYXRpb25UeXBlJz4+ICYge1xuICBhcmdzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyA9IENoaWxkV29ya2Zsb3dPcHRpb25zICYgUmVxdWlyZWRDaGlsZFdvcmtmbG93T3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlU0RLSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzbGljZSBvZiBhIGZpbGUgc3RhcnRpbmcgYXQgbGluZU9mZnNldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlU2xpY2Uge1xuICAvKipcbiAgICogT25seSB1c2VkIHBvc3NpYmxlIHRvIHRyaW0gdGhlIGZpbGUgd2l0aG91dCBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLlxuICAgKi9cbiAgbGluZV9vZmZzZXQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIHNsaWNlIG9mIGEgZmlsZSB3aXRoIGBcXG5gIChuZXdsaW5lKSBsaW5lIHRlcm1pbmF0b3IuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gYSBmaWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHNvdXJjZSBmaWxlIChhYnNvbHV0ZSBvciByZWxhdGl2ZSkuXG4gICAqIFdoZW4gdXNpbmcgYSByZWxhdGl2ZSBwYXRoLCBtYWtlIHN1cmUgYWxsIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgc2FtZSByb290LlxuICAgKi9cbiAgZmlsZV9wYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLCByZXF1aXJlZCBmb3IgZGlzcGxheWluZyB0aGUgY29kZSBsb2NhdGlvbi5cbiAgICovXG4gIGxpbmU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBwb3NzaWJsZSwgU0RLIHNob3VsZCBzZW5kIHRoaXMuXG4gICAqL1xuICBjb2x1bW4/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBuYW1lIHRoaXMgbGluZSBiZWxvbmdzIHRvIChpZiBhcHBsaWNhYmxlKS5cbiAgICogVXNlZCBmb3IgZmFsbGluZyBiYWNrIHRvIHN0YWNrIHRyYWNlIHZpZXcuXG4gICAqL1xuICBmdW5jdGlvbl9uYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogRmxhZyB0byBtYXJrIHRoaXMgYXMgaW50ZXJuYWwgU0RLIGNvZGUgYW5kIGhpZGUgYnkgZGVmYXVsdCBpbiB0aGUgVUkuXG4gICAqL1xuICBpbnRlcm5hbF9jb2RlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2Uge1xuICBsb2NhdGlvbnM6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBVc2VkIGFzIHRoZSByZXN1bHQgZm9yIHRoZSBlbmhhbmNlZCBzdGFjayB0cmFjZSBxdWVyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VkU3RhY2tUcmFjZSB7XG4gIHNkazogU3RhY2tUcmFjZVNES0luZm87XG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGZpbGUgcGF0aCB0byBmaWxlIGNvbnRlbnRzLlxuICAgKiBTREsgbWF5IGNob29zZSB0byBzZW5kIG5vLCBzb21lIG9yIGFsbCBzb3VyY2VzLlxuICAgKiBTb3VyY2VzIG1pZ2h0IGJlIHRyaW1tZWQsIGFuZCBzb21lIHRpbWUgb25seSB0aGUgZmlsZShzKSBvZiB0aGUgdG9wIGVsZW1lbnQgb2YgdGhlIHRyYWNlIHdpbGwgYmUgc2VudC5cbiAgICovXG4gIHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFN0YWNrVHJhY2VGaWxlU2xpY2VbXT47XG4gIHN0YWNrczogU3RhY2tUcmFjZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9ucyB7XG4gIGluZm86IFdvcmtmbG93SW5mbztcbiAgcmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdO1xuICBub3c6IG51bWJlcjtcbiAgc2hvd1N0YWNrVHJhY2VTb3VyY2VzOiBib29sZWFuO1xuICBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwgZXh0ZW5kcyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBzb3VyY2VNYXA6IFJhd1NvdXJjZU1hcDtcbiAgcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXM6IFNldDxzdHJpbmc+O1xuICBnZXRUaW1lT2ZEYXkoKTogYmlnaW50O1xuICBzdGFja1RyYWNlc0VuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGNhcGFibGUgb2YgYWNjZXB0aW5nIHRoZSBhcmd1bWVudHMgZm9yIGEgZ2l2ZW4gVXBkYXRlRGVmaW5pdGlvbiwgU2lnbmFsRGVmaW5pdGlvbiBvciBRdWVyeURlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXI8XG4gIFJldCxcbiAgQXJncyBleHRlbmRzIGFueVtdLFxuICBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+IHwgU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+LFxuPiA9IFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPGluZmVyIFIsIGluZmVyIEE+XG4gID8gKC4uLmFyZ3M6IEEpID0+IFIgfCBQcm9taXNlPFI+XG4gIDogVCBleHRlbmRzIFNpZ25hbERlZmluaXRpb248aW5mZXIgQT5cbiAgICA/ICguLi5hcmdzOiBBKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPlxuICAgIDogVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxpbmZlciBSLCBpbmZlciBBPlxuICAgICAgPyAoLi4uYXJnczogQSkgPT4gUlxuICAgICAgOiBuZXZlcjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHNpZ25hbCBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLlxuICovXG5leHBvcnQgdHlwZSBEZWZhdWx0U2lnbmFsSGFuZGxlciA9IChzaWduYWxOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyB1cGRhdGUgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHVwZGF0ZSBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFVwZGF0ZUhhbmRsZXIgPSAodXBkYXRlTmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgcXVlcnkgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHF1ZXJ5IG5hbWVzLlxuICovXG5leHBvcnQgdHlwZSBEZWZhdWx0UXVlcnlIYW5kbGVyID0gKHF1ZXJ5TmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG5cbi8qKlxuICogQSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGNhcGFibGUgb2YgYWNjZXB0aW5nIHRoZSBhcmd1bWVudHMgZm9yIGEgZ2l2ZW4gVXBkYXRlRGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgVXBkYXRlVmFsaWRhdG9yPEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSAoLi4uYXJnczogQXJncykgPT4gdm9pZDtcblxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIGEgcXVlcnkgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgUXVlcnlIYW5kbGVyT3B0aW9ucyA9IHsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfTtcblxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIGEgc2lnbmFsIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNpZ25hbEhhbmRsZXJPcHRpb25zID0geyBkZXNjcmlwdGlvbj86IHN0cmluZzsgdW5maW5pc2hlZFBvbGljeT86IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5IH07XG5cbi8qKlxuICogQSB2YWxpZGF0b3IgYW5kIGRlc2NyaXB0aW9uIG9mIGFuIHVwZGF0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzIGV4dGVuZHMgYW55W10+ID0ge1xuICB2YWxpZGF0b3I/OiBVcGRhdGVWYWxpZGF0b3I8QXJncz47XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB1bmZpbmlzaGVkUG9saWN5PzogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2YXRpb25Db21wbGV0aW9uIHtcbiAgY29tbWFuZHM6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZFtdO1xuICB1c2VkSW50ZXJuYWxGbGFnczogbnVtYmVyW107XG4gIHZlcnNpb25pbmdCZWhhdmlvcj86IFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgdHlwZSB7IFJhd1NvdXJjZU1hcCB9IGZyb20gJ3NvdXJjZS1tYXAnO1xuaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0LFxuICBGYWlsdXJlQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBQcm90b0ZhaWx1cmUsXG4gIFdvcmtmbG93LFxuICBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMsXG4gIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVUeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIFZlcnNpb25pbmdCZWhhdmlvcixcbiAgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyxcbiAgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBhcnJheUZyb21QYXlsb2FkcyxcbiAgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGVuc3VyZVRlbXBvcmFsRmFpbHVyZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIElsbGVnYWxTdGF0ZUVycm9yLFxuICBUZW1wb3JhbEZhaWx1cmUsXG4gIFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcixcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBtYXBGcm9tUGF5bG9hZHMsXG4gIGZyb21QYXlsb2Fkc0F0SW5kZXgsXG4gIFJhd1ZhbHVlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHtcbiAgZGVjb2RlU2VhcmNoQXR0cmlidXRlcyxcbiAgZGVjb2RlVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2NvbnZlcnRlci9wYXlsb2FkLXNlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGssIHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHtcbiAgVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYLFxuICBTVEFDS19UUkFDRV9RVUVSWV9OQU1FLFxuICBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3Jlc2VydmVkJztcbmltcG9ydCB0eXBlIHsgUk5HIH0gZnJvbSAnLi9hbGVhJztcbmltcG9ydCB7IGFsZWEgfSBmcm9tICcuL2FsZWEnO1xuaW1wb3J0IHsgUm9vdENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJy4vaW50ZXJjZXB0b3ItY29tcG9zaXRpb24nO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UsIFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHsgZGVyaXZlQWxlYVNlZWQgfSBmcm9tICcuL3JhbmRvbS1zdHJlYW0tc2VlZCc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yLCBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmLCBpc0NhbmNlbGxhdGlvbiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgUXVlcnlJbnB1dCxcbiAgU2lnbmFsSW5wdXQsXG4gIFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQsXG4gIFVwZGF0ZUlucHV0LFxuICBXb3JrZmxvd0V4ZWN1dGVJbnB1dCxcbiAgV29ya2Zsb3dJbnRlcmNlcHRvcnMsXG59IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVmYXVsdFNpZ25hbEhhbmRsZXIsXG4gIFN0YWNrVHJhY2VTREtJbmZvLFxuICBTdGFja1RyYWNlRmlsZVNsaWNlLFxuICBTdGFja1RyYWNlRmlsZUxvY2F0aW9uLFxuICBXb3JrZmxvd0luZm8sXG4gIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsLFxuICBBY3RpdmF0aW9uQ29tcGxldGlvbixcbiAgRGVmYXVsdFVwZGF0ZUhhbmRsZXIsXG4gIERlZmF1bHRRdWVyeUhhbmRsZXIsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbnRpbnVlQXNOZXcgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHlwZSBTaW5rQ2FsbCB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHBrZyBmcm9tICcuL3BrZyc7XG5pbXBvcnQgdHlwZSB7IFNka0ZsYWcgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IGFzc2VydFZhbGlkRmxhZyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nLCBsb2cgfSBmcm9tICcuL2xvZ3MnO1xuXG5jb25zdCBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSA9IHtcbiAgV09SS0ZMT1dfQUxSRUFEWV9FWElTVFM6ICdXT1JLRkxPV19BTFJFQURZX0VYSVNUUycsXG59IGFzIGNvbnN0O1xudHlwZSBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSA9XG4gICh0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UpW2tleW9mIHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZV07XG5cbmNvbnN0IFtfZW5jb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsIGRlY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlXSA9XG4gIG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsXG4gICAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsXG4gICAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsXG4gICAgdHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgICdTVEFSVF9DSElMRF9XT1JLRkxPV19FWEVDVVRJT05fRkFJTEVEX0NBVVNFXydcbiAgPihcbiAgICB7XG4gICAgICBbU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UuV09SS0ZMT1dfQUxSRUFEWV9FWElTVFNdOiAxLFxuICAgICAgVU5TUEVDSUZJRUQ6IDAsXG4gICAgfSBhcyBjb25zdCxcbiAgICAnU1RBUlRfQ0hJTERfV09SS0ZMT1dfRVhFQ1VUSU9OX0ZBSUxFRF9DQVVTRV8nXG4gICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2sge1xuICBmb3JtYXR0ZWQ6IHN0cmluZztcbiAgc3RydWN0dXJlZDogU3RhY2tUcmFjZUZpbGVMb2NhdGlvbltdO1xufVxuXG4vKipcbiAqIEdsb2JhbCBzdG9yZSB0byB0cmFjayBwcm9taXNlIHN0YWNrcyBmb3Igc3RhY2sgdHJhY2UgcXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9taXNlU3RhY2tTdG9yZSB7XG4gIGNoaWxkVG9QYXJlbnQ6IE1hcDxQcm9taXNlPHVua25vd24+LCBTZXQ8UHJvbWlzZTx1bmtub3duPj4+O1xuICBwcm9taXNlVG9TdGFjazogTWFwPFByb21pc2U8dW5rbm93bj4sIFN0YWNrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uPFN1Y2Nlc3MsIENvbnRleHQgPSBuZXZlcj4ge1xuICByZXNvbHZlKHZhbDogU3VjY2Vzcyk6IHZvaWQ7XG4gIHJlamVjdChyZWFzb246IEVycm9yKTogdm9pZDtcbiAgY29udGV4dD86IENvbnRleHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uIHtcbiAgZm4oKTogYm9vbGVhbjtcblxuICByZXNvbHZlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIEFjdGl2YXRpb25IYW5kbGVyRnVuY3Rpb248SyBleHRlbmRzIGtleW9mIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iPiA9IChcbiAgYWN0aXZhdGlvbjogTm9uTnVsbGFibGU8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2JbS10+XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogVmVyaWZpZXMgYWxsIGFjdGl2YXRpb24gam9iIGhhbmRsaW5nIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2YXRpb25IYW5kbGVyID0ge1xuICBbUCBpbiBrZXlvZiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYl06IEFjdGl2YXRpb25IYW5kbGVyRnVuY3Rpb248UD47XG59O1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGFuIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb24uXG4gKi9cbmludGVyZmFjZSBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG4gIGlkPzogc3RyaW5nO1xufVxuXG50eXBlIEluZmVyTWFwVmFsdWU8VD4gPSBUIGV4dGVuZHMgTWFwPG51bWJlciwgaW5mZXIgVj4gPyBWIDogbmV2ZXI7XG5cbmludGVyZmFjZSBTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSB7XG4gIHJhbmRvbSgpOiBudW1iZXI7XG59XG5cbi8qKlxuICogS2VlcHMgYWxsIG9mIHRoZSBXb3JrZmxvdyBydW50aW1lIHN0YXRlIGxpa2UgcGVuZGluZyBjb21wbGV0aW9ucyBmb3IgYWN0aXZpdGllcyBhbmQgdGltZXJzLlxuICpcbiAqIEltcGxlbWVudHMgaGFuZGxlcnMgZm9yIGFsbCB3b3JrZmxvdyBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90ZSB0aGF0IG1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBtZWFudCB0byBiZSBjYWxsZWQgb25seSBmcm9tIHdpdGhpbiB0aGUgVk0uXG4gKlxuICogSG93ZXZlciwgYSBmZXcgbWV0aG9kcyBtYXkgYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gb3V0c2lkZSB0aGUgVk0gKGVzc2VudGlhbGx5IGZyb20gYHZtLXNoYXJlZC50c2ApLlxuICogVGhlc2UgbWV0aG9kcyBhcmUgc3BlY2lmaWNhbGx5IG1hcmtlZCB3aXRoIGEgY29tbWVudCBhbmQgcmVxdWlyZSBjYXJlZnVsIGNvbnNpZGVyYXRpb24sIGFzIHRoZVxuICogZXhlY3V0aW9uIGNvbnRleHQgbWF5IG5vdCBwcm9wZXJseSByZWZsZWN0IHRoYXQgb2YgdGhlIHRhcmdldCB3b3JrZmxvdyBleGVjdXRpb24gKGUuZy46IHdpdGggUmV1c2FibGVcbiAqIFZNcywgdGhlIGBnbG9iYWxgIG1heSBub3QgaGF2ZSBiZWVuIHN3YXBwZWQgdG8gdGhvc2Ugb2YgdGhhdCB3b3JrZmxvdyBleGVjdXRpb247IHRoZSBhY3RpdmUgbWljcm90YXNrXG4gKiBxdWV1ZSBtYXkgYmUgdGhhdCBvZiB0aGUgdGhyZWFkL3Byb2Nlc3MsIHJhdGhlciB0aGFuIHRoZSBxdWV1ZSBvZiB0aGF0IFZNIGNvbnRleHQ7IGV0YykuIENvbnNlcXVlbnRseSxcbiAqIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgVk0gbXVzdCBub3QgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogLSBBY2Nlc3MgYW55IGdsb2JhbCB2YXJpYWJsZTtcbiAqIC0gQ3JlYXRlIFByb21pc2Ugb2JqZWN0cywgdXNlIGFzeW5jL2F3YWl0LCBvciBvdGhlcndpc2Ugc2NoZWR1bGUgbWljcm90YXNrcztcbiAqIC0gQ2FsbCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLCBpbmNsdWRpbmcgYW55IGZvcm0gb2YgaW50ZXJjZXB0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBBY3RpdmF0aW9uSGFuZGxlciB7XG4gIC8qKlxuICAgKiBDYWNoZSBmb3IgbW9kdWxlcyAtIHJlZmVyZW5jZWQgaW4gcmV1c2FibGUtdm0udHNcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbiAgLyoqXG4gICAqIE1hcCBvZiB0YXNrIHNlcXVlbmNlIHRvIGEgQ29tcGxldGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGxldGlvbnMgPSB7XG4gICAgdGltZXI6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHZvaWQ+PigpLFxuICAgIGFjdGl2aXR5OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx1bmtub3duLCBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0Pj4oKSxcbiAgICBuZXh1c09wZXJhdGlvblN0YXJ0OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Pj4oKSxcbiAgICBuZXh1c09wZXJhdGlvbkNvbXBsZXRlOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx1bmtub3duPj4oKSxcbiAgICBjaGlsZFdvcmtmbG93U3RhcnQ6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHN0cmluZywgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgY2hpbGRXb3JrZmxvd0NvbXBsZXRlOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx1bmtub3duLCBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0Pj4oKSxcbiAgICBzaWduYWxXb3JrZmxvdzogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dm9pZCwgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dD4+KCksXG4gICAgY2FuY2VsV29ya2Zsb3c6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHZvaWQsIFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQ+PigpLFxuICB9O1xuXG4gIC8qKlxuICAgKiBIb2xkcyBidWZmZXJlZCBVcGRhdGUgY2FsbHMgdW50aWwgYSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1ZmZlcmVkVXBkYXRlcyA9IEFycmF5PGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JRG9VcGRhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEhvbGRzIGJ1ZmZlcmVkIHNpZ25hbCBjYWxscyB1bnRpbCBhIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyZWRTaWduYWxzID0gQXJyYXk8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklTaWduYWxXb3JrZmxvdz4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiB1cGRhdGUgbmFtZSB0byBoYW5kbGVyIGFuZCB2YWxpZGF0b3JcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZT4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBzaWduYWwgbmFtZSB0byBoYW5kbGVyXG4gICAqL1xuICByZWFkb25seSBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgaW4tcHJvZ3Jlc3MgdXBkYXRlcyB0byBoYW5kbGVyIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluUHJvZ3Jlc3NVcGRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGluLXByb2dyZXNzIHNpZ25hbHMgdG8gaGFuZGxlciBleGVjdXRpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpblByb2dyZXNzU2lnbmFscyA9IG5ldyBNYXA8bnVtYmVyLCBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbj4oKTtcblxuICAvKipcbiAgICogQSBzZXF1ZW5jZSBudW1iZXIgcHJvdmlkaW5nIHVuaXF1ZSBpZGVudGlmaWVycyBmb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBzaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxID0gMDtcblxuICAvKipcbiAgICogQSBzaWduYWwgaGFuZGxlciB0aGF0IGNhdGNoZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAgICovXG4gIGRlZmF1bHRTaWduYWxIYW5kbGVyPzogRGVmYXVsdFNpZ25hbEhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEEgdXBkYXRlIGhhbmRsZXIgdGhhdCBjYXRjaGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gICAqL1xuICBkZWZhdWx0VXBkYXRlSGFuZGxlcj86IERlZmF1bHRVcGRhdGVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBBIHF1ZXJ5IGhhbmRsZXIgdGhhdCBjYXRjaGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAgICovXG4gIGRlZmF1bHRRdWVyeUhhbmRsZXI/OiBEZWZhdWx0UXVlcnlIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UgbWFwIGZpbGUgZm9yIGxvb2tpbmcgdXAgdGhlIHNvdXJjZSBmaWxlcyBpbiByZXNwb25zZSB0byBfX2VuaGFuY2VkX3N0YWNrX3RyYWNlXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHNlbmQgdGhlIHNvdXJjZXMgaW4gZW5oYW5jZWQgc3RhY2sgdHJhY2UgcXVlcnkgcmVzcG9uc2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1N0YWNrVHJhY2VTb3VyY2VzO1xuXG4gIHJlYWRvbmx5IHByb21pc2VTdGFja1N0b3JlOiBQcm9taXNlU3RhY2tTdG9yZSA9IHtcbiAgICBwcm9taXNlVG9TdGFjazogbmV3IE1hcCgpLFxuICAgIGNoaWxkVG9QYXJlbnQ6IG5ldyBNYXAoKSxcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2sgdG8gZmFpbC4gU2V0cyBpZiBhIG5vbi1gVGVtcG9yYWxGYWlsdXJlYFxuICAgKiBlcnJvciBidWJibGVzIHVwIG91dCBvZiB0aGUgV29ya2Zsb3cgZnVuY3Rpb24sIG9yIG91dCBvZiBhIFNpZ25hbCBvciBVcGRhdGUgaGFuZGxlci4gV2VcbiAgICogY2FwdHVyZSBlcnJvcnMgdGhpcyB3YXkgYmVjYXVzZSB0aG9zZSBmdW5jdGlvbnMgYXJlIG5vdCB0ZWNobmljYWxseSBhd2FpdGVkIHdoZW4gc3RhcnRlZCxcbiAgICogYnV0IGxlZnQgdG8gcnVuIGFzeW5jaHJvbm91c2x5LiBUaGVyZSBpcyB0aGVyZWZvcmUgbm8gcmVhbCBcInBhcmVudFwiIGZ1bmN0aW9uIHRoYXQgY2FuXG4gICAqIGRpcmVjdGx5IGhhbmRsZSB0aG9zZSBlcnJvcnMsIGFuZCBub3QgY2FwdHVyaW5nIGl0IHdvdWxkIHJlc3VsdCBpbiBhbiBVbmhhbmRsZWQgUHJvbWlzZVxuICAgKiBSZWplY3Rpb24uIFNvIGluc3RlYWQsIHdlIGJ1ZmZlciB0aGUgZXJyb3IgaGVyZSwgdG8gdGhlbiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbnRleHRcbiAgICogb2Ygb3VyIG93biBzeW5jaHJvbm91cyBBY3RpdmF0aW9uIGhhbmRsaW5nIGV2ZW50IGxvb3AuXG4gICAqXG4gICAqIE91ciBjb2RlIGRvZXMgYSBiZXN0IGVmZm9ydCB0byBzdG9wIHByb2Nlc3NpbmcgdGhlIGN1cnJlbnQgYWN0aXZhdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlXG4gICAqIGFmdGVyIHRoaXMgZmllbGQgaXMgc2V0OlxuICAgKiAgLSBJZiBhbiBlcnJvciBpcyB0aHJvd24gd2hpbGUgZXhlY3V0aW5nIGNvZGUgc3luY2hyb25vdXNseSAoZS5nLiBhbnl0aGluZyBiZWZvcmUgdGhlXG4gICAqICAgIGZpcnN0IGBhd2FpdGAgc3RhdGVtZW50IGluIGEgV29ya2Zsb3cgZnVuY3Rpb24gb3IgYSBzaWduYWwvdXBkYXRlIGhhbmRsZXIpLCB0aGUgZXJyb3JcbiAgICogICAgd2lsbCBiZSBfaW1tZWRpYXRlbHlfIHJldGhyb3duLCB3aGljaCB3aWxsIHByZXZlbnQgZXhlY3V0aW9uIG9mIGZ1cnRoZXIgam9icyBpbiB0aGVcbiAgICogICAgY3VycmVudCBhY3RpdmF0aW9uLiBXZSBrbm93IHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGNvZGUgc3luY2hyb25vdXNseSB0aGFua3MgdG8gdGhlXG4gICAqICAgIGByZXRocm93U3luY2hyb25vdXNseWAgZmxhZyBiZWxvdy5cbiAgICogIC0gSXQgYW4gZXJyb3IgaXMgdGhyb3duIHdoaWxlIGV4ZWN1dGluZyBtaWNyb3Rhc2tzLCB0aGVuIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIG9uXG4gICAqICAgIHRoZSBuZXh0IGNhbGwgdG8gYHRyeVVuYmxvY2tDb25kaXRpb25zKClgLlxuICAgKlxuICAgKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSdzIG5vIHdheSBmb3IgdXMgdG8gcHJldmVudCBmdXJ0aGVyIGV4ZWN1dGlvbiBvZiBtaWNyb3Rhc2tzIHRoYXQgaGF2ZVxuICAgKiBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkLCBub3IgdGhvc2UgdGhhdCB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjaGVkdWxlZCBmcm9tIHRob3NlIG1pY3JvdGFza3MuXG4gICAqIFNob3VsZCBtb3JlIGVycm9ycyBnZXQgdGhyb3duIHdoaWxlIHNldHRsaW5nIG1pY3JvdGFza3MsIHRob3NlIHdpbGwgYmUgaWdub3JlZCAoaS5lLiBvbmx5XG4gICAqIHRoZSBmaXJzdCBjYXB0dXJlZCBlcnJvciBpcyBwcmVzZXJ2ZWQpLlxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93VGFza0Vycm9yOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFcnJvciB0eXBlIF9uYW1lc18gKGZyb20ge0BsaW5rIFdvcmtlck9wdGlvbnMud29ya2Zsb3dGYWlsdXJlRXJyb3JUeXBlc30pIHRoYXRcbiAgICogc2hvdWxkIGNhdXNlIFdvcmtmbG93IEV4ZWN1dGlvbiBmYWlsdXJlIHJhdGhlciB0aGFuIFdGVCBmYWlsdXJlLlxuICAgKlxuICAgKiBTZXQgYXQgd29ya2Zsb3cgY3JlYXRpb24gdGltZSBmcm9tIHRoZSB3b3JrZXIgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBmYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBFcnJvciBfdHlwZXNfIChmcm9tIHtAbGluayBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zLmZhaWx1cmVFeGNlcHRpb25UeXBlc30pXG4gICAqIHRoYXQgc2hvdWxkIGNhdXNlIFdvcmtmbG93IEV4ZWN1dGlvbiBmYWlsdXJlIHJhdGhlciB0aGFuIFdGVCBmYWlsdXJlLlxuICAgKlxuICAgKiBTZXQgaW4gYHdvcmtlci1pbnRlcmZhY2UudHNgIGFmdGVyIHRoZSB3b3JrZmxvdyBkZWZpbml0aW9uIG9wdGlvbnMgYXJlIHJlYWQuXG4gICAqL1xuICBwdWJsaWMgd29ya2Zsb3dEZWZpbml0aW9uRmFpbHVyZUV4Y2VwdGlvblR5cGVzOiBBcnJheTxuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBFcnJvcj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHdoZW4gcnVubmluZyBzeW5jaHJvbm91cyBjb2RlIChlLmcuIHdoaWxlIHByb2Nlc3NpbmcgYWN0aXZhdGlvbiBqb2JzIGFuZCB3aGVuIGNhbGxpbmdcbiAgICogYHRyeVVuYmxvY2tDb25kaXRpb25zKClgKS4gV2hpbGUgdGhpcyBmbGFnIGlzIHNldCwgaXQgaXMgc2FmZSB0byBsZXQgZXJyb3JzIGJ1YmJsZSB1cC5cbiAgICovXG4gIHB1YmxpYyByZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSByb290U2NvcGUgPSBuZXcgUm9vdENhbmNlbGxhdGlvblNjb3BlKCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgcXVlcnkgbmFtZSB0byBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVlcnlIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZT4oW1xuICAgIFtcbiAgICAgIFNUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPHN0cmluZz4oXG4gICAgICAgICAgICB0aGlzLmdldFN0YWNrVHJhY2VzKClcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mb3JtYXR0ZWQpXG4gICAgICAgICAgICAgIC5qb2luKCdcXG5cXG4nKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHNlbnNpYmxlIHN0YWNrIHRyYWNlLicsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IFJhd1ZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNvdXJjZU1hcCB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBzZGs6IFN0YWNrVHJhY2VTREtJbmZvID0geyBuYW1lOiAndHlwZXNjcmlwdCcsIHZlcnNpb246IHBrZy52ZXJzaW9uIH07XG4gICAgICAgICAgY29uc3Qgc3RhY2tzID0gdGhpcy5nZXRTdGFja1RyYWNlcygpLm1hcCgoeyBzdHJ1Y3R1cmVkOiBsb2NhdGlvbnMgfSkgPT4gKHsgbG9jYXRpb25zIH0pKTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+ID0ge307XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1N0YWNrVHJhY2VTb3VyY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgbG9jYXRpb25zIH0gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgeyBmaWxlX3BhdGggfSBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfcGF0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHNvdXJjZU1hcD8uc291cmNlc0NvbnRlbnQ/Lltzb3VyY2VNYXA/LnNvdXJjZXMuaW5kZXhPZihmaWxlX3BhdGgpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXNbZmlsZV9wYXRoXSA9IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTxFbmhhbmNlZFN0YWNrVHJhY2U+KHsgc2RrLCBzdGFja3MsIHNvdXJjZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHN0YWNrIHRyYWNlIGFubm90YXRlZCB3aXRoIHNvdXJjZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgICdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IFJhd1ZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB3b3JrZmxvd1R5cGUgPSB0aGlzLmluZm8ud29ya2Zsb3dUeXBlO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5RGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHNpZ25hbERlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnNpZ25hbEhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlRGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMudXBkYXRlSGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KHtcbiAgICAgICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgdHlwZTogd29ya2Zsb3dUeXBlLFxuICAgICAgICAgICAgICBxdWVyeURlZmluaXRpb25zLFxuICAgICAgICAgICAgICBzaWduYWxEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgdXBkYXRlRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VycmVudERldGFpbHM6IHRoaXMuY3VycmVudERldGFpbHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3b3JrZmxvdy4nLFxuICAgICAgfSxcbiAgICBdLFxuICBdKTtcblxuICAvKipcbiAgICogTG9hZGVkIGluIHtAbGluayBpbml0UnVudGltZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnM6IFJlcXVpcmVkPFdvcmtmbG93SW50ZXJjZXB0b3JzPiA9IHtcbiAgICBpbmJvdW5kOiBbXSxcbiAgICBvdXRib3VuZDogW10sXG4gICAgaW50ZXJuYWxzOiBbXSxcbiAgfTtcblxuICAvKipcbiAgICogQnVmZmVyIHRoYXQgc3RvcmVzIGFsbCBnZW5lcmF0ZWQgY29tbWFuZHMsIHJlc2V0IGFmdGVyIGVhY2ggYWN0aXZhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgYWxsIHtAbGluayBjb25kaXRpb259cyB0aGF0IGhhdmVuJ3QgYmVlbiB1bmJsb2NrZWQgeWV0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tlZENvbmRpdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgQ29uZGl0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIFdvcmtmbG93IGNvbXBsZXRlZD9cbiAgICpcbiAgICogQSBXb3JrZmxvdyB3aWxsIGJlIGNvbnNpZGVyZWQgY29tcGxldGVkIGlmIGl0IGdlbmVyYXRlcyBhIGNvbW1hbmQgdGhhdCB0aGVcbiAgICogc3lzdGVtIGNvbnNpZGVycyBhcyBhIGZpbmFsIFdvcmtmbG93IGNvbW1hbmQgKGUuZy5cbiAgICogY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbiBvciBmYWlsV29ya2Zsb3dFeGVjdXRpb24pLlxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXYXMgdGhpcyBXb3JrZmxvdyBjYW5jZWxsZWQ/XG4gICAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXh0IChpbmNyZW1lbnRhbCkgc2VxdWVuY2UgdG8gYXNzaWduIHdoZW4gZ2VuZXJhdGluZyBjb21wbGV0YWJsZSBjb21tYW5kc1xuICAgKi9cbiAgcHVibGljIG5leHRTZXFzID0ge1xuICAgIHRpbWVyOiAxLFxuICAgIGFjdGl2aXR5OiAxLFxuICAgIGNoaWxkV29ya2Zsb3c6IDEsXG4gICAgc2lnbmFsV29ya2Zsb3c6IDEsXG4gICAgY2FuY2VsV29ya2Zsb3c6IDEsXG4gICAgY29uZGl0aW9uOiAxLFxuICAgIG5leHVzT3BlcmF0aW9uOiAxLFxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSB0byBrZWVwIHRyYWNrIG9mIGFjdGl2ZSBzdGFjayB0cmFjZXNcbiAgICBzdGFjazogMSxcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyBzZXQgZXZlcnkgdGltZSB0aGUgd29ya2Zsb3cgZXhlY3V0ZXMgYW4gYWN0aXZhdGlvblxuICAgKiBNYXkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBub3c6IG51bWJlcjtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFdvcmtmbG93LCBpbml0aWFsaXplZCB3aGVuIGEgV29ya2Zsb3cgaXMgc3RhcnRlZFxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93PzogV29ya2Zsb3cgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT47XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqIE1heSBiZSBhY2Nlc3NlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGluZm86IFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogVGhlIG1haW4gZGV0ZXJtaW5pc3RpYyBSTkcgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBTY29wZWQgb3ZlcnJpZGVzIHVzZWQgYnkgYFdvcmtmbG93UmFuZG9tU3RyZWFtLndpdGgoLi4uKWAgYXJlIGxheWVyZWQgb24gdG9wIG9mIHRoaXMgUk5HLlxuICAgKi9cbiAgcHVibGljIHJhbmRvbTogUk5HO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzZWVkIG1hdGVyaWFsIGZvciB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbidzIGRldGVybWluaXN0aWMgUk5Hcy5cbiAgICovXG4gIHB1YmxpYyByYW5kb21uZXNzU2VlZDogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZGV0ZXJtaW5pc3RpYyBSTkcgc3RyZWFtcyBrZXllZCBieSBzdGFibGUgc3RyZWFtIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZWRSYW5kb21TdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFJORz4oKTtcblxuICBwcm90ZWN0ZWQgY3VycmVudFJhbmRvbVN0b3JhZ2U/OiBBTFM8U2NvcGVkV29ya2Zsb3dSYW5kb21Tb3VyY2UgfCB1bmRlZmluZWQ+O1xuXG4gIHB1YmxpYyBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyID0gZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXI7XG4gIHB1YmxpYyBmYWlsdXJlQ29udmVydGVyOiBGYWlsdXJlQ29udmVydGVyID0gZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI7XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgd2Uga25vdyB0aGUgc3RhdHVzIG9mIGZvciB0aGlzIHdvcmtmbG93LCBhcyBpbiB7QGxpbmsgcGF0Y2hlZH1cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkga25vd25QcmVzZW50UGF0Y2hlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIHNlbnQgdG8gY29yZSB7QGxpbmsgcGF0Y2hlZH1cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGtub3duRmxhZ3MgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBzZGtWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdWZmZXJlZCBzaW5rIGNhbGxzIHBlciBhY3RpdmF0aW9uXG4gICAqL1xuICBzaW5rQ2FsbHMgPSBBcnJheTxTaW5rQ2FsbD4oKTtcblxuICAvKipcbiAgICogQSBuYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZSBmdW5jdGlvbiwgZXh0ZXJuYWxseSBpbmplY3RlZC4gVGhpcyBpcyB1c2VkIHRvXG4gICAqIHByZWNpc2VseSBzb3J0IGxvZ3MgZW50cmllcyBlbWl0dGVkIGZyb20gdGhlIFdvcmtmbG93IENvbnRleHQgdnMgdGhvc2UgZW1pdHRlZFxuICAgKiBmcm9tIG90aGVyIHNvdXJjZXMgKGUuZy4gbWFpbiB0aHJlYWQsIENvcmUsIGV0YykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2V0VGltZU9mRGF5OiAoKSA9PiBiaWdpbnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcblxuICBwdWJsaWMgY3VycmVudERldGFpbHM6IHN0cmluZyA9ICcnO1xuXG4gIHB1YmxpYyB2ZXJzaW9uaW5nQmVoYXZpb3I/OiBWZXJzaW9uaW5nQmVoYXZpb3I7XG4gIHB1YmxpYyB3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyPzogKCkgPT4gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucztcblxuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0YWNrVHJhY2VzRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW5mbyxcbiAgICBub3csXG4gICAgc2hvd1N0YWNrVHJhY2VTb3VyY2VzLFxuICAgIHNvdXJjZU1hcCxcbiAgICBnZXRUaW1lT2ZEYXksXG4gICAgcmFuZG9tbmVzc1NlZWQsXG4gICAgcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMsXG4gICAgc3RhY2tUcmFjZXNFbmFibGVkLFxuICAgIGZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMsXG4gIH06IFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsKSB7XG4gICAgdGhpcy5nZXRUaW1lT2ZEYXkgPSBnZXRUaW1lT2ZEYXk7XG4gICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB0aGlzLm5vdyA9IG5vdztcbiAgICB0aGlzLnNob3dTdGFja1RyYWNlU291cmNlcyA9IHNob3dTdGFja1RyYWNlU291cmNlcztcbiAgICB0aGlzLnNvdXJjZU1hcCA9IHNvdXJjZU1hcDtcbiAgICB0aGlzLnJhbmRvbW5lc3NTZWVkID0gWy4uLnJhbmRvbW5lc3NTZWVkXTtcbiAgICB0aGlzLnJhbmRvbSA9IGFsZWEodGhpcy5yYW5kb21uZXNzU2VlZCk7XG4gICAgdGhpcy5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcyA9IHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzO1xuICAgIHRoaXMuc3RhY2tUcmFjZXNFbmFibGVkID0gc3RhY2tUcmFjZXNFbmFibGVkO1xuICAgIHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcyA9IGZhaWx1cmVFeGNlcHRpb25UeXBlTmFtZXMgPz8gW107XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0UmFuZG9tbmVzc1NlZWQocmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5yYW5kb21uZXNzU2VlZCA9IFsuLi5yYW5kb21uZXNzU2VlZF07XG4gICAgdGhpcy5yYW5kb20gPSBhbGVhKHRoaXMucmFuZG9tbmVzc1NlZWQpO1xuICAgIHRoaXMubmFtZWRSYW5kb21TdHJlYW1zLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmFtZWRSYW5kb20obmFtZTogc3RyaW5nKTogUk5HIHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm5hbWVkUmFuZG9tU3RyZWFtcy5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmRvbSA9IGFsZWEoZGVyaXZlQWxlYVNlZWQodGhpcy5yYW5kb21uZXNzU2VlZCwgbmFtZSkpO1xuICAgIHRoaXMubmFtZWRSYW5kb21TdHJlYW1zLnNldChuYW1lLCByYW5kb20pO1xuICAgIHJldHVybiByYW5kb207XG4gIH1cblxuICBwcm90ZWN0ZWQgd2l0aFJhbmRvbVNvdXJjZTxUPihyYW5kb21Tb3VyY2U6IFNjb3BlZFdvcmtmbG93UmFuZG9tU291cmNlIHwgdW5kZWZpbmVkLCBmbjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiAodGhpcy5jdXJyZW50UmFuZG9tU3RvcmFnZSA/Pz0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFNjb3BlZFdvcmtmbG93UmFuZG9tU291cmNlIHwgdW5kZWZpbmVkPigpKS5ydW4oXG4gICAgICByYW5kb21Tb3VyY2UsXG4gICAgICBmblxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgd2l0aEN1cnJlbnRSYW5kb208VD4ocmFuZG9tU291cmNlOiBTY29wZWRXb3JrZmxvd1JhbmRvbVNvdXJjZSwgZm46ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gdGhpcy53aXRoUmFuZG9tU291cmNlKHJhbmRvbVNvdXJjZSwgZm4pO1xuICB9XG5cbiAgcHVibGljIGJpbmRDdXJyZW50UmFuZG9tPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4oZm46IFQpOiBUIHtcbiAgICBjb25zdCByYW5kb21Tb3VyY2UgPSB0aGlzLmN1cnJlbnRSYW5kb21TdG9yYWdlPy5nZXRTdG9yZSgpO1xuICAgIHJldHVybiAoKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IHRoaXMud2l0aFJhbmRvbVNvdXJjZShyYW5kb21Tb3VyY2UsICgpID0+IGZuKC4uLmFyZ3MpKSkgYXMgVDtcbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50UmFuZG9tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJhbmRvbVN0b3JhZ2U/LmdldFN0b3JlKCk/LnJhbmRvbSgpID8/IHRoaXMucmFuZG9tKCk7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIG11dGF0ZVdvcmtmbG93SW5mbyhmbjogKGluZm86IFdvcmtmbG93SW5mbykgPT4gV29ya2Zsb3dJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5pbmZvID0gZm4odGhpcy5pbmZvKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTdGFja1RyYWNlcygpOiBTdGFja1tdIHtcbiAgICBpZiAoIXRoaXMuc3RhY2tUcmFjZXNFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHN0YWNrIHRyYWNlcyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyB3b3JrZXInKTtcbiAgICB9XG4gICAgY29uc3QgeyBjaGlsZFRvUGFyZW50LCBwcm9taXNlVG9TdGFjayB9ID0gdGhpcy5wcm9taXNlU3RhY2tTdG9yZTtcbiAgICBjb25zdCBpbnRlcm5hbE5vZGVzID0gWy4uLmNoaWxkVG9QYXJlbnQudmFsdWVzKCldLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgY3Vycikge1xuICAgICAgICBhY2MuYWRkKHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBuZXcgU2V0KCkpO1xuICAgIGNvbnN0IHN0YWNrcyA9IG5ldyBNYXA8c3RyaW5nLCBTdGFjaz4oKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkVG9QYXJlbnQua2V5cygpKSB7XG4gICAgICBpZiAoIWludGVybmFsTm9kZXMuaGFzKGNoaWxkKSkge1xuICAgICAgICBjb25zdCBzdGFjayA9IHByb21pc2VUb1N0YWNrLmdldChjaGlsZCk7XG4gICAgICAgIGlmICghc3RhY2sgfHwgIXN0YWNrLmZvcm1hdHRlZCkgY29udGludWU7XG4gICAgICAgIHN0YWNrcy5zZXQoc3RhY2suZm9ybWF0dGVkLCBzdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vdCAxMDAlIHN1cmUgd2hlcmUgdGhpcyBjb21lcyBmcm9tLCBqdXN0IGZpbHRlciBpdCBvdXRcbiAgICBzdGFja3MuZGVsZXRlKCcgICAgYXQgUHJvbWlzZS50aGVuICg8YW5vbnltb3VzPiknKTtcbiAgICBzdGFja3MuZGVsZXRlKCcgICAgYXQgUHJvbWlzZS50aGVuICg8YW5vbnltb3VzPilcXG4nKTtcbiAgICByZXR1cm4gWy4uLnN0YWNrc10ubWFwKChbXywgc3RhY2tdKSA9PiBzdGFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIGdldEFuZFJlc2V0U2lua0NhbGxzKCk6IFNpbmtDYWxsW10ge1xuICAgIGNvbnN0IHsgc2lua0NhbGxzIH0gPSB0aGlzO1xuICAgIHRoaXMuc2lua0NhbGxzID0gW107XG4gICAgcmV0dXJuIHNpbmtDYWxscztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWZmZXIgYSBXb3JrZmxvdyBjb21tYW5kIHRvIGJlIGNvbGxlY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGFjdGl2YXRpb24uXG4gICAqXG4gICAqIFByZXZlbnRzIGNvbW1hbmRzIGZyb20gYmVpbmcgYWRkZWQgYWZ0ZXIgV29ya2Zsb3cgY29tcGxldGlvbi5cbiAgICovXG4gIHB1c2hDb21tYW5kKGNtZDogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kLCBjb21wbGV0ZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKGNtZCk7XG4gICAgaWYgKGNvbXBsZXRlKSB7XG4gICAgICB0aGlzLmNvbXBsZXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgY29uY2x1ZGVBY3RpdmF0aW9uKCk6IEFjdGl2YXRpb25Db21wbGV0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tbWFuZHM6IHRoaXMuY29tbWFuZHMuc3BsaWNlKDApLFxuICAgICAgdXNlZEludGVybmFsRmxhZ3M6IFsuLi50aGlzLmtub3duRmxhZ3NdLFxuICAgICAgdmVyc2lvbmluZ0JlaGF2aW9yOiB0aGlzLnZlcnNpb25pbmdCZWhhdmlvcixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0V29ya2Zsb3dOZXh0SGFuZGxlcih7IGFyZ3MgfTogV29ya2Zsb3dFeGVjdXRlSW5wdXQpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgd29ya2Zsb3cgfSA9IHRoaXM7XG4gICAgaWYgKHdvcmtmbG93ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgdW5pbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgd29ya2Zsb3coLi4uYXJncyk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnRXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQsICdleGVjdXRlJywgdGhpcy5zdGFydFdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gICAgdW50cmFja1Byb21pc2UoXG4gICAgICBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoKCkgPT5cbiAgICAgICAgZXhlY3V0ZSh7XG4gICAgICAgICAgaGVhZGVyczogYWN0aXZhdGlvbi5oZWFkZXJzID8/IHt9LFxuICAgICAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMsIGNvbnRleHQpLFxuICAgICAgICB9KVxuICAgICAgKS50aGVuKHRoaXMuY29tcGxldGVXb3JrZmxvdy5iaW5kKHRoaXMpLCB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZS5iaW5kKHRoaXMpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JSW5pdGlhbGl6ZVdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250aW51ZWRGYWlsdXJlLCBsYXN0Q29tcGxldGlvblJlc3VsdCwgbWVtbywgc2VhcmNoQXR0cmlidXRlcyB9ID0gYWN0aXZhdGlvbjtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgICAvLyBNb3N0IHRoaW5ncyByZWxhdGVkIHRvIGluaXRpYWxpemF0aW9uIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgaW4gdGhlIGNvbnN0cnVjdG9yXG4gICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAuLi5pbmZvLFxuXG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBkZWNvZGVTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM/LmluZGV4ZWRGaWVsZHMpLFxuICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBkZWNvZGVUeXBlZFNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlcz8uaW5kZXhlZEZpZWxkcyksXG5cbiAgICAgIG1lbW86IG1hcEZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIG1lbW8/LmZpZWxkcywgY29udGV4dCksXG4gICAgICBsYXN0UmVzdWx0OiBmcm9tUGF5bG9hZHNBdEluZGV4KHRoaXMucGF5bG9hZENvbnZlcnRlciwgMCwgbGFzdENvbXBsZXRpb25SZXN1bHQ/LnBheWxvYWRzLCBjb250ZXh0KSxcbiAgICAgIGxhc3RGYWlsdXJlOlxuICAgICAgICBjb250aW51ZWRGYWlsdXJlICE9IG51bGxcbiAgICAgICAgICA/IHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihjb250aW51ZWRGYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSkpO1xuICAgIGNvbnN0IHdvcmtmbG93RGVmaW5pdGlvbk9wdHMgPSB0aGlzLndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNHZXR0ZXI/LigpO1xuICAgIGlmICh3b3JrZmxvd0RlZmluaXRpb25PcHRzKSB7XG4gICAgICB0aGlzLnZlcnNpb25pbmdCZWhhdmlvciA9IHdvcmtmbG93RGVmaW5pdGlvbk9wdHMudmVyc2lvbmluZ0JlaGF2aW9yO1xuICAgICAgdGhpcy53b3JrZmxvd0RlZmluaXRpb25GYWlsdXJlRXhjZXB0aW9uVHlwZXMgPSB3b3JrZmxvd0RlZmluaXRpb25PcHRzLmZhaWx1cmVFeGNlcHRpb25UeXBlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsV29ya2Zsb3coX2FjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JQ2FuY2VsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5yb290U2NvcGUuY2FuY2VsKCk7XG4gIH1cblxuICBwdWJsaWMgZmlyZVRpbWVyKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JRmlyZVRpbWVyKTogdm9pZCB7XG4gICAgLy8gVGltZXJzIGFyZSBhIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVpciBjb21wbGV0aW9uIG1pZ2h0IG5vdCBiZSBpbiBXb3JrZmxvdyBzdGF0ZSxcbiAgICAvLyB0aGlzIGlzIGR1ZSB0byBpbW1lZGlhdGUgdGltZXIgY2FuY2VsbGF0aW9uIHRoYXQgZG9lc24ndCBnbyB3YWl0IGZvciBDb3JlLlxuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ3RpbWVyJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBjb21wbGV0aW9uPy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUFjdGl2aXR5KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUFjdGl2aXR5KTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVBY3Rpdml0eSBhY3RpdmF0aW9uIHdpdGggbm8gcmVzdWx0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdhY3Rpdml0eScsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVkID0gYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxldGVkLnJlc3VsdCA/IHRoaXMucGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZChjb21wbGV0ZWQucmVzdWx0LCBjb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBmYWlsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgY2FuY2VsbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuYmFja29mZikge1xuICAgICAgcmVqZWN0KG5ldyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmKGFjdGl2YXRpb24ucmVzdWx0LmJhY2tvZmYpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydChcbiAgICBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGNvbnRleHQgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ2NoaWxkV29ya2Zsb3dTdGFydCcsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24uc3VjY2VlZGVkKSB7XG4gICAgICBpZiAoIWFjdGl2YXRpb24uc3VjY2VlZGVkLnJ1bklkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gcnVuSWQnKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoYWN0aXZhdGlvbi5zdWNjZWVkZWQucnVuSWQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5mYWlsZWQpIHtcbiAgICAgIGlmIChkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZShhY3RpdmF0aW9uLmZhaWxlZC5jYXVzZSkgIT09ICdXT1JLRkxPV19BTFJFQURZX0VYSVNUUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdHb3QgdW5rbm93biBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZScpO1xuICAgICAgfVxuICAgICAgaWYgKCEoYWN0aXZhdGlvbi5zZXEgJiYgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dJZCAmJiBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd1R5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYXR0cmlidXRlcyBpbiBhY3RpdmF0aW9uIGpvYicpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yKFxuICAgICAgICAgICdXb3JrZmxvdyBleGVjdXRpb24gYWxyZWFkeSBzdGFydGVkJyxcbiAgICAgICAgICBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd0lkLFxuICAgICAgICAgIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93VHlwZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5jYW5jZWxsZWQpIHtcbiAgICAgIGlmICghYWN0aXZhdGlvbi5jYW5jZWxsZWQuZmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3Qgbm8gZmFpbHVyZSBpbiBjYW5jZWxsZWQgdmFyaWFudCcpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQgd2l0aCBubyBzdGF0dXMnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24oYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbik6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbiBhY3RpdmF0aW9uIHdpdGggbm8gcmVzdWx0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBjb250ZXh0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93Q29tcGxldGUnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGNhbmNlbGxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlTmV4dXNPcGVyYXRpb25TdGFydCk6IHZvaWQge1xuICAgIGNvbnN0IHNlcSA9IGdldFNlcShhY3RpdmF0aW9uKTtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignbmV4dXNPcGVyYXRpb25TdGFydCcsIHNlcSk7XG5cbiAgICBpZiAoIWFjdGl2YXRpb24uZmFpbGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25Db21wbGV0ZS5zZXQoc2VxLCB7XG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAgICAgdW50cmFja1Byb21pc2UoY29tcGxldGVQcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuXG4gICAgICByZXNvbHZlKHsgdG9rZW46IGFjdGl2YXRpb24ub3BlcmF0aW9uVG9rZW4hLCByZXN1bHQ6IGNvbXBsZXRlUHJvbWlzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5mYWlsZWQpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZU5leHVzT3BlcmF0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZU5leHVzT3BlcmF0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2VxID0gZ2V0U2VxKGFjdGl2YXRpb24pO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcblxuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY29tcGxldGVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkLCBjb250ZXh0KTtcblxuICAgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIFJlc29sdmVOZXh1c09wZXJhdGlvbiB0byBiZSByZWNlaXZlZCB3aXRob3V0IGEgcHJpb3IgUmVzb2x2ZU5leHVzT3BlcmF0aW9uU3RhcnQsXG4gICAgICAvLyBlLmcuIGJlY2F1c2UgdGhlIGhhbmRsZXIgY29tcGxldGVkIHRoZSBPcGVyYXRpb24gc3luY2hyb25vdXNseS5cbiAgICAgIGNvbnN0IHN0YXJ0Q29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbignbmV4dXNPcGVyYXRpb25TdGFydCcsIHNlcSk7XG4gICAgICBpZiAoc3RhcnRDb21wbGV0aW9uKSB7XG4gICAgICAgIHN0YXJ0Q29tcGxldGlvbi5yZXNvbHZlKHsgcmVzdWx0OiBQcm9taXNlLnJlc29sdmUocmVzdWx0KSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uQ29tcGxldGUnLCBzZXEpLnJlc29sdmUocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVycjogRXJyb3I7XG4gICAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmZhaWxlZCkge1xuICAgICAgICBlcnIgPSB0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZCk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5jYW5jZWxsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8udGltZWRPdXQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC50aW1lZE91dCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRpb24gPVxuICAgICAgICB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpID8/XG4gICAgICAgIHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uQ29tcGxldGUnLCBzZXEpO1xuICAgICAgY29tcGxldGlvbi5yZWplY3QoZXJyISk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW50ZW50aW9uYWxseSBub24tYXN5bmMgZnVuY3Rpb24gc28gdGhpcyBoYW5kbGVyIGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgc3RhY2sgdHJhY2VcbiAgcHJvdGVjdGVkIHF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlcih7IHF1ZXJ5TmFtZSwgYXJncyB9OiBRdWVyeUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgbGV0IGZuID0gdGhpcy5xdWVyeUhhbmRsZXJzLmdldChxdWVyeU5hbWUpPy5oYW5kbGVyO1xuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmbiA9IHRoaXMuZGVmYXVsdFF1ZXJ5SGFuZGxlci5iaW5kKHVuZGVmaW5lZCwgcXVlcnlOYW1lKTtcbiAgICB9XG4gICAgLy8gTm8gaGFuZGxlciBvciBkZWZhdWx0IHJlZ2lzdGVyZWQsIGZhaWwuXG4gICAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGtub3duUXVlcnlUeXBlcyA9IFsuLi50aGlzLnF1ZXJ5SGFuZGxlcnMua2V5cygpXS5qb2luKCcgJyk7XG4gICAgICAvLyBGYWlsIHRoZSBxdWVyeVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgYFdvcmtmbG93IGRpZCBub3QgcmVnaXN0ZXIgYSBoYW5kbGVyIGZvciAke3F1ZXJ5TmFtZX0uIFJlZ2lzdGVyZWQgcXVlcmllczogWyR7a25vd25RdWVyeVR5cGVzfV1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEV4ZWN1dGUgaGFuZGxlci5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gZm4oLi4uYXJncyk7XG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoJ1F1ZXJ5IGhhbmRsZXJzIHNob3VsZCBub3QgcmV0dXJuIGEgUHJvbWlzZScpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBxdWVyeVdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUXVlcnlXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgcXVlcnlUeXBlLCBxdWVyeUlkLCBoZWFkZXJzIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghKHF1ZXJ5VHlwZSAmJiBxdWVyeUlkKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBxdWVyeSBhY3RpdmF0aW9uIGF0dHJpYnV0ZXMnKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgX190ZW1wb3JhbF8tcHJlZml4ZWQgcXVlcmllcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSByb3V0ZWQgdG8gdGhlXG4gICAgLy8gdXNlcidzIGRlZmF1bHQgaGFuZGxlci4gQSBzcGVjaWZpYyByZWdpc3RlcmVkIGhhbmRsZXIgKGUuZy4gZnJvbSBhXG4gICAgLy8gY29udHJpYiBwYWNrYWdlKSBpcyBhbGxvd2VkIHRocm91Z2guXG4gICAgaWYgKFxuICAgICAgcXVlcnlUeXBlLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSAmJlxuICAgICAgIXRoaXMucXVlcnlIYW5kbGVycy5oYXMocXVlcnlUeXBlKSAmJlxuICAgICAgdGhpcy5kZWZhdWx0UXVlcnlIYW5kbGVyICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCB1c2UgcXVlcnkgbmFtZTogJyR7cXVlcnlUeXBlfScsIHdpdGggcmVzZXJ2ZWQgcHJlZml4OiAnJHtURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9J2ApO1xuICAgIH1cblxuICAgIC8vIFNraXAgaW50ZXJjZXB0b3JzIGlmIGl0J3MgYW4gaW50ZXJuYWwgcXVlcnkuXG4gICAgY29uc3QgaXNJbnRlcm5hbFF1ZXJ5ID1cbiAgICAgIHF1ZXJ5VHlwZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgfHxcbiAgICAgIHF1ZXJ5VHlwZSA9PT0gU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSB8fFxuICAgICAgcXVlcnlUeXBlID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxRdWVyeSA/IFtdIDogdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZDtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcnMsICdoYW5kbGVRdWVyeScsIHRoaXMucXVlcnlXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIHF1ZXJ5TmFtZTogcXVlcnlUeXBlLFxuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmFyZ3VtZW50cywgY29udGV4dCksXG4gICAgICBxdWVyeUlkLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVF1ZXJ5KHF1ZXJ5SWQsIHJlc3VsdCksXG4gICAgICAocmVhc29uKSA9PiB0aGlzLmZhaWxRdWVyeShxdWVyeUlkLCByZWFzb24pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkb1VwZGF0ZShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlKTogdm9pZCB7XG4gICAgY29uc3QgeyBpZDogdXBkYXRlSWQsIHByb3RvY29sSW5zdGFuY2VJZCwgbmFtZSwgaGVhZGVycywgcnVuVmFsaWRhdG9yIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghdXBkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgaWQnKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKCFwcm90b2NvbEluc3RhbmNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgcHJvdG9jb2xJbnN0YW5jZUlkJyk7XG4gICAgfVxuXG4gICAgLy8gUmVqZWN0IF9fdGVtcG9yYWxfLXByZWZpeGVkIHVwZGF0ZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcm91dGVkIHRvIHRoZVxuICAgIC8vIHVzZXIncyBkZWZhdWx0IGhhbmRsZXIuIEEgc3BlY2lmaWMgcmVnaXN0ZXJlZCBoYW5kbGVyIChlLmcuIGZyb20gYVxuICAgIC8vIGNvbnRyaWIgcGFja2FnZSkgaXMgYWxsb3dlZCB0aHJvdWdoLCBhbmQgdW5yZWdpc3RlcmVkIG5hbWVzIHdpdGhvdXQgYVxuICAgIC8vIGRlZmF1bHQgaGFuZGxlciBmYWxsIHRocm91Z2ggdG8gdGhlIGJ1ZmZlci10aGVuLXJlamVjdCBwYXRoIGJlbG93LlxuICAgIGlmIChcbiAgICAgIG5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmXG4gICAgICAhdGhpcy51cGRhdGVIYW5kbGVycy5oYXMobmFtZSkgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFVwZGF0ZUhhbmRsZXIgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSB1cGRhdGUgbmFtZTogJyR7bmFtZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHVwZGF0ZS5cbiAgICBjb25zdCBpc0ludGVybmFsVXBkYXRlID1cbiAgICAgIG5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBuYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBuYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxVcGRhdGUgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG5cbiAgICBjb25zdCBlbnRyeSA9XG4gICAgICB0aGlzLnVwZGF0ZUhhbmRsZXJzLmdldChuYW1lKSA/P1xuICAgICAgKHRoaXMuZGVmYXVsdFVwZGF0ZUhhbmRsZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyLmJpbmQodW5kZWZpbmVkLCBuYW1lKSxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBhIHdhcm5pbmcgcG9saWN5LlxuICAgICAgICAgICAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTixcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbCk7XG5cbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIGVudHJ5IGZyb20gZWl0aGVyIHNvdXJjZSwgYnVmZmVyIGFuZCByZXR1cm5cbiAgICBpZiAoZW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhpcy5idWZmZXJlZFVwZGF0ZXMucHVzaChhY3RpdmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYWtlSW5wdXQgPSAoKTogVXBkYXRlSW5wdXQgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlSWQsXG4gICAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5pbnB1dCwgY29udGV4dCksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgaXMgcmVzcG9uc2libGUgZm9yIHVwaG9sZGluZywgYW5kIGNvbnN0cmFpbmVkXG4gICAgLy8gYnksIHRoZSBmb2xsb3dpbmcgY29udHJhY3Q6XG4gICAgLy9cbiAgICAvLyAxLiBJZiBubyB2YWxpZGF0b3IgaXMgcHJlc2VudCB0aGVuIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzIHdpbGwgbm90IGJlIHJ1bi5cbiAgICAvL1xuICAgIC8vIDIuIER1cmluZyB2YWxpZGF0aW9uLCBhbnkgZXJyb3IgbXVzdCBmYWlsIHRoZSBVcGRhdGU7IGR1cmluZyB0aGUgVXBkYXRlXG4gICAgLy8gICAgaXRzZWxmLCBUZW1wb3JhbCBlcnJvcnMgZmFpbCB0aGUgVXBkYXRlIHdoZXJlYXMgb3RoZXIgZXJyb3JzIGZhaWwgdGhlXG4gICAgLy8gICAgYWN0aXZhdGlvbi5cbiAgICAvL1xuICAgIC8vIDMuIFRoZSBoYW5kbGVyIG11c3Qgbm90IHNlZSBhbnkgbXV0YXRpb25zIG9mIHRoZSBhcmd1bWVudHMgbWFkZSBieSB0aGVcbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA0LiBBbnkgZXJyb3Igd2hlbiBkZWNvZGluZy9kZXNlcmlhbGl6aW5nIGlucHV0IG11c3QgYmUgY2F1Z2h0IGFuZCByZXN1bHRcbiAgICAvLyAgICBpbiByZWplY3Rpb24gb2YgdGhlIFVwZGF0ZSBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQsIGV2ZW4gaWYgdGhlcmUgaXMgbm9cbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA1LiBUaGUgaW5pdGlhbCBzeW5jaHJvbm91cyBwb3J0aW9uIG9mIHRoZSAoYXN5bmMpIFVwZGF0ZSBoYW5kbGVyIHNob3VsZFxuICAgIC8vICAgIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSAoc3luYykgdmFsaWRhdG9yIGNvbXBsZXRlcyBzdWNoIHRoYXQgdGhlcmUgaXNcbiAgICAvLyAgICBtaW5pbWFsIG9wcG9ydHVuaXR5IGZvciBhIGRpZmZlcmVudCBjb25jdXJyZW50IHRhc2sgdG8gYmUgc2NoZWR1bGVkXG4gICAgLy8gICAgYmV0d2VlbiB0aGVtLlxuICAgIC8vXG4gICAgLy8gNi4gVGhlIHN0YWNrIHRyYWNlIHZpZXcgcHJvdmlkZWQgaW4gdGhlIFRlbXBvcmFsIFVJIG11c3Qgbm90IGJlIHBvbGx1dGVkXG4gICAgLy8gICAgYnkgcHJvbWlzZXMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gdXNlciBjb2RlLiBUaGlzIGltcGxpZXMgdGhhdFxuICAgIC8vICAgIGFzeW5jL2F3YWl0IHN5bnRheCBtYXkgbm90IGJlIHVzZWQuXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBkZWxpYmVyYXRlbHkgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGJlbG93LlxuICAgIC8vIFRoZXNlIGFyZSBjYXVnaHQgZWxzZXdoZXJlIGFuZCBmYWlsIHRoZSBjb3JyZXNwb25kaW5nIGFjdGl2YXRpb24uXG4gICAgY29uc3QgZG9VcGRhdGVJbXBsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGlucHV0OiBVcGRhdGVJbnB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChydW5WYWxpZGF0b3IgJiYgZW50cnkudmFsaWRhdG9yKSB7XG4gICAgICAgICAgLy8gVGVtcG9yYXJpbHkgbWFyayBhcyBub3QgcmVwbGF5aW5nIGhpc3RvcnkgZXZlbnRzIGR1cmluZyB2YWxpZGF0b3IgZXhlY3V0aW9uXG4gICAgICAgICAgLy8gc28gdGhhdCBsb2dnaW5nIGlzIHBlcm1pdHRlZC4gVmFsaWRhdG9ycyBhcmUgbGl2ZSByZWFkLW9ubHkgb3BlcmF0aW9ucy5cbiAgICAgICAgICBjb25zdCB3YXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzID0gdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZ0hpc3RvcnlFdmVudHM7XG4gICAgICAgICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgdW5zYWZlOiB7IC4uLmluZm8udW5zYWZlLCBpc1JlcGxheWluZ0hpc3RvcnlFdmVudHM6IGZhbHNlIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgICAgICAgIGludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgJ3ZhbGlkYXRlVXBkYXRlJyxcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkudmFsaWRhdG9yKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhbGlkYXRlKG1ha2VJbnB1dCgpKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmluZm8sXG4gICAgICAgICAgICAgIHVuc2FmZTogeyAuLi5pbmZvLnVuc2FmZSwgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiB3YXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gbWFrZUlucHV0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2NlcHRVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkKTtcbiAgICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICBpbnRlcmNlcHRvcnMsXG4gICAgICAgICdoYW5kbGVVcGRhdGUnLFxuICAgICAgICB0aGlzLnVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkuaGFuZGxlcilcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHVuZmluaXNoZWRQb2xpY3kgfSA9IGVudHJ5O1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5zZXQodXBkYXRlSWQsIHsgbmFtZSwgdW5maW5pc2hlZFBvbGljeSwgaWQ6IHVwZGF0ZUlkIH0pO1xuICAgICAgY29uc3QgcmVzID0gZXhlY3V0ZShpbnB1dClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIHJlc3VsdCkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLmRlbGV0ZSh1cGRhdGVJZCkpO1xuICAgICAgdW50cmFja1Byb21pc2UocmVzKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICB1bnRyYWNrUHJvbWlzZShVcGRhdGVTY29wZS51cGRhdGVXaXRoSW5mbyh1cGRhdGVJZCwgbmFtZSwgZG9VcGRhdGVJbXBsKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlTmV4dEhhbmRsZXIoaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlciguLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyKHZhbGlkYXRvcjogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3IoLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkVXBkYXRlcyA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzO1xuICAgIHdoaWxlIChidWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciwgc28gYWxsIHVwZGF0ZXMgYXJlIGRpc3BhdGNoYWJsZS5cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgICAvLyBMb2dpY2FsbHksIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGFzIHdlJ3JlIGluIHRoZSBsb29wLlxuICAgICAgICAvLyBCdXQgVHlwZXNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBzbyB3ZSB1c2UgYSBub24tbnVsbCBhc3NlcnRpb24gKCEpLlxuICAgICAgICB0aGlzLmRvVXBkYXRlKHVwZGF0ZSEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGJ1ZmZlcmVkVXBkYXRlcy5maW5kSW5kZXgoKHVwZGF0ZSkgPT4gdGhpcy51cGRhdGVIYW5kbGVycy5oYXModXBkYXRlLm5hbWUgYXMgc3RyaW5nKSk7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgIC8vIE5vIGJ1ZmZlcmVkIFVwZGF0ZXMgaGF2ZSBhIGhhbmRsZXIgeWV0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFt1cGRhdGVdID0gYnVmZmVyZWRVcGRhdGVzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5kb1VwZGF0ZSh1cGRhdGUhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzLnNoaWZ0KCk7XG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKFxuICAgICAgICAgIHVwZGF0ZS5wcm90b2NvbEluc3RhbmNlSWQhLFxuICAgICAgICAgIEFwcGxpY2F0aW9uRmFpbHVyZS5ub25SZXRyeWFibGUoYE5vIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgdXBkYXRlOiAke3VwZGF0ZS5uYW1lfWApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzaWduYWxOYW1lLCBhcmdzIH06IFNpZ25hbElucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBhd2FpdCBmbiguLi5hcmdzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKHNpZ25hbE5hbWUsIC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIHJlZ2lzdGVyZWQgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbDogJHtzaWduYWxOYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaWduYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVNpZ25hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBzaWduYWxOYW1lLCBoZWFkZXJzIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghc2lnbmFsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHNpZ25hbE5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgX190ZW1wb3JhbF8tcHJlZml4ZWQgc2lnbmFscyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSByb3V0ZWQgdG8gdGhlXG4gICAgLy8gdXNlcidzIGRlZmF1bHQgaGFuZGxlci4gQSBzcGVjaWZpYyByZWdpc3RlcmVkIGhhbmRsZXIgKGUuZy4gZnJvbSBhXG4gICAgLy8gY29udHJpYiBwYWNrYWdlKSBpcyBhbGxvd2VkIHRocm91Z2gsIGFuZCB1bnJlZ2lzdGVyZWQgbmFtZXMgd2l0aG91dCBhXG4gICAgLy8gZGVmYXVsdCBoYW5kbGVyIGZhbGwgdGhyb3VnaCB0byB0aGUgYnVmZmVyLXRoZW4tcmVqZWN0IHBhdGggYmVsb3cuXG4gICAgaWYgKFxuICAgICAgc2lnbmFsTmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiZcbiAgICAgICF0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWxOYW1lKSAmJlxuICAgICAgdGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgQ2Fubm90IHVzZSBzaWduYWwgbmFtZTogJyR7c2lnbmFsTmFtZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNraXAgaW50ZXJjZXB0b3JzIGlmIGl0J3MgYW4gaW50ZXJuYWwgc2lnbmFsLlxuICAgIGNvbnN0IGlzSW50ZXJuYWxTaWduYWwgPVxuICAgICAgc2lnbmFsTmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgfHxcbiAgICAgIHNpZ25hbE5hbWUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIHNpZ25hbE5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUU7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gaXNJbnRlcm5hbFNpZ25hbCA/IFtdIDogdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZDtcblxuICAgIGlmICghdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsTmFtZSkgJiYgIXRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRTaWduYWxzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHNpZ25hbCBoYW5kbGVyIHRoZW4gdGhlIHVuZmluaXNoZWRcbiAgICAvLyBwb2xpY3kgaXMgV0FSTl9BTkRfQUJBTkRPTjsgdXNlcnMgY3VycmVudGx5IGhhdmUgbm8gd2F5IHRvIHNpbGVuY2UgYW55XG4gICAgLy8gZW5zdWluZyB3YXJuaW5ncy5cbiAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID1cbiAgICAgIHRoaXMuc2lnbmFsSGFuZGxlcnMuZ2V0KHNpZ25hbE5hbWUpPy51bmZpbmlzaGVkUG9saWN5ID8/IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET047XG5cbiAgICBjb25zdCBzaWduYWxFeGVjdXRpb25OdW0gPSB0aGlzLnNpZ25hbEhhbmRsZXJFeGVjdXRpb25TZXErKztcbiAgICB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLnNldChzaWduYWxFeGVjdXRpb25OdW0sIHsgbmFtZTogc2lnbmFsTmFtZSwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcnMsICdoYW5kbGVTaWduYWwnLCB0aGlzLnNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIGV4ZWN1dGUoe1xuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmlucHV0LCBjb250ZXh0KSxcbiAgICAgIHNpZ25hbE5hbWUsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuaW5Qcm9ncmVzc1NpZ25hbHMuZGVsZXRlKHNpZ25hbEV4ZWN1dGlvbk51bSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkU2lnbmFscyA9IHRoaXMuYnVmZmVyZWRTaWduYWxzO1xuICAgIHdoaWxlIChidWZmZXJlZFNpZ25hbHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCBzaWduYWwgaGFuZGxlciwgc28gYWxsIHNpZ25hbHMgYXJlIGRpc3BhdGNoYWJsZVxuXG4gICAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3coYnVmZmVyZWRTaWduYWxzLnNoaWZ0KCkhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFNpZ25hbHMuZmluZEluZGV4KChzaWduYWwpID0+IHRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbC5zaWduYWxOYW1lIGFzIHN0cmluZykpO1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGJyZWFrO1xuICAgICAgICBjb25zdCBbc2lnbmFsXSA9IGJ1ZmZlcmVkU2lnbmFscy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3coc2lnbmFsISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVNpZ25hbEV4dGVybmFsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgY29udGV4dCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignc2lnbmFsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5mYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlUmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3coXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlUmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3dcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGNvbnRleHQgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ2NhbmNlbFdvcmtmbG93JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5mYWlsdXJlKSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd2FybklmVW5maW5pc2hlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yKSByZXR1cm47XG5cbiAgICBjb25zdCBnZXRXYXJuYWJsZSA9IChoYW5kbGVyRXhlY3V0aW9uczogSXRlcmFibGU8TWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KTogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSA9PiB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShoYW5kbGVyRXhlY3V0aW9ucykuZmlsdGVyKFxuICAgICAgICAoZXgpID0+IGV4LnVuZmluaXNoZWRQb2xpY3kgPT09IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET05cbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdhcm5hYmxlVXBkYXRlcyA9IGdldFdhcm5hYmxlKHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMudmFsdWVzKCkpO1xuICAgIGlmICh3YXJuYWJsZVVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLndhcm4obWFrZVVuZmluaXNoZWRVcGRhdGVIYW5kbGVyTWVzc2FnZSh3YXJuYWJsZVVwZGF0ZXMpKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YXJuYWJsZVNpZ25hbHMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVTaWduYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2Uod2FybmFibGVTaWduYWxzKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJhbmRvbVNlZWQoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklVcGRhdGVSYW5kb21TZWVkKTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJhbmRvbW5lc3NTZWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhY3RpdmF0aW9uIHdpdGggcmFuZG9tbmVzc1NlZWQgYXR0cmlidXRlJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0UmFuZG9tbmVzc1NlZWQoYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZC50b0J5dGVzKCkpO1xuICB9XG5cbiAgcHVibGljIG5vdGlmeUhhc1BhdGNoKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JTm90aWZ5SGFzUGF0Y2gpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcpXG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1VuZXhwZWN0ZWQgbm90aWZ5SGFzUGF0Y2ggam9iIG9uIG5vbi1yZXBsYXkgYWN0aXZhdGlvbicpO1xuICAgIGlmICghYWN0aXZhdGlvbi5wYXRjaElkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3RpZnlIYXNQYXRjaCBtaXNzaW5nIHBhdGNoIGlkJyk7XG4gICAgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmFkZChhY3RpdmF0aW9uLnBhdGNoSWQpO1xuICB9XG5cbiAgcHVibGljIHBhdGNoSW50ZXJuYWwocGF0Y2hJZDogc3RyaW5nLCBkZXByZWNhdGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud29ya2Zsb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdQYXRjaGVzIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBXb3JrZmxvdyBzdGFydHMnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlUGF0Y2ggPSAhdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyB8fCB0aGlzLmtub3duUHJlc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpO1xuICAgIC8vIEF2b2lkIHNlbmRpbmcgY29tbWFuZHMgZm9yIHBhdGNoZXMgY29yZSBhbHJlYWR5IGtub3dzIGFib3V0LlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGVuYWJsZXMgZGV2ZWxvcG1lbnQgb2YgYXV0b21hdGljIHBhdGNoaW5nIHRvb2xzLlxuICAgIGlmICh1c2VQYXRjaCAmJiAhdGhpcy5zZW50UGF0Y2hlcy5oYXMocGF0Y2hJZCkpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgICBzZXRQYXRjaE1hcmtlcjogeyBwYXRjaElkLCBkZXByZWNhdGVkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VudFBhdGNoZXMuYWRkKHBhdGNoSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlUGF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGVhcmx5IHdoaWxlIGhhbmRsaW5nIGFuIGFjdGl2YXRpb24gdG8gcmVnaXN0ZXIga25vd24gZmxhZ3MuXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgYWRkS25vd25GbGFncyhmbGFnczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgZmxhZ3MpIHtcbiAgICAgIGFzc2VydFZhbGlkRmxhZyhmbGFnKTtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIFNESyBGbGFnIG1heSBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFNESyBmbGFncyBwbGF5IGEgcm9sZSBzaW1pbGFyIHRvIHRoZSBgcGF0Y2hlZCgpYCBBUEksIGJ1dCBhcmUgbWVhbnQgZm9yIGludGVybmFsIHVzYWdlIGJ5IHRoZVxuICAgKiBTREsgaXRzZWxmLiBUaGV5IG1ha2UgaXQgcG9zc2libGUgZm9yIHRoZSBTREsgdG8gZXZvbHZlIGl0cyBiZWhhdmlvcnMgb3ZlciB0aW1lLCB3aGlsZSBzdGlsbFxuICAgKiBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggV29ya2Zsb3cgaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IG9sZGVyIFNES3MsIHdpdGhvdXQgY2F1c2luZ1xuICAgKiBkZXRlcm1pbmlzbSB2aW9sYXRpb25zLlxuICAgKlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGhhc0ZsYWcoZmxhZzogU2RrRmxhZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmtub3duRmxhZ3MuaGFzKGZsYWcuaWQpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCByZXBsYXlpbmcsIGVuYWJsZSB0aGUgZmxhZyBpZiBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gU2V0dGluZyBhXG4gICAgLy8gZmxhZydzIGRlZmF1bHQgdG8gZmFsc2UgYWxsb3dzIHByb2dyZXNzaXZlIHJvbGxvdXQgb2YgbmV3IGZlYXR1cmUgZmxhZ3MsIHdpdGggdGhlIHBvc3NpYmlsaXR5XG4gICAgLy8gb2YgcmV2ZXJ0aW5nIGJhY2sgdG8gYSB2ZXJzaW9uIG9mIHRoZSBTREsgd2hlcmUgdGhlIGZsYWcgaXMgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgIC8vIEl0IGlzIGFsc28gdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2UuXG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuZGVmYXVsdCkge1xuICAgICAgdGhpcy5rbm93bkZsYWdzLmFkZChmbGFnLmlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdoZW4gcmVwbGF5aW5nLCBhIGZsYWcgaXMgY29uc2lkZXJlZCBlbmFibGVkIGlmIGl0IHdhcyBlbmFibGVkIGR1cmluZyB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIG9mXG4gICAgLy8gdGhhdCBXb3JrZmxvdyBUYXNrOyB0aGlzIGlzIG5vcm1hbGx5IGRldGVybWluZWQgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBmbGFnIElEIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gV0ZUIENvbXBsZXRlZCdzIGBzZGtNZXRhZGF0YS5sYW5nVXNlZEZsYWdzYC5cbiAgICAvL1xuICAgIC8vIFNESyBGbGFnIEFsdGVybmF0ZSBDb25kaXRpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBmbGFnIHNob3VsZFxuICAgIC8vIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNESyB0aGF0XG4gICAgLy8gZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVCBlbWl0dGVkXG4gICAgLy8gYnkgcHJldmlvdXMgU0RLcyB0aGF0IGNvbnRhaW5lZCBhIGJ1Zy4gQWx0IENvbmRpdGlvbnMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZy4gQWxzbywgYWx0ZXJuYXRlIGNvbmRpdGlvbnMgd2lsbCBub3RcbiAgICAvLyBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzXG4gICAgLy8gbWF5IG5vdCByZWZsZWN0IHRoaXMgZmxhZyBpZiB0aGUgY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3RcbiAgICAvLyBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93IEV4ZWN1dGlvbiBoYXMgZ29uZSB0aHJvdWdoIGEgbmV3ZXIgU0RLIHZlcnNpb24gdGhlbiBhZ2FpblxuICAgIC8vIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICAgIGlmICh0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmQgb2YgZmxhZy5hbHRlcm5hdGl2ZUNvbmRpdGlvbnMpIHtcbiAgICAgICAgaWYgKGNvbmQoeyBpbmZvOiB0aGlzLmluZm8sIHNka1ZlcnNpb246IHRoaXMuc2RrVmVyc2lvbiB9KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUZyb21DYWNoZSgpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ3JlbW92ZUZyb21DYWNoZSBhY3RpdmF0aW9uIGpvYiBzaG91bGQgbm90IHJlYWNoIHdvcmtmbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBmYWlsdXJlcyBpbnRvIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFVzZWQgdG8gaGFuZGxlIGFueSBmYWlsdXJlIGVtaXR0ZWQgYnkgdGhlIFdvcmtmbG93LlxuICAgKi9cbiAgaGFuZGxlV29ya2Zsb3dGYWlsdXJlKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkICYmIGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNhbmNlbFdvcmtmbG93RXhlY3V0aW9uOiB7fSB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbjogZXJyb3IuY29tbWFuZCB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlIHx8IHRoaXMuaXNDb25maWd1cmVkRmFpbHVyZUV4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93LiBXZSBkbyBub3Qgd2FudCB0byBpc3N1ZSB1bmZpbmlzaGVkSGFuZGxlcnMgd2FybmluZ3MuIFRvIGFjaGlldmUgdGhhdCwgd2VcbiAgICAgIC8vIG1hcmsgYWxsIGhhbmRsZXJzIGFzIGNvbXBsZXRlZCBub3cuXG4gICAgICB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLmNsZWFyKCk7XG4gICAgICB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLmNsZWFyKCk7XG4gICAgICB0aGlzLnB1c2hDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgZmFpbFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICBmYWlsdXJlOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVjb3JkV29ya2Zsb3dUYXNrRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGVycm9yIG1hdGNoZXMgYW55IG9mIHRoZSBjb25maWd1cmVkIGZhaWx1cmUgZXhjZXB0aW9uIHR5cGVzXG4gICAqIChmcm9tIHtAbGluayBXb3JrZXJPcHRpb25zLndvcmtmbG93RmFpbHVyZUVycm9yVHlwZXN9IG9yXG4gICAqIHtAbGluayBXb3JrZmxvd0RlZmluaXRpb25PcHRpb25zLmZhaWx1cmVFeGNlcHRpb25UeXBlc30pLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmZpZ3VyZWRGYWlsdXJlRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgY2xhc3MgcmVmZXJlbmNlcyBmcm9tIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgKGluc3RhbmNlb2YtYmFzZWQsIHN1cHBvcnRzIHN1YmNsYXNzZXMpXG4gICAgaWYgKHRoaXMud29ya2Zsb3dEZWZpbml0aW9uRmFpbHVyZUV4Y2VwdGlvblR5cGVzKSB7XG4gICAgICAvLyBXZSBndWFyYW50ZWUgdGhhdCBpbmNsdWRpbmcgRXJyb3IgaW4gdGhlIGxpc3Qgd2lsbCBjYXRjaCBfYW55XyBlcnJvci5cbiAgICAgIGlmICh0aGlzLndvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlcy5pbmNsdWRlcyhFcnJvcikpIHJldHVybiB0cnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IGVycm9yVHlwZSBvZiB0aGlzLndvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlcykge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBlcnJvclR5cGUpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGNsYXNzIG5hbWUgc3RyaW5ncyBmcm9tIFdvcmtlck9wdGlvbnMgKHByb3RvdHlwZS1jaGFpbi1iYXNlZClcbiAgICBpZiAodGhpcy5mYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFdlIGd1YXJhbnRlZSB0aGF0IGluY2x1ZGluZyAnRXJyb3InIGluIHRoZSBsaXN0IHdpbGwgY2F0Y2ggX2FueV8gZXJyb3IuXG4gICAgICBpZiAodGhpcy5mYWlsdXJlRXhjZXB0aW9uVHlwZU5hbWVzLmluY2x1ZGVzKCdFcnJvcicpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IGN0b3IgPSAoZXJyb3IgYXMgYW55KS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgd2hpbGUgKGN0b3IgIT0gbnVsbCAmJiBjdG9yICE9PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gKGN0b3IgYXMgYW55KS5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmFpbHVyZUV4Y2VwdGlvblR5cGVOYW1lcy5pbmNsdWRlcyhuYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3Rvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZWNvcmRXb3JrZmxvd1Rhc2tFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIE9ubHkga2VlcCB0aGUgZmlyc3QgZXJyb3IgdGhhdCBidWJibGVzIHVwOyBzdWJzZXF1ZW50IGVycm9ycyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgaWYgKHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPT09IHVuZGVmaW5lZCkgdGhpcy53b3JrZmxvd1Rhc2tFcnJvciA9IGVycm9yO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgcmV0aHJvdyB0aGUgZXJyb3IgaWYgd2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIHNvIChpLmUuIHdlIGFyZSBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIG1pY3JvdGFza3MpLiBPdGhlcndpc2UsIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIHdoZW5ldmVyIHdlIGdldCBhbiBvcHBvcnR1bml0eSB0byBkbyBzbyxcbiAgICAvLyBlLmcuIHRoZSBuZXh0IHRpbWUgYHRyeVVuYmxvY2tDb25kaXRpb25zKClgIGlzIGNhbGxlZC5cbiAgICBpZiAodGhpcy5yZXRocm93U3luY2hyb25vdXNseSkgdGhpcy5tYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgV29ya2Zsb3cgVGFzayBlcnJvciB3YXMgY2FwdHVyZWQsIGFuZCB3ZSBhcmUgcnVubmluZyBpbiBzeW5jaHJvbm91cyBtb2RlLFxuICAgKiB0aGVuIGJ1YmJsZSBpdCB1cCBub3cuIFRoaXMgaXMgc2FmZSB0byBjYWxsIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZXJyb3IgdG8gcmV0aHJvdy5cbiAgICovXG4gIG1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yKSB0aHJvdyB0aGlzLndvcmtmbG93VGFza0Vycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMud29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCgpO1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgcmVzcG9uZFRvUXVlcnk6IHsgcXVlcnlJZCwgc3VjY2VlZGVkOiB7IHJlc3BvbnNlOiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCwgY29udGV4dCkgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWlsUXVlcnkocXVlcnlJZDogc3RyaW5nLCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgcmVzcG9uZFRvUXVlcnk6IHtcbiAgICAgICAgcXVlcnlJZCxcbiAgICAgICAgZmFpbGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWNjZXB0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7IHVwZGF0ZVJlc3BvbnNlOiB7IHByb3RvY29sSW5zdGFuY2VJZCwgYWNjZXB0ZWQ6IHt9IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlVXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZTogeyBwcm90b2NvbEluc3RhbmNlSWQsIGNvbXBsZXRlZDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQsIGNvbnRleHQpIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZywgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHVwZGF0ZVJlc3BvbnNlOiB7XG4gICAgICAgIHByb3RvY29sSW5zdGFuY2VJZCxcbiAgICAgICAgcmVqZWN0ZWQ6IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZW5zdXJlVGVtcG9yYWxGYWlsdXJlKGVycm9yKSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbnN1bWUgYSBjb21wbGV0aW9uIGlmIGl0IGV4aXN0cyBpbiBXb3JrZmxvdyBzdGF0ZSAqL1xuICBwcml2YXRlIG1heWJlQ29uc3VtZUNvbXBsZXRpb248SyBleHRlbmRzIGtleW9mIEFjdGl2YXRvclsnY29tcGxldGlvbnMnXT4oXG4gICAgdHlwZTogSyxcbiAgICB0YXNrU2VxOiBudW1iZXJcbiAgKTogSW5mZXJNYXBWYWx1ZTxBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ11bS10+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5jb21wbGV0aW9uc1t0eXBlXS5nZXQodGFza1NlcSk7XG4gICAgaWYgKGNvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb21wbGV0aW9uc1t0eXBlXS5kZWxldGUodGFza1NlcSk7XG4gICAgfVxuICAgIHJldHVybiBjb21wbGV0aW9uIGFzIEluZmVyTWFwVmFsdWU8QWN0aXZhdG9yWydjb21wbGV0aW9ucyddW0tdPiB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUsIHRocm93cyBpZiBpdCBkb2Vzbid0ICovXG4gIHByaXZhdGUgY29uc3VtZUNvbXBsZXRpb248SyBleHRlbmRzIGtleW9mIEFjdGl2YXRvclsnY29tcGxldGlvbnMnXT4oXG4gICAgdHlwZTogSyxcbiAgICB0YXNrU2VxOiBudW1iZXJcbiAgKTogSW5mZXJNYXBWYWx1ZTxBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ11bS10+IHtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKHR5cGUsIHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcihgTm8gY29tcGxldGlvbiBmb3IgdGFza1NlcSAke3Rhc2tTZXF9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wbGV0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVdvcmtmbG93KHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICB0aGlzLnB1c2hDb21tYW5kKFxuICAgICAge1xuICAgICAgICBjb21wbGV0ZVdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgcmVzdWx0OiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCwgY29udGV4dCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24pOiBQcm90b0ZhaWx1cmUge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoKTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmVycm9yVG9GYWlsdXJlKGVyciwgdGhpcy5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0KTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSk6IEVycm9yIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGNvbnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSB3b3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KCk6IFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnd29ya2Zsb3cnLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLmluZm8ubmFtZXNwYWNlLFxuICAgICAgd29ya2Zsb3dJZDogdGhpcy5pbmZvLndvcmtmbG93SWQsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZXE8VCBleHRlbmRzIHsgc2VxPzogbnVtYmVyIHwgbnVsbCB9PihhY3RpdmF0aW9uOiBUKTogbnVtYmVyIHtcbiAgY29uc3Qgc2VxID0gYWN0aXZhdGlvbi5zZXE7XG4gIGlmIChzZXEgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEdvdCBhY3RpdmF0aW9uIHdpdGggbm8gc2VxIGF0dHJpYnV0ZWApO1xuICB9XG4gIHJldHVybiBzZXE7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYW4gdXBkYXRlIGhhbmRsZXIgd2FzIHN0aWxsIHJ1bm5pbmcuIFRoaXMgbWF5IGhhdmUgaW50ZXJydXB0ZWQgd29yayB0aGF0IHRoZVxudXBkYXRlIGhhbmRsZXIgd2FzIGRvaW5nLCBhbmQgdGhlIGNsaWVudCB0aGF0IHNlbnQgdGhlIHVwZGF0ZSB3aWxsIHJlY2VpdmUgYSAnd29ya2Zsb3cgZXhlY3V0aW9uXG5hbHJlYWR5IGNvbXBsZXRlZCcgUlBDRXJyb3IgaW5zdGVhZCBvZiB0aGUgdXBkYXRlIHJlc3VsdC4gWW91IGNhbiB3YWl0IGZvciBhbGwgdXBkYXRlIGFuZCBzaWduYWxcbmhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nIFxcYGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxcYC5cbkFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGUgY2xpZW50cyBzZW5kaW5nIHRoZSB1cGRhdGUgYXJlIG9rYXkgd2l0aCBpbnRlcnJ1cHRpbmcgcnVubmluZyBoYW5kbGVyc1xud2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsIGFuZCBjYXVzaW5nIGNsaWVudHMgdG8gcmVjZWl2ZSBlcnJvcnMsIHRoZW4geW91IGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBieVxucGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVVwZGF0ZSwgbXlVcGRhdGVIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnICcpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyB1cGRhdGVzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBoYW5kbGVyRXhlY3V0aW9ucy5tYXAoKGV4KSA9PiAoeyBuYW1lOiBleC5uYW1lLCBpZDogZXguaWQgfSkpXG4gICl9YDtcbn1cblxuZnVuY3Rpb24gbWFrZVVuZmluaXNoZWRTaWduYWxIYW5kbGVyTWVzc2FnZShoYW5kbGVyRXhlY3V0aW9uczogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgXG5bVE1QUkwxMTAyXSBXb3JrZmxvdyBmaW5pc2hlZCB3aGlsZSBhIHNpZ25hbCBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnNpZ25hbCBoYW5kbGVyIHdhcyBkb2luZy4gWW91IGNhbiB3YWl0IGZvciBhbGwgdXBkYXRlIGFuZCBzaWduYWwgaGFuZGxlcnMgdG8gY29tcGxldGUgYnkgdXNpbmdcblxcYGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxcYC4gQWx0ZXJuYXRpdmVseSwgaWYgYm90aCB5b3UgYW5kIHRoZVxuY2xpZW50cyBzZW5kaW5nIHRoZSB1cGRhdGUgYXJlIG9rYXkgd2l0aCBpbnRlcnJ1cHRpbmcgcnVubmluZyBoYW5kbGVycyB3aGVuIHRoZSB3b3JrZmxvdyBmaW5pc2hlcyxcbnRoZW4geW91IGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBieSBwYXNzaW5nIGFuIG9wdGlvbiB3aGVuIHNldHRpbmcgdGhlIGhhbmRsZXI6XG5cXGB3b3JrZmxvdy5zZXRIYW5kbGVyKG15U2lnbmFsLCBteVNpZ25hbEhhbmRsZXIsIHt1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5BQkFORE9OfSk7XFxgLmBcblxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgbmFtZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IGV4IG9mIGhhbmRsZXJFeGVjdXRpb25zKSB7XG4gICAgY29uc3QgY291bnQgPSBuYW1lcy5nZXQoZXgubmFtZSkgfHwgMDtcbiAgICBuYW1lcy5zZXQoZXgubmFtZSwgY291bnQgKyAxKTtcbiAgfVxuXG4gIHJldHVybiBgJHttZXNzYWdlfSBUaGUgZm9sbG93aW5nIHNpZ25hbHMgd2VyZSB1bmZpbmlzaGVkIChhbmQgd2FybmluZ3Mgd2VyZSBub3QgZGlzYWJsZWQgZm9yIHRoZWlyIGhhbmRsZXIpOiAke0pTT04uc3RyaW5naWZ5KFxuICAgIEFycmF5LmZyb20obmFtZXMuZW50cmllcygpKS5tYXAoKFtuYW1lLCBjb3VudF0pID0+ICh7IG5hbWUsIGNvdW50IH0pKVxuICApfWA7XG59XG4iLCJpbXBvcnQgeyBTZGtDb21wb25lbnQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJy4vaW50ZXJjZXB0b3ItY29tcG9zaXRpb24nO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgdHlwZSBTaW5rLCB0eXBlIFNpbmtzLCBwcm94eVNpbmtzIH0gZnJvbSAnLi9zaW5rcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxhdGlvbiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbnRpbnVlQXNOZXcgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGN1cnJlbnRVcGRhdGVJbmZvLCBpbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vd29ya2Zsb3cnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TG9nZ2VyIGV4dGVuZHMgU2luayB7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xufVxuXG4vKipcbiAqIFNpbmsgaW50ZXJmYWNlIGZvciBmb3J3YXJkaW5nIGxvZ3MgZnJvbSB0aGUgV29ya2Zsb3cgc2FuZGJveCB0byB0aGUgV29ya2VyXG4gKlxuICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgZXh0ZW5kcyBTaW5rcyB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICAgKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gICAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAgICovXG4gIGRlZmF1bHRXb3JrZXJMb2dnZXI6IFdvcmtmbG93TG9nZ2VyO1xufVxuXG4vKipcbiAqIFNpbmsgaW50ZXJmYWNlIGZvciBmb3J3YXJkaW5nIGxvZ3MgZnJvbSB0aGUgV29ya2Zsb3cgc2FuZGJveCB0byB0aGUgV29ya2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NJbnRlcm5hbCBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9sb2dnZXI6IFdvcmtmbG93TG9nZ2VyO1xufVxuXG5jb25zdCBsb2dnZXJTaW5rID0gcHJveHlTaW5rczxMb2dnZXJTaW5rc0ludGVybmFsPigpLl9fdGVtcG9yYWxfbG9nZ2VyO1xuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGJ5IHRoZSBTREsgbG9nZ2VyIHRvIGV4dHJhY3QgYSB0aW1lc3RhbXAgZnJvbSBsb2cgYXR0cmlidXRlcy5cbiAqIEFsc28gZGVmaW5lZCBpbiBgd29ya2VyL2xvZ2dlci50c2AgLSBpbnRlbnRpb25hbGx5IG5vdCBzaGFyZWQuXG4gKi9cbmNvbnN0IExvZ1RpbWVzdGFtcCA9IFN5bWJvbC5mb3IoJ2xvZ190aW1lc3RhbXAnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHdvcmtmbG93IGxvZ2dlci5cbiAqXG4gKiBUaGlzIGxvZ2dlciBpcyByZXBsYXktYXdhcmUgYW5kIHdpbGwgb21pdCBsb2cgbWVzc2FnZXMgb24gd29ya2Zsb3cgcmVwbGF5LiBNZXNzYWdlcyBlbWl0dGVkIGJ5IHRoaXMgbG9nZ2VyIGFyZVxuICogZnVubmVsbGVkIHRocm91Z2ggYSBzaW5rIHRoYXQgZm9yd2FyZHMgdGhlbSB0byB0aGUgbG9nZ2VyIHJlZ2lzdGVyZWQgb24ge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfS5cbiAqXG4gKiBBdHRyaWJ1dGVzIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgRXhlY3V0aW9uIGNvbnRleHQgYXJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYXMgbWV0YWRhdGEgb24gZXZlcnkgbG9nXG4gKiBlbnRyaWVzLiBBbiBleHRyYSBgc2RrQ29tcG9uZW50YCBtZXRhZGF0YSBhdHRyaWJ1dGUgaXMgYWxzbyBhZGRlZCwgd2l0aCB2YWx1ZSBgd29ya2Zsb3dgOyB0aGlzIGNhbiBiZSB1c2VkIGZvclxuICogZmluZS1ncmFpbmVkIGZpbHRlcmluZyBvZiBsb2cgZW50cmllcyBmdXJ0aGVyIGRvd25zdHJlYW0uXG4gKlxuICogVG8gY3VzdG9taXplIGxvZyBhdHRyaWJ1dGVzLCByZWdpc3RlciBhIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvcn0gdGhhdCBpbnRlcmNlcHRzIHRoZVxuICogYGdldExvZ0F0dHJpYnV0ZXMoKWAgbWV0aG9kLlxuICpcbiAqIE5vdGljZSB0aGF0IHNpbmNlIHNpbmtzIGFyZSB1c2VkIHRvIHBvd2VyIHRoaXMgbG9nZ2VyLCBhbnkgbG9nIGF0dHJpYnV0ZXMgbXVzdCBiZSB0cmFuc2ZlcmFibGUgdmlhIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbCN3b3JrZXJfdGhyZWFkc19wb3J0X3Bvc3RtZXNzYWdlX3ZhbHVlX3RyYW5zZmVybGlzdCB8IHBvc3RNZXNzYWdlfVxuICogQVBJLlxuICpcbiAqIE5PVEU6IFNwZWNpZnlpbmcgYSBjdXN0b20gbG9nZ2VyIHRocm91Z2gge0BsaW5rIGRlZmF1bHRTaW5rfSBvciBieSBtYW51YWxseSByZWdpc3RlcmluZyBhIHNpbmsgbmFtZWRcbiAqIGBkZWZhdWx0V29ya2VyTG9nZ2VyYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZzogV29ya2Zsb3dMb2dnZXIgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIChbJ3RyYWNlJywgJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddIGFzIEFycmF5PGtleW9mIFdvcmtmbG93TG9nZ2VyPikubWFwKChsZXZlbCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBsZXZlbCxcbiAgICAgIChtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmxvZyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICAgICAgICBjb25zdCBnZXRMb2dBdHRyaWJ1dGVzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TG9nQXR0cmlidXRlcycsIChhKSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGxvZ2dlclNpbmtbbGV2ZWxdIShtZXNzYWdlLCB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBjYWxsIHRpbWUgaW4gbmFub3NlY29uZCByZXNvbHV0aW9uIGFzIGV4cGVjdGVkIGJ5IHRoZSB3b3JrZXIgbG9nZ2VyLlxuICAgICAgICAgIFtMb2dUaW1lc3RhbXBdOiBhY3RpdmF0b3IuZ2V0VGltZU9mRGF5KCksXG4gICAgICAgICAgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2Zsb3csXG4gICAgICAgICAgLi4uZ2V0TG9nQXR0cmlidXRlcyh3b3JrZmxvd0xvZ0F0dHJpYnV0ZXMoYWN0aXZhdG9yLmluZm8pKSxcbiAgICAgICAgICAuLi5hdHRycyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIF07XG4gIH0pXG4pIGFzIGFueTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZyhmbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICBsb2cuZGVidWcoJ1dvcmtmbG93IHN0YXJ0ZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgY29uc3QgcCA9IGZuKCkudGhlbihcbiAgICAocmVzKSA9PiB7XG4gICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbXBsZXRlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgLy8gQXZvaWQgdXNpbmcgaW5zdGFuY2VvZiBjaGVja3MgaW4gY2FzZSB0aGUgbW9kdWxlcyB0aGV5J3JlIGRlZmluZWQgaW4gbG9hZGVkIG1vcmUgdGhhbiBvbmNlLFxuICAgICAgLy8gZS5nLiBieSBqZXN0IG9yIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgYXJlIGluc3RhbGxlZC5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29tcGxldGVkIGFzIGNhbmNlbGxlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29udGludWVkIGFzIG5ldycsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2cud2FybignV29ya2Zsb3cgZmFpbGVkJywgeyBlcnJvciwgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICApO1xuICAvLyBBdm9pZCBzaG93aW5nIHRoaXMgaW50ZXJjZXB0b3IgaW4gc3RhY2sgdHJhY2UgcXVlcnlcbiAgdW50cmFja1Byb21pc2UocCk7XG4gIHJldHVybiBwO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYXR0cmlidXRlcyB0byBiZSBzZXQgX2J5IGRlZmF1bHRfIG9uIGxvZyBtZXNzYWdlcyBmb3IgYSBnaXZlbiBXb3JrZmxvdy5cbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBXb3JrZmxvdyBjb250ZXh0IChlZy4gYnkgdGhlIHdvcmtlciBpdHNlbGYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dMb2dBdHRyaWJ1dGVzKGluZm86IFdvcmtmbG93SW5mbyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgYXR0cmlidXRlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHRhc2tRdWV1ZTogaW5mby50YXNrUXVldWUsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICAgIHJ1bklkOiBpbmZvLnJ1bklkLFxuICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gIH07XG4gIGlmIChpbldvcmtmbG93Q29udGV4dCgpKSB7XG4gICAgY29uc3QgdXBkYXRlSW5mbyA9IGN1cnJlbnRVcGRhdGVJbmZvKCk7XG4gICAgaWYgKHVwZGF0ZUluZm8pIHtcbiAgICAgIC8vIEFkZCB1cGRhdGUgaW5mbyBpZiBpdCBleGlzdHNcbiAgICAgIGF0dHJpYnV0ZXNbJ3VwZGF0ZUlkJ10gPSB1cGRhdGVJbmZvLmlkO1xuICAgICAgYXR0cmlidXRlc1sndXBkYXRlTmFtZSddID0gdXBkYXRlSW5mby5uYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXR0cmlidXRlcztcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgTWV0cmljQ291bnRlcixcbiAgTWV0cmljR2F1Z2UsXG4gIE1ldHJpY0hpc3RvZ3JhbSxcbiAgTWV0cmljTWV0ZXIsXG4gIE1ldHJpY1RhZ3MsXG4gIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJy4vaW50ZXJjZXB0b3ItY29tcG9zaXRpb24nO1xuaW1wb3J0IHR5cGUgeyBTaW5rLCBTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgd29ya2Zsb3dJbmZvIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5jbGFzcyBXb3JrZmxvd01ldHJpY01ldGVySW1wbCBpbXBsZW1lbnRzIE1ldHJpY01ldGVyIHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNyZWF0ZUNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY0NvdW50ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICByZXR1cm4gbmV3IFdvcmtmbG93TWV0cmljQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0dhdWdlKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlciB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNNZXRlcmApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljQ291bnRlciBpbXBsZW1lbnRzIE1ldHJpY0NvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdjb3VudGVyJztcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlVHlwZSA9ICdpbnQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFnczogTWV0cmljVGFncyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNDb3VudGVyIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLmFkZE1ldHJpY0NvdW50ZXJWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljQ291bnRlcmApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljSGlzdG9ncmFtIGltcGxlbWVudHMgTWV0cmljSGlzdG9ncmFtIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnaGlzdG9ncmFtJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgcmVjb3JkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFnczogTWV0cmljVGFncyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNIaXN0b2dyYW0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1NpbmsucmVjb3JkTWV0cmljSGlzdG9ncmFtVmFsdWUodGhpcy5uYW1lLCB0aGlzLnZhbHVlVHlwZSwgdGhpcy51bml0LCB0aGlzLmRlc2NyaXB0aW9uLCB2YWx1ZSwgZXh0cmFUYWdzKTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbWApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljR2F1Z2UgaW1wbGVtZW50cyBNZXRyaWNHYXVnZSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2dhdWdlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIHRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNHYXVnZSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5zZXRNZXRyaWNHYXVnZVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIHRhZ3MgPz8ge30pO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNHYXVnZWApO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8gTm90ZTogZ2l2ZW4gdGhhdCBmb3J3YXJkaW5nIG1ldHJpY3Mgb3V0c2lkZSBvZiB0aGUgc2FuYm94IGNhbiBiZSBxdWl0ZSBjaGF0dHkgYW5kIGFkZCBub25cbi8vIG5lZ2xpZ2VhYmxlIG92ZXJoZWFkLCB3ZSBlYWdlcmx5IGNoZWNrIGZvciBgaXNSZXBsYXlpbmdgIGFuZCBjb21wbGV0ZWx5IHNraXAgZG9pbmcgc2lua1xuLy8gY2FsbHMgaWYgd2UgYXJlIHJlcGxheWluZy5cbmNvbnN0IG1ldHJpY1NpbmsgPSBwcm94eVNpbmtzPE1ldHJpY1NpbmtzPigpLl9fdGVtcG9yYWxfbWV0cmljcztcblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBtZXRyaWNzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlci5cbiAqXG4gKiBUaGVzZSBzaW5rIGZ1bmN0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHdvcmtmbG93IGNvZGU7IGluc3RlYWQsXG4gKiBkZXZlbG9wZXJzIHNob3VsZCB1c2UgdGhlIGBtZXRyaWNNZXRlcmAgb2JqZWN0IGV4cG9zZWQgdG8gd29ya2Zsb3cgY29kZSBieSB0aGUgU0RLLCB3aGljaFxuICogcHJvdmlkZXMgYW4gQVBJIHRoYXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aC5cbiAqXG4gKiBUaGlzIHNpbmsgaW50ZXJmYWNlIGlzIGFsc28gbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IHVzZXIuXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsIFVzZXJzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBub3IgdXNlIGl0IGRpcmVjdGx5LiBVc2UgYG1ldHJpY01ldGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1NpbmtzIGV4dGVuZHMgU2lua3Mge1xuICBfX3RlbXBvcmFsX21ldHJpY3M6IFdvcmtmbG93TWV0cmljTWV0ZXI7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGludGVybmFsIFVzZXJzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBub3IgdXNlIGl0IGRpcmVjdGx5LiBVc2UgYG1ldHJpY01ldGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TWV0cmljTWV0ZXIgZXh0ZW5kcyBTaW5rIHtcbiAgYWRkTWV0cmljQ291bnRlclZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG5cbiAgcmVjb3JkTWV0cmljSGlzdG9ncmFtVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG5cbiAgc2V0TWV0cmljR2F1Z2VWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgYXR0cnM6IE1ldHJpY1RhZ3NcbiAgKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIE1ldHJpY01ldGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW1pdCBtZXRyaWNzIGZyb20gd2l0aGluIGEgV29ya2Zsb3cuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgY29uc3QgbWV0cmljTWV0ZXI6IE1ldHJpY01ldGVyID0gTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzLmNvbXBvc2UoXG4gIG5ldyBXb3JrZmxvd01ldHJpY01ldGVySW1wbCgpLFxuICAoKSA9PiB7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93Lm1ldHJpY01ldGVyIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICAgIGNvbnN0IGdldE1ldHJpY1RhZ3MgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdnZXRNZXRyaWNUYWdzJywgKGEpID0+IGEpO1xuXG4gICAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICAgIHJldHVybiBnZXRNZXRyaWNUYWdzKHtcbiAgICAgIC8vIG5hbWVzcGFjZSBhbmQgdGFza1F1ZXVlIHdpbGwgYmUgYWRkZWQgYnkgdGhlIFdvcmtlclxuICAgICAgd29ya2Zsb3dUeXBlOiBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB9KTtcbiAgfSxcbiAgdHJ1ZVxuKTtcbiIsImltcG9ydCB0eXBlICogYXMgbmV4dXMgZnJvbSAnbmV4dXMtcnBjJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb1RzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IHVzZXJNZXRhZGF0YVRvUGF5bG9hZCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdXNlci1tZXRhZGF0YSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJy4vaW50ZXJjZXB0b3ItY29tcG9zaXRpb24nO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBTdGFydE5leHVzT3BlcmF0aW9uSW5wdXQsIFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQsIFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zIH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuXG4vKipcbiAqIEEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHNlcnZpY2UgZnJvbSBhIFdvcmtmbG93LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+IHtcbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIGFuZCB3YWl0IGZvciBpdHMgY29tcGxldGlvbiB0YWtpbmcgYSB7QGxpbmsgbmV4dXMub3BlcmF0aW9ufS5cbiAgICogUmV0dXJucyB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICBvcDogTyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8Tz4sXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8U3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnM+XG4gICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PjtcblxuICAvLyBUT0RPKG5leHVzL3Bvc3QtaW5pdGlhbC1yZWxlYXNlKTogUmV2aXNpdCB0aGUgXCJPcGVyYXRpb24gUHJvcGVydHkgTmFtZVwiIHRlcm1pbm9sb2d5LFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJlZmxlY3QgaW4gdGhlIE5leHVzIFJQQyBTREsuXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIGFuZCB3YWl0IGZvciBpdHMgY29tcGxldGlvbiwgdGFraW5nIGFuIE9wZXJhdGlvbidzIF9wcm9wZXJ0eSBuYW1lXy5cbiAgICogUmV0dXJucyB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgZXhlY3V0ZU9wZXJhdGlvbjxLIGV4dGVuZHMgbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT4+KFxuICAgIG9wOiBLLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bS10+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxUWydvcGVyYXRpb25zJ11bS10+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIHN0YXJ0T3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPE5leHVzT3BlcmF0aW9uSGFuZGxlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj4+O1xuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiwgdGFraW5nIGFuIE9wZXJhdGlvbidzIF9wcm9wZXJ0eSBuYW1lXy5cbiAgICogUmV0dXJucyBhIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoZSBPcGVyYXRpb24ncyByZXN1bHQuXG4gICAqXG4gICAqIEFuIE9wZXJhdGlvbidzIF9wcm9wZXJ0eSBuYW1lXyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdXNlZCB0byBkZWZpbmUgdGhhdCBPcGVyYXRpb24gaW5cbiAgICogdGhlIHtAbGluayBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbn0gb2JqZWN0OyBpdCBtYXkgZGlmZmVyIGZyb20gdGhlIHZhbHVlIG9mIHRoZSBgbmFtZWAgcHJvcGVydHlcbiAgICogaWYgb25lIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGUge0BsaW5rIG5leHVzLk9wZXJhdGlvbkRlZmluaXRpb259IG9iamVjdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxLIGV4dGVuZHMgbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT4+KFxuICAgIG9wOiBLLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bS10+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPE5leHVzT3BlcmF0aW9uSGFuZGxlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxUWydvcGVyYXRpb25zJ11bS10+Pj47XG59XG5cbi8qKlxuICogQSBoYW5kbGUgdG8gYSBOZXh1cyBPcGVyYXRpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNPcGVyYXRpb25IYW5kbGU8VD4ge1xuICAvKipcbiAgICogVGhlIE9wZXJhdGlvbidzIHNlcnZpY2UgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIE9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcGVyYXRpb24gdG9rZW4gYXMgc2V0IGJ5IHRoZSBPcGVyYXRpb24ncyBoYW5kbGVyLiBNYXkgYmUgZW1wdHkgaWYgdGhlIE9wZXJhdGlvbiBjb21wbGV0ZWQgc3luY2hyb25vdXNseS5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBPcGVyYXRpb24gY29tcGxldGlvbiBhbmQgZ2V0IGl0cyByZXN1bHQuXG4gICAqL1xuICByZXN1bHQoKTogUHJvbWlzZTxUPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlTmV4dXNTZXJ2aWNlQ2xpZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+IHtcbiAgZW5kcG9pbnQ6IHN0cmluZztcbiAgc2VydmljZTogVDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBOZXh1cyBjbGllbnQgZm9yIGludm9raW5nIE5leHVzIE9wZXJhdGlvbnMgZnJvbSBhIFdvcmtmbG93LlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV4dXNTZXJ2aWNlQ2xpZW50PFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4oXG4gIG9wdGlvbnM6IE5leHVzU2VydmljZUNsaWVudE9wdGlvbnM8VD5cbik6IE5leHVzU2VydmljZUNsaWVudDxUPiB7XG4gIGNsYXNzIE5leHVzU2VydmljZUNsaWVudEltcGw8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiBpbXBsZW1lbnRzIE5leHVzU2VydmljZUNsaWVudDxUPiB7XG4gICAgYXN5bmMgZXhlY3V0ZU9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFBhcnRpYWw8U3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnM+XG4gICAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHRoaXMuc3RhcnRPcGVyYXRpb24ob3BlcmF0aW9uLCBpbnB1dCwgb3BlcmF0aW9uT3B0aW9ucyk7XG4gICAgICByZXR1cm4gYXdhaXQgaGFuZGxlLnJlc3VsdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIHN0YXJ0T3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgICBvcGVyYXRpb246IHN0cmluZyB8IFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0sXG4gICAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XT4sXG4gICAgICBvcGVyYXRpb25PcHRpb25zPzogU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnNcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wTmFtZSA9XG4gICAgICAgIHR5cGVvZiBvcGVyYXRpb24gPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyAvLyBDYXN0aW5nIGFzIHN0cmluZyB0byBjb3ZlciB1cCB0aGUgZmFjdCB0aGF0IGBvcE5hbWVgIG1pZ2h0IGJlIHVuZGVmaW5lZC5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucywgdGhlbiBgZXhlY3V0ZWAgd2lsbCBwcm9kdWNlIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZS5OT1RfRk9VTkRgLlxuICAgICAgICAgICAgKG9wdGlvbnMuc2VydmljZS5vcGVyYXRpb25zW29wZXJhdGlvbl0/Lm5hbWUgYXMgc3RyaW5nKVxuICAgICAgICAgIDogb3BlcmF0aW9uLm5hbWU7XG5cbiAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLm5leHVzT3BlcmF0aW9uKys7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLFxuICAgICAgICAnc3RhcnROZXh1c09wZXJhdGlvbicsXG4gICAgICAgIHN0YXJ0TmV4dXNPcGVyYXRpb25OZXh0SGFuZGxlclxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGludGVyY2VwdG9yIHJldHVybnMgYSBQcm9taXNlPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+LCB3aXRoIHRoZSByZXN1bHQgcHJvbWlzZSBjb250YWluZWRcbiAgICAgIC8vIGluIHRoYXQgT3V0cHV0IG9iamVjdC4gQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzLCB0aGUgcmVzdWx0IHByb21pc2UvY29tcGxldGlvbiBkb2VzIG5vdCBleGlzdFxuICAgICAgLy8gdW50aWwgdGhlIFN0YXJ0TmV4dXNPcGVyYXRpb24gZXZlbnQgaXMgcmVjZWl2ZWQuIFRoaXMgaXMgdG90YWxseSBkaWZmZXJlbnQgZnJvbSB3aGF0IHdlIGRpZCBpblxuICAgICAgLy8gQ2hpbGRXb3JrZmxvdywgYnV0IGlzIG11Y2ggY2xlYW5lciBmcm9tIHRoZSBpbnRlcmNlcHRvcnMgcG9pbnQgb2Ygdmlldy5cbiAgICAgIGNvbnN0IHsgdG9rZW4sIHJlc3VsdDogcmVzdWx0UHJvbWlzZSB9ID0gYXdhaXQgZXhlY3V0ZSh7XG4gICAgICAgIGVuZHBvaW50OiBvcHRpb25zLmVuZHBvaW50LFxuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAuLi5vcGVyYXRpb25PcHRpb25zLFxuICAgICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IG9wZXJhdGlvbk9wdGlvbnM/LmNhbmNlbGxhdGlvblR5cGUgPz8gJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBzZXEsXG4gICAgICAgIGlucHV0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZpY2U6IG9wdGlvbnMuc2VydmljZS5uYW1lLFxuICAgICAgICBvcGVyYXRpb246IG9wTmFtZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGFzeW5jIHJlc3VsdCgpOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj4ge1xuICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlIGFzIG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPjtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQ+KCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0TmV4dXNPcGVyYXRpb25OZXh0SGFuZGxlcih7XG4gIGlucHV0LFxuICBlbmRwb2ludCxcbiAgc2VydmljZSxcbiAgb3B0aW9ucyxcbiAgb3BlcmF0aW9uLFxuICBzZXEsXG4gIGhlYWRlcnMsXG59OiBTdGFydE5leHVzT3BlcmF0aW9uSW5wdXQpOiBQcm9taXNlPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgdHlwZTogJ3dvcmtmbG93JyBhcyBjb25zdCxcbiAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSxcbiAgICB3b3JrZmxvd0lkOiBhY3RpdmF0b3IuaW5mby53b3JrZmxvd0lkLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWQgPVxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvblN0YXJ0LmhhcyhzZXEpICYmXG4gICAgICAgICAgICAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuaGFzKHNlcSk7XG5cbiAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbmNlbE5leHVzT3BlcmF0aW9uOiB7IHNlcSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZU5leHVzT3BlcmF0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHNlcnZpY2UsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgbmV4dXNIZWFkZXI6IGhlYWRlcnMsXG4gICAgICAgIGlucHV0OiBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQoaW5wdXQsIGNvbnRleHQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUob3B0aW9ucz8uY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN1bW1hcnksIHVuZGVmaW5lZCwgY29udGV4dCksXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBPcGVyYXRpb24ncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgV29ya2Zsb3dcbiAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0IHByb21pc2UgZmFpbCB3aXRoIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZWAsXG4gKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAqIE9wZXJhdGlvbiBjYWxsIHdhcyBtYWRlLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgZmllbGRcbmV4cG9ydCBjb25zdCBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uLCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciB0aGUgTmV4dXMgb3BlcmF0aW9uIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uIHRvXG4gICAqIHRoZSBjYWxsZXIuIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGNhbmNlbGxhdGlvbiBpcyBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiBpZlxuICAgKiBjYWxsaW5nIHdvcmtmbG93IGV4aXRzIGJlZm9yZSB0aGUgZGVsaXZlcnkgaXMgZG9uZS4gSWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgY2FuY2VsbGF0aW9uIGlzXG4gICAqIGRlbGl2ZXJlZCB0byB0aGUgb3BlcmF0aW9uLCB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRH0uXG4gICAqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci4gSW4gcGFydGljdWxhciwgZWl0aGVyIHRoZVxuICAgKiBPcGVyYXRpb24gb3IgdGhlIFdvcmtmbG93IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgT3BlcmF0aW9uIGNvbXBsZXRlZFxuICAgKiBzdWNjZXNzZnVsbHksIGJ1dCB0aGUgV29ya2Zsb3cgdGhpbmtzIGl0IHdhcyBjYW5jZWxsZWQuXG4gICAqXG4gICAqIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBPcGVyYXRpb24gd2lsbCBldmVudHVhbGx5IGJlIG5vdGlmaWVkIG9mIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgdGhlbiB3YWl0IGZvciB0aGUgc2VydmVyXG4gICAqIHRvIGNvbmZpcm0gdGhhdCB0aGUgT3BlcmF0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyBkZWxpdmVyZWQgdG8gdGhlIE9wZXJhdGlvbiBIYW5kbGVyLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgY29tcGxldGlvblxuICAgKiBvZiB0aGUgT3BlcmF0aW9uLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZV07XG5cbmNvbnN0IFtlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsIF9dID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDAsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMSxcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAyLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEXTogMyxcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG4iLCIvLyAuLi9wYWNrYWdlLmpzb24gaXMgb3V0c2lkZSBvZiB0aGUgVFMgcHJvamVjdCByb290RGlyIHdoaWNoIGNhdXNlcyBUUyB0byBjb21wbGFpbiBhYm91dCB0aGlzIGltcG9ydC5cbi8vIFdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgcm9vdERpciBiZWNhdXNlIGl0IG1lc3NlcyB1cCB0aGUgb3V0cHV0IHN0cnVjdHVyZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgcGtnIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiIsImV4cG9ydCBmdW5jdGlvbiBmaWxsV2l0aFJhbmRvbShyYW5kb206ICgpID0+IG51bWJlciwgYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzW2ldID0gTWF0aC5mbG9vcihyYW5kb20oKSAqIDB4MTAwKTtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNEZyb21SYW5kb20ocmFuZG9tOiAoKSA9PiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBobyA9IChuOiBudW1iZXIsIHA6IG51bWJlcikgPT4gbi50b1N0cmluZygxNikucGFkU3RhcnQocCwgJzAnKTtcbiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMTYpKTtcbiAgdmlldy5zZXRVaW50MzIoMCwgKHJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoNCwgKHJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoOCwgKHJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoMTIsIChyYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDgoNiwgKHZpZXcuZ2V0VWludDgoNikgJiAweGYpIHwgMHg0MCk7XG4gIHZpZXcuc2V0VWludDgoOCwgKHZpZXcuZ2V0VWludDgoOCkgJiAweDNmKSB8IDB4ODApO1xuICByZXR1cm4gYCR7aG8odmlldy5nZXRVaW50MzIoMCksIDgpfS0ke2hvKHZpZXcuZ2V0VWludDE2KDQpLCA0KX0tJHtobyh2aWV3LmdldFVpbnQxNig2KSwgNCl9LSR7aG8oXG4gICAgdmlldy5nZXRVaW50MTYoOCksXG4gICAgNFxuICApfS0ke2hvKHZpZXcuZ2V0VWludDMyKDEwKSwgOCl9JHtobyh2aWV3LmdldFVpbnQxNigxNCksIDQpfWA7XG59XG4iLCJpbXBvcnQgeyBlbmNvZGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2VuY29kaW5nJztcblxuY29uc3QgUkFORE9NX1NUUkVBTV9TRUVEX1BSRUZJWCA9IEFycmF5LmZyb20oZW5jb2RlKCd0ZW1wb3JhbC13b3JrZmxvdy1yYW5kb20tc3RyZWFtLXYxJykpO1xuXG5mdW5jdGlvbiBlbmNvZGVVMzIodmFsdWU6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIFsodmFsdWUgPj4+IDI0KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gMTYpICYgMHhmZiwgKHZhbHVlID4+PiA4KSAmIDB4ZmYsIHZhbHVlICYgMHhmZl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVBbGVhU2VlZChzZWVkOiBudW1iZXJbXSwgbmFtZXNwYWNlOiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIGNvbnN0IG5hbWVzcGFjZUJ5dGVzID0gQXJyYXkuZnJvbShlbmNvZGUobmFtZXNwYWNlKSk7XG4gIHJldHVybiBbXG4gICAgLi4uUkFORE9NX1NUUkVBTV9TRUVEX1BSRUZJWCxcbiAgICAuLi5lbmNvZGVVMzIoc2VlZC5sZW5ndGgpLFxuICAgIC4uLnNlZWQsXG4gICAgLi4uZW5jb2RlVTMyKG5hbWVzcGFjZUJ5dGVzLmxlbmd0aCksXG4gICAgLi4ubmFtZXNwYWNlQnl0ZXMsXG4gIF07XG59XG4iLCJpbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgeyBmaWxsV2l0aFJhbmRvbSwgdXVpZDRGcm9tUmFuZG9tIH0gZnJvbSAnLi9yYW5kb20taGVscGVycyc7XG5cbi8qKlxuICogQSBkZXRlcm1pbmlzdGljIFBSTkcgc3RyZWFtIHNjb3BlZCB0byB0aGUgY3VycmVudCBXb3JrZmxvdyBleGVjdXRpb24uXG4gKlxuICogV29ya2Zsb3cgY29kZSBhbHJlYWR5IGdldHMgYSBkZXRlcm1pbmlzdGljIGRlZmF1bHQgc3RyZWFtIHRocm91Z2ggYE1hdGgucmFuZG9tKClgLlxuICogVGhpcyBpbnRlcmZhY2UgZXhwb3NlcyBhZGRpdGlvbmFsIG5hbWVkIHN0cmVhbXMgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIHRoZSB3b3JrZmxvd1xuICogc2VlZCB3aXRob3V0IGNvbnN1bWluZyB0aGF0IGRlZmF1bHQgc3RyZWFtLiBSZXBlYXRlZCBjYWxscyB0b1xuICoge0BsaW5rIGdldFJhbmRvbVN0cmVhbX0gd2l0aCB0aGUgc2FtZSBuYW1lIHJlZmVyIHRvIHRoZSBzYW1lIGxvZ2ljYWwgc3RyZWFtIHN0YXRlXG4gKiBmb3IgdGhlIGN1cnJlbnQgd29ya2Zsb3cgZXhlY3V0aW9uLCBhbmQgdGhhdCBzdGF0ZSBpcyBwcmVzZXJ2ZWQgYWNyb3NzIGFjdGl2YXRpb25zLlxuICpcbiAqIFRoZSBwcmltYXJ5IHVzZSBjYXNlIGlzIHdvcmtmbG93IHBsdWdpbnMgYW5kIGludGVyY2VwdG9ycyB0aGF0IG5lZWQgcHJpdmF0ZSxcbiAqIHJlcGxheS1zdGFibGUgZW50cm9weSB3aXRob3V0IHBlcnR1cmJpbmcgdXNlciB3b3JrZmxvdyByYW5kb21uZXNzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgbWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UmFuZG9tU3RyZWFtIHtcbiAgLyoqXG4gICAqIERyYXcgdGhlIG5leHQgZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIG51bWJlciBmcm9tIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYE1hdGgucmFuZG9tKClgLCBidXQgaXNvbGF0ZWQgZnJvbSB0aGUgd29ya2Zsb3cncyBtYWluXG4gICAqIHJhbmRvbSBzdHJlYW0gYW5kIGZyb20gb3RoZXIgbmFtZWQgc3RyZWFtcy5cbiAgICovXG4gIHJhbmRvbSgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgZGV0ZXJtaW5pc3RpYyBVVUlEdjQgYmFja2VkIGJ5IHRoaXMgc3RyZWFtLlxuICAgKi9cbiAgdXVpZDQoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxsIGEgYnl0ZSBhcnJheSBkZXRlcm1pbmlzdGljYWxseSBmcm9tIHRoaXMgc3RyZWFtLlxuICAgKi9cbiAgZmlsbChieXRlczogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG5cbiAgLyoqXG4gICAqIFJ1biBgZm5gIHdpdGggc2NvcGVkIHdvcmtmbG93LXJhbmRvbSBoZWxwZXJzIHN1Y2ggYXMgYE1hdGgucmFuZG9tKClgIGFuZCBgdXVpZDQoKWBcbiAgICogcm91dGVkIHRocm91Z2ggdGhpcyBzdHJlYW0uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHNjb3BlZCBvdmVycmlkZSBBUEkgZm9yIHdvcmtmbG93IHJhbmRvbSBzdHJlYW1zLiBJdCBpcyBpbnRlbmRlZCBmb3JcbiAgICogYm91bmRlZCBwbHVnaW4vaW50ZXJjZXB0b3IgY29kZSB0aGF0IG5lZWRzIGV4aXN0aW5nIGNhbGxzIHRvIGBNYXRoLnJhbmRvbSgpYCBvclxuICAgKiBgdXVpZDQoKWAgdG8gdXNlIHRoaXMgc3RyZWFtIHdpdGhvdXQgcGVydHVyYmluZyB0aGUgd29ya2Zsb3cncyBkZWZhdWx0IHJhbmRvbVxuICAgKiBzZXF1ZW5jZSBvciBhbnkgb3RoZXIgbmFtZWQgc3RyZWFtLlxuICAgKlxuICAgKiBUaGUgb3ZlcnJpZGUgZm9sbG93cyBhc3luYyBjb250aW51YXRpb25zIHN0YXJ0ZWQgYnkgYGZuYC4gV29ya2Zsb3cgaW50ZXJjZXB0b3JcbiAgICogYG5leHQoLi4uKWAgY29udGludWF0aW9ucyByZXN0b3JlIHRoZSBkb3duc3RyZWFtIHdvcmtmbG93IHJhbmRvbSBzY29wZSBiZWZvcmVcbiAgICogZW50ZXJpbmcgdGhlIHJlc3Qgb2YgdGhlIGludGVyY2VwdG9yIGNoYWluIG9yIHdvcmtmbG93IGNvZGUsIHNvIGEgdGVtcG9yYXJ5XG4gICAqIHBsdWdpbiBzY29wZSBkb2VzIG5vdCBsZWFrIGRvd25zdHJlYW0gdW5sZXNzIHRoYXQgZG93bnN0cmVhbSBjb2RlIGV4cGxpY2l0bHlcbiAgICogZXN0YWJsaXNoZXMgaXRzIG93biBzY29wZS5cbiAgICpcbiAgICogUHJlZmVyIGV4cGxpY2l0IGBzdHJlYW0ucmFuZG9tKClgIC8gYHN0cmVhbS51dWlkNCgpYCBjYWxscyB3aGVuIHRoYXQgaXMgcHJhY3RpY2FsLlxuICAgKiBVc2UgYHN0cmVhbS53aXRoKC4uLilgIHdoZW4gYSB0ZW1wb3Jhcnkgc2NvcGVkIG92ZXJyaWRlIGlzIHRoZSBiZXR0ZXIgZml0LCBvclxuICAgKiB3aGVuIHlvdSB3YW50IHRvIGtlZXAgdGhlIHN0cmVhbSBpbnN0YW5jZSBpbiBtb2R1bGUgc2NvcGUgYW5kIHJldXNlIGl0IGRpcmVjdGx5LlxuICAgKi9cbiAgd2l0aDxUPihmbjogKCkgPT4gVCk6IFQ7XG59XG5cbmNsYXNzIEFjdGl2YXRvclJhbmRvbVN0cmVhbSBpbXBsZW1lbnRzIFdvcmtmbG93UmFuZG9tU3RyZWFtIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjdGl2YXRvcjogQWN0aXZhdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgKSB7fVxuXG4gIHJhbmRvbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRvci5nZXROYW1lZFJhbmRvbSh0aGlzLm5hbWUpKCk7XG4gIH1cblxuICB1dWlkNCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkNEZyb21SYW5kb20oKCkgPT4gdGhpcy5yYW5kb20oKSk7XG4gIH1cblxuICBmaWxsKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGZpbGxXaXRoUmFuZG9tKCgpID0+IHRoaXMucmFuZG9tKCksIGJ5dGVzKTtcbiAgfVxuXG4gIHdpdGg8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmF0b3Iud2l0aEN1cnJlbnRSYW5kb20odGhpcywgZm4pO1xuICB9XG59XG5cbmNsYXNzIERlZmF1bHRXb3JrZmxvd1JhbmRvbVN0cmVhbSBpbXBsZW1lbnRzIFdvcmtmbG93UmFuZG9tU3RyZWFtIHtcbiAgcmFuZG9tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy53b3JrZmxvd1JhbmRvbSBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKS5yYW5kb20oKTtcbiAgfVxuXG4gIHV1aWQ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV1aWQ0RnJvbVJhbmRvbSgoKSA9PiB0aGlzLnJhbmRvbSgpKTtcbiAgfVxuXG4gIGZpbGwoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gZmlsbFdpdGhSYW5kb20oKCkgPT4gdGhpcy5yYW5kb20oKSwgYnl0ZXMpO1xuICB9XG5cbiAgd2l0aDxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy53b3JrZmxvd1JhbmRvbSBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICByZXR1cm4gYWN0aXZhdG9yLndpdGhDdXJyZW50UmFuZG9tKHRoaXMsIGZuKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGRldGVybWluaXN0aWMgcmFuZG9tIHN0cmVhbSBmb3IgdGhlIGN1cnJlbnQgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFRoaXMgZXhwb3NlcyB0aGUgc2FtZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHVzZWQgYnkgd29ya2Zsb3ctbGV2ZWwgYE1hdGgucmFuZG9tKClgXG4gKiB3aGVuIG5vIG5hbWVkIG92ZXJyaWRlIGlzIGFjdGl2ZS4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgcGx1Z2luL2ludGVyY2VwdG9yIGNvZGVcbiAqIHRoYXQgd2FudHMgYW4gZXhwbGljaXQgaGFuZGxlIHRvIHRoZSBtYWluIHdvcmtmbG93IHJhbmRvbSBzdHJlYW0sIGluY2x1ZGluZyBmcm9tXG4gKiBpbnNpZGUgYSB0ZW1wb3JhcnkgbmFtZWQgc2NvcGUgZXN0YWJsaXNoZWQgYnkgYW5vdGhlciBgV29ya2Zsb3dSYW5kb21TdHJlYW1gLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgbWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3Qgd29ya2Zsb3dSYW5kb206IFdvcmtmbG93UmFuZG9tU3RyZWFtID0gbmV3IERlZmF1bHRXb3JrZmxvd1JhbmRvbVN0cmVhbSgpO1xuXG4vKipcbiAqIEdldCBhIG5hbWVkIGRldGVybWluaXN0aWMgcmFuZG9tIHN0cmVhbSBmb3IgdGhlIGN1cnJlbnQgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICpcbiAqIE5hbWVkIHN0cmVhbXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgd29ya2Zsb3cgc2VlZCBhbmQgYSBzdGFibGUgc3RyZWFtIG5hbWUsXG4gKiB3aXRob3V0IGNvbnN1bWluZyB0aGUgd29ya2Zsb3cncyBkZWZhdWx0IGBNYXRoLnJhbmRvbSgpYCBzdHJlYW0uIFJlcGVhdGVkXG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIGBuYW1lYCB3aXRoaW4gYSB3b3JrZmxvdyBleGVjdXRpb24gcmVmZXIgdG8gdGhlIHNhbWVcbiAqIGxvZ2ljYWwgc3RyZWFtIHN0YXRlLCBpbmNsdWRpbmcgYWNyb3NzIGFjdGl2YXRpb25zLlxuICpcbiAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBlbnRyeSBwb2ludCBmb3Igd29ya2Zsb3cgcGx1Z2lucyBhbmQgaW50ZXJjZXB0b3JzIHRoYXRcbiAqIG5lZWQgdGhlaXIgb3duIGRldGVybWluaXN0aWMgZW50cm9weS4gVXNlIHN0YWJsZSBwYWNrYWdlLSBvciBtb2R1bGUtc3R5bGVcbiAqIG5hbWVzIHNvIHRoZSBzdHJlYW0gaWRlbnRpdHkgcmVtYWlucyByZXBsYXktc2FmZSwgdGhlbiBrZWVwIHRoZSByZXR1cm5lZFxuICogYFdvcmtmbG93UmFuZG9tU3RyZWFtYCBhcm91bmQgYW5kIGNhbGwgaXRzIG1ldGhvZHMgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIEFQSSBtYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5kb21TdHJlYW0obmFtZTogc3RyaW5nKTogV29ya2Zsb3dSYW5kb21TdHJlYW0ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuZ2V0UmFuZG9tU3RyZWFtKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJyk7XG4gIHJldHVybiBuZXcgQWN0aXZhdG9yUmFuZG9tU3RyZWFtKGFjdGl2YXRvciwgbmFtZSk7XG59XG4iLCIvKipcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBXb3JrZmxvdyBlbmQgb2YgdGhlIHNpbmtzIG1lY2hhbmlzbS5cbiAqXG4gKiBTaW5rcyBhcmUgYSBtZWNoYW5pc20gZm9yIGV4cG9ydGluZyBkYXRhIGZyb20gdGhlIFdvcmtmbG93IGlzb2xhdGUgdG8gdGhlXG4gKiBOb2RlLmpzIGVudmlyb25tZW50LCB0aGV5IGFyZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgV29ya2Zsb3cgaGFzIG5vIHdheSB0b1xuICogY29tbXVuaWNhdGUgd2l0aCB0aGUgb3V0c2lkZSBXb3JsZC5cbiAqXG4gKiBTaW5rcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGV4cG9ydGluZyBsb2dzLCBtZXRyaWNzIGFuZCB0cmFjZXMgb3V0IGZyb20gdGhlXG4gKiBXb3JrZmxvdy5cbiAqXG4gKiBTaW5rIGZ1bmN0aW9ucyBtYXkgbm90IHJldHVybiB2YWx1ZXMgdG8gdGhlIFdvcmtmbG93IGluIG9yZGVyIHRvIHByZXZlbnRcbiAqIGJyZWFraW5nIGRldGVybWluaXNtLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vKipcbiAqIEFueSBmdW5jdGlvbiBzaWduYXR1cmUgY2FuIGJlIHVzZWQgZm9yIFNpbmsgZnVuY3Rpb25zIGFzIGxvbmcgYXMgdGhlIHJldHVybiB0eXBlIGlzIGB2b2lkYC5cbiAqXG4gKiBXaGVuIGNhbGxpbmcgYSBTaW5rIGZ1bmN0aW9uLCBhcmd1bWVudHMgYXJlIGNvcGllZCBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZSBOb2RlLmpzIGVudmlyb25tZW50IHVzaW5nXG4gKiB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS93b3JrZXJfdGhyZWFkcy5odG1sI3dvcmtlcl90aHJlYWRzX3BvcnRfcG9zdG1lc3NhZ2VfdmFsdWVfdHJhbnNmZXJsaXN0IHwgcG9zdE1lc3NhZ2V9LlxuXG4gKiBUaGlzIGNvbnN0cmFpbnMgdGhlIGFyZ3VtZW50IHR5cGVzIHRvIHByaW1pdGl2ZXMgKGV4Y2x1ZGluZyBTeW1ib2xzKS5cbiAqL1xuZXhwb3J0IHR5cGUgU2lua0Z1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuXG4vKiogQSBtYXBwaW5nIG9mIG5hbWUgdG8gZnVuY3Rpb24sIGRlZmluZXMgYSBzaW5nbGUgc2luayAoZS5nLiBsb2dnZXIpICovXG5leHBvcnQgdHlwZSBTaW5rID0gUmVjb3JkPHN0cmluZywgU2lua0Z1bmN0aW9uPjtcbi8qKlxuICogV29ya2Zsb3cgU2luayBhcmUgYSBtYXBwaW5nIG9mIG5hbWUgdG8ge0BsaW5rIFNpbmt9XG4gKi9cbmV4cG9ydCB0eXBlIFNpbmtzID0gUmVjb3JkPHN0cmluZywgU2luaz47XG5cbi8qKlxuICogQ2FsbCBpbmZvcm1hdGlvbiBmb3IgYSBTaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua0NhbGwge1xuICBpZmFjZU5hbWU6IHN0cmluZztcbiAgZm5OYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IGFueVtdO1xuICB3b3JrZmxvd0luZm86IFdvcmtmbG93SW5mbztcbn1cblxuLyoqXG4gKiBHZXQgYSByZWZlcmVuY2UgdG8gU2lua3MgZm9yIGV4cG9ydGluZyBkYXRhIG91dCBvZiB0aGUgV29ya2Zsb3cuXG4gKlxuICogVGhlc2UgU2lua3MgKiptdXN0KiogYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBXb3JrZXIgaW4gb3JkZXIgZm9yIHRoaXNcbiAqIG1lY2hhbmlzbSB0byB3b3JrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcHJveHlTaW5rcywgU2lua3MgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogaW50ZXJmYWNlIE15U2lua3MgZXh0ZW5kcyBTaW5rcyB7XG4gKiAgIGxvZ2dlcjoge1xuICogICAgIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAqICAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICogICB9O1xuICogfVxuICpcbiAqIGNvbnN0IHsgbG9nZ2VyIH0gPSBwcm94eVNpbmtzPE15RGVwZW5kZW5jaWVzPigpO1xuICogbG9nZ2VyLmluZm8oJ3NldHRpbmcgdXAnKTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBhc3luYyBleGVjdXRlKCkge1xuICogICAgICAgbG9nZ2VyLmluZm8oXCJoZXkgaG9cIik7XG4gKiAgICAgICBsb2dnZXIuZXJyb3IoXCJsZXRzIGdvXCIpO1xuICogICAgIH1cbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJveHlTaW5rczxUIGV4dGVuZHMgU2lua3M+KCk6IFQge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIHt9LFxuICAgIHtcbiAgICAgIGdldChfLCBpZmFjZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQoXywgZm5OYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAgICAgICAgICAgICAgICdQcm94aWVkIHNpbmtzIGZ1bmN0aW9ucyBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYWN0aXZhdG9yLnNpbmtDYWxscy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlmYWNlTmFtZTogaWZhY2VOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGZuTmFtZTogZm5OYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZnVuY3Rpb24gZG9lc24ndCBnZXQgY2FsbGVkIGltbWVkaWF0ZWx5LiBNYWtlIGEgY2xvbmUgb2YgdGhlIHNpbmsncyBhcmdzLCBzbyB0aGF0IGZ1cnRoZXIgbXV0YXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB0byB0aGVzZSBvYmplY3RzIGRvbid0IGNvcnJ1cHQgdGhlIGFyZ3MgdGhhdCB0aGUgc2luayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUuIE9ubHkgYXZhaWxhYmxlIGZyb20gbm9kZSAxNy5cbiAgICAgICAgICAgICAgICAgIGFyZ3M6IChnbG9iYWxUaGlzIGFzIGFueSkuc3RydWN0dXJlZENsb25lID8gKGdsb2JhbFRoaXMgYXMgYW55KS5zdHJ1Y3R1cmVkQ2xvbmUoYXJncykgOiBhcmdzLFxuICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdG9yLmluZm8gaXMgaW50ZXJuYWxseSBjb3B5LW9uLXdyaXRlLiBUaGlzIGVuc3VyZSB0aGF0IGFueSBmdXJ0aGVyIG11dGF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHdvcmtmbG93IHN0YXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcmVzZW50IGFjdGl2YXRpb24gd2lsbCBub3QgY29ycnVwdCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93SW5mbyBzdGF0ZSB0aGF0IGdldHMgcGFzc2VkIHdoZW4gdGhlIHNpbmsgZnVuY3Rpb24gYWN0dWFsbHkgZ2V0cyBjYWxsZWQuXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0luZm86IGFjdGl2YXRvci5pbmZvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH1cbiAgKSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgYSBwcm9taXNlIGZyb20gYmVpbmcgdHJhY2tlZCBmb3Igc3RhY2sgdHJhY2UgcXVlcnkgcHVycG9zZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVudHJhY2tQcm9taXNlKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3Qgc3RvcmUgPSBtYXliZUdldEFjdGl2YXRvcigpPy5wcm9taXNlU3RhY2tTdG9yZTtcbiAgaWYgKCFzdG9yZSkgcmV0dXJuO1xuICBzdG9yZS5jaGlsZFRvUGFyZW50LmRlbGV0ZShwcm9taXNlKTtcbiAgc3RvcmUucHJvbWlzZVRvU3RhY2suZGVsZXRlKHByb21pc2UpO1xufVxuIiwiaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5cbi8qKlxuICogQSBgUHJvbWlzZUxpa2VgIGhlbHBlciB3aGljaCBleHBvc2VzIGl0cyBgcmVzb2x2ZWAgYW5kIGByZWplY3RgIG1ldGhvZHMuXG4gKlxuICogVHJpZ2dlciBpcyBDYW5jZWxsYXRpb25TY29wZS1hd2FyZTogaXQgaXMgbGlua2VkIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9uXG4gKiBjb25zdHJ1Y3Rpb24gYW5kIHRocm93cyB3aGVuIHRoYXQgc2NvcGUgaXMgY2FuY2VsbGVkLlxuICpcbiAqIFVzZWZ1bCBmb3IgZS5nLiB3YWl0aW5nIGZvciB1bmJsb2NraW5nIGEgV29ya2Zsb3cgZnJvbSBhIFNpZ25hbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGRlZmluZVNpZ25hbCwgc2V0SGFuZGxlciwgc2xlZXAsIFRyaWdnZXIgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogY29uc3QgY29tcGxldGVVc2VySW50ZXJhY3Rpb24gPSBkZWZpbmVTaWduYWwoJ2NvbXBsZXRlVXNlckludGVyYWN0aW9uJyk7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRPblVzZXIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgY29uc3QgdXNlckludGVyYWN0aW9uID0gbmV3IFRyaWdnZXI8Ym9vbGVhbj4oKTtcbiAqXG4gKiAgIC8vIHByb2dyYW1tYXRpY2FsbHkgcmVzb2x2ZSBUcmlnZ2VyXG4gKiAgIHNldEhhbmRsZXIoY29tcGxldGVVc2VySW50ZXJhY3Rpb24sICgpID0+IHVzZXJJbnRlcmFjdGlvbi5yZXNvbHZlKHRydWUpKTtcbiAqXG4gKiAgIGNvbnN0IHVzZXJJbnRlcmFjdGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFt1c2VySW50ZXJhY3Rpb24sIHNsZWVwKCczMCBkYXlzJyldKTtcbiAqICAgaWYgKCF1c2VySW50ZXJhY3RlZCkge1xuICogICAgIGF3YWl0IHNlbmRSZW1pbmRlckVtYWlsKHVzZXJJZCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVHJpZ2dlcjxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+IHtcbiAgLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCByZWFsaXplIHRoYXQgdGhlIHByb21pc2UgZXhlY3V0b3IgaXMgcnVuIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb2x2ZTogKHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgcmVhZG9ubHkgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxUPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG4gICAgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbnNcbiAgICB1bnRyYWNrUHJvbWlzZSh0aGlzLnByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cblxuICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsXG4gICk6IFByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuXG4vKipcbiAqIE9wdGlvbiBmb3IgY29uc3RydWN0aW5nIGEgVXBkYXRlU2NvcGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVTY29wZU9wdGlvbnMge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vLyBBc3luY0xvY2FsU3RvcmFnZSBpcyBpbmplY3RlZCB2aWEgdm0gbW9kdWxlIGludG8gZ2xvYmFsIHNjb3BlLlxuLy8gSW4gY2FzZSBXb3JrZmxvdyBjb2RlIGlzIGltcG9ydGVkIGluIE5vZGUuanMgY29udGV4dCwgcmVwbGFjZSB3aXRoIGFuIGVtcHR5IGNsYXNzLlxuZXhwb3J0IGNvbnN0IEFzeW5jTG9jYWxTdG9yYWdlOiBuZXcgPFQ+KCkgPT4gQUxTPFQ+ID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Bc3luY0xvY2FsU3RvcmFnZSA/PyBjbGFzcyB7fTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZVNjb3BlIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHVwZGF0ZSB0eXBlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFVwZGF0ZVNjb3BlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkO1xuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc2NvcGUgYXMgY3VycmVudCBhbmQgcnVuIHRoZSB1cGRhdGUgaGFuZGxlciBgZm5gLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYGZuYFxuICAgKi9cbiAgcnVuPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHN0b3JhZ2UucnVuKHRoaXMsIGZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgXCJhY3RpdmVcIiB1cGRhdGUgc2NvcGUuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpOiBVcGRhdGVTY29wZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IFVwZGF0ZVNjb3BlKHsgaWQsIG5hbWUgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIHVwZGF0ZVdpdGhJbmZvPFQ+KGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBpZCwgbmFtZSB9KS5ydW4oZm4pO1xuICB9XG59XG5cbmNvbnN0IHN0b3JhZ2U6IEFMUzxVcGRhdGVTY29wZT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiIsIi8qKlxuICogRXhwb3J0ZWQgZnVuY3Rpb25zIGZvciB0aGUgV29ya2VyIHRvIGludGVyYWN0IHdpdGggdGhlIFdvcmtmbG93IGlzb2xhdGVcbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IGVuY29kZVZlcnNpb25pbmdCZWhhdmlvciwgSWxsZWdhbFN0YXRlRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICcuL2ludGVyY2VwdG9yLWNvbXBvc2l0aW9uJztcbmltcG9ydCB7IHNldEFjdGl2YXRvciwgZ2V0QWN0aXZhdG9yLCBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vLyBFeHBvcnQgdGhlIHR5cGUgZm9yIHVzZSBvbiB0aGUgXCJ3b3JrZXJcIiBzaWRlXG5leHBvcnQgeyBQcm9taXNlU3RhY2tTdG9yZSB9IGZyb20gJy4vaW50ZXJuYWxzJztcblxuY29uc3QgT3JpZ2luYWxEYXRlID0gZ2xvYmFsVGhpcy5EYXRlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGlzb2xhdGUgcnVudGltZS5cbiAqXG4gKiBTZXRzIHJlcXVpcmVkIGludGVybmFsIHN0YXRlIGFuZCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtmbG93IGFuZCBpbnRlcmNlcHRvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0UnVudGltZShvcHRpb25zOiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBuZXcgQWN0aXZhdG9yKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGluZm86IGZpeFByb3RvdHlwZXMoe1xuICAgICAgLi4ub3B0aW9ucy5pbmZvLFxuICAgICAgdW5zYWZlOiB7IC4uLm9wdGlvbnMuaW5mby51bnNhZmUsIG5vdzogT3JpZ2luYWxEYXRlLm5vdyB9LFxuICAgIH0pLFxuICB9KTtcbiAgLy8gVGhlcmUncyBvbmUgYWN0aXZhdG9yIHBlciB3b3JrZmxvdyBpbnN0YW5jZSwgc2V0IGl0IGdsb2JhbGx5IG9uIHRoZSBjb250ZXh0LlxuICAvLyBXZSBkbyB0aGlzIGJlZm9yZSBpbXBvcnRpbmcgYW55IHVzZXIgY29kZSBzbyB1c2VyIGNvZGUgY2FuIHN0YXRpY2FsbHkgcmVmZXJlbmNlIEB0ZW1wb3JhbGlvL3dvcmtmbG93IGZ1bmN0aW9uc1xuICAvLyBhcyB3ZWxsIGFzIERhdGUgYW5kIE1hdGgucmFuZG9tLlxuICBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yKTtcblxuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIC8vIHdlYnBhY2sgYWxpYXMgdG8gcGF5bG9hZENvbnZlcnRlclBhdGhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9wYXlsb2FkX2NvbnZlcnRlcicpLnBheWxvYWRDb252ZXJ0ZXI7XG4gICAgLy8gVGhlIGBwYXlsb2FkQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgICBpZiAoY3VzdG9tUGF5bG9hZENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciA9IGN1c3RvbVBheWxvYWRDb252ZXJ0ZXI7XG4gICAgfVxuICAgIC8vIHdlYnBhY2sgYWxpYXMgdG8gZmFpbHVyZUNvbnZlcnRlclBhdGhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9mYWlsdXJlX2NvbnZlcnRlcicpLmZhaWx1cmVDb252ZXJ0ZXI7XG4gICAgLy8gVGhlIGBmYWlsdXJlQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgICBpZiAoY3VzdG9tRmFpbHVyZUNvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IuZmFpbHVyZUNvbnZlcnRlciA9IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpbXBvcnRXb3JrZmxvd3MsIGltcG9ydEludGVyY2VwdG9ycyB9ID0gZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX187XG4gICAgaWYgKGltcG9ydFdvcmtmbG93cyA9PT0gdW5kZWZpbmVkIHx8IGltcG9ydEludGVyY2VwdG9ycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGJ1bmRsZSBkaWQgbm90IHJlZ2lzdGVyIGltcG9ydCBob29rcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGltcG9ydEludGVyY2VwdG9ycygpO1xuICAgIGZvciAoY29uc3QgbW9kIG9mIGludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgZmFjdG9yeTogV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5ID0gbW9kLmludGVyY2VwdG9ycztcbiAgICAgIGlmIChmYWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZmxvd3MgaW50ZXJjZXB0b3JzOiBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHtmYWN0b3J5fSdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBmYWN0b3J5KCk7XG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW5ib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW5ib3VuZCA/PyBbXSkpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLnB1c2goLi4uKGludGVyY2VwdG9ycy5vdXRib3VuZCA/PyBbXSkpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscy5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW50ZXJuYWxzID8/IFtdKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kID0gaW1wb3J0V29ya2Zsb3dzKCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGbiA9IG1vZFthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGVdO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZmxvd0ZuID0gbW9kWydkZWZhdWx0J107XG5cbiAgICBpZiAodHlwZW9mIHdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IHdvcmtmbG93Rm47XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmYXVsdFdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IGRlZmF1bHRXb3JrZmxvd0ZuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZXRhaWxzID1cbiAgICAgICAgd29ya2Zsb3dGbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAnbm8gc3VjaCBmdW5jdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgd29ya2Zsb3cgYnVuZGxlJ1xuICAgICAgICAgIDogYGV4cGVjdGVkIGEgZnVuY3Rpb24sIGJ1dCBnb3Q6ICcke3R5cGVvZiB3b3JrZmxvd0ZufSdgO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3cgb2YgdHlwZSAnJHthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGV9JzogJHtkZXRhaWxzfWApO1xuICAgIH1cbiAgICBpZiAoaXNXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMoYWN0aXZhdG9yLndvcmtmbG93KSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYWN0aXZhdG9yLnZlcnNpb25pbmdCZWhhdmlvciA9IGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICAgICAgYWN0aXZhdG9yLndvcmtmbG93RGVmaW5pdGlvbkZhaWx1cmVFeGNlcHRpb25UeXBlcyA9XG4gICAgICAgICAgYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMuZmFpbHVyZUV4Y2VwdGlvblR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdG9yLndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNHZXR0ZXIgPSBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucztcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ29yZSB3b24ndCBzZW5kIGFuIGV2aWN0aW9uIGpvYiBhZnRlciBhbiBlYXJseSBlcnJvciwgc28gd2UgYXJlIHJlc3BvbnNpYmxlIGZvciB0cmlnZ2VyaW5nXG4gICAgICAvLyBkaXNwb3NhbCBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQuIE90aGVyd2lzZSwgdGhlcmUgbWlnaHQgYmUgcmVzb3VyY2UgbGVha3MuXG4gICAgICBkaXNwb3NlKCk7XG4gICAgfSBjYXRjaCAoX2lubmVyRXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvciBkaXNwb3Npbmcgb2YgYWN0aXZhdG9yLCBpdCBpcyBtb3JlIGltcG9ydGFudCB0byByZXRocm93IHRoZSBvcmlnaW5hbCBlcnJvclxuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogT2JqZWN0cyB0cmFuc2ZlcmVkIHRvIHRoZSBWTSBmcm9tIG91dHNpZGUgaGF2ZSBwcm90b3R5cGVzIGJlbG9uZ2luZyB0byB0aGVcbiAqIG91dGVyIGNvbnRleHQsIHdoaWNoIG1lYW5zIHRoYXQgaW5zdGFuY2VvZiB3b24ndCB3b3JrIGluc2lkZSB0aGUgVk0uIFRoaXNcbiAqIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHdhbGtzIG92ZXIgdGhlIGNvbnRlbnQgb2YgYW4gb2JqZWN0LCBhbmQgcmVjcmVhdGUgc29tZVxuICogb2YgdGhlc2Ugb2JqZWN0cyAobm90YWJseSBBcnJheSwgRGF0ZSBhbmQgT2JqZWN0cykuXG4gKi9cbmZ1bmN0aW9uIGZpeFByb3RvdHlwZXM8WD4ob2JqOiBYKTogWCB7XG4gIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik/LmNvbnN0cnVjdG9yPy5uYW1lKSB7XG4gICAgICBjYXNlICdBcnJheSc6XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKChvYmogYXMgQXJyYXk8dW5rbm93bj4pLm1hcChmaXhQcm90b3R5cGVzKSkgYXMgWDtcbiAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICByZXR1cm4gbmV3IERhdGUob2JqIGFzIHVua25vd24gYXMgRGF0ZSkgYXMgWDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrLCB2XSk6IFtzdHJpbmcsIGFueV0gPT4gW2ssIGZpeFByb3RvdHlwZXModildKSkgYXMgWDtcbiAgICB9XG4gIH0gZWxzZSByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHdvcmtmbG93LiBPciB0byBiZSBleGFjdCwgX2NvbXBsZXRlXyBpbml0aWFsaXphdGlvbiwgYXMgbW9zdCBwYXJ0IGhhcyBiZWVuIGRvbmUgaW4gY29uc3RydWN0b3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZShpbml0aWFsaXplV29ya2Zsb3dKb2I6IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JSW5pdGlhbGl6ZVdvcmtmbG93KTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGFjdGl2YXRvci5pbml0aWFsaXplV29ya2Zsb3coaW5pdGlhbGl6ZVdvcmtmbG93Sm9iKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBhIGNodW5rIG9mIGFjdGl2YXRpb24gam9icy5cbiAqXG4gKiBOb3RpY2UgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhc3luYyBhbmQgcnVucyBfaW5zaWRlXyB0aGUgVk0gY29udGV4dC4gVGhlcmVmb3JlLCBubyBtaWNyb3Rhc2tcbiAqIHdpbGwgZ2V0IGV4ZWN1dGVkIF93aGlsZV8gdGhpcyBmdW5jdGlvbiBpcyBhY3RpdmU7IHRoZXkgd2lsbCBob3dldmVyIGdldCBleGVjdXRlZCBfYWZ0ZXJfIHRoaXNcbiAqIGZ1bmN0aW9uIHJldHVybnMgKGkuZS4gYWxsIG91dHN0YW5kaW5nIG1pY3JvdGFza3MgaW4gdGhlIFZNIHdpbGwgZ2V0IGV4ZWN1dGVkIGJlZm9yZSBleGVjdXRpb25cbiAqIHJlc3VtZXMgb3V0IG9mIHRoZSBWTSwgaW4gYHZtLXNoYXJlZC50czphY3RpdmF0ZSgpYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY3RpdmF0ZShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbiwgYmF0Y2hJbmRleCA9IDApOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2FjdGl2YXRlJywgKHsgYWN0aXZhdGlvbiB9KSA9PiB7XG4gICAgICAvLyBDYXN0IGZyb20gdGhlIGludGVyZmFjZSB0byB0aGUgY2xhc3Mgd2hpY2ggaGFzIHRoZSBgdmFyaWFudGAgYXR0cmlidXRlLlxuICAgICAgLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IGFjdGl2YXRpb24gaXMgYSBwcm90byBjbGFzcy5cbiAgICAgIGNvbnN0IGpvYnMgPSBhY3RpdmF0aW9uLmpvYnMgYXMgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLldvcmtmbG93QWN0aXZhdGlvbkpvYltdO1xuXG4gICAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHksIGJ1dCB3ZSBtaWdodCBzdGlsbCBuZWVkIHRvIHN0YXJ0IHRoZSB3b3JrZmxvdyBmdW5jdGlvblxuICAgICAgY29uc3Qgc3RhcnRXb3JrZmxvd0pvYiA9IGpvYnNbMF0/LnZhcmlhbnQgPT09ICdpbml0aWFsaXplV29ya2Zsb3cnID8gam9icy5zaGlmdCgpPy5pbml0aWFsaXplV29ya2Zsb3cgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgaWYgKGpvYi52YXJpYW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGpvYi52YXJpYW50IHRvIGJlIGRlZmluZWQnKTtcblxuICAgICAgICBjb25zdCB2YXJpYW50ID0gam9iW2pvYi52YXJpYW50XTtcbiAgICAgICAgaWYgKCF2YXJpYW50KSB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBqb2IuJHtqb2IudmFyaWFudH0gdG8gYmUgc2V0YCk7XG5cbiAgICAgICAgYWN0aXZhdG9yW2pvYi52YXJpYW50XSh2YXJpYW50IGFzIGFueSAvKiBUUyBjYW4ndCBpbmZlciB0aGlzIHR5cGUgKi8pO1xuXG4gICAgICAgIGlmIChqb2IudmFyaWFudCAhPT0gJ3F1ZXJ5V29ya2Zsb3cnKSB0cnlVbmJsb2NrQ29uZGl0aW9ucygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnRXb3JrZmxvd0pvYikge1xuICAgICAgICBjb25zdCBzYWZlSm9iVHlwZXM6IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbJ3ZhcmlhbnQnXVtdID0gW1xuICAgICAgICAgICdpbml0aWFsaXplV29ya2Zsb3cnLFxuICAgICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgICAgJ2RvVXBkYXRlJyxcbiAgICAgICAgICAnY2FuY2VsV29ya2Zsb3cnLFxuICAgICAgICAgICd1cGRhdGVSYW5kb21TZWVkJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKGpvYnMuc29tZSgoam9iKSA9PiAhc2FmZUpvYlR5cGVzLmluY2x1ZGVzKGpvYi52YXJpYW50KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ1JlY2VpdmVkIGJvdGggaW5pdGlhbGl6ZVdvcmtmbG93IGFuZCBub24tc2lnbmFsL25vbi11cGRhdGUgam9icyBpbiB0aGUgc2FtZSBhY3RpdmF0aW9uOiAnICtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoam9icy5tYXAoKGpvYikgPT4gam9iLnZhcmlhbnQpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhY3RpdmF0b3Iuc3RhcnRXb3JrZmxvdyhzdGFydFdvcmtmbG93Sm9iKTtcblxuICAgICAgICB0cnlVbmJsb2NrQ29uZGl0aW9ucygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGludGVyY2VwdCh7IGFjdGl2YXRpb24sIGJhdGNoSW5kZXggfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25jbHVkZSBhIHNpbmdsZSBhY3RpdmF0aW9uLlxuICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBwcm9jZXNzaW5nIGFsbCBhY3RpdmF0aW9uIGpvYnMgYW5kIHF1ZXVlZCBtaWNyb3Rhc2tzLlxuICpcbiAqIEFjdGl2YXRpb24gZmFpbHVyZXMgYXJlIGhhbmRsZWQgaW4gdGhlIG1haW4gTm9kZS5qcyBpc29sYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2x1ZGVBY3RpdmF0aW9uKCk6IGNvcmVzZGsud29ya2Zsb3dfY29tcGxldGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGFjdGl2YXRvci5yZWplY3RCdWZmZXJlZFVwZGF0ZXMoKTtcbiAgICBjb25zdCBpbnRlcmNlcHQgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW50ZXJuYWxzLCAnY29uY2x1ZGVBY3RpdmF0aW9uJywgKGlucHV0KSA9PiBpbnB1dCk7XG4gICAgY29uc3QgYWN0aXZhdGlvbkNvbXBsZXRpb24gPSBhY3RpdmF0b3IuY29uY2x1ZGVBY3RpdmF0aW9uKCk7XG4gICAgY29uc3QgeyBjb21tYW5kcyB9ID0gaW50ZXJjZXB0KHsgY29tbWFuZHM6IGFjdGl2YXRpb25Db21wbGV0aW9uLmNvbW1hbmRzIH0pO1xuICAgIGlmIChhY3RpdmF0b3IuY29tcGxldGVkKSB7XG4gICAgICBhY3RpdmF0b3Iud2FybklmVW5maW5pc2hlZEhhbmRsZXJzKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBydW5JZDogYWN0aXZhdG9yLmluZm8ucnVuSWQsXG4gICAgICBzdWNjZXNzZnVsOiB7XG4gICAgICAgIC4uLmFjdGl2YXRpb25Db21wbGV0aW9uLFxuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgdmVyc2lvbmluZ0JlaGF2aW9yOiBlbmNvZGVWZXJzaW9uaW5nQmVoYXZpb3IoYWN0aXZhdGlvbkNvbXBsZXRpb24udmVyc2lvbmluZ0JlaGF2aW9yKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIExvb3AgdGhyb3VnaCBhbGwgYmxvY2tlZCBjb25kaXRpb25zLCBldmFsdWF0ZSBhbmQgdW5ibG9jayBpZiBwb3NzaWJsZS5cbiAqXG4gKiBAcmV0dXJucyBudW1iZXIgb2YgdW5ibG9ja2VkIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlVbmJsb2NrQ29uZGl0aW9ucygpOiBudW1iZXIge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBsZXQgbnVtVW5ibG9ja2VkID0gMDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBhY3RpdmF0b3IubWF5YmVSZXRocm93V29ya2Zsb3dUYXNrRXJyb3IoKTtcbiAgICAgIGNvbnN0IHByZXZVbmJsb2NrZWQgPSBudW1VbmJsb2NrZWQ7XG4gICAgICBmb3IgKGNvbnN0IFtzZXEsIGNvbmRdIG9mIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGNvbmQuZm4oKSkge1xuICAgICAgICAgIGNvbmQucmVzb2x2ZSgpO1xuICAgICAgICAgIG51bVVuYmxvY2tlZCsrO1xuICAgICAgICAgIC8vIEl0IGlzIHNhZmUgdG8gZGVsZXRlIGVsZW1lbnRzIGR1cmluZyBtYXAgaXRlcmF0aW9uXG4gICAgICAgICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLmRlbGV0ZShzZXEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJldlVuYmxvY2tlZCA9PT0gbnVtVW5ibG9ja2VkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtVW5ibG9ja2VkO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8vIEhhbmRsZSBkaXNwb3NhbCBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRlc3Ryb3lpbmdcbi8vIHRoZSBzYW5kYm94IHZtLCB3aGljaCBtYXkgcG9zc2libHkgYmUgcmV1c2VkIGlmIGByZXVzZVY4Q29udGV4dGAgaXMgdHJ1ZSkuXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZSgpOiB2b2lkIHtcbiAgbGV0IGVycm9yOiB1bmtub3duIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkaXNwb3NlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2Rpc3Bvc2UnLCBhc3luYyAoKSA9PiB7fSk7XG4gICAgICBkaXNwb3NlKHt9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvciA9IGU7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJ1Y3RvcnMgYXJlIHJ1biBvdXRzaWRlIG9mIGludGVyY2VwdG9ycywgYmVjYXVzZSBpbnRlcmNlcHRvcnMgdGhlbXNlbHZlcyBvZnRlbiByZWx5XG4gICAgLy8gb24gb2JqZWN0cyB0aGF0IHdpbGwgYmUgZGVzdHJveWVkIChub3RhYmx5IEFzeW5jTG9jYWxTdG9yYWdlIGluc3RhbmNlcyksIGFuZCBiZWNhdXNlIHdlXG4gICAgLy8gd2FudCB0byBtYWtlIHN1cmUgdGhhdCByZXNvdXJjZXMgZ2V0IGNsZWFuZWQgdXAgZXZlbiBpZiBhbiBpbnRlcmNlcHRvciB0aHJvd3MgYW4gZXJyb3IuXG4gICAgLy8gT25seSB0aGUgZmlyc3QgZXJyb3IgKGlmIGFueSkgaXMgcmV0aHJvd24uXG4gICAgZm9yIChjb25zdCBkZXN0cnVjdG9yIG9mIGFjdGl2YXRvci53b3JrZmxvd1NhbmRib3hEZXN0cnVjdG9ycy5zcGxpY2UoMCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlc3RydWN0b3IoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgIT0gbnVsbCkgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG5cbiAgICAvLyBUaGUgYWN0aXZhdG9yIGlzIG5vIGxvbmdlciB2YWxpZCBwYXN0IHRoaXMgcG9pbnQuXG4gICAgc2V0QWN0aXZhdG9yKHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuLy8gRGVzdHJveSB0aGUgc2FuZGJveCBWTSAobm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZGlzcG9zaW5nIG9mIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gY29udGV4dCkuXG5leHBvcnQgZnVuY3Rpb24gZGVzdHJveSgpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgaWYgKGFjdGl2YXRvcikgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBleGVjdXRpb24gY29udGV4dCBzaG91bGQgaGF2ZSBiZWVuIGRpc3Bvc2VkIGZpcnN0Jyk7XG5cbiAgbGV0IGVycm9yOiB1bmtub3duIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGRlc3RydWN0b3Igb2YgZ2xvYmFsVGhpcy5fX3RlbXBvcmFsX2dsb2JhbFNhbmRib3hEZXN0cnVjdG9ycz8uc3BsaWNlKDApID8/IFtdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRlc3RydWN0b3IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICBlcnJvciA9IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zKG9iajogYW55KTogb2JqIGlzIFdvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9uczxhbnlbXSwgYW55PiB7XG4gIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihvYmosICd3b3JrZmxvd0RlZmluaXRpb25PcHRpb25zJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFjdGl2aXR5RnVuY3Rpb24sXG4gIEFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQsXG4gIEFjdGl2aXR5T3B0aW9ucyxcbiAgTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlVmFsdWUsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVudHlwZWRBY3Rpdml0aWVzLFxuICBVcGRhdGVEZWZpbml0aW9uLFxuICBXaXRoV29ya2Zsb3dBcmdzLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCxcbiAgV29ya2Zsb3dSZXN1bHRUeXBlLFxuICBXb3JrZmxvd1JldHVyblR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSxcbiAgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcixcbiAgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHtcbiAgY29tcGlsZVJldHJ5UG9saWN5LFxuICBjb21waWxlUHJpb3JpdHksXG4gIGVuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBleHRyYWN0V29ya2Zsb3dUeXBlLFxuICBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSxcbiAgbWFwVG9QYXlsb2FkcyxcbiAgZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcixcbiAgdG9QYXlsb2Fkc1dpdGhDb250ZXh0LFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyB1c2VyTWV0YWRhdGFUb1BheWxvYWQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3VzZXItbWV0YWRhdGEnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvY29udmVydGVyL3BheWxvYWQtc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgdmVyc2lvbmluZ0ludGVudFRvUHJvdG8gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3ZlcnNpb25pbmctaW50ZW50LWVudW0nO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcywgbXNUb051bWJlciwgbXNUb1RzLCByZXF1aXJlZFRzVG9NcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgeyB0aHJvd0lmUmVzZXJ2ZWROYW1lIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSwgcmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJy4vaW50ZXJjZXB0b3ItY29tcG9zaXRpb24nO1xuaW1wb3J0IHsgVXBkYXRlU2NvcGUgfSBmcm9tICcuL3VwZGF0ZS1zY29wZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEFjdGl2aXR5SW5wdXQsXG4gIExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgU2lnbmFsV29ya2Zsb3dJbnB1dCxcbiAgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gIFRpbWVySW5wdXQsXG4gIFRpbWVyT3B0aW9ucyxcbn0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBDaGlsZFdvcmtmbG93T3B0aW9ucyxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBIYW5kbGVyLFxuICBRdWVyeUhhbmRsZXJPcHRpb25zLFxuICBTaWduYWxIYW5kbGVyT3B0aW9ucyxcbiAgVXBkYXRlSGFuZGxlck9wdGlvbnMsXG4gIFdvcmtmbG93SW5mbyxcbiAgVXBkYXRlSW5mbyxcbiAgRGVmYXVsdFVwZGF0ZUhhbmRsZXIsXG4gIERlZmF1bHRRdWVyeUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ29udGludWVBc05ldyxcbiAgZW5jb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVBhcmVudENsb3NlUG9saWN5LFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTG9jYWxBY3Rpdml0eURvQmFja29mZiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LCBnZXRBY3RpdmF0b3IsIG1heWJlR2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyB1dWlkNEZyb21SYW5kb20gfSBmcm9tICcuL3JhbmRvbS1oZWxwZXJzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgQ2hpbGRXb3JrZmxvd0hhbmRsZSwgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSB9IGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcblxuLy8gQXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5XG5yZWdpc3RlclNsZWVwSW1wbGVtZW50YXRpb24oc2xlZXApO1xuXG5mdW5jdGlvbiBjdXJyZW50V29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dChpbmZvOiBXb3JrZmxvd0luZm8pOiBXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnd29ya2Zsb3cnLFxuICAgIG5hbWVzcGFjZTogaW5mby5uYW1lc3BhY2UsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0YXJnZXRXb3JrZmxvd1NlcmlhbGl6YXRpb25Db250ZXh0KGluZm86IFdvcmtmbG93SW5mbywgd29ya2Zsb3dJZDogc3RyaW5nKTogV29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3dvcmtmbG93JyxcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHdvcmtmbG93SWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFjdGl2aXR5U2VyaWFsaXphdGlvbkNvbnRleHQoXG4gIGluZm86IFdvcmtmbG93SW5mbyxcbiAgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBpc0xvY2FsOiBib29sZWFuXG4pOiBBY3Rpdml0eVNlcmlhbGl6YXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYWN0aXZpdHknLFxuICAgIG5hbWVzcGFjZTogaW5mby5uYW1lc3BhY2UsXG4gICAgYWN0aXZpdHlJZCxcbiAgICB3b3JrZmxvd0lkOiBpbmZvLndvcmtmbG93SWQsXG4gICAgaXNMb2NhbCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGRlZmF1bHQgdmFsdWVzIG9mIGB3b3JrZmxvd0lkYCBhbmQgYGNhbmNlbGxhdGlvblR5cGVgIHRvIGdpdmVuIHdvcmtmbG93IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdHM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyB7XG4gIGNvbnN0IHsgYXJncywgd29ya2Zsb3dJZCwgLi4ucmVzdCB9ID0gb3B0cztcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkOiB3b3JrZmxvd0lkID8/IHV1aWQ0KCksXG4gICAgYXJnczogKGFyZ3MgPz8gW10pIGFzIHVua25vd25bXSxcbiAgICBjYW5jZWxsYXRpb25UeXBlOiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc3RhcnRUaW1lciBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuZnVuY3Rpb24gdGltZXJOZXh0SGFuZGxlcih7IHNlcSwgZHVyYXRpb25Ncywgb3B0aW9ucyB9OiBUaW1lcklucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCBjb250ZXh0ID0gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8pO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuZGVsZXRlKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKGR1cmF0aW9uTXMpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQsIGNvbnRleHQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXMgc2xlZXAuXG4gKlxuICogU2NoZWR1bGVzIGEgdGltZXIgb24gdGhlIFRlbXBvcmFsIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyIG9yIDAsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCB0aW1lciBvcHRpb25zIGZvciBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBEdXJhdGlvbiwgb3B0aW9ucz86IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuc2xlZXAoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nKTtcbiAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG5cbiAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDEsIG1zVG9OdW1iZXIobXMpKTtcblxuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc3RhcnRUaW1lcicsIHRpbWVyTmV4dEhhbmRsZXIpO1xuXG4gIHJldHVybiBleGVjdXRlKHtcbiAgICBkdXJhdGlvbk1zLFxuICAgIHNlcSxcbiAgICBvcHRpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVpcmVkIGVpdGhlciBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0IG9yIHN0YXJ0VG9DbG9zZVRpbWVvdXQnKTtcbiAgfVxufVxuXG4vLyBVc2Ugc2FtZSB2YWxpZGF0aW9uIHdlIHVzZSBmb3Igbm9ybWFsIGFjdGl2aXRpZXNcbmNvbnN0IHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMgPSB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucztcblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gYWN0aXZhdG9yIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcih7IG9wdGlvbnMsIGFyZ3MsIGhlYWRlcnMsIHNlcSwgYWN0aXZpdHlUeXBlIH06IEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBhY3Rpdml0eUlkID0gb3B0aW9ucy5hY3Rpdml0eUlkID8/IGAke3NlcX1gO1xuICBjb25zdCBjb250ZXh0ID0gYWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dChhY3RpdmF0b3IuaW5mbywgYWN0aXZpdHlJZCwgZmFsc2UpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhY3Rpdml0eUlkLFxuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBhcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICBoZWFydGJlYXRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgICAgZG9Ob3RFYWdlcmx5RXhlY3V0ZTogIShvcHRpb25zLmFsbG93RWFnZXJEaXNwYXRjaCA/PyB0cnVlKSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSxcbiAgICAgICAgcHJpb3JpdHk6IG9wdGlvbnMucHJpb3JpdHkgPyBjb21waWxlUHJpb3JpdHkob3B0aW9ucy5wcmlvcml0eSkgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMuc3VtbWFyeSwgdW5kZWZpbmVkLCBjb250ZXh0KSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIGNvbnRleHQsXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFB1c2ggYSBzY2hlZHVsZUFjdGl2aXR5IGNvbW1hbmQgaW50byBzdGF0ZSBhY2N1bXVsYXRvciBhbmQgcmVnaXN0ZXIgY29tcGxldGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHlOZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGFyZ3MsXG4gIGhlYWRlcnMsXG4gIHNlcSxcbiAgYWN0aXZpdHlUeXBlLFxuICBhdHRlbXB0LFxuICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbn06IExvY2FsQWN0aXZpdHlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgY29uc3QgYWN0aXZpdHlJZCA9IGAke3NlcX1gO1xuICBjb25zdCBjb250ZXh0ID0gYWN0aXZpdHlTZXJpYWxpemF0aW9uQ29udGV4dChhY3RpdmF0b3IuaW5mbywgYWN0aXZpdHlJZCwgdHJ1ZSk7XG4gIC8vIEVhZ2VybHkgZmFpbCB0aGUgbG9jYWwgYWN0aXZpdHkgKHdoaWNoIHdpbGwgaW4gdHVybiBmYWlsIHRoZSB3b3JrZmxvdyB0YXNrLlxuICAvLyBEbyBub3QgZmFpbCBvbiByZXBsYXkgd2hlcmUgdGhlIGxvY2FsIGFjdGl2aXRpZXMgbWF5IG5vdCBiZSByZWdpc3RlcmVkIG9uIHRoZSByZXBsYXkgd29ya2VyLlxuICBpZiAoIWFjdGl2YXRvci5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiAhYWN0aXZhdG9yLnJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLmhhcyhhY3Rpdml0eVR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBMb2NhbCBhY3Rpdml0eSBvZiB0eXBlICcke2FjdGl2aXR5VHlwZX0nIG5vdCByZWdpc3RlcmVkIG9uIHdvcmtlcmApO1xuICB9XG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsTG9jYWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eToge1xuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgICBhY3Rpdml0eUlkLFxuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBhcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc3RhcnRUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIGxvY2FsUmV0cnlUaHJlc2hvbGQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMubG9jYWxSZXRyeVRocmVzaG9sZCksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLnN1bW1hcnksIHVuZGVmaW5lZCwgY29udGV4dCksXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgICBjb250ZXh0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhbiBhY3Rpdml0eSBhbmQgcnVuIG91dGJvdW5kIGludGVyY2VwdG9yc1xuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGVBY3Rpdml0eTxSPihhY3Rpdml0eVR5cGU6IHN0cmluZywgYXJnczogYW55W10sIG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVBY3Rpdml0eSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbidcbiAgKTtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBlbXB0eSBhY3Rpdml0eSBvcHRpb25zJyk7XG4gIH1cbiAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmFjdGl2aXR5Kys7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdzY2hlZHVsZUFjdGl2aXR5Jywgc2NoZWR1bGVBY3Rpdml0eU5leHRIYW5kbGVyKTtcblxuICByZXR1cm4gZXhlY3V0ZSh7XG4gICAgYWN0aXZpdHlUeXBlLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIG9wdGlvbnMsXG4gICAgYXJncyxcbiAgICBzZXEsXG4gIH0pIGFzIFByb21pc2U8Uj47XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNjaGVkdWxlTG9jYWxBY3Rpdml0eTxSPihcbiAgYWN0aXZpdHlUeXBlOiBzdHJpbmcsXG4gIGFyZ3M6IGFueVtdLFxuICBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuKTogUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zY2hlZHVsZUxvY2FsQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG5cbiAgbGV0IGF0dGVtcHQgPSAxO1xuICBsZXQgb3JpZ2luYWxTY2hlZHVsZVRpbWUgPSB1bmRlZmluZWQ7XG5cbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICdzY2hlZHVsZUxvY2FsQWN0aXZpdHknLFxuICAgICAgc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXJcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlY3V0ZSh7XG4gICAgICAgIGFjdGl2aXR5VHlwZSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHNlcSxcbiAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG4gICAgICB9KSkgYXMgUHJvbWlzZTxSPjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHJlcXVpcmVkVHNUb01zKGVyci5iYWNrb2ZmLmJhY2tvZmZEdXJhdGlvbiwgJ2JhY2tvZmZEdXJhdGlvbicpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBlcnIuYmFja29mZi5hdHRlbXB0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYmFja29mZiBhdHRlbXB0IHR5cGUnKTtcbiAgICAgICAgfVxuICAgICAgICBhdHRlbXB0ID0gZXJyLmJhY2tvZmYuYXR0ZW1wdDtcbiAgICAgICAgb3JpZ2luYWxTY2hlZHVsZVRpbWUgPSBlcnIuYmFja29mZi5vcmlnaW5hbFNjaGVkdWxlVGltZSA/PyB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbk5leHRIYW5kbGVyKHtcbiAgb3B0aW9ucyxcbiAgaGVhZGVycyxcbiAgd29ya2Zsb3dUeXBlLFxuICBzZXEsXG59OiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCk6IFByb21pc2U8W1Byb21pc2U8c3RyaW5nPiwgUHJvbWlzZTx1bmtub3duPl0+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGNvbnN0IHdvcmtmbG93SWQgPSBvcHRpb25zLndvcmtmbG93SWQgPz8gdXVpZDQoKTtcbiAgY29uc3QgY29udGV4dCA9IHRhcmdldFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIHdvcmtmbG93SWQpO1xuICBjb25zdCBzdGFydFByb21pc2UgPSBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gIWFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93Q29tcGxldGUuaGFzKHNlcSk7XG5cbiAgICAgICAgICBpZiAoIWNvbXBsZXRlKSB7XG4gICAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgICBjYW5jZWxDaGlsZFdvcmtmbG93RXhlY3V0aW9uOiB7IGNoaWxkV29ya2Zsb3dTZXE6IHNlcSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY2FuY2VsIG90aGVyd2lzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIHdvcmtmbG93SWQsXG4gICAgICAgIHdvcmtmbG93VHlwZSxcbiAgICAgICAgaW5wdXQ6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgb3B0aW9ucy5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLCAvLyBOb3QgY29uZmlndXJhYmxlXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIHdvcmtmbG93SWRSZXVzZVBvbGljeTogZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5KG9wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5KSxcbiAgICAgICAgcGFyZW50Q2xvc2VQb2xpY3k6IGVuY29kZVBhcmVudENsb3NlUG9saWN5KG9wdGlvbnMucGFyZW50Q2xvc2VQb2xpY3kpLFxuICAgICAgICBjcm9uU2NoZWR1bGU6IG9wdGlvbnMuY3JvblNjaGVkdWxlLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlc1xuICAgICAgICAgICAgPyB7IGluZGV4ZWRGaWVsZHM6IGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcywgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXMpIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBtZW1vOiBvcHRpb25zLm1lbW8gJiYgbWFwVG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5tZW1vLCBjb250ZXh0KSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSxcbiAgICAgICAgcHJpb3JpdHk6IG9wdGlvbnMucHJpb3JpdHkgPyBjb21waWxlUHJpb3JpdHkob3B0aW9ucy5wcmlvcml0eSkgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoXG4gICAgICAgIGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLFxuICAgICAgICBvcHRpb25zPy5zdGF0aWNTdW1tYXJ5LFxuICAgICAgICBvcHRpb25zPy5zdGF0aWNEZXRhaWxzLFxuICAgICAgICBjb250ZXh0XG4gICAgICApLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93U3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICAgIGNvbnRleHQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFdlIGNvbnN0cnVjdCBhIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjaGlsZCBXb3JrZmxvdyBiZWZvcmUgd2Uga25vd1xuICAvLyBpZiB0aGUgV29ya2Zsb3cgY29kZSB3aWxsIGF3YWl0IGl0IHRvIGNhcHR1cmUgdGhlIHJlc3VsdCBpbiBjYXNlIGl0IGRvZXMuXG4gIGNvbnN0IGNvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBDaGFpbiBzdGFydCBQcm9taXNlIHJlamVjdGlvbiB0byB0aGUgY29tcGxldGUgUHJvbWlzZS5cbiAgICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UuY2F0Y2gocmVqZWN0KSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNoaWxkV29ya2Zsb3dDb21wbGV0ZS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgY29udGV4dCxcbiAgICB9KTtcbiAgfSk7XG4gIHVudHJhY2tQcm9taXNlKHN0YXJ0UHJvbWlzZSk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZSk7XG4gIC8vIFByZXZlbnQgdW5oYW5kbGVkIHJlamVjdGlvbiBiZWNhdXNlIHRoZSBjb21wbGV0aW9uIG1pZ2h0IG5vdCBiZSBhd2FpdGVkXG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgY29uc3QgcmV0ID0gbmV3IFByb21pc2U8W1Byb21pc2U8c3RyaW5nPiwgUHJvbWlzZTx1bmtub3duPl0+KChyZXNvbHZlKSA9PiByZXNvbHZlKFtzdGFydFByb21pc2UsIGNvbXBsZXRlUHJvbWlzZV0pKTtcbiAgdW50cmFja1Byb21pc2UocmV0KTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlcih7IHNlcSwgc2lnbmFsTmFtZSwgYXJncywgdGFyZ2V0LCBoZWFkZXJzIH06IFNpZ25hbFdvcmtmbG93SW5wdXQpIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGNvbnN0IHRhcmdldFdvcmtmbG93SWQgPSB0YXJnZXQudHlwZSA9PT0gJ2V4dGVybmFsJyA/IHRhcmdldC53b3JrZmxvd0V4ZWN1dGlvbi53b3JrZmxvd0lkIDogdGFyZ2V0LmNoaWxkV29ya2Zsb3dJZDtcbiAgY29uc3QgY29udGV4dCA9IHRhcmdldFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIHRhcmdldFdvcmtmbG93SWQhKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy5zaWduYWxXb3JrZmxvdy5oYXMoc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoeyBjYW5jZWxTaWduYWxXb3JrZmxvdzogeyBzZXEgfSB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzaWduYWxFeHRlcm5hbFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgYXJnczogdG9QYXlsb2Fkc1dpdGhDb250ZXh0KGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBjb250ZXh0LCBhcmdzKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgc2lnbmFsTmFtZSxcbiAgICAgICAgLi4uKHRhcmdldC50eXBlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgLi4udGFyZ2V0LndvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaGlsZFdvcmtmbG93SWQ6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QsIGNvbnRleHQgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGluIHRoZSByZXR1cm4gdHlwZSBvZiBwcm94eSBtZXRob2RzIHRvIG1hcmsgdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNvdXJjZSB0eXBlIGlzIG5vdCBhIG1ldGhvZC5cbiAqXG4gKiBAc2VlIHtAbGluayBBY3Rpdml0eUludGVyZmFjZUZvcn1cbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc31cbiAqIEBzZWUge0BsaW5rIHByb3h5TG9jYWxBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgY29uc3QgTm90QW5BY3Rpdml0eU1ldGhvZCA9IFN5bWJvbC5mb3IoJ19fVEVNUE9SQUxfTk9UX0FOX0FDVElWSVRZX01FVEhPRCcpO1xuXG4vKipcbiAqIFR5cGUgaGVscGVyIHRoYXQgdGFrZXMgYSB0eXBlIGBUYCBhbmQgdHJhbnNmb3JtcyBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCB7QGxpbmsgQWN0aXZpdHlGdW5jdGlvbn0gdG9cbiAqIHtAbGluayBOb3RBbkFjdGl2aXR5TWV0aG9kfS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIFVzZWQgYnkge0BsaW5rIHByb3h5QWN0aXZpdGllc30gdG8gZ2V0IHRoaXMgY29tcGlsZS10aW1lIGVycm9yOlxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcmZhY2UgTXlBY3Rpdml0aWVzIHtcbiAqICAgdmFsaWQoaW5wdXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbiAqICAgaW52YWxpZChpbnB1dDogbnVtYmVyKTogbnVtYmVyO1xuICogfVxuICpcbiAqIGNvbnN0IGFjdCA9IHByb3h5QWN0aXZpdGllczxNeUFjdGl2aXRpZXM+KHsgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyB9KTtcbiAqXG4gKiBhd2FpdCBhY3QudmFsaWQodHJ1ZSk7XG4gKiBhd2FpdCBhY3QuaW52YWxpZCgpO1xuICogLy8gXiBUUyBjb21wbGFpbnMgd2l0aDpcbiAqIC8vIChwcm9wZXJ0eSkgaW52YWxpZERlZmluaXRpb246IHR5cGVvZiBOb3RBbkFjdGl2aXR5TWV0aG9kXG4gKiAvLyBUaGlzIGV4cHJlc3Npb24gaXMgbm90IGNhbGxhYmxlLlxuICogLy8gVHlwZSAnU3ltYm9sJyBoYXMgbm8gY2FsbCBzaWduYXR1cmVzLigyMzQ5KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5SW50ZXJmYWNlRm9yPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24gPyBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VFtLXT4gOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZDtcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aXZpdHksIG92ZXJyaWRpbmcgaXRzIGV4aXN0aW5nIG9wdGlvbnMgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgQWN0aXZpdHlPcHRpb25zXG4gICAqIEBwYXJhbSBhcmdzIGxpc3Qgb2YgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aXZpdHlcbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBleGVjdXRlV2l0aE9wdGlvbnMgaXMgYSBuZXcgbWV0aG9kIHRvIHByb3ZpZGUgY2FsbC1zaXRlIG9wdGlvbnMgYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlXG4gICAqL1xuICBleGVjdXRlV2l0aE9wdGlvbnMob3B0aW9uczogQWN0aXZpdHlPcHRpb25zLCBhcmdzOiBQYXJhbWV0ZXJzPFQ+KTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pjtcbn07XG5cbi8qKlxuICogVGhlIGxvY2FsIGFjdGl2aXR5IGNvdW50ZXJwYXJ0IHRvIHtAbGluayBBY3Rpdml0eUludGVyZmFjZUZvcn1cbiAqL1xuZXhwb3J0IHR5cGUgTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBBY3Rpdml0eUZ1bmN0aW9uID8gTG9jYWxBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VFtLXT4gOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZDtcbn07XG5cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFQgZXh0ZW5kcyBBY3Rpdml0eUZ1bmN0aW9uPiA9IFQgJiB7XG4gIC8qKlxuICAgKiBSdW4gdGhlIGxvY2FsIGFjdGl2aXR5LCBvdmVycmlkaW5nIGl0cyBleGlzdGluZyBvcHRpb25zIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIExvY2FsQWN0aXZpdHlPcHRpb25zXG4gICAqIEBwYXJhbSBhcmdzIGxpc3Qgb2YgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHJldHVybiB2YWx1ZSBvZiB0aGUgYWN0aXZpdHlcbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBleGVjdXRlV2l0aE9wdGlvbnMgaXMgYSBuZXcgbWV0aG9kIHRvIHByb3ZpZGUgY2FsbC1zaXRlIG9wdGlvbnMgYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlXG4gICAqL1xuICBleGVjdXRlV2l0aE9wdGlvbnMob3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnMsIGFyZ3M6IFBhcmFtZXRlcnM8VD4pOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4+O1xufTtcblxuLyoqXG4gKiBDb25maWd1cmUgQWN0aXZpdHkgZnVuY3Rpb25zIHdpdGggZ2l2ZW4ge0BsaW5rIEFjdGl2aXR5T3B0aW9uc30uXG4gKlxuICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBzZXR1cCBBY3Rpdml0aWVzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMuXG4gKlxuICogQHJldHVybiBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSB8IFByb3h5fSBmb3JcbiAqICAgICAgICAgd2hpY2ggZWFjaCBhdHRyaWJ1dGUgaXMgYSBjYWxsYWJsZSBBY3Rpdml0eSBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcHJveHlBY3Rpdml0aWVzIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICogaW1wb3J0ICogYXMgYWN0aXZpdGllcyBmcm9tICcuLi9hY3Rpdml0aWVzJztcbiAqXG4gKiAvLyBTZXR1cCBBY3Rpdml0aWVzIGZyb20gbW9kdWxlIGV4cG9ydHNcbiAqIGNvbnN0IHsgaHR0cEdldCwgb3RoZXJBY3Rpdml0eSB9ID0gcHJveHlBY3Rpdml0aWVzPHR5cGVvZiBhY3Rpdml0aWVzPih7XG4gKiAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICczMCBtaW51dGVzJyxcbiAqIH0pO1xuICpcbiAqIC8vIFVzZSBhY3Rpdml0aWVzIHdpdGggZGVmYXVsdCBvcHRpb25zXG4gKiBjb25zdCByZXN1bHQxID0gYXdhaXQgaHR0cEdldCgnaHR0cDovL2V4YW1wbGUuY29tJyk7XG4gKlxuICogLy8gT3ZlcnJpZGUgb3B0aW9ucyBmb3Igc3BlY2lmaWMgYWN0aXZpdHkgY2FsbHNcbiAqIGNvbnN0IHJlc3VsdDIgPSBhd2FpdCBodHRwR2V0LmV4ZWN1dGVXaXRoT3B0aW9ucyh7XG4gKiAgIHN0YXRpY1N1bW1hcnk6ICdGZXRjaGVzIGRhdGEgZnJvbSBleHRlcm5hbCBBUEknLFxuICogICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiAnNW0nXG4gKiB9LCBbJ2h0dHA6Ly9hcGkuZXhhbXBsZS5jb20nXSk7XG4gKlxuICogY29uc3QgcmVzdWx0MyA9IGF3YWl0IG90aGVyQWN0aXZpdHkuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgc3RhdGljU3VtbWFyeTogJ1Byb2Nlc3NlcyB0aGUgZmV0Y2hlZCBkYXRhJyxcbiAqICAgdGFza1F1ZXVlOiAnc3BlY2lhbC10YXNrLXF1ZXVlJ1xuICogfSwgW2RhdGFdKTtcbiAqXG4gKiAvLyBTZXR1cCBBY3Rpdml0aWVzIGZyb20gYW4gZXhwbGljaXQgaW50ZXJmYWNlIChlLmcuIHdoZW4gZGVmaW5lZCBieSBhbm90aGVyIFNESylcbiAqIGludGVyZmFjZSBKYXZhQWN0aXZpdGllcyB7XG4gKiAgIGh0dHBHZXRGcm9tSmF2YSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPlxuICogICBzb21lT3RoZXJKYXZhQWN0aXZpdHkoYXJnMTogbnVtYmVyLCBhcmcyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gKiB9XG4gKlxuICogY29uc3Qge1xuICogICBodHRwR2V0RnJvbUphdmEsXG4gKiAgIHNvbWVPdGhlckphdmFBY3Rpdml0eVxuICogfSA9IHByb3h5QWN0aXZpdGllczxKYXZhQWN0aXZpdGllcz4oe1xuICogICB0YXNrUXVldWU6ICdqYXZhLXdvcmtlci10YXNrUXVldWUnLFxuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnNW0nLFxuICogfSk7XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cEdldChcImh0dHA6Ly9leGFtcGxlLmNvbVwiKTtcbiAqICAgLy8gT3Igd2l0aCBjdXN0b20gb3B0aW9uczpcbiAqICAgY29uc3QgcmVzcG9uc2UyID0gYXdhaXQgaHR0cEdldEZyb21KYXZhLmV4ZWN1dGVXaXRoT3B0aW9ucyh7XG4gKiAgICAgc3RhdGljU3VtbWFyeTogJ0phdmEgSFRUUCBjYWxsIHdpdGggdGltZW91dCBvdmVycmlkZScsXG4gKiAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzJtJ1xuICogICB9LCBbXCJodHRwOi8vZmFzdC1hcGkuZXhhbXBsZS5jb21cIl0pO1xuICogICAvLyAuLi5cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJveHlBY3Rpdml0aWVzPEEgPSBVbnR5cGVkQWN0aXZpdGllcz4ob3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogQWN0aXZpdHlJbnRlcmZhY2VGb3I8QT4ge1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgfVxuICAvLyBWYWxpZGF0ZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgaW1tZWRpYXRlIHVzZXIgZmVlZGJhY2tcbiAgdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBBY3Rpdml0eUludGVyZmFjZUZvcjxBPiwge1xuICAgIGdldChfLCBhY3Rpdml0eVR5cGUpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZpdHlUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgQWN0aXZpdHkgdHlwZXMsIGdvdDogJHtTdHJpbmcoYWN0aXZpdHlUeXBlKX1gKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYWN0aXZpdHlQcm94eUZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVBY3Rpdml0eShhY3Rpdml0eVR5cGUgYXMgc3RyaW5nLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgYWN0aXZpdHlQcm94eUZ1bmN0aW9uLmV4ZWN1dGVXaXRoT3B0aW9ucyA9IGZ1bmN0aW9uIChcbiAgICAgICAgb3ZlcnJpZGVPcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMsXG4gICAgICAgIGFyZ3M6IGFueVtdXG4gICAgICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQWN0aXZpdHkoYWN0aXZpdHlUeXBlLCBhcmdzLCBkZWVwTWVyZ2Uob3B0aW9ucywgb3ZlcnJpZGVPcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYWN0aXZpdHlQcm94eUZ1bmN0aW9uO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSBMb2NhbCBBY3Rpdml0eSBmdW5jdGlvbnMgd2l0aCBnaXZlbiB7QGxpbmsgTG9jYWxBY3Rpdml0eU9wdGlvbnN9LlxuICpcbiAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gc2V0dXAgQWN0aXZpdGllcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkgfCBQcm94eX1cbiAqICAgICAgICAgZm9yIHdoaWNoIGVhY2ggYXR0cmlidXRlIGlzIGEgY2FsbGFibGUgQWN0aXZpdHkgZnVuY3Rpb25cbiAqXG4gKiBAc2VlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9IGZvciBleGFtcGxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJveHlMb2NhbEFjdGl2aXRpZXM8QSA9IFVudHlwZWRBY3Rpdml0aWVzPihcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8QT4ge1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgfVxuICAvLyBWYWxpZGF0ZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgaW1tZWRpYXRlIHVzZXIgZmVlZGJhY2tcbiAgdmFsaWRhdGVMb2NhbEFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcblxuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8QT4sIHtcbiAgICBnZXQoXywgYWN0aXZpdHlUeXBlKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGl2aXR5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIEFjdGl2aXR5IHR5cGVzLCBnb3Q6ICR7U3RyaW5nKGFjdGl2aXR5VHlwZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVMb2NhbEFjdGl2aXR5KGFjdGl2aXR5VHlwZSBhcyBzdHJpbmcsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBsb2NhbEFjdGl2aXR5UHJveHlGdW5jdGlvbi5leGVjdXRlV2l0aE9wdGlvbnMgPSBmdW5jdGlvbiAoXG4gICAgICAgIG92ZXJyaWRlT3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gICAgICAgIGFyZ3M6IGFueVtdXG4gICAgICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlTG9jYWxBY3Rpdml0eShhY3Rpdml0eVR5cGUsIGFyZ3MsIGRlZXBNZXJnZShvcHRpb25zLCBvdmVycmlkZU9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBsb2NhbEFjdGl2aXR5UHJveHlGdW5jdGlvbjtcbiAgICB9LFxuICB9KTtcbn1cblxuLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgcGF0Y2ggYWZ0ZXIgXCJlbm91Z2hcIiB0aW1lIGhhcyBwYXNzZWRcbmNvbnN0IEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCA9ICdfX3RlbXBvcmFsX2ludGVybmFsX2Nvbm5lY3RfZXh0ZXJuYWxfaGFuZGxlX2NhbmNlbF90b19zY29wZSc7XG4vLyBUaGUgbmFtZSBvZiB0aGlzIHBhdGNoIGNvbWVzIGZyb20gYW4gYXR0ZW1wdCB0byBidWlsZCBhIGdlbmVyaWMgaW50ZXJuYWwgcGF0Y2hpbmcgbWVjaGFuaXNtLlxuLy8gVGhhdCBlZmZvcnQgaGFzIGJlZW4gYWJhbmRvbmVkIGluIGZhdm9yIG9mIGEgbmV3ZXIgV29ya2Zsb3dUYXNrQ29tcGxldGVkTWV0YWRhdGEgYmFzZWQgbWVjaGFuaXNtLlxuY29uc3QgQ09ORElUSU9OXzBfUEFUQ0ggPSAnX19zZGtfaW50ZXJuYWxfcGF0Y2hfbnVtYmVyOjEnO1xuXG4vKipcbiAqIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBzaWduYWwgYW5kIGNhbmNlbCBhbiBleGlzdGluZyBXb3JrZmxvdyBleGVjdXRpb24uXG4gKiBJdCB0YWtlcyBhIFdvcmtmbG93IElEIGFuZCBvcHRpb25hbCBydW4gSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFdvcmtmbG93SGFuZGxlKHdvcmtmbG93SWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiBFeHRlcm5hbFdvcmtmbG93SGFuZGxlIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LmdldEV4dGVybmFsV29ya2Zsb3dIYW5kbGUoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5nZXRIYW5kbGUoLi4uKSBpbnN0ZWFkLiknXG4gICk7XG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZCxcbiAgICBydW5JZCxcbiAgICBjYW5jZWwoKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBDb25uZWN0IHRoaXMgY2FuY2VsIG9wZXJhdGlvbiB0byB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gc2NvcGUuXG4gICAgICAgIC8vIFRoaXMgaXMgYmVoYXZpb3Igd2FzIGludHJvZHVjZWQgYWZ0ZXIgdjAuMjIuMCBhbmQgaXMgaW5jb21wYXRpYmxlXG4gICAgICAgIC8vIHdpdGggaGlzdG9yaWVzIGdlbmVyYXRlZCB3aXRoIHByZXZpb3VzIFNESyB2ZXJzaW9ucyBhbmQgdGh1cyByZXF1aXJlc1xuICAgICAgICAvLyBwYXRjaGluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgdHJ5IHRvIGRlbGF5IHBhdGNoaW5nIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gYXZvaWQgcG9sbHV0aW5nXG4gICAgICAgIC8vIGhpc3RvcmllcyB1bmxlc3Mgc3RyaWN0bHkgcmVxdWlyZWQuXG4gICAgICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChwYXRjaGVkKEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCkpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgaWYgKHBhdGNoZWQoRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jYW5jZWxXb3JrZmxvdysrO1xuICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgIHJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dJZCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2FuY2VsV29ya2Zsb3cuc2V0KHNlcSwge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIGNvbnRleHQ6IHRhcmdldFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoYWN0aXZhdG9yLmluZm8sIHdvcmtmbG93SWQpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdleHRlcm5hbCcsXG4gICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHsgd29ya2Zsb3dJZCwgcnVuSWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqICoqT3ZlcnJpZGUgZm9yIFdvcmtmbG93cyB0aGF0IGFjY2VwdCBubyBhcmd1bWVudHMqKi5cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd1R5cGU6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoZSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGFueT4+KHdvcmtmbG93RnVuYzogVCk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnN0YXJ0Q2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5zdGFydCguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IGFkZERlZmF1bHRXb3JrZmxvd09wdGlvbnMob3B0aW9ucyA/PyAoe30gYXMgYW55KSk7XG4gIGNvbnN0IHdvcmtmbG93VHlwZSA9IGV4dHJhY3RXb3JrZmxvd1R5cGUod29ya2Zsb3dUeXBlT3JGdW5jKTtcbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJyxcbiAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlclxuICApO1xuICBjb25zdCBbc3RhcnRlZCwgY29tcGxldGVkXSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLmNoaWxkV29ya2Zsb3crKyxcbiAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIHdvcmtmbG93VHlwZSxcbiAgfSk7XG4gIGNvbnN0IGZpcnN0RXhlY3V0aW9uUnVuSWQgPSBhd2FpdCBzdGFydGVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgIGZpcnN0RXhlY3V0aW9uUnVuSWQsXG4gICAgYXN5bmMgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNvbXBsZXRlZCkgYXMgYW55O1xuICAgIH0sXG4gICAgYXN5bmMgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdjaGlsZCcsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiBvcHRpb25zV2l0aERlZmF1bHRzLndvcmtmbG93SWQsXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyAoKSA9PiBXb3JrZmxvd1JldHVyblR5cGU+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBULFxuICBvcHRpb25zPzogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5leGVjdXRlQ2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5leGVjdXRlKC4uLikgaW5zdGVhZC4nXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgZXhlY1Byb21pc2UgPSBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShleGVjUHJvbWlzZSk7XG4gIGNvbnN0IGNvbXBsZXRlZFByb21pc2UgPSBleGVjUHJvbWlzZS50aGVuKChbX3N0YXJ0ZWQsIGNvbXBsZXRlZF0pID0+IGNvbXBsZXRlZCk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlZFByb21pc2UpO1xuICByZXR1cm4gY29tcGxldGVkUHJvbWlzZSBhcyBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZyb3plbiBjb3B5IG9mIFdvcmtmbG93SW5mbywgYXQgdGhlIHBvaW50IHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAqIENoYW5nZXMgaGFwcGVuaW5nIGF0IGxhdGVyIHBvaW50IGluIHdvcmtmbG93IGV4ZWN1dGlvbiB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBGb3IgdGhpcyByZWFzb24sIHdlIHJlY29tbWVuZCBjYWxsaW5nIGB3b3JrZmxvd0luZm8oKWAgb24gZXZlcnkgYWNjZXNzIHRvIHtAbGluayBXb3JrZmxvd0luZm99J3MgZmllbGRzLFxuICogcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgYFdvcmtmbG93SW5mb2Agb2JqZWN0IChvciBwYXJ0IG9mIGl0KSBpbiBhIGxvY2FsIHZhcmlhYmxlLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogLy8gR09PRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgZG9Tb21ldGhpbmcod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZSh3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKlxuICogdnNcbiAqXG4gKiBgYGB0c1xuICogLy8gQkFEXG4gKiBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICBjb25zdCBhdHRyaWJ1dGVzID0gd29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlc1xuICogICBkb1NvbWV0aGluZyhhdHRyaWJ1dGVzKVxuICogICAuLi5cbiAqICAgZG9Tb21ldGhpbmdFbHNlKGF0dHJpYnV0ZXMpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93SW5mbygpOiBXb3JrZmxvd0luZm8ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dJbmZvKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmluZm87XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVwZGF0ZSBpZiBhbnkuXG4gKlxuICogQHJldHVybiBJbmZvIGZvciB0aGUgY3VycmVudCB1cGRhdGUgaGFuZGxlciB0aGUgY29kZSBjYWxsaW5nIHRoaXMgaXMgZXhlY3V0aW5nXG4gKiB3aXRoaW4gaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFVwZGF0ZUluZm8oKTogVXBkYXRlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5jdXJyZW50VXBkYXRlSW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIFVwZGF0ZVNjb3BlLmN1cnJlbnQoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNvZGUgaXMgZXhlY3V0aW5nIGluIHdvcmtmbG93IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluV29ya2Zsb3dDb250ZXh0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF5YmVHZXRBY3RpdmF0b3IoKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBgZmAgdGhhdCB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIENvbnRpbnVlQXNOZXcgd2hlbiBjYWxsZWQuXG4gKlxuICogYGZgIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgV29ya2Zsb3cgZnVuY3Rpb24gc3VwcGxpZWQgdG8gdHlwZXBhcmFtIGBGYC5cbiAqXG4gKiBPbmNlIGBmYCBpcyBjYWxsZWQsIFdvcmtmbG93IEV4ZWN1dGlvbiBpbW1lZGlhdGVseSBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29udGludWVBc05ld0Z1bmM8RiBleHRlbmRzIFdvcmtmbG93PihcbiAgb3B0aW9ucz86IENvbnRpbnVlQXNOZXdPcHRpb25zXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxGPikgPT4gUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuY29udGludWVBc05ldyguLi4pIGFuZCBXb3JrZmxvdy5tYWtlQ29udGludWVBc05ld0Z1bmMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBjb25zdCBpbmZvID0gYWN0aXZhdG9yLmluZm87XG4gIGNvbnN0IHsgd29ya2Zsb3dUeXBlLCB0YXNrUXVldWUsIC4uLnJlc3QgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJlcXVpcmVkT3B0aW9ucyA9IHtcbiAgICB3b3JrZmxvd1R5cGU6IHdvcmtmbG93VHlwZSA/PyBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB0YXNrUXVldWU6IHRhc2tRdWV1ZSA/PyBpbmZvLnRhc2tRdWV1ZSxcbiAgICAuLi5yZXN0LFxuICB9O1xuXG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gY3VycmVudFdvcmtmbG93U2VyaWFsaXphdGlvbkNvbnRleHQoaW5mbyk7XG4gICAgY29uc3QgZm4gPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdjb250aW51ZUFzTmV3JywgYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB7IGhlYWRlcnMsIGFyZ3MsIG9wdGlvbnMgfSA9IGlucHV0O1xuICAgICAgdGhyb3cgbmV3IENvbnRpbnVlQXNOZXcoe1xuICAgICAgICB3b3JrZmxvd1R5cGU6IG9wdGlvbnMud29ya2Zsb3dUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHNXaXRoQ29udGV4dChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgY29udGV4dCwgYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUsXG4gICAgICAgIG1lbW86IG9wdGlvbnMubWVtbyAmJiBtYXBUb1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLm1lbW8sIGNvbnRleHQpLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlc1xuICAgICAgICAgICAgPyB7IGluZGV4ZWRGaWVsZHM6IGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcywgb3B0aW9ucy50eXBlZFNlYXJjaEF0dHJpYnV0ZXMpIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB3b3JrZmxvd1J1blRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dUYXNrVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy53b3JrZmxvd1Rhc2tUaW1lb3V0KSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSxcbiAgICAgICAgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcihvcHRpb25zLmluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZuKHtcbiAgICAgIGFyZ3MsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIG9wdGlvbnM6IHJlcXVpcmVkT3B0aW9ucyxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtmbG93LWV4ZWN1dGlvbi9jb250aW51ZS1hcy1uZXcjY29udGludWUtYXMtbmV3IHwgQ29udGludWVzLUFzLU5ld30gdGhlIGN1cnJlbnQgV29ya2Zsb3cgRXhlY3V0aW9uXG4gKiB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAqXG4gKiBTaG9ydGhhbmQgZm9yIGBtYWtlQ29udGludWVBc05ld0Z1bmM8Rj4oKSguLi5hcmdzKWAuIChTZWU6IHtAbGluayBtYWtlQ29udGludWVBc05ld0Z1bmN9LilcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjb250aW51ZUFzTmV3IH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICogaW1wb3J0IHsgU2VhcmNoQXR0cmlidXRlVHlwZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3cobjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIC8vIC4uLiBXb3JrZmxvdyBsb2dpY1xuICogICBhd2FpdCBjb250aW51ZUFzTmV3PHR5cGVvZiBteVdvcmtmbG93PihuICsgMSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRpbnVlQXNOZXc8RiBleHRlbmRzIFdvcmtmbG93PiguLi5hcmdzOiBQYXJhbWV0ZXJzPEY+KTogUHJvbWlzZTxuZXZlcj4ge1xuICByZXR1cm4gbWFrZUNvbnRpbnVlQXNOZXdGdW5jKCkoLi4uYXJncyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYW4gUkZDIGNvbXBsaWFudCBWNCB1dWlkLlxuICogVXNlcyB0aGUgd29ya2Zsb3cncyBkZXRlcm1pbmlzdGljIFBSTkcgbWFraW5nIGl0IHNhZmUgZm9yIHVzZSB3aXRoaW4gYSB3b3JrZmxvdy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY3J5cHRvZ3JhcGhpY2FsbHkgaW5zZWN1cmUuXG4gKiBTZWUgdGhlIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZCB8IHN0YWNrb3ZlcmZsb3cgZGlzY3Vzc2lvbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNCgpOiBzdHJpbmcge1xuICBjb25zdCBhY3RpdmF0b3IgPSBtYXliZUdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gdXVpZDRGcm9tUmFuZG9tKGFjdGl2YXRvciA/ICgpID0+IGFjdGl2YXRvci5jdXJyZW50UmFuZG9tKCkgOiBNYXRoLnJhbmRvbSk7XG59XG5cbi8qKlxuICogUGF0Y2ggb3IgdXBncmFkZSB3b3JrZmxvdyBjb2RlIGJ5IGNoZWNraW5nIG9yIHN0YXRpbmcgdGhhdCB0aGlzIHdvcmtmbG93IGhhcyBhIGNlcnRhaW4gcGF0Y2guXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBJZiB0aGUgd29ya2Zsb3cgaXMgcmVwbGF5aW5nIGFuIGV4aXN0aW5nIGhpc3RvcnksIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhhdFxuICogaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgd2hpY2ggYWxzbyBoYWQgYSBgcGF0Y2hlZGAgY2FsbCB3aXRoIHRoZSBzYW1lIGBwYXRjaElkYC5cbiAqIElmIHRoZSBoaXN0b3J5IHdhcyBwcm9kdWNlZCBieSBhIHdvcmtlciAqd2l0aG91dCogc3VjaCBhIGNhbGwsIHRoZW4gaXQgd2lsbCByZXR1cm4gZmFsc2UuXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIG5vdCBjdXJyZW50bHkgcmVwbGF5aW5nLCB0aGVuIHRoaXMgY2FsbCAqYWx3YXlzKiByZXR1cm5zIHRydWUuXG4gKlxuICogWW91ciB3b3JrZmxvdyBjb2RlIHNob3VsZCBydW4gdGhlIFwibmV3XCIgY29kZSBpZiB0aGlzIHJldHVybnMgdHJ1ZSwgaWYgaXQgcmV0dXJucyBmYWxzZSwgeW91XG4gKiBzaG91bGQgcnVuIHRoZSBcIm9sZFwiIGNvZGUuIEJ5IGRvaW5nIHRoaXMsIHlvdSBjYW4gbWFpbnRhaW4gZGV0ZXJtaW5pc20uXG4gKlxuICogQHBhcmFtIHBhdGNoSWQgQW4gaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZSB1bmlxdWUgdG8gdGhpcyBwYXRjaC4gSXQgaXMgT0sgdG8gdXNlIG11bHRpcGxlXG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIElELCB3aGljaCBtZWFucyBhbGwgc3VjaCBjYWxscyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaGVkKHBhdGNoSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cucGF0Y2goLi4uKSBhbmQgV29ya2Zsb3cuZGVwcmVjYXRlUGF0Y2ggbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5wYXRjaEludGVybmFsKHBhdGNoSWQsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZSB0aGF0IGEgcGF0Y2ggaXMgYmVpbmcgcGhhc2VkIG91dC5cbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L3ZlcnNpb25pbmcgfCBkb2NzIHBhZ2V9IGZvciBpbmZvLlxuICpcbiAqIFdvcmtmbG93cyB3aXRoIHRoaXMgY2FsbCBtYXkgYmUgZGVwbG95ZWQgYWxvbmdzaWRlIHdvcmtmbG93cyB3aXRoIGEge0BsaW5rIHBhdGNoZWR9IGNhbGwsIGJ1dFxuICogdGhleSBtdXN0ICpub3QqIGJlIGRlcGxveWVkIHdoaWxlIGFueSB3b3JrZXJzIHN0aWxsIGV4aXN0IHJ1bm5pbmcgb2xkIGNvZGUgd2l0aG91dCBhXG4gKiB7QGxpbmsgcGF0Y2hlZH0gY2FsbCwgb3IgYW55IHJ1bnMgd2l0aCBoaXN0b3JpZXMgcHJvZHVjZWQgYnkgc3VjaCB3b3JrZXJzIGV4aXN0LiBJZiBlaXRoZXIga2luZFxuICogb2Ygd29ya2VyIGVuY291bnRlcnMgYSBoaXN0b3J5IHByb2R1Y2VkIGJ5IHRoZSBvdGhlciwgdGhlaXIgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLlxuICpcbiAqIE9uY2UgYWxsIGxpdmUgd29ya2Zsb3cgcnVucyBoYXZlIGJlZW4gcHJvZHVjZWQgYnkgd29ya2VycyB3aXRoIHRoaXMgY2FsbCwgeW91IGNhbiBkZXBsb3kgd29ya2Vyc1xuICogd2hpY2ggYXJlIGZyZWUgb2YgZWl0aGVyIGtpbmQgb2YgcGF0Y2ggY2FsbCBmb3IgdGhpcyBJRC4gV29ya2VycyB3aXRoIGFuZCB3aXRob3V0IHRoaXMgY2FsbFxuICogbWF5IGNvZXhpc3QsIGFzIGxvbmcgYXMgdGhleSBhcmUgYm90aCBydW5uaW5nIHRoZSBcIm5ld1wiIGNvZGUuXG4gKlxuICogQHBhcmFtIHBhdGNoSWQgQW4gaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZSB1bmlxdWUgdG8gdGhpcyBwYXRjaC4gSXQgaXMgT0sgdG8gdXNlIG11bHRpcGxlXG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIElELCB3aGljaCBtZWFucyBhbGwgc3VjaCBjYWxscyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGVQYXRjaChwYXRjaElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGFjdGl2YXRvci5wYXRjaEludGVybmFsKHBhdGNoSWQsIHRydWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBgZm5gIGV2YWx1YXRlcyB0byBgdHJ1ZWAgb3IgYHRpbWVvdXRgIGV4cGlyZXMsIHByb3ZpZGluZ1xuICogb3B0aW9ucyB0byBjb25maWd1cmUgdGhlIHRpbWVyIChpLmUuIHByb3ZpZGUgbWV0YWRhdGEpXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICpcbiAqIEByZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbmRpdGlvbiB3YXMgdHJ1ZSBiZWZvcmUgdGhlIHRpbWVvdXQgZXhwaXJlc1xuICpcbiAqIEBleHBlcmltZW50YWwgVGltZXJPcHRpb25zIGlzIGEgbmV3IGFkZGl0aW9uIGFuZCBzdWJqZWN0IHRvIGNoYW5nZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuLCB0aW1lb3V0OiBEdXJhdGlvbiwgb3B0aW9uczogVGltZXJPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4vKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBgZm5gIGV2YWx1YXRlcyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuLCB0aW1lb3V0PzogRHVyYXRpb24sIG9wdHM/OiBUaW1lck9wdGlvbnMpOiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB7XG4gIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5jb25kaXRpb24oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIFByaW9yIHRvIDEuNS4wLCBgY29uZGl0aW9uKGZuLCAwKWAgd2FzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0byBgY29uZGl0aW9uKGZuLCB1bmRlZmluZWQpYFxuICBpZiAodGltZW91dCA9PT0gMCAmJiAhcGF0Y2hlZChDT05ESVRJT05fMF9QQVRDSCkpIHtcbiAgICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xuICB9XG4gIGlmICh0eXBlb2YgdGltZW91dCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHRpbWVvdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIENhbmNlbGxhdGlvblNjb3BlLmNhbmNlbGxhYmxlKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW3NsZWVwKHRpbWVvdXQsIG9wdHMpLnRoZW4oKCkgPT4gZmFsc2UpLCBjb25kaXRpb25Jbm5lcihmbikudGhlbigoKSA9PiB0cnVlKV0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBjb25kaXRpb25Jbm5lcihmbik7XG59XG5cbmZ1bmN0aW9uIGNvbmRpdGlvbklubmVyKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmNvbmRpdGlvbisrO1xuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLmRlbGV0ZShzZXEpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFYWdlciBldmFsdWF0aW9uXG4gICAgaWYgKGZuKCkpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuc2V0KHNlcSwgeyBmbiwgcmVzb2x2ZSB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmaW5lIGFuIHVwZGF0ZSBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byB1cGRhdGUgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVVcGRhdGU8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gIG5hbWU6IE5hbWVcbik6IFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3VwZGF0ZScsXG4gICAgbmFtZSxcbiAgfSBhcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgc2lnbmFsIG1ldGhvZCBmb3IgYSBXb3JrZmxvdy5cbiAqXG4gKiBBIGRlZmluaXRpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgaW4gdGhlIFdvcmtmbG93IHZpYSB7QGxpbmsgc2V0SGFuZGxlcn0gYW5kIHRvIHNpZ25hbCBhIFdvcmtmbG93IHVzaW5nIGEge0BsaW5rIFdvcmtmbG93SGFuZGxlfSwge0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGV9IG9yIHtAbGluayBFeHRlcm5hbFdvcmtmbG93SGFuZGxlfS5cbiAqIEEgZGVmaW5pdGlvbiBjYW4gYmUgcmV1c2VkIGluIG11bHRpcGxlIFdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gIG5hbWU6IE5hbWVcbik6IFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdzaWduYWwnLFxuICAgIG5hbWUsXG4gIH0gYXMgU2lnbmFsRGVmaW5pdGlvbjxBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBxdWVyeSBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBxdWVyeSBhIFdvcmtmbG93IHVzaW5nIGEge0BsaW5rIFdvcmtmbG93SGFuZGxlfS5cbiAqIEEgZGVmaW5pdGlvbiBjYW4gYmUgcmV1c2VkIGluIG11bHRpcGxlIFdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVF1ZXJ5PFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3F1ZXJ5JyxcbiAgICBuYW1lLFxuICB9IGFzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIFNldCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIGEgV29ya2Zsb3cgdXBkYXRlLCBzaWduYWwsIG9yIHF1ZXJ5LlxuICpcbiAqIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIGdpdmVuIHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeSBuYW1lIHRoZSBsYXN0IGhhbmRsZXIgd2lsbCBvdmVyd3JpdGUgYW55IHByZXZpb3VzIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBkZWYgYW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259LCB7QGxpbmsgU2lnbmFsRGVmaW5pdGlvbn0sIG9yIHtAbGluayBRdWVyeURlZmluaXRpb259IGFzIHJldHVybmVkIGJ5IHtAbGluayBkZWZpbmVVcGRhdGV9LCB7QGxpbmsgZGVmaW5lU2lnbmFsfSwgb3Ige0BsaW5rIGRlZmluZVF1ZXJ5fSByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gaGFuZGxlciBhIGNvbXBhdGlibGUgaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIGRlZmluaXRpb24gb3IgYHVuZGVmaW5lZGAgdG8gdW5zZXQgdGhlIGhhbmRsZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyBhbiBvcHRpb25hbCBgZGVzY3JpcHRpb25gIG9mIHRoZSBoYW5kbGVyIGFuZCBhbiBvcHRpb25hbCB1cGRhdGUgYHZhbGlkYXRvcmAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnNcbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFNpZ25hbERlZmluaXRpb248QXJncz4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFNpZ25hbEhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkO1xuXG4vLyBGb3IgVXBkYXRlcyBhbmQgU2lnbmFscyB3ZSB3YW50IHRvIG1ha2UgYSBwdWJsaWMgZ3VhcmFudGVlIHNvbWV0aGluZyBsaWtlIHRoZVxuLy8gZm9sbG93aW5nOlxuLy9cbi8vICAgXCJJZiBhIFdGVCBjb250YWlucyBhIFNpZ25hbC9VcGRhdGUsIGFuZCBpZiBhIGhhbmRsZXIgaXMgYXZhaWxhYmxlIGZvciB0aGF0XG4vLyAgIFNpZ25hbC9VcGRhdGUsIHRoZW4gdGhlIGhhbmRsZXIgd2lsbCBiZSBleGVjdXRlZC5cIlwiXG4vL1xuLy8gSG93ZXZlciwgdGhhdCBzdGF0ZW1lbnQgaXMgbm90IHdlbGwtZGVmaW5lZCwgbGVhdmluZyBzZXZlcmFsIHF1ZXN0aW9ucyBvcGVuOlxuLy9cbi8vIDEuIFdoYXQgZG9lcyBpdCBtZWFuIGZvciBhIGhhbmRsZXIgdG8gYmUgXCJhdmFpbGFibGVcIj8gV2hhdCBoYXBwZW5zIGlmIHRoZVxuLy8gICAgaGFuZGxlciBpcyBub3QgcHJlc2VudCBpbml0aWFsbHkgYnV0IGlzIHNldCBhdCBzb21lIHBvaW50IGR1cmluZyB0aGVcbi8vICAgIFdvcmtmbG93IGNvZGUgdGhhdCBpcyBleGVjdXRlZCBpbiB0aGF0IFdGVD8gV2hhdCBoYXBwZW5zIGlmIHRoZSBoYW5kbGVyIGlzXG4vLyAgICBzZXQgYW5kIHRoZW4gZGVsZXRlZCwgb3IgcmVwbGFjZWQgd2l0aCBhIGRpZmZlcmVudCBoYW5kbGVyP1xuLy9cbi8vIDIuIFdoZW4gaXMgdGhlIGhhbmRsZXIgZXhlY3V0ZWQ/IChXaGVuIGl0IGZpcnN0IGJlY29tZXMgYXZhaWxhYmxlPyBBdCB0aGUgZW5kXG4vLyAgICBvZiB0aGUgYWN0aXZhdGlvbj8pIFdoYXQgYXJlIHRoZSBleGVjdXRpb24gc2VtYW50aWNzIG9mIFdvcmtmbG93IGFuZFxuLy8gICAgU2lnbmFsL1VwZGF0ZSBoYW5kbGVyIGNvZGUgZ2l2ZW4gdGhhdCB0aGV5IGFyZSBjb25jdXJyZW50PyBDYW4gdGhlIHVzZXJcbi8vICAgIHJlbHkgb24gU2lnbmFsL1VwZGF0ZSBzaWRlIGVmZmVjdHMgYmVpbmcgcmVmbGVjdGVkIGluIHRoZSBXb3JrZmxvdyByZXR1cm5cbi8vICAgIHZhbHVlLCBvciBpbiB0aGUgdmFsdWUgcGFzc2VkIHRvIENvbnRpbnVlLUFzLU5ldz8gSWYgdGhlIGhhbmRsZXIgaXMgYW5cbi8vICAgIGFzeW5jIGZ1bmN0aW9uIC8gY29yb3V0aW5lLCBob3cgbXVjaCBvZiBpdCBpcyBleGVjdXRlZCBhbmQgd2hlbiBpcyB0aGVcbi8vICAgIHJlc3QgZXhlY3V0ZWQ/XG4vL1xuLy8gMy4gV2hhdCBoYXBwZW5zIGlmIHRoZSBoYW5kbGVyIGlzIG5vdCBleGVjdXRlZD8gKGkuZS4gYmVjYXVzZSBpdCB3YXNuJ3Rcbi8vICAgIGF2YWlsYWJsZSBpbiB0aGUgc2Vuc2UgZGVmaW5lZCBieSAoMSkpXG4vL1xuLy8gNC4gSW4gdGhlIGNhc2Ugb2YgVXBkYXRlLCB3aGVuIGlzIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGV4ZWN1dGVkP1xuLy9cbi8vIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgVHlwZXNjcmlwdCBpcyBhcyBmb2xsb3dzOlxuLy9cbi8vIDEuIHNkay1jb3JlIHNvcnRzIFNpZ25hbCBhbmQgVXBkYXRlIGpvYnMgKGFuZCBQYXRjaGVzKSBhaGVhZCBvZiBhbGwgb3RoZXJcbi8vICAgIGpvYnMuIFRodXMgaWYgdGhlIGhhbmRsZXIgaXMgYXZhaWxhYmxlIGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiB0aGVuXG4vLyAgICB0aGUgU2lnbmFsL1VwZGF0ZSB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSBXb3JrZmxvdyBjb2RlIGlzIGV4ZWN1dGVkLiBJZiBpdFxuLy8gICAgaXMgbm90LCB0aGVuIHRoZSBTaWduYWwvVXBkYXRlIGNhbGxzIGFyZSBwdXNoZWQgdG8gYSBidWZmZXIuXG4vL1xuLy8gMi4gT24gZWFjaCBjYWxsIHRvIHNldEhhbmRsZXIgZm9yIGEgZ2l2ZW4gU2lnbmFsL1VwZGF0ZSwgd2UgbWFrZSBhIHBhc3Ncbi8vICAgIHRocm91Z2ggdGhlIGJ1ZmZlciBsaXN0LiBJZiBhIGJ1ZmZlcmVkIGpvYiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGp1c3Qtc2V0XG4vLyAgICBoYW5kbGVyLCB0aGVuIHRoZSBqb2IgaXMgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIgYW5kIHRoZSBpbml0aWFsXG4vLyAgICBzeW5jaHJvbm91cyBwb3J0aW9uIG9mIHRoZSBoYW5kbGVyIGlzIGludm9rZWQgb24gdGhhdCBpbnB1dCAoaS5lLlxuLy8gICAgcHJlZW1wdGluZyB3b3JrZmxvdyBjb2RlKS5cbi8vXG4vLyBUaHVzIGluIHRoZSBjYXNlIG9mIFR5cGVzY3JpcHQgdGhlIHF1ZXN0aW9ucyBhYm92ZSBhcmUgYW5zd2VyZWQgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBBIGhhbmRsZXIgaXMgXCJhdmFpbGFibGVcIiBpZiBpdCBpcyBzZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBBY3RpdmF0aW9uIG9yXG4vLyAgICBiZWNvbWVzIHNldCBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoZSBBY3RpdmF0aW9uLiBJZiB0aGUgaGFuZGxlciBpcyBub3Qgc2V0XG4vLyAgICBpbml0aWFsbHkgdGhlbiBpdCBpcyBleGVjdXRlZCBhcyBzb29uIGFzIGl0IGlzIHNldC4gU3Vic2VxdWVudCBkZWxldGlvbiBvclxuLy8gICAgcmVwbGFjZW1lbnQgYnkgYSBkaWZmZXJlbnQgaGFuZGxlciBoYXMgbm8gaW1wYWN0IGJlY2F1c2UgdGhlIGpvYnMgaXQgd2FzXG4vLyAgICBoYW5kbGluZyBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGFuZCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBidWZmZXIuXG4vL1xuLy8gMi4gVGhlIGhhbmRsZXIgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZS4gSS5lLiBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiB0aGVuIGl0IGlzIGV4ZWN1dGVkIHdoZW5cbi8vICAgIGZpcnN0IGF0dGVtcHRpbmcgdG8gcHJvY2VzcyB0aGUgU2lnbmFsL1VwZGF0ZSBqb2I7IGFsdGVybmF0aXZlbHksIGlmIGl0IGlzXG4vLyAgICBzZXQgYnkgYSBzZXRIYW5kbGVyIGNhbGwgbWFkZSBieSBXb3JrZmxvdyBjb2RlLCB0aGVuIGl0IGlzIGV4ZWN1dGVkIGFzXG4vLyAgICBwYXJ0IG9mIHRoYXQgY2FsbCAocHJlZW1wdGluZyBXb3JrZmxvdyBjb2RlKS4gVGhlcmVmb3JlLCBhIHVzZXIgY2FuIHJlbHlcbi8vICAgIG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiBlLmcuIHRoZSBXb3JrZmxvdyByZXR1cm5cbi8vICAgIHZhbHVlLCBhbmQgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXcuIEFjdGl2YXRpb24gam9icyBhcmVcbi8vICAgIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIgc3VwcGxpZWQgYnkgc2RrLWNvcmUsIGkuZS4gU2lnbmFscywgdGhlbiBVcGRhdGVzLFxuLy8gICAgdGhlbiBvdGhlciBqb2JzLiBXaXRoaW4gZWFjaCBncm91cCwgdGhlIG9yZGVyIHNlbnQgYnkgdGhlIHNlcnZlciBpc1xuLy8gICAgcHJlc2VydmVkLiBJZiB0aGUgaGFuZGxlciBpcyBhc3luYywgaXQgaXMgZXhlY3V0ZWQgdXAgdG8gaXRzIGZpcnN0IHlpZWxkXG4vLyAgICBwb2ludC5cbi8vXG4vLyAzLiBTaWduYWwgY2FzZTogSWYgYSBoYW5kbGVyIGRvZXMgbm90IGJlY29tZSBhdmFpbGFibGUgZm9yIGEgU2lnbmFsIGpvYiB0aGVuXG4vLyAgICB0aGUgam9iIHJlbWFpbnMgaW4gdGhlIGJ1ZmZlci4gSWYgYSBoYW5kbGVyIGZvciB0aGUgU2lnbmFsIGJlY29tZXNcbi8vICAgIGF2YWlsYWJsZSBpbiBhIHN1YnNlcXVlbnQgQWN0aXZhdGlvbiAob2YgdGhlIHNhbWUgb3IgYSBzdWJzZXF1ZW50IFdGVClcbi8vICAgIHRoZW4gdGhlIGhhbmRsZXIgd2lsbCBiZSBleGVjdXRlZC4gSWYgbm90LCB0aGVuIHRoZSBTaWduYWwgd2lsbCBuZXZlciBiZVxuLy8gICAgcmVzcG9uZGVkIHRvIGFuZCB0aGlzIGNhdXNlcyBubyBlcnJvci5cbi8vXG4vLyAgICBVcGRhdGUgY2FzZTogSWYgYSBoYW5kbGVyIGRvZXMgbm90IGJlY29tZSBhdmFpbGFibGUgZm9yIGFuIFVwZGF0ZSBqb2IgdGhlblxuLy8gICAgdGhlIFVwZGF0ZSBpcyByZWplY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBBY3RpdmF0aW9uLiBUaHVzLCBpZiBhIHVzZXIgZG9lc1xuLy8gICAgbm90IHdhbnQgYW4gVXBkYXRlIHRvIGJlIHJlamVjdGVkIGZvciB0aGlzIHJlYXNvbiwgdGhlbiBpdCBpcyB0aGVpclxuLy8gICAgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlaXIgYXBwbGljYXRpb24gYW5kIHdvcmtmbG93IGNvZGUgaW50ZXJhY3Rcbi8vICAgIHN1Y2ggdGhhdCBhIGhhbmRsZXIgaXMgYXZhaWxhYmxlIGZvciB0aGUgVXBkYXRlIGR1cmluZyBhbnkgQWN0aXZhdGlvblxuLy8gICAgd2hpY2ggbWlnaHQgY29udGFpbiB0aGVpciBVcGRhdGUgam9iLiAoTm90ZSB0aGF0IHRoZSB1c2VyIG9mdGVuIGhhc1xuLy8gICAgdW5jZXJ0YWludHkgYWJvdXQgd2hpY2ggV0ZUIHRoZWlyIFNpZ25hbC9VcGRhdGUgd2lsbCBhcHBlYXIgaW4uIEZvclxuLy8gICAgZXhhbXBsZSwgaWYgdGhleSBjYWxsIHN0YXJ0V29ya2Zsb3coKSBmb2xsb3dlZCBieSBzdGFydFVwZGF0ZSgpLCB0aGVuIHRoZXlcbi8vICAgIHdpbGwgdHlwaWNhbGx5IG5vdCBrbm93IHdoZXRoZXIgdGhlc2Ugd2lsbCBiZSBkZWxpdmVyZWQgaW4gb25lIG9yIHR3b1xuLy8gICAgV0ZUcy4gT24gdGhlIG90aGVyIGhhbmQgdGhlcmUgYXJlIHNpdHVhdGlvbnMgd2hlcmUgdGhleSB3b3VsZCBoYXZlIHJlYXNvblxuLy8gICAgdG8gYmVsaWV2ZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSBXRlQsIGZvciBleGFtcGxlIGlmIHRoZXkgZG8gbm90IHN0YXJ0XG4vLyAgICBXb3JrZXIgcG9sbGluZyB1bnRpbCBhZnRlciB0aGV5IGhhdmUgdmVyaWZpZWQgdGhhdCBib3RoIHJlcXVlc3RzIGhhdmVcbi8vICAgIHN1Y2NlZWRlZC4pXG4vL1xuLy8gNC4gSWYgYW4gVXBkYXRlIGhhcyBhIHZhbGlkYXRpb24gZnVuY3Rpb24gdGhlbiBpdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseVxuLy8gICAgcHJpb3IgdG8gdGhlIGhhbmRsZXIuIChOb3RlIHRoYXQgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmVcbi8vICAgIHN5bmNocm9ub3VzKS5cbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFxuICBSZXQsXG4gIEFyZ3MgZXh0ZW5kcyBhbnlbXSxcbiAgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPiB8IFNpZ25hbERlZmluaXRpb248QXJncz4gfCBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPixcbj4oXG4gIGRlZjogVCxcbiAgaGFuZGxlcjogSGFuZGxlcjxSZXQsIEFyZ3MsIFQ+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogUXVlcnlIYW5kbGVyT3B0aW9ucyB8IFNpZ25hbEhhbmRsZXJPcHRpb25zIHwgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncz5cbik6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuc2V0SGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgLy8gQ2Fubm90IHJlZ2lzdGVyIGhhbmRsZXIgZm9yIHJlc2VydmVkIG5hbWVzXG4gIHRocm93SWZSZXNlcnZlZE5hbWUoZGVmLnR5cGUsIGRlZi5uYW1lKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBvcHRpb25zPy5kZXNjcmlwdGlvbjtcbiAgaWYgKGRlZi50eXBlID09PSAndXBkYXRlJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgdXBkYXRlT3B0aW9ucyA9IG9wdGlvbnMgYXMgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncz4gfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHVwZGF0ZU9wdGlvbnM/LnZhbGlkYXRvciBhcyBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gdXBkYXRlT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnVwZGF0ZUhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyLCB2YWxpZGF0b3IsIGRlc2NyaXB0aW9uLCB1bmZpbmlzaGVkUG9saWN5IH0pO1xuICAgICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID09IG51bGwpIHtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5kZWxldGUoZGVmLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGVmLnR5cGUgPT09ICdzaWduYWwnKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBzaWduYWxPcHRpb25zID0gb3B0aW9ucyBhcyBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuZmluaXNoZWRQb2xpY3kgPSBzaWduYWxPcHRpb25zPy51bmZpbmlzaGVkUG9saWN5ID8/IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET047XG4gICAgICBhY3RpdmF0b3Iuc2lnbmFsSGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkU2lnbmFscygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3Iuc2lnbmFsSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAncXVlcnknKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhY3RpdmF0b3IucXVlcnlIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlcjogaGFuZGxlciBhcyBhbnksIGRlc2NyaXB0aW9uIH0pO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IucXVlcnlIYW5kbGVycy5kZWxldGUoZGVmLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBkZWZpbml0aW9uIHR5cGU6ICR7KGRlZiBhcyBhbnkpLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBzaWduYWwgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHNpZ25hbHMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAqXG4gKiBTaWduYWxzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHNpZ25hbCBoYW5kbGVyIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhY2NlcHRlZCBieSB0aGUgc2VydmVyLlxuICpcbiAqIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIGdpdmVuIHNpZ25hbCBuYW1lIHRoZSBsYXN0IGhhbmRsZXIgd2lsbCBvdmVyd3JpdGUgYW55IHByZXZpb3VzIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFNpZ25hbEhhbmRsZXIoaGFuZGxlcjogRGVmYXVsdFNpZ25hbEhhbmRsZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNldERlZmF1bHRTaWduYWxIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gaGFuZGxlcjtcbiAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgfSBlbHNlIGlmIChoYW5kbGVyID09IG51bGwpIHtcbiAgICBhY3RpdmF0b3IuZGVmYXVsdFNpZ25hbEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSB1cGRhdGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHVwZGF0ZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHVwZGF0ZSBuYW1lcy5cbiAqXG4gKiBVcGRhdGVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHVwZGF0ZSBoYW5kbGVyIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhY2NlcHRlZCBieSB0aGUgc2VydmVyLlxuICpcbiAqIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBhIGdpdmVuIHVwZGF0ZSBuYW1lIHRoZSBsYXN0IGhhbmRsZXIgd2lsbCBvdmVyd3JpdGUgYW55IHByZXZpb3VzIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFVwZGF0ZUhhbmRsZXIoaGFuZGxlcjogRGVmYXVsdFVwZGF0ZUhhbmRsZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNldERlZmF1bHRVcGRhdGVIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gaGFuZGxlcjtcbiAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFVwZGF0ZXMoKTtcbiAgfSBlbHNlIGlmIChoYW5kbGVyID09IG51bGwpIHtcbiAgICBhY3RpdmF0b3IuZGVmYXVsdFVwZGF0ZUhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSBxdWVyeSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcnkgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHF1ZXJ5IG5hbWVzLlxuICpcbiAqIFF1ZXJpZXMgYXJlIGRpc3BhdGNoZWQgdG8gdGhlIGRlZmF1bHQgcXVlcnkgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBxdWVyeSBuYW1lIHRoZSBsYXN0IGhhbmRsZXIgd2lsbCBvdmVyd3JpdGUgYW55IHByZXZpb3VzIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBxdWVyaWVzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcywgb3IgYHVuZGVmaW5lZGAgdG8gdW5zZXQgdGhlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0UXVlcnlIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRRdWVyeUhhbmRsZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNldERlZmF1bHRRdWVyeUhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicgfHwgaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRRdWVyeUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGlzIFdvcmtmbG93J3MgU2VhcmNoIEF0dHJpYnV0ZXMgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgYHNlYXJjaEF0dHJpYnV0ZXNgIHdpdGggdGhlIGV4aXN0aW5nIFNlYXJjaFxuICogQXR0cmlidXRlcywgYHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXNgLlxuICpcbiAqIFNlYXJjaCBhdHRyaWJ1dGVzIGNhbiBiZSB1cHNlcnRlZCB1c2luZyBlaXRoZXIgU2VhcmNoQXR0cmlidXRlcyAoZGVwcmVjYXRlZCkgb3IgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpXG4gKlxuICogVXBzZXJ0aW5nIGEgd29ya2Zsb3cncyBzZWFyY2ggYXR0cmlidXRlcyB1c2luZyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW106XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGludEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tSW50RmllbGQnLCAnSU5UJyk7XG4gKiBjb25zdCBib29sS2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21Cb29sRmllbGQnLCAnQk9PTCcpO1xuICogY29uc3Qga2V5d29yZExpc3RLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUtleXdvcmRGaWVsZCcsICdLRVlXT1JEX0xJU1QnKTtcbiAqXG4gKiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKFtcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoaW50S2V5LCAxKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoYm9vbEtleSwgdHJ1ZSlcbiAqIF0pO1xuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgNDIpLFxuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShrZXl3b3JkTGlzdEtleSwgWydkdXJhYmxlIGNvZGUnLCAnaXMgZ3JlYXQnXSlcbiAqIF0pO1xuICogYGBgXG4gKlxuICogV291bGQgcmVzdWx0IGluIHRoZSBXb3JrZmxvdyBoYXZpbmcgdGhlc2UgU2VhcmNoIEF0dHJpYnV0ZXM6XG4gKlxuICogYGBgdHNcbiAqIHtcbiAqICAgQ3VzdG9tSW50RmllbGQ6IFs0Ml0sXG4gKiAgIEN1c3RvbUJvb2xGaWVsZDogW3RydWVdLFxuICogICBDdXN0b21LZXl3b3JkRmllbGQ6IFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J11cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzZWFyY2hBdHRyaWJ1dGVzIFRoZSBSZWNvcmQgdG8gbWVyZ2UuXG4gKiBJZiB1c2luZyBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10gKHByZWZlcnJlZCksIHNldCBhIHZhbHVlIHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBzZWFyY2ggYXR0cmlidXRlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlcyAoZGVwcmVjYXRlZCksIHNldCBhIHZhbHVlIHRvIHVuZGVmaW5lZCBvciBhbiBlbXB0eSBsaXN0IHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyB8IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cudXBzZXJ0U2VhcmNoQXR0cmlidXRlcyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG5cbiAgaWYgKHNlYXJjaEF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoQXR0cmlidXRlcyBtdXN0IGJlIGEgbm9uLW51bGwgU2VhcmNoQXR0cmlidXRlcycpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoQXR0cmlidXRlcykpIHtcbiAgICAvLyBUeXBlZCBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKHVuZGVmaW5lZCwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAgICBjb25zdCBuZXdTZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzID0geyAuLi5pbmZvLnNlYXJjaEF0dHJpYnV0ZXMgfTtcbiAgICAgIGZvciAoY29uc3QgcGFpciBvZiBzZWFyY2hBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChwYWlyLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgcmVtb3ZlIHRoZSBzZWFyY2ggYXR0cmlidXRlLlxuICAgICAgICAgIC8vIFdlIGRvbid0IG11dGF0ZSB0aGUgZXhpc3Rpbmcgc3RhdGUgKGp1c3QgdGhlIG5ldyBtYXApIHNvIHRoaXMgaXMgc2FmZS5cbiAgICAgICAgICBkZWxldGUgbmV3U2VhcmNoQXR0cmlidXRlc1twYWlyLmtleS5uYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdID0gQXJyYXkuaXNBcnJheShwYWlyLnZhbHVlKVxuICAgICAgICAgICAgPyBwYWlyLnZhbHVlXG4gICAgICAgICAgICA6IChbcGFpci52YWx1ZV0gYXMgU2VhcmNoQXR0cmlidXRlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbmZvLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBuZXdTZWFyY2hBdHRyaWJ1dGVzLFxuICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgY29weSBhbmQgYXBwbHkgZXhpc3RpbmcgYW5kIG5ldyB1cGRhdGVzLiBLZWVwIGluIG1pbmQgdGhlIG9yZGVyIG1hdHRlcnMgaGVyZSAoZXhpc3RpbmcgZmlyc3QsIG5ldyBzZWNvbmQgLSB0byBwb3NzaWJseSBvdmVyd3JpdGUgZXhpc3RpbmcpLlxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoWy4uLnNlYXJjaEF0dHJpYnV0ZXNdKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTGVnYWN5IHNlYXJjaCBhdHRyaWJ1dGVzXG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHVwc2VydFdvcmtmbG93U2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgaW5kZXhlZEZpZWxkczogbWFwVG9QYXlsb2FkcyhzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLCBzZWFyY2hBdHRyaWJ1dGVzKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvOiBXb3JrZmxvd0luZm8pOiBXb3JrZmxvd0luZm8gPT4ge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAgICBsZXQgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzID0gaW5mby50eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXSk7XG4gICAgICBjb25zdCBuZXdTZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzID0geyAuLi5pbmZvLnNlYXJjaEF0dHJpYnV0ZXMgfTtcblxuICAgICAgLy8gVXBzZXJ0IGxlZ2FjeSBzZWFyY2ggYXR0cmlidXRlcyBpbnRvIHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvciB1bmRlZmluZWQsIGdvdCAke3Z9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIGFuIGVtcHR5IGxpc3QsIHRoaXMgc2lnbmlmaWVzIGRlbGV0aW9uLlxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBib3RoIHVudHlwZWQgJiB0eXBlZCBzZWFyY2ggYXR0cmlidXRlcy5cbiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAvLyBXZSBjYW5ub3QgZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgZnJvbSB0aGVzZSB2YWx1ZXMuXG4gICAgICAgICAgLy8gSW5zdGVhZCwgd2UgZG8gYSBcImJlc3QgZWZmb3J0XCIgZGVsZXRpb24gZnJvbSB0eXBlZCBzZWFyY2ggYXR0cmlidXRlczpcbiAgICAgICAgICAvLyAtIGNoZWNrIGlmIGEgbWF0Y2hpbmcga2V5IG5hbWUgZXhpc3RzLCBpZiBzbywgcmVtb3ZlIGl0LlxuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSBrKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgICAgIHsga2V5OiBtYXRjaGluZ1BhaXIua2V5LCB2YWx1ZTogbnVsbCB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNba107XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZvciB0aGUgdXBkYXRlLlxuICAgICAgICBjb25zdCB0eXBlZEtleSA9IFR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRLZXlGcm9tVW50eXBlZChrLCB2KTtcblxuICAgICAgICAvLyBVbmFibGUgdG8gZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgKG5vIHZhbGlkIHR5cGUgZm9yIGRlZmluZWQgdmFsdWUpLlxuICAgICAgICAvLyBTa2lwIGFwcGx5aW5nIHRoaXMgdXBkYXRlIChuby1vcCkuXG4gICAgICAgIGlmICh0eXBlZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBURVhUIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSBhIHN0cmluZyB2YWx1ZSwgYnV0IGl0IGNvdWxkIGFsc28gYmUgS0VZV09SRC5cbiAgICAgICAgLy8gSWYgYSBtYXRjaGluZyBwYWlyIGV4aXN0cyB3aXRoIEtFWVdPUkQgdHlwZSwgdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdURVhUJykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSB0eXBlZEtleS5uYW1lKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZEtleS50eXBlID0gbWF0Y2hpbmdQYWlyLmtleS50eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdWYWx1ZTogdW5rbm93biA9IHY7XG4gICAgICAgIC8vIFVucGFjayB2YWx1ZSBpZiBpdCBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5LlxuICAgICAgICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHZbMF07XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSBiYWNrIHRvIERhdGUuXG4gICAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdEQVRFVElNRScpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3IERhdGUobmV3VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmaW5lZCB2YWx1ZSB3aXRoIHZhbGlkIHR5cGUuIEFwcGx5IHRoZSB1cGRhdGUuXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFtcbiAgICAgICAgICB7IGtleTogdHlwZWRLZXksIHZhbHVlOiBuZXdWYWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgIF0pO1xuICAgICAgICBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluZm8sXG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IG5ld1NlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoaXMgV29ya2Zsb3cncyBNZW1vcyBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBgbWVtb2Agd2l0aCBleGlzdGluZ1xuICogTWVtb3MgKGFzIHJldHVybmVkIGJ5IGB3b3JrZmxvd0luZm8oKS5tZW1vYCkuXG4gKlxuICogTmV3IG1lbW8gaXMgbWVyZ2VkIGJ5IHJlcGxhY2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBzYW1lIG5hbWUgX2F0IHRoZSBmaXJzdFxuICogbGV2ZWwgb25seV8uIFNldHRpbmcgYSBwcm9wZXJ0eSB0byB2YWx1ZSBgdW5kZWZpbmVkYCBvciBgbnVsbGAgY2xlYXJzIHRoYXRcbiAqIGtleSBmcm9tIHRoZSBNZW1vLlxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiB1cHNlcnRNZW1vKHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTM6IHsgc3Via2V5MTogdmFsdWUgfVxuICogICBrZXk0OiB2YWx1ZSxcbiAqIH0pO1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTI6IHZhbHVlXG4gKiAgIGtleTM6IHsgc3Via2V5MjogdmFsdWUgfVxuICogICBrZXk0OiB1bmRlZmluZWQsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIHdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIE1lbW86XG4gKlxuICogYGBgdHNcbiAqIHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTI6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH0gIC8vIE5vdGUgdGhpcyBvYmplY3Qgd2FzIGNvbXBsZXRlbHkgcmVwbGFjZWRcbiAqICAgLy8gTm90ZSB0aGF0IGtleTQgd2FzIGNvbXBsZXRlbHkgcmVtb3ZlZFxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG1lbW8gVGhlIFJlY29yZCB0byBtZXJnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydE1lbW8obWVtbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnVwc2VydE1lbW8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIGNvbnN0IGNvbnRleHQgPSBjdXJyZW50V29ya2Zsb3dTZXJpYWxpemF0aW9uQ29udGV4dChhY3RpdmF0b3IuaW5mbyk7XG5cbiAgaWYgKG1lbW8gPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVtbyBtdXN0IGJlIGEgbm9uLW51bGwgUmVjb3JkJyk7XG4gIH1cblxuICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgIG1vZGlmeVdvcmtmbG93UHJvcGVydGllczoge1xuICAgICAgdXBzZXJ0ZWRNZW1vOiB7XG4gICAgICAgIGZpZWxkczogbWFwVG9QYXlsb2FkcyhcbiAgICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICAvLyBDb252ZXJ0IG51bGwgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG1lbW8pLm1hcCgoW2ssIHZdKSA9PiBbaywgdiA/PyB1bmRlZmluZWRdKSksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBhY3RpdmF0b3IubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvOiBXb3JrZmxvd0luZm8pOiBXb3JrZmxvd0luZm8gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5pbmZvLFxuICAgICAgbWVtbzogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICAgICAgLi4uaW5mby5tZW1vLFxuICAgICAgICAgIC4uLm1lbW8sXG4gICAgICAgIH0pLmZpbHRlcigoW18sIHZdKSA9PiB2ICE9IG51bGwpXG4gICAgICApLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdXBkYXRlIGFuZCBzaWduYWwgaGFuZGxlcnMgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcuXG4gKlxuICogQ29uc2lkZXIgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbiBiZWZvcmUgd29ya2Zsb3cgcmV0dXJuIG9yIGNvbnRpbnVlLWFzLW5ldywgdG8gcHJldmVudFxuICogaW50ZXJydXB0aW9uIG9mIGluLXByb2dyZXNzIGhhbmRsZXJzIGJ5IHdvcmtmbG93IGV4aXQ6XG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxuICogYGBgXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaW4tcHJvZ3Jlc3MgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxIYW5kbGVyc0ZpbmlzaGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnYWxsSGFuZGxlcnNGaW5pc2hlZCgpIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5pblByb2dyZXNzU2lnbmFscy5zaXplID09PSAwICYmIGFjdGl2YXRvci5pblByb2dyZXNzVXBkYXRlcy5zaXplID09PSAwO1xufVxuXG4vKipcbiAqIENhbiBiZSB1c2VkIHRvIGFsdGVyIHdvcmtmbG93IGZ1bmN0aW9ucyB3aXRoIGNlcnRhaW4gb3B0aW9ucyBzcGVjaWZpZWQgYXQgZGVmaW5pdGlvbiB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBGb3IgZXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBzZXRXb3JrZmxvd09wdGlvbnMoe1xuICogICB2ZXJzaW9uaW5nQmVoYXZpb3I6ICdQSU5ORUQnLFxuICogICBmYWlsdXJlRXhjZXB0aW9uVHlwZXM6IFtDdXN0b21Xb3JrZmxvd0Vycm9yXVxuICogfSwgbXlXb3JrZmxvdyk7XG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdygpOiBQcm9taXNlPHN0cmluZz4ge1xuICogICAvLyBXb3JrZmxvdyBjb2RlIGhlcmVcbiAqICAgcmV0dXJuIFwiaGlcIjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBUbyBhbm5vdGF0ZSBhIGRlZmF1bHQgb3IgZHluYW1pYyB3b3JrZmxvdzpcbiAqIGBgYHRzXG4gKiBleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiAoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAqICAgLy8gV29ya2Zsb3cgY29kZSBoZXJlXG4gKiAgIHJldHVybiBcImhpXCI7XG4gKiB9XG4gKiBzZXRXb3JrZmxvd09wdGlvbnMoe1xuICogICB2ZXJzaW9uaW5nQmVoYXZpb3I6ICdQSU5ORUQnLFxuICogICBmYWlsdXJlRXhjZXB0aW9uVHlwZXM6IFtDdXN0b21Xb3JrZmxvd0Vycm9yXVxuICogfSwgbW9kdWxlLmV4cG9ydHMuZGVmYXVsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgZGVmaW50aW9uLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBvcHRpb25zLiBJZiBhXG4gKiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgb25jZSBqdXN0IGJlZm9yZSB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGVcbiAqIGZpcnN0IHRpbWUuIEl0IGlzIHNhZmUgdG8gY2FsbCB7QGxpbmsgd29ya2Zsb3dJbmZvfSBpbnNpZGUgc3VjaCBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZuIFRoZSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdvcmtmbG93T3B0aW9uczxBIGV4dGVuZHMgYW55W10sIFJUPihcbiAgb3B0aW9uczogV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyLFxuICBmbjogKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8UlQ+XG4pOiB2b2lkIHtcbiAgT2JqZWN0LmFzc2lnbihmbiwge1xuICAgIHdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM6IG9wdGlvbnMsXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8c3RyaW5nPignX19zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IGVuaGFuY2VkU3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8RW5oYW5jZWRTdGFja1RyYWNlPignX19lbmhhbmNlZF9zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93TWV0YWRhdGFRdWVyeSA9IGRlZmluZVF1ZXJ5PHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KCdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50RGV0YWlscygpOiBzdHJpbmcge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnZ2V0Q3VycmVudERldGFpbHMoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuY3VycmVudERldGFpbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50RGV0YWlscyhkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBhY3RpdmF0b3IuY3VycmVudERldGFpbHMgPSBkZXRhaWxzO1xufVxuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBoYW5kbGVyIGVycm9yLlxuICpcbiAqIFRoaXMgZXJyb3IgY2xhc3MgcmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgaGFuZGxpbmcgb2YgYVxuICogTmV4dXMgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgYXMgYSBoYW5kbGVyIGVycm9yLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqICAgICBpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgYmFkIHJlcXVlc3QgZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgcmV0cnlhYmxlIGludGVybmFsIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIklOVEVSTkFMXCIsIFwiRGF0YWJhc2UgdW5hdmFpbGFibGVcIiwgeyByZXRyeWFibGVPdmVycmlkZTogdHJ1ZSB9KTtcbiAqXG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBIYW5kbGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBPbmUgb2YgdGhlIHByZWRlZmluZWQgZXJyb3IgdHlwZXMuXG4gICAqXG4gICAqIElmIHRoZSBjb25zdHJ1Y3RvciByZWNlaXZlZCBhbiB1bmtub3duIHN0cmluZywgdGhpcyB3aWxsIGJlIGBcIlVOS05PV05cImAuXG4gICAqIFVzZSB7QGxpbmsgcmF3RXJyb3JUeXBlfSB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIHN0cmluZy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBIYW5kbGVyRXJyb3JUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGVycm9yIHR5cGUgc3RyaW5nLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgZXF1YWxzIHtAbGluayB0eXBlfS4gRm9yIHVua25vd24gdHlwZXMsIHRoaXMgcHJlc2VydmVzXG4gICAqIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZyB3aGlsZSB7QGxpbmsgdHlwZX0gaXMgc2V0IHRvIGBcIlVOS05PV05cImAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmF3RXJyb3JUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBzaG91bGQgYmUgY29uc2lkZXJlZCByZXRyeWFibGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSByZXRyeSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGVycm9yIHR5cGUuXG4gICAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBgSU5URVJOQUxgIGlzIHJldHJ5YWJsZSwgYnV0IGBVTkFWQUlMQUJMRWAgaXMgbm9uLXJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgc3BlY2lmaWVkLCBgcmV0cnlhYmxlT3ZlcnJpZGVgIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZXRyeSBiZWhhdmlvciBkZXRlcm1pbmVkIGJhc2VkIG9uXG4gICAqIHRoZSBlcnJvciB0eXBlLiBVc2Uge0BsaW5rIHJldHJ5YWJsZX0gdG8gZGV0ZXJtaW5lIHRoZSBlZmZlY3RpdmUgcmV0cnkgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZX0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZXJyb3IuIE11c3QgYmUgYSBrbm93biB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX0uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgaW5jbHVkaW5nIHRoZSBjYXVzZSBhbmQgcmV0cnlhYmxlIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBIYW5kbGVyRXJyb3JUeXBlLCBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogSGFuZGxlckVycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IGFjdHVhbE1lc3NhZ2UgPSBtZXNzYWdlIHx8IGBIYW5kbGVyIGVycm9yOiAke3R5cGV9YDtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKEhhbmRsZXJFcnJvclR5cGUsIHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIEhhbmRsZXJFcnJvclR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnJhd0Vycm9yVHlwZSA9IHR5cGUgPT09IFwiVU5LTk9XTlwiID8gKG9wdGlvbnM/LnJhd0Vycm9yVHlwZSA/PyB0eXBlKSA6IHR5cGU7XG4gICAgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9IG9wdGlvbnM/LnJldHJ5YWJsZU92ZXJyaWRlO1xuICAgIHRoaXMub3JpZ2luYWxGYWlsdXJlID0gb3B0aW9ucz8ub3JpZ2luYWxGYWlsdXJlO1xuICAgIGlmIChvcHRpb25zPy5zdGFja1RyYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBvcHRpb25zLnN0YWNrVHJhY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyByZXRyeWFibGUuXG4gICAqXG4gICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9IHByb3BlcnR5IGluIHRoYXQgYHJldHJ5YWJsZWAgdGFrZXMgaW50b1xuICAgKiBhY2NvdW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHJlc3VsdGluZyBmcm9tIHRoZSBlcnJvciB0eXBlLCBpZiBubyBvdmVycmlkZSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9LlxuICAgKi9cbiAgcHVibGljIGdldCByZXRyeWFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGU7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBcIkJBRF9SRVFVRVNUXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIRU5USUNBVEVEXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIT1JJWkVEXCI6XG4gICAgICBjYXNlIFwiTk9UX0ZPVU5EXCI6XG4gICAgICBjYXNlIFwiTk9UX0lNUExFTUVOVEVEXCI6XG4gICAgICBjYXNlIFwiQ09ORkxJQ1RcIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjYXNlIFwiVU5BVkFJTEFCTEVcIjpcbiAgICAgIGNhc2UgXCJVUFNUUkVBTV9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCI6XG4gICAgICBjYXNlIFwiSU5URVJOQUxcIjpcbiAgICAgIGNhc2UgXCJSRVFVRVNUX1RJTUVPVVRcIjpcbiAgICAgIGNhc2UgXCJVTktOT1dOXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZvcmNlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG1pc3NpbmcgYSBjYXNlXG4gICAgICAgIGNvbnN0IF9ub01pc3NpbmdDYXNlOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZihIYW5kbGVyRXJyb3IsIFwiSGFuZGxlckVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBIYW5kbGVyRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyRXJyb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgY2F1c2U/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBJZiBub3Qgc2V0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqL1xuICByZXRyeWFibGVPdmVycmlkZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBlcnJvciB0eXBlIHN0cmluZywgcHJlc2VydmluZyB0aGUgcmF3IHdpcmUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBrbm93biB0eXBlcywgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cbiAgICogV2hlbiB0aGUgZXJyb3IncyB0eXBlIGlzIHNldCB0byBgXCJVTktOT1dOXCJgLCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZy5cbiAgICovXG4gIHJhd0Vycm9yVHlwZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBIYW5kbGVyRXJyb3J9LCBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgTmV4dXMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJFcnJvclR5cGUgPSAodHlwZW9mIEhhbmRsZXJFcnJvclR5cGUpW2tleW9mIHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlXTtcbmV4cG9ydCBjb25zdCBIYW5kbGVyRXJyb3JUeXBlID0ge1xuICAvKipcbiAgICogVGhlIGVycm9yIHR5cGUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOS05PV046IFwiVU5LTk9XTlwiLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciBjYW5ub3Qgb3Igd2lsbCBub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYW4gYXBwYXJlbnQgY2xpZW50IGVycm9yLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIEJBRF9SRVFVRVNUOiBcIkJBRF9SRVFVRVNUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZGlkIG5vdCBzdXBwbHkgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBVTkFVVEhFTlRJQ0FURUQ6IFwiVU5BVVRIRU5USUNBVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIT1JJWkVEOiBcIlVOQVVUSE9SSVpFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdGVkIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCBidXQgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgTk9UX0ZPVU5EOiBcIk5PVF9GT1VORFwiLFxuXG4gIC8qKlxuICAgKiBSZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gaXQgaGFzIGdpdmVuIHVwIGhhbmRsaW5nIGEgcmVxdWVzdC4gVGhpcyBtYXkgb2NjdXIgYnkgZW5mb3JjaW5nXG4gICAqIGEgY2xpZW50IHByb3ZpZGVkIGBSZXF1ZXN0LVRpbWVvdXRgIG9yIGZvciBhbnkgYXJiaXRyYXJ5IHJlYXNvbiBzdWNoIGFzIGVuZm9yY2luZyBzb21lXG4gICAqIGNvbmZpZ3VyYWJsZSBsaW1pdC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFJFUVVFU1RfVElNRU9VVDogXCJSRVFVRVNUX1RJTUVPVVRcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIG1hZGUgZHVlIHRvIGEgY29uZmxpY3QuIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRyeWluZyB0byBjcmVhdGUgYW5cbiAgICogb3BlcmF0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIENPTkZMSUNUOiBcIkNPTkZMSUNUXCIsXG5cbiAgLyoqXG4gICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlIGVudGlyZSBmaWxlIHN5c3RlbVxuICAgKiBpcyBvdXQgb2Ygc3BhY2UuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsXG5cbiAgLyoqXG4gICAqIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgSU5URVJOQUw6IFwiSU5URVJOQUxcIixcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBlaXRoZXIgZG9lcyBub3QgcmVjb2duaXplIHRoZSByZXF1ZXN0IG1ldGhvZCwgb3IgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8gZnVsZmlsbCB0aGVcbiAgICogcmVxdWVzdC4gQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBOT1RfSU1QTEVNRU5URUQ6IFwiTk9UX0lNUExFTUVOVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOQVZBSUxBQkxFOiBcIlVOQVZBSUxBQkxFXCIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZ2F0ZXdheXMgdG8gcmVwb3J0IHRoYXQgYSByZXF1ZXN0IHRvIGFuIHVwc3RyZWFtIHNlcnZlciBoYXMgdGltZWQgb3V0LlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgVVBTVFJFQU1fVElNRU9VVDogXCJVUFNUUkVBTV9USU1FT1VUXCIsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IHsgdHlwZSBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuZXhwb3J0IHsgSGFuZGxlckVycm9yLCBIYW5kbGVyRXJyb3JUeXBlLCB0eXBlIEhhbmRsZXJFcnJvck9wdGlvbnMgfSBmcm9tIFwiLi9oYW5kbGVyLWVycm9yXCI7XG5leHBvcnQgeyB0eXBlIExpbmsgfSBmcm9tIFwiLi9saW5rXCI7XG5leHBvcnQge1xuICBPcGVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVyYXRpb25FcnJvclN0YXRlLFxuICB0eXBlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWVycm9yXCI7XG4iLCJpbXBvcnQgeyBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3ltYm9sLWluc3RhbmNlb2ZcIjtcbmltcG9ydCB0eXBlIHsgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcblxuLyoqXG4gKiBBIE5leHVzIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgdGhlIGFibm9ybWFsIGNvbXBsZXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24sXG4gKiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGFuIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgT3BlcmF0aW9uRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgZmFpbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3IsIHdpdGggYSBjYXVzZVxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgY2FuY2VsZWQgb3BlcmF0aW9uIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwiY2FuY2VsZWRcIiwgXCJVc2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb25cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IHJlc3VsdGVkIGluIHRoaXMgb3BlcmF0aW9uIGVycm9yLlxuICAgKi9cbiAgZGVjbGFyZSBwdWJsaWMgcmVhZG9ubHkgY2F1c2U6IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXh0cmEgb3B0aW9ucyBmb3IgdGhlIGVycm9yLCBlLmcuIHRoZSBjYXVzZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGUsXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogT3BlcmF0aW9uRXJyb3JPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9IHN0YXRlID09PSBcImNhbmNlbGVkXCIgPyBgT3BlcmF0aW9uIGNhbmNlbGVkYCA6IGBPcGVyYXRpb24gZmFpbGVkYDtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBkZWZhdWx0TWVzc2FnZTtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoT3BlcmF0aW9uRXJyb3IsIFwiT3BlcmF0aW9uRXJyb3JcIik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBPcGVyYXRpb25FcnJvcn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQGlubGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHN0YXRlIG9mIGFuIG9wZXJhdGlvbiB0aGF0IGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSA9IFwiZmFpbGVkXCIgfCBcImNhbmNlbGVkXCI7XG4iLCJleHBvcnQge1xuICB0eXBlIE9wZXJhdGlvbkNvbnRleHQsXG4gIHR5cGUgU3RhcnRPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIENhbmNlbE9wZXJhdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5cbmV4cG9ydCB7XG4gIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jLFxuICB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jLFxufSBmcm9tIFwiLi9zdGFydC1vcGVyYXRpb24tcmVzdWx0XCI7XG5cbmV4cG9ydCB7XG4gIC8vXG4gIHR5cGUgT3BlcmF0aW9uSGFuZGxlcixcbiAgdHlwZSBTeW5jT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWhhbmRsZXJcIjtcblxuZXhwb3J0IHtcbiAgU2VydmljZUhhbmRsZXIsXG4gIHNlcnZpY2VIYW5kbGVyLFxuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3IsXG4gIHR5cGUgU2VydmljZUhhbmRsZXJGb3IsXG59IGZyb20gXCIuL3NlcnZpY2UtaGFuZGxlclwiO1xuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuaW1wb3J0IHsgQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgU3RhcnRPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vb3BlcmF0aW9uLWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIE9wZXJhdGlvbklucHV0LFxuICBPcGVyYXRpb25LZXksXG4gIE9wZXJhdGlvbk1hcCxcbiAgT3BlcmF0aW9uT3V0cHV0LFxufSBmcm9tIFwiLi4vc2VydmljZVwiO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgYSBOZXh1cyBvcGVyYXRpb24uXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgTmV4dXMgc2VydmljZSBpbXBsZW1lbnRvcnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICAvKipcbiAgICogSGFuZGxlIHJlcXVlc3RzIHRvIHN0YXJ0IGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogUmV0dXJuIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfSB0byByZXNwb25kIHN1Y2Nlc3NmdWxseSBpbmxpbmUsIG9yXG4gICAqIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luY30gdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdhcyBzdGFydGVkLlxuICAgKiBUaHJvdyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9IHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBhcyBmYWlsZWQgb3IgY2FuY2VsZWQuXG4gICAqL1xuICBzdGFydChjdHg6IFN0YXJ0T3BlcmF0aW9uQ29udGV4dCwgaW5wdXQ6IEkpOiBQcm9taXNlPEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxPPj47XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBjYW5jZWwgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQ2FuY2VsYXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24gaXM6XG4gICAqIDEuIF9hc3luY2hyb25vdXNfIC0gcmV0dXJuaW5nIGZyb20gdGhpcyBtZXRob2Qgb25seSBjb25maXJtcyB0aGF0IGNhbmNlbGF0aW9uIHdhcyBub3RpZmllZDtcbiAgICogICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBob3dldmVyIGNob29zZSB0byBwcm9jZXNzIHRoZSBjYW5jZWxsYXRpb24gYXQgYSBsYXRlciB0aW1lLCBvciB0b1xuICAgKiAgICBpZ25vcmUgaXQgZW50aXJlbHkuXG4gICAqIDIuIF9pZGVtcG90ZW50XyAtIGltcGxlbWVudGF0aW9ucyBtdXN0IGlnbm9yZSBkdXBsaWNhdGUgY2FuY2VsYXRpb25zIGZvciB0aGUgc2FtZSBvcGVyYXRpb24uXG4gICAqL1xuICBjYW5jZWwoY3R4OiBDYW5jZWxPcGVyYXRpb25Db250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHNob3J0Y3V0IGZvciBkZWZpbmluZyBhbiBvcGVyYXRpb24gaGFuZGxlciB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9XG4gKiBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm5zIGEge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmN9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gPSAoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKSA9PiBQcm9taXNlPE8+O1xuXG4vKipcbiAqIENvbXBpbGVzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGludG8gYSB7QGxpbmsgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyfS4gQSBjb21waWxlZCBvcGVyYXRpb25cbiAqIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYSBmdWxsLWZsZWRnZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVPcGVyYXRpb25IYW5kbGVyPEksIE8+KFxuICBkZWZpbml0aW9uOiBPcGVyYXRpb25EZWZpbml0aW9uPEksIE8+LFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCB1bmRlZmluZWQsXG4pOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBObyBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyAoZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSAnJHtkZWZpbml0aW9uLm5hbWV9JylgLFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIE9wZXJhdGlvbiBoYW5kbGVyIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBzaG9ydGN1dCBzeW50YXguIFdyYXAgaXQgaW50byBhIGZ1bGwtZmxlZGdlZCBoYW5kbGVyLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZpbml0aW9uLFxuXG4gICAgICBzdGFydDogYXN5bmMgKGN0eCwgaW5wdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKGF3YWl0IGhhbmRsZXIoY3R4LCBpbnB1dCkpO1xuICAgICAgfSxcbiAgICAgIGNhbmNlbDogbm90SW1wbGVtZW50ZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5zdGFydCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSGFuZGxlciBmb3Igb3BlcmF0aW9uICcke2RlZmluaXRpb24ubmFtZX0nIGhhcyBubyBzdGFydCBtZXRob2RgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGVmaW5pdGlvbixcblxuICAgIC8vIERlZmVuc2l2ZWx5IGVuc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhbGwgdGhlIHJlcXVpcmVkIG1ldGhvZHMsXG4gICAgLy8gZGVmYXVsdGluZyB0byB0aHJvd2luZyBhIG5vdCBpbXBsZW1lbnRlZCBlcnJvciBpZiBzb21lIG1ldGhvZHMgYXJlIG1pc3NpbmcuXG4gICAgc3RhcnQ6IGhhbmRsZXIuc3RhcnQuYmluZChoYW5kbGVyKSxcbiAgICBjYW5jZWw6IGhhbmRsZXIuY2FuY2VsPy5iaW5kKGhhbmRsZXIpID8/IG5vdEltcGxlbWVudGVkLFxuICB9O1xufVxuXG4vKipcbiAqIEEgY29tcGlsZWQgb3BlcmF0aW9uIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYVxuICogZnVsbC1mbGVkZ2VkIG9wZXJhdGlvbiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiAmIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz47XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+ID0gQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPFxuICBPcGVyYXRpb25JbnB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPixcbiAgT3BlcmF0aW9uT3V0cHV0PE9wc1tPcGVyYXRpb25LZXk8T3BzPl0+XG4+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBub3RJbXBsZW1lbnRlZCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIiwgXCJOb3QgaW1wbGVtZW50ZWRcIik7XG59XG4iLCJpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBPcGVyYXRpb25LZXksIE9wZXJhdGlvbk1hcCwgU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi4vc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yLFxuICBjb21waWxlT3BlcmF0aW9uSGFuZGxlcixcbiAgT3BlcmF0aW9uSGFuZGxlcixcbiAgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbi8qKlxuICogQSBOZXh1cyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLCB0aGF0IHByb3ZpZGVzIGhhbmRsZXJzIGZvciBlYWNoIG9mIGl0cyBvcGVyYXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VIYW5kbGVyPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICAvKipcbiAgICogQnVpbGQgYSBgU2VydmljZUhhbmRsZXJgIGZyb20gYSBzZXJ2aWNlIGRlZmluaXRpb24gYW5kIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaGFuZGxlcnMuXG4gICAqXG4gICAqIFRoZXJlIG11c3QgYmUgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGV2ZXJ5IG9wZXJhdGlvbiBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVycyBUaGUgY29sbGVjdGlvbiBvZiBoYW5kbGVyc1xuICAgKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBoYW5kbGVyXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIGhhbmRsZXJzOiBTZXJ2aWNlSGFuZGxlckZvcjxPcHM+LFxuICApOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gbmV3IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgICAgY29uc3QgY29tcGlsZWRPcEhhbmRsZXIgPSBjb21waWxlT3BlcmF0aW9uSGFuZGxlcihkZWZpbml0aW9uLCBoYW5kbGVyc1twcm9wTmFtZV0pO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IGNvbXBpbGVkT3BIYW5kbGVyLm5hbWUgYXMgT3BlcmF0aW9uS2V5PE9wcz47XG5cbiAgICAgIGlmIChvcGVyYXRpb25zLmhhcyhvcGVyYXRpb25OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBPcGVyYXRpb24gd2l0aCBuYW1lICcke29wZXJhdGlvbk5hbWV9JyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNlcnZpY2UgJyR7c2VydmljZS5uYW1lfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcGVyYXRpb25zLnNldChvcGVyYXRpb25OYW1lLCBjb21waWxlZE9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcihzZXJ2aWNlLCBoYW5kbGVycywgb3BlcmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBkZWZpbml0aW9uOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIHB1YmxpYyByZWFkb25seSBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbnNNYXA6IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gYW5kIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZVxuICAgKi9cbiAgcHVibGljIGdldE9wZXJhdGlvbkhhbmRsZXI8SyBleHRlbmRzIE9wZXJhdGlvbktleTxPcHM+PihcbiAgICBvcGVyYXRpb25OYW1lOiBLLFxuICApOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLm9wZXJhdGlvbnNNYXAuZ2V0KG9wZXJhdGlvbk5hbWUpO1xuICAgIGlmIChlbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFxuICAgICAgICBcIk5PVF9GT1VORFwiLFxuICAgICAgICBgT3BlcmF0aW9uIGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgaW4gc2VydmljZSAnJHt0aGlzLmRlZmluaXRpb24ubmFtZX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBzZXJ2aWNlIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+KFxuICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbik6IFNlcnZpY2VIYW5kbGVyPE9wcz4ge1xuICByZXR1cm4gU2VydmljZUhhbmRsZXIuYnVpbGQoc2VydmljZSwgaGFuZGxlcnMpO1xufVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IGRlZmluZXMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3I8VD4gPVxuICBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+XG4gICAgOiBuZXZlcjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbiBpbnRlcmZhY2VzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZUhhbmRsZXJGb3I8VCBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBPcGVyYXRpb25IYW5kbGVyRm9yPFRbS10+O1xufTtcbiIsIi8qKiBAaW1wb3J0IHsgT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCIgKi9cblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBzeW1ib2wsIHVzZWQgdG8gcHJldmVudCBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlcy5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2wgPSBTeW1ib2woXCJfX25leHVzX2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0XCIpO1xuXG4vKipcbiAqIFRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSB7QGxpbmsgT3BlcmF0aW9uSGFuZGxlci5zdGFydH0gbWV0aG9kLlxuICpcbiAqIFVzZSBlaXRoZXIge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSBvciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jfVxuICogdG8gY3JlYXRlIGEgcmVzdWx0IG9iamVjdC4gRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxUID0gdW5rbm93bj4gPVxuICB8IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmM8VD5cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYztcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0ID0ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGFjY2VwdGVkIGFuZCB3aWxsIGNvbXBsZXRlIGFzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgYXN5bmModG9rZW46IHN0cmluZyk6IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogdHJ1ZSxcbiAgICAgIHRva2VuLFxuICAgICAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN5bmM8VD4odmFsdWU6IFQpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICBbU3ltYm9sLmhhc0luc3RhbmNlXTogZnVuY3Rpb24gKHRoaXM6IGFueSwgdmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAodmFsdWUgYXMgYW55KVtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF0gPT09IHRydWVcbiAgICApO1xuICB9LFxufTtcblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIFVzZSB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IHRvIGNyZWF0ZSBhIHN5bmMgcmVzdWx0IG9iamVjdC5cbiAqIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKDQyKTtcbiAqIGBgYFxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQgPSB1bmtub3duPiB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkgKGZhbHNlKSBvciB3aWxsIGNvbXBsZXRlXG4gICAqIGFzeW5jaHJvbm91c2x5ICh0cnVlKS5cbiAgICovXG4gIGlzQXN5bmM6IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICB2YWx1ZTogVDtcblxuICAvKipcbiAgICogUHJldmVudHMgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY30gdG8gY3JlYXRlIGFuIGFzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmMoXCJ1bmlxdWUgdG9rZW5cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmMge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBBIHRva2VuIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gaW4gZm9sbG93dXAgaGFuZGxlciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuZ2V0UmVzdWx0fVxuICAgKiBhbmQge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuY2FuY2VsfS5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb21tb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hhbmRsZXJcIjtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgYnkgbWFwcGluZyBhbGwgc3RyaW5nIHByb3BlcnRpZXMgKGtleXMgYW5kIHZhbHVlcykgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0XG4gKiB0aHJvdWdoIGEgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgc291cmNlIG9iamVjdCwgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBmbiAtIFRoZSBtYXBwZXIgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHByb3BlcnRpZXMgbWFwcGVkIHRvIHRoZSBuZXcgdHlwZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEtleVZhbHVlczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVT4oXG4gIG9iajogVCxcbiAgZm46IChrZXk6IGtleW9mIFQgJiBzdHJpbmcsIHZhbHVlOiBUW2tleW9mIFQgJiBzdHJpbmddKSA9PiBVLFxuKTogUmVjb3JkPGtleW9mIFQsIFU+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBmbihrZXksIHZhbHVlKV0pLFxuICApIGFzIFJlY29yZDxrZXlvZiBULCBVPjtcbn1cbiIsIi8qKlxuICogSW5qZWN0IGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIG9uIHRoZSBnaXZlbiBjbGFzcywgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2Y8RT4oY2xheno6IENsYXNzPEU+LCBtYXJrZXJOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gSXQgbWF5IHNlZW0gcmVkdW5kYW50IHRvIGhhdmUgYW4gZXhwbGljaXQgbWFya2VyTmFtZSBhcmd1bWVudCBoZXJlLiBDYW4ndCB3ZSBzaW1wbHkgdXNlIHRoZSBjbGFzc1xuICAvLyBmdW5jdGlvbiBuYW1lIGZvciB0aGF0PyBVbmZvcnR1bmF0ZWx5LCBubywgYXMgdGhlIGNsYXNzIG5hbWUgbWF5IGdldCBtYW5nbGVkIGlmIHRoZSBmaWxlIGdldHMgbWluaWZpZWQuXG4gIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fbmV4dXNfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgXCJuYW1lXCIsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6eiwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAvLyBgeCBpbnN0YW5jZW9mIFN1YmNsYXNzT2ZQYXJlbnRgIHdvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgaW5zdGFuY2Ugb2YgJ1BhcmVudCcsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAvLyByZWRlZmluZSBbU3ltYm9sLmhhc0luc3RhbmNlXSwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdC4gV2UgdGhlcmVmb3JlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlb2ZcbiAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodmFsdWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBjbGFzcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzczxFPiB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59XG4iLCJpbXBvcnQgeyBtYXBLZXlWYWx1ZXMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvb2JqZWN0LXV0aWxzXCI7XG5pbXBvcnQgeyBTaW1wbGlmeSB9IGZyb20gXCIuLi9pbnRlcm5hbC90eXBlc1wiO1xuaW1wb3J0IHsgaW5wdXRCcmFuZCwgb3V0cHV0QnJhbmQsIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdGlvbkRlZmluaXRpb24sIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc2VydmljZSBkZWZpbml0aW9uIGZvciBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlPE9wcyBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+KFxuICBuYW1lOiBzdHJpbmcsXG4gIG9wZXJhdGlvbnM6IE9wcyxcbik6IFNlcnZpY2VEZWZpbml0aW9uPFNpbXBsaWZ5PE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+PiB7XG4gIGNvbnN0IHNlcnZpY2UgPSB7XG4gICAgbmFtZSxcbiAgICBvcGVyYXRpb25zOiBtYXBLZXlWYWx1ZXMob3BlcmF0aW9ucywgKGtleSwgb3A6IFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+KSA9PiAoe1xuICAgICAgLi4ub3AsXG4gICAgICBuYW1lOiBvcC5uYW1lIHx8IGtleSxcbiAgICB9KSksXG4gIH0gYXMgU2VydmljZURlZmluaXRpb248T3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8T3BzPj47XG5cbiAgdmFsaWRhdGVTZXJ2aWNlRGVmaW5pdGlvbihzZXJ2aWNlKTtcbiAgcmV0dXJuIHNlcnZpY2U7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIG9wZXJhdGlvbiBkZWZpbml0aW9uIGFzIHBhcnQgb2YgYSBzZXJ2aWNlIGNvbnRyYWN0LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZXJhdGlvbjxJLCBPPihvcD86IE9wZXJhdGlvbk9wdGlvbnM8SSwgTz4pOiBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgcmV0dXJuIHsgLi4ub3AgfSBhcyBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgb3BlcmF0aW9ufSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uT3B0aW9uczxfSSwgX08+IHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2YgcGFydGlhbCBvcGVyYXRpb24gaGFuZGxlcnMuIElucHV0IGZvciB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCB0cmFuc2Zvcm1zIGEge0BsaW5rIFBhcnRpYWxPcGVyYXRpb25NYXB9IGludG8gYW4ge0BsaW5rIE9wZXJhdGlvbk1hcH0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxUIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBUW0tdIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPlxuICAgIDogbmV2ZXI7XG59O1xuXG4vKipcbiAqIEEgcGFydGlhbCB7QGxpbmsgT3BlcmF0aW9uRGVmaW5pdGlvbn0gdGhhdCBpcyB1c2VkIHRvIGRlZmluZSBhbiBvcGVyYXRpb24gaW4gYSB7QGxpbmsgU2VydmljZURlZmluaXRpb259LlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IGlzIHRoYXQgdGhlIG5hbWUgaXMgb3B0aW9uYWwuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpYWxPcGVyYXRpb248SSwgTz4ge1xuICBuYW1lPzogc3RyaW5nO1xuICBbaW5wdXRCcmFuZF06IEk7XG4gIFtvdXRwdXRCcmFuZF06IE87XG59XG4iLCJleHBvcnQge1xuICB0eXBlIFNlcnZpY2VEZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbklucHV0LFxuICB0eXBlIE9wZXJhdGlvbk91dHB1dCxcbiAgdHlwZSBPcGVyYXRpb25LZXksXG59IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG5leHBvcnQge1xuICBzZXJ2aWNlLFxuICBvcGVyYXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uT3B0aW9ucyxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsLFxuICB0eXBlIFBhcnRpYWxPcGVyYXRpb24sXG59IGZyb20gXCIuL2hlbHBlcnNcIjtcbiIsImV4cG9ydCBkZWNsYXJlIGNvbnN0IGlucHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBvdXRwdXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgTmV4dXMgc2VydmljZSBjb250cmFjdCwgaW5jbHVkaW5nIGl0cyBuYW1lIGFuZCBvcGVyYXRpb25zLlxuICpcbiAqIENhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IHRoZSB7QGxpbmsgc2VydmljZX0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VEZWZpbml0aW9uPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9wZXJhdGlvbnM6IE9wcztcbn1cblxuLyoqXG4gKiBBbiBvcGVyYXRpb24gY29udHJhY3QgdGhhdCBkZXNjcmliZXMgdGhlIG5hbWUsIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgY29sbGVjdGlvbiBvZiBvcGVyYXRpb25zLCBhcyBkZWZpbmVkIGJ5IGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIGlucHV0IHR5cGUgZnJvbSBhbiBvcGVyYXRpb24gaW4gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uSW5wdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBhbnk+ID8gSSA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIG91dHB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk91dHB1dDxUPiA9IFQgZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgaW5mZXIgTz4gPyBPIDogYW55O1xuXG4vKipcbiAqIEEgbWFwcGVkIHR5cGUgdGhhdCBleHRyYWN0cyBhbGwgb3BlcmF0aW9uIG5hbWVzIGZyb20gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uS2V5PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+ID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUICYgc3RyaW5nXTtcblxuLyoqXG4gKiBDb25maXJtIHRoYXQgYSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgc2VydmljZSBkZWZpbml0aW9uIHRvIHZhbGlkYXRlLlxuICpcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbiBpcyBpbnZhbGlkLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZTogU2VydmljZURlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBzZXJ2aWNlLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIXNlcnZpY2UubmFtZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZXJ2aWNlIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIik7XG4gIH1cblxuICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgb3BlcmF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlLm9wZXJhdGlvbnMpKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5uYW1lO1xuICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhb3BlcmF0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT3BlcmF0aW9uIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGZvciBwcm9wZXJ0eSAnJHtwcm9wTmFtZX0nYCk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25OYW1lcy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYER1cGxpY2F0ZSBvcGVyYXRpb24gZGVmaW5pdGlvbiBmb3IgbmFtZTogJyR7b3BlcmF0aW9uTmFtZX0nYCk7XG4gICAgfVxuICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb25OYW1lKTtcbiAgfVxufVxuIiwiLyogKGlnbm9yZWQpICovIiwiLyogKGlnbm9yZWQpICovIiwiLy8gSGVscGVycy5cbmNvbnN0IHMgPSAxMDAwO1xuY29uc3QgbSA9IHMgKiA2MDtcbmNvbnN0IGggPSBtICogNjA7XG5jb25zdCBkID0gaCAqIDI0O1xuY29uc3QgdyA9IGQgKiA3O1xuY29uc3QgeSA9IGQgKiAzNjUuMjU7XG5mdW5jdGlvbiBtcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zPy5sb25nID8gZm10TG9uZyh2YWx1ZSkgOiBmbXRTaG9ydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBpcyBub3QgYSBzdHJpbmcgb3IgbnVtYmVyLicpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGlzRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICA/IGAke2Vycm9yLm1lc3NhZ2V9LiB2YWx1ZT0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgICAgICA6ICdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG59XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy4nKTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICBjb25zdCB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3lyJzpcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHk7XG4gICAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB3O1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGQ7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hycyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGg7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIG07XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2VjJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHM7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbXNlY3MnOlxuICAgICAgICBjYXNlICdtc2VjJzpcbiAgICAgICAgY2FzZSAnbXMnOlxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ci5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHVuaXQgJHt0eXBlfSB3YXMgbWF0Y2hlZCwgYnV0IG5vIG1hdGNoaW5nIGNhc2UgZXhpc3RzLmApO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IG1zO1xuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBkKX1kYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBoKX1oYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBtKX1tYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBzKX1zYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfW1zYDtcbn1cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfSBtc2A7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgY29uc3QgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbil9ICR7bmFtZX0ke2lzUGx1cmFsID8gJ3MnIDogJyd9YDtcbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnbWVzc2FnZScgaW4gZXJyb3I7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAwOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnNcbiAqIENvcHlyaWdodCAyMDIwIERhbmllbCBXaXJ0eiAvIFRoZSBsb25nLmpzIEF1dGhvcnMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuLy8gV2ViQXNzZW1ibHkgb3B0aW1pemF0aW9ucyB0byBkbyBuYXRpdmUgaTY0IG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpZGVcbnZhciB3YXNtID0gbnVsbDtcbnRyeSB7XG4gIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UoXG4gICAgbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShcbiAgICAgIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgLy8gXFwwYXNtXG4gICAgICAgIDAsIDk3LCAxMTUsIDEwOSxcbiAgICAgICAgLy8gdmVyc2lvbiAxXG4gICAgICAgIDEsIDAsIDAsIDAsXG5cbiAgICAgICAgLy8gc2VjdGlvbiBcInR5cGVcIlxuICAgICAgICAxLCAxMywgMixcbiAgICAgICAgLy8gMCwgKCkgPT4gaTMyXG4gICAgICAgIDk2LCAwLCAxLCAxMjcsXG4gICAgICAgIC8vIDEsIChpMzIsIGkzMiwgaTMyLCBpMzIpID0+IGkzMlxuICAgICAgICA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsXG5cbiAgICAgICAgLy8gc2VjdGlvbiBcImZ1bmN0aW9uXCJcbiAgICAgICAgMywgNywgNixcbiAgICAgICAgLy8gMCwgdHlwZSAwXG4gICAgICAgIDAsXG4gICAgICAgIC8vIDEsIHR5cGUgMVxuICAgICAgICAxLFxuICAgICAgICAvLyAyLCB0eXBlIDFcbiAgICAgICAgMSxcbiAgICAgICAgLy8gMywgdHlwZSAxXG4gICAgICAgIDEsXG4gICAgICAgIC8vIDQsIHR5cGUgMVxuICAgICAgICAxLFxuICAgICAgICAvLyA1LCB0eXBlIDFcbiAgICAgICAgMSxcblxuICAgICAgICAvLyBzZWN0aW9uIFwiZ2xvYmFsXCJcbiAgICAgICAgNiwgNiwgMSxcbiAgICAgICAgLy8gMCwgXCJoaWdoXCIsIG11dGFibGUgaTMyXG4gICAgICAgIDEyNywgMSwgNjUsIDAsIDExLFxuXG4gICAgICAgIC8vIHNlY3Rpb24gXCJleHBvcnRcIlxuICAgICAgICA3LCA1MCwgNixcbiAgICAgICAgLy8gMCwgXCJtdWxcIlxuICAgICAgICAzLCAxMDksIDExNywgMTA4LCAwLCAxLFxuICAgICAgICAvLyAxLCBcImRpdl9zXCJcbiAgICAgICAgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMixcbiAgICAgICAgLy8gMiwgXCJkaXZfdVwiXG4gICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTcsIDAsIDMsXG4gICAgICAgIC8vIDMsIFwicmVtX3NcIlxuICAgICAgICA1LCAxMTQsIDEwMSwgMTA5LCA5NSwgMTE1LCAwLCA0LFxuICAgICAgICAvLyA0LCBcInJlbV91XCJcbiAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSxcbiAgICAgICAgLy8gNSwgXCJnZXRfaGlnaFwiXG4gICAgICAgIDgsIDEwMywgMTAxLCAxMTYsIDk1LCAxMDQsIDEwNSwgMTAzLCAxMDQsIDAsIDAsXG5cbiAgICAgICAgLy8gc2VjdGlvbiBcImNvZGVcIlxuICAgICAgICAxMCwgMTkxLCAxLCA2LFxuICAgICAgICAvLyAwLCBcImdldF9oaWdoXCJcbiAgICAgICAgNCwgMCwgMzUsIDAsIDExLFxuICAgICAgICAvLyAxLCBcIm11bFwiXG4gICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLFxuICAgICAgICAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNiwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCxcbiAgICAgICAgMTY3LCAxMSxcbiAgICAgICAgLy8gMiwgXCJkaXZfc1wiXG4gICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLFxuICAgICAgICAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCxcbiAgICAgICAgMTY3LCAxMSxcbiAgICAgICAgLy8gMywgXCJkaXZfdVwiXG4gICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLFxuICAgICAgICAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyOCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCxcbiAgICAgICAgMTY3LCAxMSxcbiAgICAgICAgLy8gNCwgXCJyZW1fc1wiXG4gICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLFxuICAgICAgICAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyOSwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCxcbiAgICAgICAgMTY3LCAxMSxcbiAgICAgICAgLy8gNSwgXCJyZW1fdVwiXG4gICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsIDMyLFxuICAgICAgICAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLCAzMiwgNCxcbiAgICAgICAgMTY3LCAxMSxcbiAgICAgIF0pLFxuICAgICksXG4gICAge30sXG4gICkuZXhwb3J0cztcbn0gY2F0Y2gge1xuICAvLyBubyB3YXNtIHN1cHBvcnQgOihcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciwgZ2l2ZW4gaXRzIGxvdyBhbmQgaGlnaCAzMiBiaXQgdmFsdWVzIGFzICpzaWduZWQqIGludGVnZXJzLlxuICogIFNlZSB0aGUgZnJvbSogZnVuY3Rpb25zIGJlbG93IGZvciBtb3JlIGNvbnZlbmllbnQgd2F5cyBvZiBjb25zdHJ1Y3RpbmcgTG9uZ3MuXG4gKiBAZXhwb3J0cyBMb25nXG4gKiBAY2xhc3MgQSBMb25nIGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IGxvdyBUaGUgbG93IChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBMb25nKGxvdywgaGlnaCwgdW5zaWduZWQpIHtcbiAgLyoqXG4gICAqIFRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHRoaXMubG93ID0gbG93IHwgMDtcblxuICAvKipcbiAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICB0aGlzLnVuc2lnbmVkID0gISF1bnNpZ25lZDtcbn1cblxuLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZyBpcyB0aGUgdHdvIGdpdmVuIHNpZ25lZCwgMzItYml0IHZhbHVlcy5cbi8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXG4vLyBKYXZhc2NyaXB0IHBlcmZvcm1zIGJpdC1vcGVyYXRpb25zLiAgRm9yIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbiBhbmRcbi8vIG11bHRpcGxpY2F0aW9uLCB3ZSBzcGxpdCBlYWNoIG51bWJlciBpbnRvIDE2IGJpdCBwaWVjZXMsIHdoaWNoIGNhbiBlYXNpbHkgYmVcbi8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XG4vLyBvciBjaGFuZ2UgaW4gc2lnbi5cbi8vXG4vLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXG4vLyBwb3NpdGl2ZSBjYXNlIGJ5IG5lZ2F0aW5nIHRoZSBpbnB1dChzKSBhbmQgdGhlbiBwb3N0LXByb2Nlc3NpbmcgdGhlIHJlc3VsdC5cbi8vIE5vdGUgdGhhdCB3ZSBtdXN0IEFMV0FZUyBjaGVjayBzcGVjaWFsbHkgd2hldGhlciB0aG9zZSB2YWx1ZXMgYXJlIE1JTl9WQUxVRVxuLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xuLy8gYSBwb3NpdGl2ZSBudW1iZXIsIGl0IG92ZXJmbG93cyBiYWNrIGludG8gYSBuZWdhdGl2ZSkuICBOb3QgaGFuZGxpbmcgdGhpc1xuLy8gY2FzZSB3b3VsZCBvZnRlbiByZXN1bHQgaW4gaW5maW5pdGUgcmVjdXJzaW9uLlxuLy9cbi8vIENvbW1vbiBjb25zdGFudCB2YWx1ZXMgWkVSTywgT05FLCBORUdfT05FLCBldGMuIGFyZSBkZWZpbmVkIGJlbG93IHRoZSBmcm9tKlxuLy8gbWV0aG9kcyBvbiB3aGljaCB0aGV5IGRlcGVuZC5cblxuLyoqXG4gKiBBbiBpbmRpY2F0b3IgdXNlZCB0byByZWxpYWJseSBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgTG9uZyBvciBub3QuXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqIEBjb25zdFxuICogQHByaXZhdGVcbiAqL1xuTG9uZy5wcm90b3R5cGUuX19pc0xvbmdfXztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAaW5uZXJcbiAqL1xuZnVuY3Rpb24gaXNMb25nKG9iaikge1xuICByZXR1cm4gKG9iaiAmJiBvYmpbXCJfX2lzTG9uZ19fXCJdKSA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgbnVtYmVyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGN0ejMyKHZhbHVlKSB7XG4gIHZhciBjID0gTWF0aC5jbHozMih2YWx1ZSAmIC12YWx1ZSk7XG4gIHJldHVybiB2YWx1ZSA/IDMxIC0gYyA6IGM7XG59XG5cbi8qKlxuICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nLmlzTG9uZyA9IGlzTG9uZztcblxuLyoqXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCBpbnRlZ2VyIHZhbHVlcy5cbiAqIEB0eXBlIHshT2JqZWN0fVxuICogQGlubmVyXG4gKi9cbnZhciBJTlRfQ0FDSEUgPSB7fTtcblxuLyoqXG4gKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cbiAqIEB0eXBlIHshT2JqZWN0fVxuICogQGlubmVyXG4gKi9cbnZhciBVSU5UX0NBQ0hFID0ge307XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gIHZhciBvYmosIGNhY2hlZE9iaiwgY2FjaGU7XG4gIGlmICh1bnNpZ25lZCkge1xuICAgIHZhbHVlID4+Pj0gMDtcbiAgICBpZiAoKGNhY2hlID0gMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDI1NikpIHtcbiAgICAgIGNhY2hlZE9iaiA9IFVJTlRfQ0FDSEVbdmFsdWVdO1xuICAgICAgaWYgKGNhY2hlZE9iaikgcmV0dXJuIGNhY2hlZE9iajtcbiAgICB9XG4gICAgb2JqID0gZnJvbUJpdHModmFsdWUsIDAsIHRydWUpO1xuICAgIGlmIChjYWNoZSkgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSB8PSAwO1xuICAgIGlmICgoY2FjaGUgPSAtMTI4IDw9IHZhbHVlICYmIHZhbHVlIDwgMTI4KSkge1xuICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgfVxuICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcbiAgICBpZiAoY2FjaGUpIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgMzIgYml0IGludGVnZXIgaW4gcXVlc3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21JbnQgPSBmcm9tSW50O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tTnVtYmVyKHZhbHVlLCB1bnNpZ25lZCkge1xuICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gIGlmICh1bnNpZ25lZCkge1xuICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiBVWkVSTztcbiAgICBpZiAodmFsdWUgPj0gVFdPX1BXUl82NF9EQkwpIHJldHVybiBNQVhfVU5TSUdORURfVkFMVUU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1JTl9WQUxVRTtcbiAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKSByZXR1cm4gTUFYX1ZBTFVFO1xuICB9XG4gIGlmICh2YWx1ZSA8IDApIHJldHVybiBmcm9tTnVtYmVyKC12YWx1ZSwgdW5zaWduZWQpLm5lZygpO1xuICByZXR1cm4gZnJvbUJpdHMoXG4gICAgdmFsdWUgJSBUV09fUFdSXzMyX0RCTCB8IDAsXG4gICAgKHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpIHwgMCxcbiAgICB1bnNpZ25lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIG51bWJlciBpbiBxdWVzdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0c1xuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAqIEByZXR1cm5zIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG5mdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcbiAgcmV0dXJuIG5ldyBMb25nKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXG4gKiAgYXNzdW1lZCB0byB1c2UgMzIgYml0cy5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgVGhlIGhpZ2ggMzIgYml0c1xuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbUJpdHMgPSBmcm9tQml0cztcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAaW5uZXJcbiAqL1xudmFyIHBvd19kYmwgPSBNYXRoLnBvdzsgLy8gVXNlZCA0IHRpbWVzICg0KjggdG8gMTUrNClcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeFxuICogQHJldHVybnMgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyLCB1bnNpZ25lZCwgcmFkaXgpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHRocm93IEVycm9yKFwiZW1wdHkgc3RyaW5nXCIpO1xuICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSBcIm51bWJlclwiKSB7XG4gICAgLy8gRm9yIGdvb2cubWF0aC5sb25nIGNvbXBhdGliaWxpdHlcbiAgICByYWRpeCA9IHVuc2lnbmVkO1xuICAgIHVuc2lnbmVkID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgdW5zaWduZWQgPSAhIXVuc2lnbmVkO1xuICB9XG4gIGlmIChcbiAgICBzdHIgPT09IFwiTmFOXCIgfHxcbiAgICBzdHIgPT09IFwiSW5maW5pdHlcIiB8fFxuICAgIHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fFxuICAgIHN0ciA9PT0gXCItSW5maW5pdHlcIlxuICApXG4gICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICByYWRpeCA9IHJhZGl4IHx8IDEwO1xuICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpIHRocm93IFJhbmdlRXJyb3IoXCJyYWRpeFwiKTtcblxuICB2YXIgcDtcbiAgaWYgKChwID0gc3RyLmluZGV4T2YoXCItXCIpKSA+IDApIHRocm93IEVycm9yKFwiaW50ZXJpb3IgaHlwaGVuXCIpO1xuICBlbHNlIGlmIChwID09PSAwKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcoc3RyLnN1YnN0cmluZygxKSwgdW5zaWduZWQsIHJhZGl4KS5uZWcoKTtcbiAgfVxuXG4gIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXG4gIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDgpKTtcblxuICB2YXIgcmVzdWx0ID0gWkVSTztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcbiAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLCBpICsgc2l6ZSksIHJhZGl4KTtcbiAgICBpZiAoc2l6ZSA8IDgpIHtcbiAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgc2l6ZSkpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgTG9uZ1xuICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBUaGUgcmFkaXggaW4gd2hpY2ggdGhlIHRleHQgaXMgd3JpdHRlbiAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXG4gKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcblxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICogQHJldHVybnMgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbmZ1bmN0aW9uIGZyb21WYWx1ZSh2YWwsIHVuc2lnbmVkKSB7XG4gIGlmICh0eXBlb2YgdmFsID09PSBcIm51bWJlclwiKSByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcbiAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBmcm9tU3RyaW5nKHZhbCwgdW5zaWduZWQpO1xuICAvLyBUaHJvd3MgZm9yIG5vbi1vYmplY3RzLCBjb252ZXJ0cyBub24taW5zdGFuY2VvZiBMb25nOlxuICByZXR1cm4gZnJvbUJpdHMoXG4gICAgdmFsLmxvdyxcbiAgICB2YWwuaGlnaCxcbiAgICB0eXBlb2YgdW5zaWduZWQgPT09IFwiYm9vbGVhblwiID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQsXG4gICk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKi9cbkxvbmcuZnJvbVZhbHVlID0gZnJvbVZhbHVlO1xuXG4vLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXG4vLyBubyBydW50aW1lIHBlbmFsdHkgZm9yIHRoZXNlLlxuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl8xNl9EQkwgPSAxIDw8IDE2O1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMO1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl82NF9EQkwgPSBUV09fUFdSXzMyX0RCTCAqIFRXT19QV1JfMzJfREJMO1xuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAY29uc3RcbiAqIEBpbm5lclxuICovXG52YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGNvbnN0XG4gKiBAaW5uZXJcbiAqL1xudmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTtcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIFpFUk8gPSBmcm9tSW50KDApO1xuXG4vKipcbiAqIFNpZ25lZCB6ZXJvLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLlpFUk8gPSBaRVJPO1xuXG4vKipcbiAqIEB0eXBlIHshTG9uZ31cbiAqIEBpbm5lclxuICovXG52YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpO1xuXG4vKipcbiAqIFVuc2lnbmVkIHplcm8uXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuVVpFUk8gPSBVWkVSTztcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIE9ORSA9IGZyb21JbnQoMSk7XG5cbi8qKlxuICogU2lnbmVkIG9uZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5PTkUgPSBPTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBVT05FID0gZnJvbUludCgxLCB0cnVlKTtcblxuLyoqXG4gKiBVbnNpZ25lZCBvbmUuXG4gKiBAdHlwZSB7IUxvbmd9XG4gKi9cbkxvbmcuVU9ORSA9IFVPTkU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBORUdfT05FID0gZnJvbUludCgtMSk7XG5cbi8qKlxuICogU2lnbmVkIG5lZ2F0aXZlIG9uZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5ORUdfT05FID0gTkVHX09ORTtcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIE1BWF9WQUxVRSA9IGZyb21CaXRzKDB4ZmZmZmZmZmYgfCAwLCAweDdmZmZmZmZmIHwgMCwgZmFsc2UpO1xuXG4vKipcbiAqIE1heGltdW0gc2lnbmVkIHZhbHVlLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLk1BWF9WQUxVRSA9IE1BWF9WQUxVRTtcblxuLyoqXG4gKiBAdHlwZSB7IUxvbmd9XG4gKiBAaW5uZXJcbiAqL1xudmFyIE1BWF9VTlNJR05FRF9WQUxVRSA9IGZyb21CaXRzKDB4ZmZmZmZmZmYgfCAwLCAweGZmZmZmZmZmIHwgMCwgdHJ1ZSk7XG5cbi8qKlxuICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cbiAqIEB0eXBlIHshTG9uZ31cbiAqL1xuTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XG5cbi8qKlxuICogQHR5cGUgeyFMb25nfVxuICogQGlubmVyXG4gKi9cbnZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwIHwgMCwgZmFsc2UpO1xuXG4vKipcbiAqIE1pbmltdW0gc2lnbmVkIHZhbHVlLlxuICogQHR5cGUgeyFMb25nfVxuICovXG5Mb25nLk1JTl9WQUxVRSA9IE1JTl9WQUxVRTtcblxuLyoqXG4gKiBAYWxpYXMgTG9uZy5wcm90b3R5cGVcbiAqIEBpbm5lclxuICovXG52YXIgTG9uZ1Byb3RvdHlwZSA9IExvbmcucHJvdG90eXBlO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgMzIgYml0IGludGVnZXIsIGFzc3VtaW5nIGl0IGlzIGEgMzIgYml0IGludGVnZXIuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb24gdG9JbnQoKSB7XG4gIHJldHVybiB0aGlzLnVuc2lnbmVkID8gdGhpcy5sb3cgPj4+IDAgOiB0aGlzLmxvdztcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIExvbmcgdG8gYSB0aGUgbmVhcmVzdCBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlIChkb3VibGUsIDUzIGJpdCBtYW50aXNzYSkuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gIGlmICh0aGlzLnVuc2lnbmVkKVxuICAgIHJldHVybiAodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTtcbiAgcmV0dXJuIHRoaXMuaGlnaCAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIExvbmcgdG8gYSBzdHJpbmcgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIHJhZGl4LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogQG92ZXJyaWRlXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxuICovXG5Mb25nUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcocmFkaXgpIHtcbiAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG4gIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gXCIwXCI7XG4gIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBMb25nIHZhbHVlIGJlZm9yZSBpdCBjYW4gYmUgbmVnYXRlZCwgc28gd2UgcmVtb3ZlXG4gICAgICAvLyB0aGUgYm90dG9tLW1vc3QgZGlnaXQgaW4gdGhpcyBiYXNlIGFuZCB0aGVuIHJlY3Vyc2UgdG8gZG8gdGhlIHJlc3QuXG4gICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXG4gICAgICAgIGRpdiA9IHRoaXMuZGl2KHJhZGl4TG9uZyksXG4gICAgICAgIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpO1xuICAgICAgcmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkgKyByZW0xLnRvSW50KCkudG9TdHJpbmcocmFkaXgpO1xuICAgIH0gZWxzZSByZXR1cm4gXCItXCIgKyB0aGlzLm5lZygpLnRvU3RyaW5nKHJhZGl4KTtcbiAgfVxuXG4gIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXG4gIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDYpLCB0aGlzLnVuc2lnbmVkKSxcbiAgICByZW0gPSB0aGlzO1xuICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLFxuICAgICAgaW50dmFsID0gcmVtLnN1YihyZW1EaXYubXVsKHJhZGl4VG9Qb3dlcikpLnRvSW50KCkgPj4+IDAsXG4gICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xuICAgIHJlbSA9IHJlbURpdjtcbiAgICBpZiAocmVtLmlzWmVybygpKSByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xuICAgIGVsc2Uge1xuICAgICAgd2hpbGUgKGRpZ2l0cy5sZW5ndGggPCA2KSBkaWdpdHMgPSBcIjBcIiArIGRpZ2l0cztcbiAgICAgIHJlc3VsdCA9IFwiXCIgKyBkaWdpdHMgKyByZXN1bHQ7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xuICovXG5Mb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHMoKSB7XG4gIHJldHVybiB0aGlzLmhpZ2g7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXG4gKi9cbkxvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzVW5zaWduZWQoKSB7XG4gIHJldHVybiB0aGlzLmhpZ2ggPj4+IDA7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzID0gZnVuY3Rpb24gZ2V0TG93Qml0cygpIHtcbiAgcmV0dXJuIHRoaXMubG93O1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRMb3dCaXRzVW5zaWduZWQoKSB7XG4gIHJldHVybiB0aGlzLmxvdyA+Pj4gMDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZXROdW1CaXRzQWJzID0gZnVuY3Rpb24gZ2V0TnVtQml0c0FicygpIHtcbiAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKVxuICAgIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xuICB2YXIgdmFsID0gdGhpcy5oaWdoICE9IDAgPyB0aGlzLmhpZ2ggOiB0aGlzLmxvdztcbiAgZm9yICh2YXIgYml0ID0gMzE7IGJpdCA+IDA7IGJpdC0tKSBpZiAoKHZhbCAmICgxIDw8IGJpdCkpICE9IDApIGJyZWFrO1xuICByZXR1cm4gdGhpcy5oaWdoICE9IDAgPyBiaXQgKyAzMyA6IGJpdCArIDE7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZyBjYW4gYmUgc2FmZWx5IHJlcHJlc2VudGVkIGFzIGEgSmF2YVNjcmlwdCBudW1iZXIuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc1NhZmVJbnRlZ2VyID0gZnVuY3Rpb24gaXNTYWZlSW50ZWdlcigpIHtcbiAgLy8gMl41My0xIGlzIHRoZSBtYXhpbXVtIHNhZmUgdmFsdWVcbiAgdmFyIHRvcDExQml0cyA9IHRoaXMuaGlnaCA+PiAyMTtcbiAgLy8gWzAsIDJeNTMtMV1cbiAgaWYgKCF0b3AxMUJpdHMpIHJldHVybiB0cnVlO1xuICAvLyA+IDJeNTMtMVxuICBpZiAodGhpcy51bnNpZ25lZCkgcmV0dXJuIGZhbHNlO1xuICAvLyBbLTJeNTMsIC0xXSBleGNlcHQgLTJeNTNcbiAgcmV0dXJuIHRvcDExQml0cyA9PT0gLTEgJiYgISh0aGlzLmxvdyA9PT0gMCAmJiB0aGlzLmhpZ2ggPT09IC0weDIwMDAwMCk7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvKCkge1xuICByZXR1cm4gdGhpcy5oaWdoID09PSAwICYmIHRoaXMubG93ID09PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNpc1plcm99LlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZXF6ID0gTG9uZ1Byb3RvdHlwZS5pc1plcm87XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbmVnYXRpdmUuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc05lZ2F0aXZlID0gZnVuY3Rpb24gaXNOZWdhdGl2ZSgpIHtcbiAgcmV0dXJuICF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA8IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIHBvc2l0aXZlIG9yIHplcm8uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5pc1Bvc2l0aXZlID0gZnVuY3Rpb24gaXNQb3NpdGl2ZSgpIHtcbiAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG9kZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7XG4gIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZXZlbi5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbigpIHtcbiAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgaWYgKFxuICAgIHRoaXMudW5zaWduZWQgIT09IG90aGVyLnVuc2lnbmVkICYmXG4gICAgdGhpcy5oaWdoID4+PiAzMSA9PT0gMSAmJlxuICAgIG90aGVyLmhpZ2ggPj4+IDMxID09PSAxXG4gIClcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0aGlzLmhpZ2ggPT09IG90aGVyLmhpZ2ggJiYgdGhpcy5sb3cgPT09IG90aGVyLmxvdztcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLm5vdEVxdWFscyA9IGZ1bmN0aW9uIG5vdEVxdWFscyhvdGhlcikge1xuICByZXR1cm4gIXRoaXMuZXEoLyogdmFsaWRhdGVzICovIG90aGVyKTtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNub3RFcXVhbHN9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubmVxID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNub3RFcXVhbHN9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUubmUgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmxlc3NUaGFuID0gZnVuY3Rpb24gbGVzc1RoYW4ob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcbn07XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbn0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sdCA9IExvbmdQcm90b3R5cGUubGVzc1RoYW47XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDw9IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5Mb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XG5cbi8qKlxuICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+IDA7XG59O1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW59LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3QgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuO1xuXG4vKipcbiAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbkxvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsID0gZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xufTtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5ndGUgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuLyoqXG4gKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5nZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xuXG4vKipcbiAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcbiAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgaWYgKHRoaXMuZXEob3RoZXIpKSByZXR1cm4gMDtcbiAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcbiAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcbiAgaWYgKHRoaXNOZWcgJiYgIW90aGVyTmVnKSByZXR1cm4gLTE7XG4gIGlmICghdGhpc05lZyAmJiBvdGhlck5lZykgcmV0dXJuIDE7XG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNpZ24gYml0cyBhcmUgdGhlIHNhbWVcbiAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcy5zdWIob3RoZXIpLmlzTmVnYXRpdmUoKSA/IC0xIDogMTtcbiAgLy8gQm90aCBhcmUgcG9zaXRpdmUgaWYgYXQgbGVhc3Qgb25lIGlzIHVuc2lnbmVkXG4gIHJldHVybiBvdGhlci5oaWdoID4+PiAwID4gdGhpcy5oaWdoID4+PiAwIHx8XG4gICAgKG90aGVyLmhpZ2ggPT09IHRoaXMuaGlnaCAmJiBvdGhlci5sb3cgPj4+IDAgPiB0aGlzLmxvdyA+Pj4gMClcbiAgICA/IC0xXG4gICAgOiAxO1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb21wYXJlfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcbiAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE1JTl9WQUxVRTtcbiAgcmV0dXJuIHRoaXMubm90KCkuYWRkKE9ORSk7XG59O1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cbiAqIEBmdW5jdGlvblxuICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5uZWcgPSBMb25nUHJvdG90eXBlLm5lZ2F0ZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gYWRkZW5kIEFkZGVuZFxuICogQHJldHVybnMgeyFMb25nfSBTdW1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XG4gIGlmICghaXNMb25nKGFkZGVuZCkpIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xuXG4gIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxuXG4gIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xuICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhmZmZmO1xuICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xuICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweGZmZmY7XG5cbiAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcbiAgdmFyIGIzMiA9IGFkZGVuZC5oaWdoICYgMHhmZmZmO1xuICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7XG4gIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhmZmZmO1xuXG4gIHZhciBjNDggPSAwLFxuICAgIGMzMiA9IDAsXG4gICAgYzE2ID0gMCxcbiAgICBjMDAgPSAwO1xuICBjMDAgKz0gYTAwICsgYjAwO1xuICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgYzAwICY9IDB4ZmZmZjtcbiAgYzE2ICs9IGExNiArIGIxNjtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweGZmZmY7XG4gIGMzMiArPSBhMzIgKyBiMzI7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhmZmZmO1xuICBjNDggKz0gYTQ4ICsgYjQ4O1xuICBjNDggJj0gMHhmZmZmO1xuICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxuICovXG5Mb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xuICBpZiAoIWlzTG9uZyhzdWJ0cmFoZW5kKSkgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcbiAgcmV0dXJuIHRoaXMuYWRkKHN1YnRyYWhlbmQubmVnKCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxuICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gKi9cbkxvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XG4gKi9cbkxvbmdQcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiBtdWx0aXBseShtdWx0aXBsaWVyKSB7XG4gIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gdGhpcztcbiAgaWYgKCFpc0xvbmcobXVsdGlwbGllcikpIG11bHRpcGxpZXIgPSBmcm9tVmFsdWUobXVsdGlwbGllcik7XG5cbiAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gIGlmICh3YXNtKSB7XG4gICAgdmFyIGxvdyA9IHdhc21bXCJtdWxcIl0odGhpcy5sb3csIHRoaXMuaGlnaCwgbXVsdGlwbGllci5sb3csIG11bHRpcGxpZXIuaGlnaCk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICB9XG5cbiAgaWYgKG11bHRpcGxpZXIuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSByZXR1cm4gbXVsdGlwbGllci5pc09kZCgpID8gTUlOX1ZBTFVFIDogWkVSTztcbiAgaWYgKG11bHRpcGxpZXIuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG5cbiAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllci5uZWcoKSk7XG4gICAgZWxzZSByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllcikubmVnKCk7XG4gIH0gZWxzZSBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm11bChtdWx0aXBsaWVyLm5lZygpKS5uZWcoKTtcblxuICAvLyBJZiBib3RoIGxvbmdzIGFyZSBzbWFsbCwgdXNlIGZsb2F0IG11bHRpcGxpY2F0aW9uXG4gIGlmICh0aGlzLmx0KFRXT19QV1JfMjQpICYmIG11bHRpcGxpZXIubHQoVFdPX1BXUl8yNCkpXG4gICAgcmV0dXJuIGZyb21OdW1iZXIodGhpcy50b051bWJlcigpICogbXVsdGlwbGllci50b051bWJlcigpLCB0aGlzLnVuc2lnbmVkKTtcblxuICAvLyBEaXZpZGUgZWFjaCBsb25nIGludG8gNCBjaHVua3Mgb2YgMTYgYml0cywgYW5kIHRoZW4gYWRkIHVwIDR4NCBwcm9kdWN0cy5cbiAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cblxuICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuXG4gIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xuICB2YXIgYjMyID0gbXVsdGlwbGllci5oaWdoICYgMHhmZmZmO1xuICB2YXIgYjE2ID0gbXVsdGlwbGllci5sb3cgPj4+IDE2O1xuICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweGZmZmY7XG5cbiAgdmFyIGM0OCA9IDAsXG4gICAgYzMyID0gMCxcbiAgICBjMTYgPSAwLFxuICAgIGMwMCA9IDA7XG4gIGMwMCArPSBhMDAgKiBiMDA7XG4gIGMxNiArPSBjMDAgPj4+IDE2O1xuICBjMDAgJj0gMHhmZmZmO1xuICBjMTYgKz0gYTE2ICogYjAwO1xuICBjMzIgKz0gYzE2ID4+PiAxNjtcbiAgYzE2ICY9IDB4ZmZmZjtcbiAgYzE2ICs9IGEwMCAqIGIxNjtcbiAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gIGMxNiAmPSAweGZmZmY7XG4gIGMzMiArPSBhMzIgKiBiMDA7XG4gIGM0OCArPSBjMzIgPj4+IDE2O1xuICBjMzIgJj0gMHhmZmZmO1xuICBjMzIgKz0gYTE2ICogYjE2O1xuICBjNDggKz0gYzMyID4+PiAxNjtcbiAgYzMyICY9IDB4ZmZmZjtcbiAgYzMyICs9IGEwMCAqIGIzMjtcbiAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gIGMzMiAmPSAweGZmZmY7XG4gIGM0OCArPSBhNDggKiBiMDAgKyBhMzIgKiBiMTYgKyBhMTYgKiBiMzIgKyBhMDAgKiBiNDg7XG4gIGM0OCAmPSAweGZmZmY7XG4gIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtdWx0aXBseX0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XG4gKi9cbkxvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoZSByZXN1bHQgaXMgc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyBzaWduZWQgb3JcbiAqICB1bnNpZ25lZCBpZiB0aGlzIExvbmcgaXMgdW5zaWduZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAqL1xuTG9uZ1Byb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiBkaXZpZGUoZGl2aXNvcikge1xuICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcbiAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpIHRocm93IEVycm9yKFwiZGl2aXNpb24gYnkgemVyb1wiKTtcblxuICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgaWYgKHdhc20pIHtcbiAgICAvLyBndWFyZCBhZ2FpbnN0IHNpZ25lZCBkaXZpc2lvbiBvdmVyZmxvdzogdGhlIGxhcmdlc3RcbiAgICAvLyBuZWdhdGl2ZSBudW1iZXIgLyAtMSB3b3VsZCBiZSAxIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0XG4gICAgLy8gcG9zaXRpdmUgbnVtYmVyLCBkdWUgdG8gdHdvJ3MgY29tcGxlbWVudC5cbiAgICBpZiAoXG4gICAgICAhdGhpcy51bnNpZ25lZCAmJlxuICAgICAgdGhpcy5oaWdoID09PSAtMHg4MDAwMDAwMCAmJlxuICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmXG4gICAgICBkaXZpc29yLmhpZ2ggPT09IC0xXG4gICAgKSB7XG4gICAgICAvLyBiZSBjb25zaXN0ZW50IHdpdGggbm9uLXdhc20gY29kZSBwYXRoXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbVtcImRpdl91XCJdIDogd2FzbVtcImRpdl9zXCJdKShcbiAgICAgIHRoaXMubG93LFxuICAgICAgdGhpcy5oaWdoLFxuICAgICAgZGl2aXNvci5sb3csXG4gICAgICBkaXZpc29yLmhpZ2gsXG4gICAgKTtcbiAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtW1wiZ2V0X2hpZ2hcIl0oKSwgdGhpcy51bnNpZ25lZCk7XG4gIH1cblxuICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gIHZhciBhcHByb3gsIHJlbSwgcmVzO1xuICBpZiAoIXRoaXMudW5zaWduZWQpIHtcbiAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXG4gICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXG4gICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xuICAgICAgaWYgKGRpdmlzb3IuZXEoT05FKSB8fCBkaXZpc29yLmVxKE5FR19PTkUpKVxuICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAvLyByZWNhbGwgdGhhdCAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRVxuICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKSByZXR1cm4gT05FO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgfG90aGVyfCA+PSAyLCBzbyB8dGhpcy9vdGhlcnwgPCB8TUlOX1ZBTFVFfC5cbiAgICAgICAgdmFyIGhhbGZUaGlzID0gdGhpcy5zaHIoMSk7XG4gICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XG4gICAgICAgIGlmIChhcHByb3guZXEoWkVSTykpIHtcbiAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUgOiBORUdfT05FO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpO1xuICAgICAgICAgIHJlcyA9IGFwcHJveC5hZGQocmVtLmRpdihkaXZpc29yKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IubmVnKCkpO1xuICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IpLm5lZygpO1xuICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLmRpdihkaXZpc29yLm5lZygpKS5uZWcoKTtcbiAgICByZXMgPSBaRVJPO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgaGFzIG5vdCBiZWVuIG1hZGUgZm9yIHVuc2lnbmVkIGxvbmdzLiBJdCdzIHRoZXJlZm9yZVxuICAgIC8vIHJlcXVpcmVkIHRvIHRha2Ugc3BlY2lhbCBjYXJlIG9mIHRoZSBNU0IgcHJpb3IgdG8gcnVubmluZyBpdC5cbiAgICBpZiAoIWRpdmlzb3IudW5zaWduZWQpIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTtcbiAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSkgcmV0dXJuIFVaRVJPO1xuICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpXG4gICAgICAvLyAxNSA+Pj4gMSA9IDcgOyB3aXRoIGRpdmlzb3IgPSA4IDsgdHJ1ZVxuICAgICAgcmV0dXJuIFVPTkU7XG4gICAgcmVzID0gVVpFUk87XG4gIH1cblxuICAvLyBSZXBlYXQgdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgcmVtYWluZGVyIGlzIGxlc3MgdGhhbiBvdGhlcjogIGZpbmQgYVxuICAvLyBmbG9hdGluZy1wb2ludCB0aGF0IGFwcHJveGltYXRlcyByZW1haW5kZXIgLyBvdGhlciAqZnJvbSBiZWxvdyosIGFkZCB0aGlzXG4gIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcbiAgLy8gdGhlIGFwcHJveGltYXRlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVhbCB2YWx1ZSBzbyB0aGF0IHRoZVxuICAvLyByZW1haW5kZXIgbmV2ZXIgYmVjb21lcyBuZWdhdGl2ZS5cbiAgcmVtID0gdGhpcztcbiAgd2hpbGUgKHJlbS5ndGUoZGl2aXNvcikpIHtcbiAgICAvLyBBcHByb3hpbWF0ZSB0aGUgcmVzdWx0IG9mIGRpdmlzaW9uLiBUaGlzIG1heSBiZSBhIGxpdHRsZSBncmVhdGVyIG9yXG4gICAgLy8gc21hbGxlciB0aGFuIHRoZSBhY3R1YWwgdmFsdWUuXG4gICAgYXBwcm94ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyZW0udG9OdW1iZXIoKSAvIGRpdmlzb3IudG9OdW1iZXIoKSkpO1xuXG4gICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxuICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cbiAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxuICAgICAgZGVsdGEgPSBsb2cyIDw9IDQ4ID8gMSA6IHBvd19kYmwoMiwgbG9nMiAtIDQ4KSxcbiAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxuICAgICAgLy8gdGhhdCBpZiBpdCBpcyB0b28gbGFyZ2UsIHRoZSBwcm9kdWN0IG92ZXJmbG93cyBhbmQgaXMgbmVnYXRpdmUuXG4gICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXG4gICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xuICAgIHdoaWxlIChhcHByb3hSZW0uaXNOZWdhdGl2ZSgpIHx8IGFwcHJveFJlbS5ndChyZW0pKSB7XG4gICAgICBhcHByb3ggLT0gZGVsdGE7XG4gICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XG4gICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xuICAgIH1cblxuICAgIC8vIFdlIGtub3cgdGhlIGFuc3dlciBjYW4ndCBiZSB6ZXJvLi4uIGFuZCBhY3R1YWxseSwgemVybyB3b3VsZCBjYXVzZVxuICAgIC8vIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB3ZSB3b3VsZCBtYWtlIG5vIHByb2dyZXNzLlxuICAgIGlmIChhcHByb3hSZXMuaXNaZXJvKCkpIGFwcHJveFJlcyA9IE9ORTtcblxuICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcbiAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2RpdmlkZX0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxuICovXG5Mb25nUHJvdG90eXBlLmRpdiA9IExvbmdQcm90b3R5cGUuZGl2aWRlO1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICovXG5Mb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7XG4gIGlmICghaXNMb25nKGRpdmlzb3IpKSBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xuXG4gIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICBpZiAod2FzbSkge1xuICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJyZW1fdVwiXSA6IHdhc21bXCJyZW1fc1wiXSkoXG4gICAgICB0aGlzLmxvdyxcbiAgICAgIHRoaXMuaGlnaCxcbiAgICAgIGRpdmlzb3IubG93LFxuICAgICAgZGl2aXNvci5oaWdoLFxuICAgICk7XG4gICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI21vZHVsb30uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAqL1xuTG9uZ1Byb3RvdHlwZS5tb2QgPSBMb25nUHJvdG90eXBlLm1vZHVsbztcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gKi9cbkxvbmdQcm90b3R5cGUucmVtID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYml0d2lzZSBOT1Qgb2YgdGhpcyBMb25nLlxuICogQHRoaXMgeyFMb25nfVxuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uIG5vdCgpIHtcbiAgcmV0dXJuIGZyb21CaXRzKH50aGlzLmxvdywgfnRoaXMuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcyBvZiB0aGlzIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IW51bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5jb3VudExlYWRpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50TGVhZGluZ1plcm9zKCkge1xuICByZXR1cm4gdGhpcy5oaWdoID8gTWF0aC5jbHozMih0aGlzLmhpZ2gpIDogTWF0aC5jbHozMih0aGlzLmxvdykgKyAzMjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBjb3VudCBsZWFkaW5nIHplcm9zLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvdW50TGVhZGluZ1plcm9zfS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHshTG9uZ31cbiAqIEByZXR1cm5zIHshbnVtYmVyfVxuICovXG5Mb25nUHJvdG90eXBlLmNseiA9IExvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3M7XG5cbi8qKlxuICogUmV0dXJucyBjb3VudCB0cmFpbGluZyB6ZXJvcyBvZiB0aGlzIExvbmcuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IW51bWJlcn1cbiAqL1xuTG9uZ1Byb3RvdHlwZS5jb3VudFRyYWlsaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudFRyYWlsaW5nWmVyb3MoKSB7XG4gIHJldHVybiB0aGlzLmxvdyA/IGN0ejMyKHRoaXMubG93KSA6IGN0ejMyKHRoaXMuaGlnaCkgKyAzMjtcbn07XG5cbi8qKlxuICogUmV0dXJucyBjb3VudCB0cmFpbGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudFRyYWlsaW5nWmVyb3N9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geyFMb25nfVxuICogQHJldHVybnMgeyFudW1iZXJ9XG4gKi9cbkxvbmdQcm90b3R5cGUuY3R6ID0gTG9uZ1Byb3RvdHlwZS5jb3VudFRyYWlsaW5nWmVyb3M7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYml0d2lzZSBBTkQgb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93ICYgb3RoZXIubG93LCB0aGlzLmhpZ2ggJiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXG4gKiBAcmV0dXJucyB7IUxvbmd9XG4gKi9cbkxvbmdQcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvcihvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IHwgb3RoZXIubG93LCB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYml0d2lzZSBYT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgZ2l2ZW4gb25lLlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICogQHJldHVybnMgeyFMb25nfVxuICovXG5Mb25nUHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvcihvdGhlcikge1xuICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93IF4gb3RoZXIubG93LCB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uIHNoaWZ0TGVmdChudW1CaXRzKSB7XG4gIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICBlbHNlIGlmIChudW1CaXRzIDwgMzIpXG4gICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgdGhpcy5sb3cgPDwgbnVtQml0cyxcbiAgICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgZWxzZSByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0TGVmdH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykge1xuICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgIHRoaXMuaGlnaCA+PiBudW1CaXRzLFxuICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICApO1xuICBlbHNlXG4gICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgdGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLFxuICAgICAgdGhpcy5oaWdoID49IDAgPyAwIDogLTEsXG4gICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICogQHRoaXMgeyFMb25nfVxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHtcbiAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChudW1CaXRzIDwgMzIpXG4gICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLFxuICAgICAgdGhpcy5oaWdoID4+PiBudW1CaXRzLFxuICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICApO1xuICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xuICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+PiAobnVtQml0cyAtIDMyKSwgMCwgdGhpcy51bnNpZ25lZCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5zaHJ1ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHRVbnNpZ25lZH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnJvdGF0ZUxlZnQgPSBmdW5jdGlvbiByb3RhdGVMZWZ0KG51bUJpdHMpIHtcbiAgdmFyIGI7XG4gIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTtcbiAgaWYgKG51bUJpdHMgPCAzMikge1xuICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYiksXG4gICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiBiKSxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgfVxuICBudW1CaXRzIC09IDMyO1xuICBiID0gMzIgLSBudW1CaXRzO1xuICByZXR1cm4gZnJvbUJpdHMoXG4gICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYiksXG4gICAgdGhpcy51bnNpZ25lZCxcbiAgKTtcbn07XG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjcm90YXRlTGVmdH0uXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICovXG5Mb25nUHJvdG90eXBlLnJvdGwgPSBMb25nUHJvdG90eXBlLnJvdGF0ZUxlZnQ7XG5cbi8qKlxuICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS5yb3RhdGVSaWdodCA9IGZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KG51bUJpdHMpIHtcbiAgdmFyIGI7XG4gIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTtcbiAgaWYgKG51bUJpdHMgPCAzMikge1xuICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgKHRoaXMuaGlnaCA8PCBiKSB8ICh0aGlzLmxvdyA+Pj4gbnVtQml0cyksXG4gICAgICAodGhpcy5sb3cgPDwgYikgfCAodGhpcy5oaWdoID4+PiBudW1CaXRzKSxcbiAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgKTtcbiAgfVxuICBudW1CaXRzIC09IDMyO1xuICBiID0gMzIgLSBudW1CaXRzO1xuICByZXR1cm4gZnJvbUJpdHMoXG4gICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgKHRoaXMuaGlnaCA8PCBiKSB8ICh0aGlzLmxvdyA+Pj4gbnVtQml0cyksXG4gICAgdGhpcy51bnNpZ25lZCxcbiAgKTtcbn07XG4vKipcbiAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZVJpZ2h0fS5cbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gKi9cbkxvbmdQcm90b3R5cGUucm90ciA9IExvbmdQcm90b3R5cGUucm90YXRlUmlnaHQ7XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshTG9uZ30gU2lnbmVkIGxvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xuICBpZiAoIXRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzO1xuICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUxvbmd9IFVuc2lnbmVkIGxvbmdcbiAqL1xuTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcbiAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzO1xuICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkge1xuICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAdGhpcyB7IUxvbmd9XG4gKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqL1xuTG9uZ1Byb3RvdHlwZS50b0J5dGVzTEUgPSBmdW5jdGlvbiB0b0J5dGVzTEUoKSB7XG4gIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICBsbyA9IHRoaXMubG93O1xuICByZXR1cm4gW1xuICAgIGxvICYgMHhmZixcbiAgICAobG8gPj4+IDgpICYgMHhmZixcbiAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgbG8gPj4+IDI0LFxuICAgIGhpICYgMHhmZixcbiAgICAoaGkgPj4+IDgpICYgMHhmZixcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgaGkgPj4+IDI0LFxuICBdO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEB0aGlzIHshTG9uZ31cbiAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICovXG5Mb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcbiAgdmFyIGhpID0gdGhpcy5oaWdoLFxuICAgIGxvID0gdGhpcy5sb3c7XG4gIHJldHVybiBbXG4gICAgaGkgPj4+IDI0LFxuICAgIChoaSA+Pj4gMTYpICYgMHhmZixcbiAgICAoaGkgPj4+IDgpICYgMHhmZixcbiAgICBoaSAmIDB4ZmYsXG4gICAgbG8gPj4+IDI0LFxuICAgIChsbyA+Pj4gMTYpICYgMHhmZixcbiAgICAobG8gPj4+IDgpICYgMHhmZixcbiAgICBsbyAmIDB4ZmYsXG4gIF07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQnl0ZSByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxuICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAqL1xuTG9uZy5mcm9tQnl0ZXMgPSBmdW5jdGlvbiBmcm9tQnl0ZXMoYnl0ZXMsIHVuc2lnbmVkLCBsZSkge1xuICByZXR1cm4gbGVcbiAgICA/IExvbmcuZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKVxuICAgIDogTG9uZy5mcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICovXG5Mb25nLmZyb21CeXRlc0xFID0gZnVuY3Rpb24gZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gIHJldHVybiBuZXcgTG9uZyhcbiAgICBieXRlc1swXSB8IChieXRlc1sxXSA8PCA4KSB8IChieXRlc1syXSA8PCAxNikgfCAoYnl0ZXNbM10gPDwgMjQpLFxuICAgIGJ5dGVzWzRdIHwgKGJ5dGVzWzVdIDw8IDgpIHwgKGJ5dGVzWzZdIDw8IDE2KSB8IChieXRlc1s3XSA8PCAyNCksXG4gICAgdW5zaWduZWQsXG4gICk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gKi9cbkxvbmcuZnJvbUJ5dGVzQkUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpIHtcbiAgcmV0dXJuIG5ldyBMb25nKFxuICAgIChieXRlc1s0XSA8PCAyNCkgfCAoYnl0ZXNbNV0gPDwgMTYpIHwgKGJ5dGVzWzZdIDw8IDgpIHwgYnl0ZXNbN10sXG4gICAgKGJ5dGVzWzBdIDw8IDI0KSB8IChieXRlc1sxXSA8PCAxNikgfCAoYnl0ZXNbMl0gPDwgOCkgfCBieXRlc1szXSxcbiAgICB1bnNpZ25lZCxcbiAgKTtcbn07XG5cbi8vIFN1cHBvcnQgY29udmVyc2lvbiB0by9mcm9tIEJpZ0ludCB3aGVyZSBhdmFpbGFibGVcbmlmICh0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYmlnIGludGVnZXIuXG4gICAqIEBmdW5jdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIGJpZyBpbnRlZ2VyIHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAqL1xuICBMb25nLmZyb21CaWdJbnQgPSBmdW5jdGlvbiBmcm9tQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgIHZhciBsb3dCaXRzID0gTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsIHZhbHVlKSk7XG4gICAgdmFyIGhpZ2hCaXRzID0gTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsIHZhbHVlID4+IEJpZ0ludCgzMikpKTtcbiAgICByZXR1cm4gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTtcbiAgfTtcblxuICAvLyBPdmVycmlkZVxuICBMb25nLmZyb21WYWx1ZSA9IGZ1bmN0aW9uIGZyb21WYWx1ZVdpdGhCaWdJbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIExvbmcuZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpO1xuICAgIHJldHVybiBmcm9tVmFsdWUodmFsdWUsIHVuc2lnbmVkKTtcbiAgfTtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIExvbmcgdG8gaXRzIGJpZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAdGhpcyB7IUxvbmd9XG4gICAqIEByZXR1cm5zIHtiaWdpbnR9XG4gICAqL1xuICBMb25nUHJvdG90eXBlLnRvQmlnSW50ID0gZnVuY3Rpb24gdG9CaWdJbnQoKSB7XG4gICAgdmFyIGxvd0JpZ0ludCA9IEJpZ0ludCh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgdmFyIGhpZ2hCaWdJbnQgPSBCaWdJbnQodGhpcy51bnNpZ25lZCA/IHRoaXMuaGlnaCA+Pj4gMCA6IHRoaXMuaGlnaCk7XG4gICAgcmV0dXJuIChoaWdoQmlnSW50IDw8IEJpZ0ludCgzMikpIHwgbG93QmlnSW50O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBMb25nO1xuIiwiZXhwb3J0IHtwcnVuZVVuY2xhaW1lZFNlbnRyeUluc3RhbGxhdGlvbnNDcm9ufSBmcm9tICcuL3BydW5lLXVuY2xhaW1lZC1pbnN0YWxsYXRpb25zLWNyb24uanMnO1xuIiwiaW1wb3J0IHtsb2csIHByb3h5QWN0aXZpdGllc30gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUge2NyZWF0ZVNlbnRyeU1haW50ZW5hbmNlQWN0aXZpdGllc30gZnJvbSAnLi4vYWN0aXZpdGllcy9pbmRleC5qcyc7XG5cbmNvbnN0IHtwcnVuZVVuY2xhaW1lZFNlbnRyeUluc3RhbGxhdGlvbnNBY3Rpdml0eX0gPSBwcm94eUFjdGl2aXRpZXM8XG4gIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVNlbnRyeU1haW50ZW5hbmNlQWN0aXZpdGllcz5cbj4oe1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnNSBtaW51dGVzJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJ1bmVVbmNsYWltZWRTZW50cnlJbnN0YWxsYXRpb25zQ3JvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge3JlbGVhc2VkUGVuZGluZywgdG9tYnN0b25lZH0gPSBhd2FpdCBwcnVuZVVuY2xhaW1lZFNlbnRyeUluc3RhbGxhdGlvbnNBY3Rpdml0eSgpO1xuICBpZiAocmVsZWFzZWRQZW5kaW5nID4gMCkge1xuICAgIGxvZy5pbmZvKCdSZWxlYXNlZCBzdGFsZSBwZW5kaW5nIFNlbnRyeSBpbnN0YWxsYXRpb24gY2xhaW1zJywge3JlbGVhc2VkUGVuZGluZ30pO1xuICB9XG4gIGlmICh0b21ic3RvbmVkID4gMCkge1xuICAgIGxvZy5pbmZvKCdUb21ic3RvbmVkIHN0YWxlIHVuY2xhaW1lZCBTZW50cnkgaW5zdGFsbGF0aW9ucycsIHt0b21ic3RvbmVkfSk7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJcbmNvbnN0IGFwaSA9IHJlcXVpcmUoJ0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYi93b3JrZXItaW50ZXJmYWNlLmpzJyk7XG5leHBvcnRzLmFwaSA9IGFwaTtcblxuY29uc3QgeyBvdmVycmlkZUdsb2JhbHMgfSA9IHJlcXVpcmUoJ0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYi9nbG9iYWwtb3ZlcnJpZGVzLmpzJyk7XG5vdmVycmlkZUdsb2JhbHMoKTtcblxuZXhwb3J0cy5wcmVsb2FkTW9kdWxlcyA9IGZ1bmN0aW9uIHByZWxvYWRNb2R1bGVzKCkge1xuXG59XG5cbmV4cG9ydHMuaW1wb3J0V29ya2Zsb3dzID0gZnVuY3Rpb24gaW1wb3J0V29ya2Zsb3dzKCkge1xuICByZXR1cm4gcmVxdWlyZSgvKiB3ZWJwYWNrTW9kZTogXCJlYWdlclwiICovIFwiL2hvbWUvcnVubmVyL3dvcmsvc2hpcGZveC9zaGlwZm94L2xpYnMvYXBpL2ludGVncmF0aW9uL3NlbnRyeS9kaXN0L3RlbXBvcmFsL3dvcmtmbG93cy9pbmRleC5qc1wiKTtcbn1cblxuZXhwb3J0cy5pbXBvcnRJbnRlcmNlcHRvcnMgPSBmdW5jdGlvbiBpbXBvcnRJbnRlcmNlcHRvcnMoKSB7XG4gIHJldHVybiBbXG4gICAgXG4gIF07XG59XG4iXSwibmFtZXMiOlsicHJ1bmVVbmNsYWltZWRTZW50cnlJbnN0YWxsYXRpb25zQ3JvbiIsImxvZyIsInByb3h5QWN0aXZpdGllcyIsInBydW5lVW5jbGFpbWVkU2VudHJ5SW5zdGFsbGF0aW9uc0FjdGl2aXR5Iiwic3RhcnRUb0Nsb3NlVGltZW91dCIsInJlbGVhc2VkUGVuZGluZyIsInRvbWJzdG9uZWQiLCJpbmZvIl0sInNvdXJjZVJvb3QiOiIifQ==
|